| @@ -1,5 +1,5 @@ | |||||
| # Discord.Net v1.0.0-dev | # Discord.Net v1.0.0-dev | ||||
| [](https://www.nuget.org/packages/Discord.Net) [](https://ci.appveyor.com/project/foxbot/discord-net/) [](https://discord.gg/0SBTUU1wZTYLhAAW) | |||||
| [](https://www.myget.org/feed/Packages/discord-net) [](https://ci.appveyor.com/project/foxbot/discord-net/) [](https://discord.gg/0SBTUU1wZTYLhAAW) | |||||
| An unofficial .Net API Wrapper for the Discord client (http://discordapp.com). | An unofficial .Net API Wrapper for the Discord client (http://discordapp.com). | ||||
| @@ -892,6 +892,12 @@ namespace Discord | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| if (!guild.HasAllMembers) | |||||
| { | |||||
| await _gatewayLogger.DebugAsync("Ignored GUILD_MEMBER_UPDATE, this user has not been downloaded yet.").ConfigureAwait(false); | |||||
| return; | |||||
| } | |||||
| await _gatewayLogger.WarningAsync("GUILD_MEMBER_UPDATE referenced an unknown user.").ConfigureAwait(false); | await _gatewayLogger.WarningAsync("GUILD_MEMBER_UPDATE referenced an unknown user.").ConfigureAwait(false); | ||||
| return; | return; | ||||
| } | } | ||||
| @@ -926,6 +932,12 @@ namespace Discord | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| if (!guild.HasAllMembers) | |||||
| { | |||||
| await _gatewayLogger.DebugAsync("Ignored GUILD_MEMBER_REMOVE, this user has not been downloaded yet.").ConfigureAwait(false); | |||||
| return; | |||||
| } | |||||
| await _gatewayLogger.WarningAsync("GUILD_MEMBER_REMOVE referenced an unknown user.").ConfigureAwait(false); | await _gatewayLogger.WarningAsync("GUILD_MEMBER_REMOVE referenced an unknown user.").ConfigureAwait(false); | ||||
| return; | return; | ||||
| } | } | ||||
| @@ -13,7 +13,7 @@ namespace Discord | |||||
| public new DiscordSocketClient Discord => base.Discord as DiscordSocketClient; | public new DiscordSocketClient Discord => base.Discord as DiscordSocketClient; | ||||
| public new CachedDMUser Recipient => base.Recipient as CachedDMUser; | public new CachedDMUser Recipient => base.Recipient as CachedDMUser; | ||||
| public IReadOnlyCollection<ICachedUser> Members => ImmutableArray.Create<ICachedUser>(Discord.CurrentUser, Recipient); | public IReadOnlyCollection<ICachedUser> Members => ImmutableArray.Create<ICachedUser>(Discord.CurrentUser, Recipient); | ||||
| IReadOnlyCollection<CachedDMUser> ICachedPrivateChannel.Recipients => ImmutableArray.Create(Recipient); | |||||
| IReadOnlyCollection<ICachedUser> ICachedPrivateChannel.Recipients => ImmutableArray.Create(Recipient); | |||||
| public CachedDMChannel(DiscordSocketClient discord, CachedDMUser recipient, Model model) | public CachedDMChannel(DiscordSocketClient discord, CachedDMUser recipient, Model model) | ||||
| : base(discord, recipient, model) | : base(discord, recipient, model) | ||||
| @@ -11,6 +11,7 @@ namespace Discord | |||||
| public Presence Presence { get; private set; } | public Presence Presence { get; private set; } | ||||
| public new DiscordSocketClient Discord { get { throw new NotSupportedException(); } } | public new DiscordSocketClient Discord { get { throw new NotSupportedException(); } } | ||||
| CachedGlobalUser ICachedUser.User => this; | |||||
| public CachedGlobalUser(Model model) | public CachedGlobalUser(Model model) | ||||
| : base(model) | : base(model) | ||||
| @@ -8,7 +8,6 @@ using MessageModel = Discord.API.Message; | |||||
| using Model = Discord.API.Channel; | using Model = Discord.API.Channel; | ||||
| using UserModel = Discord.API.User; | using UserModel = Discord.API.User; | ||||
| using VoiceStateModel = Discord.API.VoiceState; | using VoiceStateModel = Discord.API.VoiceState; | ||||
| using Discord.API; | |||||
| namespace Discord | namespace Discord | ||||
| { | { | ||||
| @@ -20,7 +19,7 @@ namespace Discord | |||||
| public new DiscordSocketClient Discord => base.Discord as DiscordSocketClient; | public new DiscordSocketClient Discord => base.Discord as DiscordSocketClient; | ||||
| public IReadOnlyCollection<ICachedUser> Members | public IReadOnlyCollection<ICachedUser> Members | ||||
| => _users.Select(x => x.Value as ICachedUser).Concat(ImmutableArray.Create(Discord.CurrentUser)).ToReadOnlyCollection(() => _users.Count + 1); | => _users.Select(x => x.Value as ICachedUser).Concat(ImmutableArray.Create(Discord.CurrentUser)).ToReadOnlyCollection(() => _users.Count + 1); | ||||
| public new IReadOnlyCollection<CachedDMUser> Recipients => _users.Cast<CachedDMUser>().ToReadOnlyCollection(_users); | |||||
| public new IReadOnlyCollection<ICachedUser> Recipients => _users.Select(x => x.Value as ICachedUser).ToReadOnlyCollection(_users); | |||||
| public CachedGroupChannel(DiscordSocketClient discord, Model model) | public CachedGroupChannel(DiscordSocketClient discord, Model model) | ||||
| : base(discord, model) | : base(discord, model) | ||||
| @@ -1,10 +1,12 @@ | |||||
| using Model = Discord.API.User; | |||||
| using System; | |||||
| using Model = Discord.API.User; | |||||
| namespace Discord | namespace Discord | ||||
| { | { | ||||
| internal class CachedSelfUser : SelfUser, ICachedUser | internal class CachedSelfUser : SelfUser, ICachedUser | ||||
| { | { | ||||
| public new DiscordSocketClient Discord => base.Discord as DiscordSocketClient; | public new DiscordSocketClient Discord => base.Discord as DiscordSocketClient; | ||||
| CachedGlobalUser ICachedUser.User { get { throw new NotSupportedException(); } } | |||||
| public CachedSelfUser(DiscordSocketClient discord, Model model) | public CachedSelfUser(DiscordSocketClient discord, Model model) | ||||
| : base(discord, model) | : base(discord, model) | ||||
| @@ -4,6 +4,6 @@ namespace Discord | |||||
| { | { | ||||
| internal interface ICachedPrivateChannel : ICachedChannel, IPrivateChannel | internal interface ICachedPrivateChannel : ICachedChannel, IPrivateChannel | ||||
| { | { | ||||
| new IReadOnlyCollection<CachedDMUser> Recipients { get; } | |||||
| new IReadOnlyCollection<ICachedUser> Recipients { get; } | |||||
| } | } | ||||
| } | } | ||||
| @@ -2,6 +2,8 @@ | |||||
| { | { | ||||
| internal interface ICachedUser : IUser, ICachedEntity<ulong> | internal interface ICachedUser : IUser, ICachedEntity<ulong> | ||||
| { | { | ||||
| CachedGlobalUser User { get; } | |||||
| ICachedUser Clone(); | ICachedUser Clone(); | ||||
| } | } | ||||
| } | } | ||||
| @@ -42,7 +42,7 @@ namespace Discord.Net.Queue | |||||
| } | } | ||||
| catch (HttpRateLimitException ex) | catch (HttpRateLimitException ex) | ||||
| { | { | ||||
| //When a 429 occurs, we drop all our locks, including the ones we wanted. | |||||
| //When a 429 occurs, we drop all our locks. | |||||
| //This is generally safe though since 429s actually occuring should be very rare. | //This is generally safe though since 429s actually occuring should be very rare. | ||||
| RequestQueueBucket bucket; | RequestQueueBucket bucket; | ||||
| bool success = FindBucket(ex.BucketId, out bucket); | bool success = FindBucket(ex.BucketId, out bucket); | ||||
| @@ -152,7 +152,8 @@ namespace Discord.Net.Queue | |||||
| if (millis <= 0 || !await _semaphore.WaitAsync(millis).ConfigureAwait(false)) | if (millis <= 0 || !await _semaphore.WaitAsync(millis).ConfigureAwait(false)) | ||||
| throw new TimeoutException(); | throw new TimeoutException(); | ||||
| } | } | ||||
| await _semaphore.WaitAsync().ConfigureAwait(false); | |||||
| else | |||||
| await _semaphore.WaitAsync().ConfigureAwait(false); | |||||
| } | } | ||||
| private async Task QueueExitAsync() | private async Task QueueExitAsync() | ||||
| { | { | ||||