Browse Source

Prevent duplicate GuildUnavailables

tags/1.0-rc
RogueException 8 years ago
parent
commit
cab41851ba
4 changed files with 32 additions and 16 deletions
  1. +0
    -1
      src/Discord.Net.Core/Utils/Cacheable.cs
  2. +0
    -1
      src/Discord.Net.WebSocket/DiscordShardedClient.Events.cs
  3. +27
    -10
      src/Discord.Net.WebSocket/DiscordSocketClient.cs
  4. +5
    -4
      src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs

+ 0
- 1
src/Discord.Net.Core/Utils/Cacheable.cs View File

@@ -1,5 +1,4 @@
using System; using System;
using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;


namespace Discord namespace Discord


+ 0
- 1
src/Discord.Net.WebSocket/DiscordShardedClient.Events.cs View File

@@ -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
{ {


+ 27
- 10
src/Discord.Net.WebSocket/DiscordSocketClient.cs View File

@@ -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)
await _guildUnavailableEvent.InvokeAsync(guild).ConfigureAwait(false);
if (guild.IsAvailable)
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)
await _guildAvailableEvent.InvokeAsync(guild).ConfigureAwait(false);
if (guild.IsAvailable)
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;




+ 5
- 4
src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs View File

@@ -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);
if (!_available)
IsAvailable = !(model.Unavailable ?? false);
if (!IsAvailable)
{ {
if (_channels == null) if (_channels == null)
_channels = new ConcurrentHashSet<ulong>(); _channels = new ConcurrentHashSet<ulong>();


Loading…
Cancel
Save