@@ -34,7 +34,7 @@ namespace Discord.WebSocket
private int _lastSeq;
private int _lastSeq;
private ImmutableDictionary<string, RestVoiceRegion> _voiceRegions;
private ImmutableDictionary<string, RestVoiceRegion> _voiceRegions;
private Task _heartbeatTask, _guildDownloadTask;
private Task _heartbeatTask, _guildDownloadTask;
private int _unavailableGuilds ;
private int _unavailableGuildCount ;
private long _lastGuildAvailableTime, _lastMessageTime;
private long _lastGuildAvailableTime, _lastMessageTime;
private int _nextAudioId;
private int _nextAudioId;
private DateTimeOffset? _statusSince;
private DateTimeOffset? _statusSince;
@@ -60,7 +60,7 @@ namespace Discord.WebSocket
internal int? HandlerTimeout { get; private set; }
internal int? HandlerTimeout { get; private set; }
internal new DiscordSocketApiClient ApiClient => base.ApiClient as DiscordSocketApiClient;
internal new DiscordSocketApiClient ApiClient => base.ApiClient as DiscordSocketApiClient;
public new SocketSelfUser CurrentUser { get { return base.CurrentUser as SocketSelfUser; } private set { base.CurrentUser = value; } }
public new SocketSelfUser CurrentUser { get => base.CurrentUser as SocketSelfUser; private set => base.CurrentUser = value; }
public IReadOnlyCollection<SocketGuild> Guilds => State.Guilds;
public IReadOnlyCollection<SocketGuild> Guilds => State.Guilds;
public IReadOnlyCollection<ISocketPrivateChannel> PrivateChannels => State.PrivateChannels;
public IReadOnlyCollection<ISocketPrivateChannel> PrivateChannels => State.PrivateChannels;
public IReadOnlyCollection<SocketDMChannel> DMChannels
public IReadOnlyCollection<SocketDMChannel> DMChannels
@@ -474,7 +474,7 @@ namespace Discord.WebSocket
AddPrivateChannel(data.PrivateChannels[i], state);
AddPrivateChannel(data.PrivateChannels[i], state);
_sessionId = data.SessionId;
_sessionId = data.SessionId;
_unavailableGuilds = unavailableGuilds;
_unavailableGuildCount = unavailableGuilds;
CurrentUser = currentUser;
CurrentUser = currentUser;
State = state;
State = state;
}
}
@@ -537,10 +537,9 @@ namespace Discord.WebSocket
if (guild != null)
if (guild != null)
{
{
guild.Update(State, data);
guild.Update(State, data);
var unavailableGuilds = _unavailableGuilds;
if (unavailableGuilds != 0)
_unavailableGuilds = unavailableGuilds - 1;
if (_unavailableGuildCount != 0)
_unavailableGuildCount--;
await GuildAvailableAsync(guild).ConfigureAwait(false);
await GuildAvailableAsync(guild).ConfigureAwait(false);
if (guild.DownloadedMemberCount >= guild.MemberCount && !guild.DownloaderPromise.IsCompleted)
if (guild.DownloadedMemberCount >= guild.MemberCount && !guild.DownloaderPromise.IsCompleted)
@@ -622,7 +621,7 @@ namespace Discord.WebSocket
var before = guild.Clone();
var before = guild.Clone();
guild.Update(State, data);
guild.Update(State, data);
//This is treated as an extension of GUILD_AVAILABLE
//This is treated as an extension of GUILD_AVAILABLE
_unavailableGuilds --;
_unavailableGuildCount --;
_lastGuildAvailableTime = Environment.TickCount;
_lastGuildAvailableTime = Environment.TickCount;
await GuildAvailableAsync(guild).ConfigureAwait(false);
await GuildAvailableAsync(guild).ConfigureAwait(false);
await TimedInvokeAsync(_guildUpdatedEvent, nameof(GuildUpdated), before, guild).ConfigureAwait(false);
await TimedInvokeAsync(_guildUpdatedEvent, nameof(GuildUpdated), before, guild).ConfigureAwait(false);
@@ -646,7 +645,7 @@ namespace Discord.WebSocket
if (guild != null)
if (guild != null)
{
{
await GuildUnavailableAsync(guild).ConfigureAwait(false);
await GuildUnavailableAsync(guild).ConfigureAwait(false);
_unavailableGuilds ++;
_unavailableGuildCount ++;
}
}
else
else
{
{
@@ -1212,10 +1211,10 @@ namespace Discord.WebSocket
var data = (payload as JToken).ToObject<API.Gateway.Reaction>(_serializer);
var data = (payload as JToken).ToObject<API.Gateway.Reaction>(_serializer);
if (State.GetChannel(data.ChannelId) is ISocketMessageChannel channel)
if (State.GetChannel(data.ChannelId) is ISocketMessageChannel channel)
{
{
SocketUserMessage cachedMsg = channel.GetCachedMessage(data.MessageId) as SocketUserMessage;
var cachedMsg = channel.GetCachedMessage(data.MessageId) as SocketUserMessage;
bool isCached = cachedMsg != null;
bool isCached = cachedMsg != null;
var user = await channel.GetUserAsync(data.UserId, CacheMode.CacheOnly);
var user = await channel.GetUserAsync(data.UserId, CacheMode.CacheOnly);
SocketReaction reaction = SocketReaction.Create(data, channel, cachedMsg, Optional.Create(user));
var reaction = SocketReaction.Create(data, channel, cachedMsg, Optional.Create(user));
var cacheable = new Cacheable<IUserMessage, ulong>(cachedMsg, data.MessageId, isCached, async () => await channel.GetMessageAsync(data.MessageId) as IUserMessage);
var cacheable = new Cacheable<IUserMessage, ulong>(cachedMsg, data.MessageId, isCached, async () => await channel.GetMessageAsync(data.MessageId) as IUserMessage);
cachedMsg?.AddReaction(reaction);
cachedMsg?.AddReaction(reaction);
@@ -1236,10 +1235,10 @@ namespace Discord.WebSocket
var data = (payload as JToken).ToObject<API.Gateway.Reaction>(_serializer);
var data = (payload as JToken).ToObject<API.Gateway.Reaction>(_serializer);
if (State.GetChannel(data.ChannelId) is ISocketMessageChannel channel)
if (State.GetChannel(data.ChannelId) is ISocketMessageChannel channel)
{
{
SocketUserMessage cachedMsg = channel.GetCachedMessage(data.MessageId) as SocketUserMessage;
var cachedMsg = channel.GetCachedMessage(data.MessageId) as SocketUserMessage;
bool isCached = cachedMsg != null;
bool isCached = cachedMsg != null;
var user = await channel.GetUserAsync(data.UserId, CacheMode.CacheOnly);
var user = await channel.GetUserAsync(data.UserId, CacheMode.CacheOnly);
SocketReaction reaction = SocketReaction.Create(data, channel, cachedMsg, Optional.Create(user));
var reaction = SocketReaction.Create(data, channel, cachedMsg, Optional.Create(user));
var cacheable = new Cacheable<IUserMessage, ulong>(cachedMsg, data.MessageId, isCached, async () => await channel.GetMessageAsync(data.MessageId) as IUserMessage);
var cacheable = new Cacheable<IUserMessage, ulong>(cachedMsg, data.MessageId, isCached, async () => await channel.GetMessageAsync(data.MessageId) as IUserMessage);
cachedMsg?.RemoveReaction(reaction);
cachedMsg?.RemoveReaction(reaction);
@@ -1260,7 +1259,7 @@ namespace Discord.WebSocket
var data = (payload as JToken).ToObject<RemoveAllReactionsEvent>(_serializer);
var data = (payload as JToken).ToObject<RemoveAllReactionsEvent>(_serializer);
if (State.GetChannel(data.ChannelId) is ISocketMessageChannel channel)
if (State.GetChannel(data.ChannelId) is ISocketMessageChannel channel)
{
{
SocketUserMessage cachedMsg = channel.GetCachedMessage(data.MessageId) as SocketUserMessage;
var cachedMsg = channel.GetCachedMessage(data.MessageId) as SocketUserMessage;
bool isCached = cachedMsg != null;
bool isCached = cachedMsg != null;
var cacheable = new Cacheable<IUserMessage, ulong>(cachedMsg, data.MessageId, isCached, async () => await channel.GetMessageAsync(data.MessageId) as IUserMessage);
var cacheable = new Cacheable<IUserMessage, ulong>(cachedMsg, data.MessageId, isCached, async () => await channel.GetMessageAsync(data.MessageId) as IUserMessage);
@@ -1289,7 +1288,7 @@ namespace Discord.WebSocket
return;
return;
}
}
foreach (var id in data.Ids)
foreach (ulong id in data.Ids)
{
{
var msg = SocketChannelHelper.RemoveMessage(channel, this, id);
var msg = SocketChannelHelper.RemoveMessage(channel, this, id);
bool isCached = msg != null;
bool isCached = msg != null;
@@ -1542,7 +1541,7 @@ namespace Discord.WebSocket
await _gatewayLogger.DebugAsync("Heartbeat Started").ConfigureAwait(false);
await _gatewayLogger.DebugAsync("Heartbeat Started").ConfigureAwait(false);
while (!cancelToken.IsCancellationRequested)
while (!cancelToken.IsCancellationRequested)
{
{
var now = Environment.TickCount;
int now = Environment.TickCount;
//Did server respond to our last heartbeat, or are we still receiving messages (long load?)
//Did server respond to our last heartbeat, or are we still receiving messages (long load?)
if (_heartbeatTimes.Count != 0 && (now - _lastMessageTime) > intervalMillis)
if (_heartbeatTimes.Count != 0 && (now - _lastMessageTime) > intervalMillis)
@@ -1589,7 +1588,7 @@ namespace Discord.WebSocket
try
try
{
{
await logger.DebugAsync("GuildDownloader Started").ConfigureAwait(false);
await logger.DebugAsync("GuildDownloader Started").ConfigureAwait(false);
while ((_unavailableGuilds != 0) && (Environment.TickCount - _lastGuildAvailableTime < 2000))
while ((_unavailableGuildCount != 0) && (Environment.TickCount - _lastGuildAvailableTime < 2000))
await Task.Delay(500, cancelToken).ConfigureAwait(false);
await Task.Delay(500, cancelToken).ConfigureAwait(false);
await logger.DebugAsync("GuildDownloader Stopped").ConfigureAwait(false);
await logger.DebugAsync("GuildDownloader Stopped").ConfigureAwait(false);
}
}
@@ -1750,27 +1749,27 @@ namespace Discord.WebSocket
private async Task UnknownGlobalUserAsync(string evnt, ulong userId)
private async Task UnknownGlobalUserAsync(string evnt, ulong userId)
{
{
var details = $"{evnt} User={userId}";
string details = $"{evnt} User={userId}";
await _gatewayLogger.WarningAsync($"Unknown User ({details}).").ConfigureAwait(false);
await _gatewayLogger.WarningAsync($"Unknown User ({details}).").ConfigureAwait(false);
}
}
private async Task UnknownChannelUserAsync(string evnt, ulong userId, ulong channelId)
private async Task UnknownChannelUserAsync(string evnt, ulong userId, ulong channelId)
{
{
var details = $"{evnt} User={userId} Channel={channelId}";
string details = $"{evnt} User={userId} Channel={channelId}";
await _gatewayLogger.WarningAsync($"Unknown User ({details}).").ConfigureAwait(false);
await _gatewayLogger.WarningAsync($"Unknown User ({details}).").ConfigureAwait(false);
}
}
private async Task UnknownGuildUserAsync(string evnt, ulong userId, ulong guildId)
private async Task UnknownGuildUserAsync(string evnt, ulong userId, ulong guildId)
{
{
var details = $"{evnt} User={userId} Guild={guildId}";
string details = $"{evnt} User={userId} Guild={guildId}";
await _gatewayLogger.WarningAsync($"Unknown User ({details}).").ConfigureAwait(false);
await _gatewayLogger.WarningAsync($"Unknown User ({details}).").ConfigureAwait(false);
}
}
private async Task IncompleteGuildUserAsync(string evnt, ulong userId, ulong guildId)
private async Task IncompleteGuildUserAsync(string evnt, ulong userId, ulong guildId)
{
{
var details = $"{evnt} User={userId} Guild={guildId}";
string details = $"{evnt} User={userId} Guild={guildId}";
await _gatewayLogger.DebugAsync($"User has not been downloaded ({details}).").ConfigureAwait(false);
await _gatewayLogger.DebugAsync($"User has not been downloaded ({details}).").ConfigureAwait(false);
}
}
private async Task UnknownChannelAsync(string evnt, ulong channelId)
private async Task UnknownChannelAsync(string evnt, ulong channelId)
{
{
var details = $"{evnt} Channel={channelId}";
string details = $"{evnt} Channel={channelId}";
await _gatewayLogger.WarningAsync($"Unknown Channel ({details}).").ConfigureAwait(false);
await _gatewayLogger.WarningAsync($"Unknown Channel ({details}).").ConfigureAwait(false);
}
}
private async Task UnknownChannelAsync(string evnt, ulong channelId, ulong guildId)
private async Task UnknownChannelAsync(string evnt, ulong channelId, ulong guildId)
@@ -1780,22 +1779,22 @@ namespace Discord.WebSocket
await UnknownChannelAsync(evnt, channelId).ConfigureAwait(false);
await UnknownChannelAsync(evnt, channelId).ConfigureAwait(false);
return;
return;
}
}
var details = $"{evnt} Channel={channelId} Guild={guildId}";
string details = $"{evnt} Channel={channelId} Guild={guildId}";
await _gatewayLogger.WarningAsync($"Unknown Channel ({details}).").ConfigureAwait(false);
await _gatewayLogger.WarningAsync($"Unknown Channel ({details}).").ConfigureAwait(false);
}
}
private async Task UnknownRoleAsync(string evnt, ulong roleId, ulong guildId)
private async Task UnknownRoleAsync(string evnt, ulong roleId, ulong guildId)
{
{
var details = $"{evnt} Role={roleId} Guild={guildId}";
string details = $"{evnt} Role={roleId} Guild={guildId}";
await _gatewayLogger.WarningAsync($"Unknown Role ({details}).").ConfigureAwait(false);
await _gatewayLogger.WarningAsync($"Unknown Role ({details}).").ConfigureAwait(false);
}
}
private async Task UnknownGuildAsync(string evnt, ulong guildId)
private async Task UnknownGuildAsync(string evnt, ulong guildId)
{
{
var details = $"{evnt} Guild={guildId}";
string details = $"{evnt} Guild={guildId}";
await _gatewayLogger.WarningAsync($"Unknown Guild ({details}).").ConfigureAwait(false);
await _gatewayLogger.WarningAsync($"Unknown Guild ({details}).").ConfigureAwait(false);
}
}
private async Task UnsyncedGuildAsync(string evnt, ulong guildId)
private async Task UnsyncedGuildAsync(string evnt, ulong guildId)
{
{
var details = $"{evnt} Guild={guildId}";
string details = $"{evnt} Guild={guildId}";
await _gatewayLogger.DebugAsync($"Unsynced Guild ({details}).").ConfigureAwait(false);
await _gatewayLogger.DebugAsync($"Unsynced Guild ({details}).").ConfigureAwait(false);
}
}