From d9b5a4ddc9c23c420194dcd697591ea8b6dfda3d Mon Sep 17 00:00:00 2001 From: RogueException Date: Wed, 20 Jul 2016 19:57:28 -0300 Subject: [PATCH] Added virtual GuildAvailable and GuildUnavailable events on Connected, Ready and Disconnected events --- src/Discord.Net/Audio/AudioClient.cs | 3 +- src/Discord.Net/DiscordSocketClient.cs | 34 +++++++++++++------ .../Entities/WebSocket/CachedGuild.cs | 7 ++-- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/src/Discord.Net/Audio/AudioClient.cs b/src/Discord.Net/Audio/AudioClient.cs index a6cb71b21..26915c450 100644 --- a/src/Discord.Net/Audio/AudioClient.cs +++ b/src/Discord.Net/Audio/AudioClient.cs @@ -90,6 +90,8 @@ namespace Discord.Audio else await _audioLogger.WarningAsync($"Connection Closed").ConfigureAwait(false); }; + + LatencyUpdated += async (old, val) => await _audioLogger.VerboseAsync($"Latency = {val} ms").ConfigureAwait(false); } /// @@ -242,7 +244,6 @@ namespace Discord.Audio { int latency = (int)(Environment.TickCount - _heartbeatTime); _heartbeatTime = 0; - await _audioLogger.VerboseAsync($"Latency = {latency} ms").ConfigureAwait(false); int before = Latency; Latency = latency; diff --git a/src/Discord.Net/DiscordSocketClient.cs b/src/Discord.Net/DiscordSocketClient.cs index 966c2aef8..ff4aeb8ee 100644 --- a/src/Discord.Net/DiscordSocketClient.cs +++ b/src/Discord.Net/DiscordSocketClient.cs @@ -103,6 +103,12 @@ namespace Discord await _gatewayLogger.WarningAsync($"Connection Closed").ConfigureAwait(false); }; + LeftGuild += async g => await _gatewayLogger.InfoAsync($"Left {g.Name}").ConfigureAwait(false); + JoinedGuild += async g => await _gatewayLogger.InfoAsync($"Joined {g.Name}").ConfigureAwait(false); + GuildAvailable += async g => await _gatewayLogger.VerboseAsync($"Connected to {g.Name}").ConfigureAwait(false); + GuildUnavailable += async g => await _gatewayLogger.VerboseAsync($"Disconnected from {g.Name}").ConfigureAwait(false); + LatencyUpdated += async (old, val) => await _gatewayLogger.VerboseAsync($"Latency = {val} ms").ConfigureAwait(false); + _voiceRegions = ImmutableDictionary.Create(); _largeGuilds = new ConcurrentQueue(); } @@ -236,6 +242,13 @@ namespace Discord await _gatewayLogger.DebugAsync("Disconnecting - Clean Large Guilds").ConfigureAwait(false); while (_largeGuilds.TryDequeue(out guildId)) { } + //Raise virtual GUILD_UNAVAILABLEs + foreach (var guild in DataStore.Guilds) + { + if (guild._available) + await _guildUnavailableEvent.InvokeAsync(guild).ConfigureAwait(false); + } + ConnectionState = ConnectionState.Disconnected; await _gatewayLogger.InfoAsync("Disconnected").ConfigureAwait(false); @@ -504,7 +517,6 @@ namespace Discord { int latency = (int)(Environment.TickCount - _heartbeatTime); _heartbeatTime = 0; - await _gatewayLogger.VerboseAsync($"Latency = {latency} ms").ConfigureAwait(false); int before = Latency; Latency = latency; @@ -549,9 +561,11 @@ namespace Discord for (int i = 0; i < data.Guilds.Length; i++) { var model = data.Guilds[i]; - AddGuild(model, dataStore); + var guild = AddGuild(model, dataStore); if (model.Unavailable == true) unavailableGuilds++; + else + await _guildAvailableEvent.InvokeAsync(guild).ConfigureAwait(false); } for (int i = 0; i < data.PrivateChannels.Length; i++) AddPrivateChannel(data.PrivateChannels[i], dataStore); @@ -583,6 +597,14 @@ namespace Discord await _gatewayLogger.DebugAsync("Received Dispatch (RESUMED)").ConfigureAwait(false); var _ = _connectTask.TrySetResultAsync(true); //Signal the .Connect() call to complete + + //Notify the client that these guilds are available again + foreach (var guild in DataStore.Guilds) + { + if (guild._available) + await _guildAvailableEvent.InvokeAsync(guild).ConfigureAwait(false); + } + await _gatewayLogger.InfoAsync("Resumed previous session").ConfigureAwait(false); } return; @@ -605,7 +627,6 @@ namespace Discord guild = AddGuild(data, DataStore); await SyncGuildsAsync().ConfigureAwait(false); await _joinedGuildEvent.InvokeAsync(guild).ConfigureAwait(false); - await _gatewayLogger.InfoAsync($"Joined {data.Name}").ConfigureAwait(false); } else { @@ -624,10 +645,7 @@ namespace Discord } if (data.Unavailable != true) - { - await _gatewayLogger.VerboseAsync($"Connected to {data.Name}").ConfigureAwait(false); await _guildAvailableEvent.InvokeAsync(guild).ConfigureAwait(false); - } } break; case "GUILD_UPDATE": @@ -705,12 +723,8 @@ namespace Discord member.User.RemoveRef(this); await _guildUnavailableEvent.InvokeAsync(guild).ConfigureAwait(false); - await _gatewayLogger.VerboseAsync($"Disconnected from {data.Name}").ConfigureAwait(false); if (data.Unavailable != true) - { await _leftGuildEvent.InvokeAsync(guild).ConfigureAwait(false); - await _gatewayLogger.InfoAsync($"Left {data.Name}").ConfigureAwait(false); - } else _unavailableGuilds++; diff --git a/src/Discord.Net/Entities/WebSocket/CachedGuild.cs b/src/Discord.Net/Entities/WebSocket/CachedGuild.cs index da90f9a6f..1a2b272b0 100644 --- a/src/Discord.Net/Entities/WebSocket/CachedGuild.cs +++ b/src/Discord.Net/Entities/WebSocket/CachedGuild.cs @@ -26,8 +26,9 @@ namespace Discord private ConcurrentHashSet _channels; private ConcurrentDictionary _members; private ConcurrentDictionary _voiceStates; + internal bool _available; - public bool Available { get; private set; } + public bool Available => _available && Discord.ConnectionState == ConnectionState.Connected; public int MemberCount { get; private set; } public int DownloadedMemberCount { get; private set; } public AudioClient AudioClient { get; private set; } @@ -62,8 +63,8 @@ namespace Discord public void Update(ExtendedModel model, UpdateSource source, DataStore dataStore) { if (source == UpdateSource.Rest && IsAttached) return; - - Available = !(model.Unavailable ?? false); + + _available = !(model.Unavailable ?? false); if (!Available) { if (_channels == null)