Prevent duplicate GuildUnavailables
This commit is contained in:
@@ -1,5 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Discord
|
namespace Discord
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Discord.Net;
|
|
||||||
|
|
||||||
namespace Discord.WebSocket
|
namespace Discord.WebSocket
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -237,8 +237,8 @@ namespace Discord.WebSocket
|
|||||||
await _gatewayLogger.DebugAsync("Raising virtual GuildUnavailables").ConfigureAwait(false);
|
await _gatewayLogger.DebugAsync("Raising virtual GuildUnavailables").ConfigureAwait(false);
|
||||||
foreach (var guild in State.Guilds)
|
foreach (var guild in State.Guilds)
|
||||||
{
|
{
|
||||||
if (guild._available)
|
if (guild.IsAvailable)
|
||||||
await _guildUnavailableEvent.InvokeAsync(guild).ConfigureAwait(false);
|
await GuildUnavailableAsync(guild).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -477,10 +477,10 @@ namespace Discord.WebSocket
|
|||||||
{
|
{
|
||||||
var model = data.Guilds[i];
|
var model = data.Guilds[i];
|
||||||
var guild = AddGuild(model, state);
|
var guild = AddGuild(model, state);
|
||||||
if (!guild._available || ApiClient.AuthTokenType == TokenType.User)
|
if (!guild.IsAvailable || ApiClient.AuthTokenType == TokenType.User)
|
||||||
unavailableGuilds++;
|
unavailableGuilds++;
|
||||||
else
|
else
|
||||||
await _guildAvailableEvent.InvokeAsync(guild).ConfigureAwait(false);
|
await GuildAvailableAsync(guild).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
for (int i = 0; i < data.PrivateChannels.Length; i++)
|
for (int i = 0; i < data.PrivateChannels.Length; i++)
|
||||||
AddPrivateChannel(data.PrivateChannels[i], state);
|
AddPrivateChannel(data.PrivateChannels[i], state);
|
||||||
@@ -526,8 +526,8 @@ namespace Discord.WebSocket
|
|||||||
//Notify the client that these guilds are available again
|
//Notify the client that these guilds are available again
|
||||||
foreach (var guild in State.Guilds)
|
foreach (var guild in State.Guilds)
|
||||||
{
|
{
|
||||||
if (guild._available)
|
if (guild.IsAvailable)
|
||||||
await _guildAvailableEvent.InvokeAsync(guild).ConfigureAwait(false);
|
await GuildAvailableAsync(guild).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
await _gatewayLogger.InfoAsync("Resumed previous session").ConfigureAwait(false);
|
await _gatewayLogger.InfoAsync("Resumed previous session").ConfigureAwait(false);
|
||||||
@@ -553,7 +553,7 @@ namespace Discord.WebSocket
|
|||||||
var unavailableGuilds = _unavailableGuilds;
|
var unavailableGuilds = _unavailableGuilds;
|
||||||
if (unavailableGuilds != 0)
|
if (unavailableGuilds != 0)
|
||||||
_unavailableGuilds = unavailableGuilds - 1;
|
_unavailableGuilds = unavailableGuilds - 1;
|
||||||
await _guildAvailableEvent.InvokeAsync(guild).ConfigureAwait(false);
|
await GuildAvailableAsync(guild).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -630,7 +630,7 @@ namespace Discord.WebSocket
|
|||||||
//This is treated as an extension of GUILD_AVAILABLE
|
//This is treated as an extension of GUILD_AVAILABLE
|
||||||
_unavailableGuilds--;
|
_unavailableGuilds--;
|
||||||
_lastGuildAvailableTime = Environment.TickCount;
|
_lastGuildAvailableTime = Environment.TickCount;
|
||||||
await _guildAvailableEvent.InvokeAsync(guild).ConfigureAwait(false);
|
await GuildAvailableAsync(guild).ConfigureAwait(false);
|
||||||
await _guildUpdatedEvent.InvokeAsync(before, guild).ConfigureAwait(false);
|
await _guildUpdatedEvent.InvokeAsync(before, guild).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -651,7 +651,7 @@ namespace Discord.WebSocket
|
|||||||
var guild = State.GetGuild(data.Id);
|
var guild = State.GetGuild(data.Id);
|
||||||
if (guild != null)
|
if (guild != null)
|
||||||
{
|
{
|
||||||
await _guildUnavailableEvent.InvokeAsync(guild).ConfigureAwait(false);
|
await GuildUnavailableAsync(guild).ConfigureAwait(false);
|
||||||
_unavailableGuilds++;
|
_unavailableGuilds++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -668,7 +668,7 @@ namespace Discord.WebSocket
|
|||||||
var guild = RemoveGuild(data.Id);
|
var guild = RemoveGuild(data.Id);
|
||||||
if (guild != null)
|
if (guild != null)
|
||||||
{
|
{
|
||||||
await _guildUnavailableEvent.InvokeAsync(guild).ConfigureAwait(false);
|
await GuildUnavailableAsync(guild).ConfigureAwait(false);
|
||||||
await _leftGuildEvent.InvokeAsync(guild).ConfigureAwait(false);
|
await _leftGuildEvent.InvokeAsync(guild).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1659,6 +1659,23 @@ namespace Discord.WebSocket
|
|||||||
return channel;
|
return channel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task GuildAvailableAsync(SocketGuild guild)
|
||||||
|
{
|
||||||
|
if (!guild.IsConnected)
|
||||||
|
{
|
||||||
|
guild.IsConnected = true;
|
||||||
|
await _guildAvailableEvent.InvokeAsync(guild).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private async Task GuildUnavailableAsync(SocketGuild guild)
|
||||||
|
{
|
||||||
|
if (guild.IsConnected)
|
||||||
|
{
|
||||||
|
guild.IsConnected = false;
|
||||||
|
await _guildUnavailableEvent.InvokeAsync(guild).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//IDiscordClient
|
//IDiscordClient
|
||||||
ConnectionState IDiscordClient.ConnectionState => _connection.State;
|
ConnectionState IDiscordClient.ConnectionState => _connection.State;
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ namespace Discord.WebSocket
|
|||||||
private ImmutableArray<GuildEmoji> _emojis;
|
private ImmutableArray<GuildEmoji> _emojis;
|
||||||
private ImmutableArray<string> _features;
|
private ImmutableArray<string> _features;
|
||||||
private AudioClient _audioClient;
|
private AudioClient _audioClient;
|
||||||
internal bool _available;
|
|
||||||
|
|
||||||
public string Name { get; private set; }
|
public string Name { get; private set; }
|
||||||
public int AFKTimeout { get; private set; }
|
public int AFKTimeout { get; private set; }
|
||||||
@@ -40,8 +39,10 @@ namespace Discord.WebSocket
|
|||||||
public VerificationLevel VerificationLevel { get; private set; }
|
public VerificationLevel VerificationLevel { get; private set; }
|
||||||
public MfaLevel MfaLevel { get; private set; }
|
public MfaLevel MfaLevel { get; private set; }
|
||||||
public DefaultMessageNotifications DefaultMessageNotifications { get; private set; }
|
public DefaultMessageNotifications DefaultMessageNotifications { get; private set; }
|
||||||
public int MemberCount { get; set; }
|
public int MemberCount { get; internal set; }
|
||||||
public int DownloadedMemberCount { get; private set; }
|
public int DownloadedMemberCount { get; private set; }
|
||||||
|
internal bool IsAvailable { get; private set; }
|
||||||
|
public bool IsConnected { get; internal set; }
|
||||||
|
|
||||||
internal ulong? AFKChannelId { get; private set; }
|
internal ulong? AFKChannelId { get; private set; }
|
||||||
internal ulong? EmbedChannelId { get; private set; }
|
internal ulong? EmbedChannelId { get; private set; }
|
||||||
@@ -120,8 +121,8 @@ namespace Discord.WebSocket
|
|||||||
}
|
}
|
||||||
internal void Update(ClientState state, ExtendedModel model)
|
internal void Update(ClientState state, ExtendedModel model)
|
||||||
{
|
{
|
||||||
_available = !(model.Unavailable ?? false);
|
IsAvailable = !(model.Unavailable ?? false);
|
||||||
if (!_available)
|
if (!IsAvailable)
|
||||||
{
|
{
|
||||||
if (_channels == null)
|
if (_channels == null)
|
||||||
_channels = new ConcurrentHashSet<ulong>();
|
_channels = new ConcurrentHashSet<ulong>();
|
||||||
|
|||||||
Reference in New Issue
Block a user