From 705d71875c69d68756e81ca6c8964ccf1fb81a47 Mon Sep 17 00:00:00 2001 From: "Sindre G. Langhus" Date: Fri, 16 Dec 2016 23:50:27 +0100 Subject: [PATCH] Simplified PR, renamed Cached to Cacheable. --- src/Discord.Net.Core/Utils/Cacheable.cs | 30 +++++++++++++ src/Discord.Net.Core/Utils/Cached.cs | 33 -------------- .../DiscordSocketClient.Events.cs | 20 ++++----- .../DiscordSocketClient.cs | 44 ++++++++++++------- 4 files changed, 67 insertions(+), 60 deletions(-) create mode 100644 src/Discord.Net.Core/Utils/Cacheable.cs delete mode 100644 src/Discord.Net.Core/Utils/Cached.cs diff --git a/src/Discord.Net.Core/Utils/Cacheable.cs b/src/Discord.Net.Core/Utils/Cacheable.cs new file mode 100644 index 000000000..b85536434 --- /dev/null +++ b/src/Discord.Net.Core/Utils/Cacheable.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Discord +{ + public struct Cacheable + where TEntity : IEntity + where TId : IEquatable + { + public bool HasValue => !EqualityComparer.Default.Equals(Value, default(TEntity)); + public ulong Id { get; } + public TEntity Value { get; } + private Func> DownloadFunc { get; } + + internal Cacheable(TEntity value, ulong id, Func> downloadFunc) + { + Value = value; + Id = id; + DownloadFunc = downloadFunc; + } + + public async Task DownloadAsync() + { + return await DownloadFunc(); + } + + public async Task GetOrDownloadAsync() => HasValue ? Value : await DownloadAsync(); + } +} \ No newline at end of file diff --git a/src/Discord.Net.Core/Utils/Cached.cs b/src/Discord.Net.Core/Utils/Cached.cs deleted file mode 100644 index 99c7794f7..000000000 --- a/src/Discord.Net.Core/Utils/Cached.cs +++ /dev/null @@ -1,33 +0,0 @@ -using Discord.WebSocket; -using System; -using System.Collections.Generic; -using System.Threading.Tasks; - -namespace Discord -{ - public struct Cached where T : IMessage - { - public bool IsCached => !EqualityComparer.Default.Equals(Value, default(T)); - public bool IsDownloadable { get; } - public ulong Id { get; } - public T Value { get; } - public ISocketMessageChannel Channel { get; } - - public Cached(ulong id, T value, ISocketMessageChannel channel, bool isDownloadable = true) - { - Id = id; - Value = value; - Channel = channel; - IsDownloadable = isDownloadable; - } - - public async Task DownloadAsync() - { - if (IsDownloadable) - return (T) await Channel.GetMessageAsync(Id); - throw new InvalidOperationException("This message cannot be downloaded."); - } - - public async Task GetOrDownloadAsync() => IsCached ? Value : await DownloadAsync(); - } -} diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.Events.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.Events.cs index 48f945b0c..63083bbb5 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.Events.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.Events.cs @@ -59,36 +59,36 @@ namespace Discord.WebSocket remove { _messageReceivedEvent.Remove(value); } } private readonly AsyncEvent> _messageReceivedEvent = new AsyncEvent>(); - public event Func, Task> MessageDeleted + public event Func, ISocketMessageChannel, Task> MessageDeleted { add { _messageDeletedEvent.Add(value); } remove { _messageDeletedEvent.Remove(value); } } - private readonly AsyncEvent, Task>> _messageDeletedEvent = new AsyncEvent, Task>>(); - public event Func, SocketMessage, Task> MessageUpdated + private readonly AsyncEvent, ISocketMessageChannel, Task>> _messageDeletedEvent = new AsyncEvent, ISocketMessageChannel, Task>>(); + public event Func, SocketMessage, ISocketMessageChannel, Task> MessageUpdated { add { _messageUpdatedEvent.Add(value); } remove { _messageUpdatedEvent.Remove(value); } } - private readonly AsyncEvent, SocketMessage, Task>> _messageUpdatedEvent = new AsyncEvent, SocketMessage, Task>>(); - public event Func, SocketReaction, Task> ReactionAdded + private readonly AsyncEvent, SocketMessage, ISocketMessageChannel, Task>> _messageUpdatedEvent = new AsyncEvent, SocketMessage, ISocketMessageChannel, Task>>(); + public event Func, ISocketMessageChannel, SocketReaction, Task> ReactionAdded { add { _reactionAddedEvent.Add(value); } remove { _reactionAddedEvent.Remove(value); } } - private readonly AsyncEvent, SocketReaction, Task>> _reactionAddedEvent = new AsyncEvent, SocketReaction, Task>>(); - public event Func, SocketReaction, Task> ReactionRemoved + private readonly AsyncEvent, ISocketMessageChannel, SocketReaction, Task>> _reactionAddedEvent = new AsyncEvent, ISocketMessageChannel, SocketReaction, Task>>(); + public event Func, ISocketMessageChannel, SocketReaction, Task> ReactionRemoved { add { _reactionRemovedEvent.Add(value); } remove { _reactionRemovedEvent.Remove(value); } } - private readonly AsyncEvent, SocketReaction, Task>> _reactionRemovedEvent = new AsyncEvent, SocketReaction, Task>>(); - public event Func, Task> ReactionsCleared + private readonly AsyncEvent, ISocketMessageChannel, SocketReaction, Task>> _reactionRemovedEvent = new AsyncEvent, ISocketMessageChannel, SocketReaction, Task>>(); + public event Func, ISocketMessageChannel, Task> ReactionsCleared { add { _reactionsClearedEvent.Add(value); } remove { _reactionsClearedEvent.Remove(value); } } - private readonly AsyncEvent, Task>> _reactionsClearedEvent = new AsyncEvent, Task>>(); + private readonly AsyncEvent, ISocketMessageChannel, Task>> _reactionsClearedEvent = new AsyncEvent, ISocketMessageChannel, Task>>(); //Roles public event Func RoleCreated diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index f28d7961d..54ffb348e 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -1265,7 +1265,7 @@ namespace Discord.WebSocket { var guild = (channel as SocketGuildChannel)?.Guild; if (guild != null && !guild.IsSynced) - { + { await _gatewayLogger.DebugAsync("Ignored MESSAGE_UPDATE, guild is not synced yet.").ConfigureAwait(false); return; } @@ -1281,13 +1281,20 @@ namespace Discord.WebSocket else if (data.Author.IsSpecified) { //Edited message isnt in cache, create a detached one - var author = (guild != null ? guild.GetUser(data.Author.Value.Id) : (channel as SocketChannel).GetUser(data.Author.Value.Id)) ?? - SocketSimpleUser.Create(this, State, data.Author.Value); + SocketUser author; + if (guild != null) + author = guild.GetUser(data.Author.Value.Id); + else + author = (channel as SocketChannel).GetUser(data.Author.Value.Id); + if (author == null) + author = SocketSimpleUser.Create(this, State, data.Author.Value); after = SocketMessage.Create(this, State, author, channel, data); } - var cached = new Cached(data.Id, before, channel); - await _messageUpdatedEvent.InvokeAsync(cached, after).ConfigureAwait(false); + if (before != null) + await _messageUpdatedEvent.InvokeAsync(before, after, channel).ConfigureAwait(false); + else + await _messageUpdatedEvent.InvokeAsync(Optional.Create(), after, channel).ConfigureAwait(false); } else { @@ -1299,25 +1306,26 @@ namespace Discord.WebSocket case "MESSAGE_DELETE": { await _gatewayLogger.DebugAsync("Received Dispatch (MESSAGE_DELETE)").ConfigureAwait(false); - + var data = (payload as JToken).ToObject(_serializer); var channel = State.GetChannel(data.ChannelId) as ISocketMessageChannel; if (channel != null) { if (!((channel as SocketGuildChannel)?.Guild.IsSynced ?? true)) - { + { await _gatewayLogger.DebugAsync("Ignored MESSAGE_DELETE, guild is not synced yet.").ConfigureAwait(false); return; } var msg = SocketChannelHelper.RemoveMessage(channel, this, data.Id); - var cached = new Cached(data.Id, msg, channel, isDownloadable: false); + var cacheable = new Cacheable(msg, data.Id, async () => await channel.GetMessageAsync(data.Id) as SocketUserMessage); - await _messageDeletedEvent.InvokeAsync(cached).ConfigureAwait(false); + await _messageDeletedEvent.InvokeAsync(cacheable, channel).ConfigureAwait(false); } else { await _gatewayLogger.WarningAsync("MESSAGE_DELETE referenced an unknown channel.").ConfigureAwait(false); + return; } } break; @@ -1332,11 +1340,11 @@ namespace Discord.WebSocket SocketUserMessage cachedMsg = channel.GetCachedMessage(data.MessageId) as SocketUserMessage; var user = await channel.GetUserAsync(data.UserId, CacheMode.CacheOnly); SocketReaction reaction = SocketReaction.Create(data, channel, cachedMsg, Optional.Create(user)); - var cached = new Cached(data.MessageId, cachedMsg, channel); + var cacheable = new Cacheable(cachedMsg, data.MessageId, async () => await channel.GetMessageAsync(data.MessageId) as SocketUserMessage); cachedMsg?.AddReaction(reaction); - await _reactionAddedEvent.InvokeAsync(cached, reaction).ConfigureAwait(false); + await _reactionAddedEvent.InvokeAsync(cacheable, channel, reaction).ConfigureAwait(false); } else { @@ -1356,15 +1364,16 @@ namespace Discord.WebSocket SocketUserMessage cachedMsg = channel.GetCachedMessage(data.MessageId) as SocketUserMessage; var user = await channel.GetUserAsync(data.UserId, CacheMode.CacheOnly); SocketReaction reaction = SocketReaction.Create(data, channel, cachedMsg, Optional.Create(user)); - var cached = new Cached(data.MessageId, cachedMsg, channel); + var cacheable = new Cacheable(cachedMsg, data.MessageId, async () => await channel.GetMessageAsync(data.MessageId) as SocketUserMessage); cachedMsg?.RemoveReaction(reaction); - await _reactionRemovedEvent.InvokeAsync(cached, reaction).ConfigureAwait(false); + await _reactionRemovedEvent.InvokeAsync(cacheable, channel, reaction).ConfigureAwait(false); } else { await _gatewayLogger.WarningAsync("MESSAGE_REACTION_REMOVE referenced an unknown channel.").ConfigureAwait(false); + return; } break; } @@ -1377,11 +1386,11 @@ namespace Discord.WebSocket if (channel != null) { SocketUserMessage cachedMsg = channel.GetCachedMessage(data.MessageId) as SocketUserMessage; - var cached = new Cached(data.MessageId, cachedMsg, channel); + var cacheable = new Cacheable(cachedMsg, data.MessageId, async () => await channel.GetMessageAsync(data.MessageId) as SocketUserMessage); cachedMsg?.ClearReactions(); - await _reactionsClearedEvent.InvokeAsync(cached); + await _reactionsClearedEvent.InvokeAsync(cacheable, channel).ConfigureAwait(false); } else { @@ -1407,13 +1416,14 @@ namespace Discord.WebSocket foreach (var id in data.Ids) { var msg = SocketChannelHelper.RemoveMessage(channel, this, id); - var cached = new Cached(id, msg, channel, false); - await _messageDeletedEvent.InvokeAsync(cached).ConfigureAwait(false); + var cacheable = new Cacheable(msg, id, async () => await channel.GetMessageAsync(id) as SocketMessage); + await _messageDeletedEvent.InvokeAsync(cacheable, channel).ConfigureAwait(false); } } else { await _gatewayLogger.WarningAsync("MESSAGE_DELETE_BULK referenced an unknown channel.").ConfigureAwait(false); + return; } } break;