| @@ -41,6 +41,8 @@ namespace Discord | |||
| /// Downloads this entity to cache. | |||
| /// </summary> | |||
| /// <returns>An awaitable Task containing the downloaded entity.</returns> | |||
| /// <exception cref="Discord.Net.HttpException">Thrown when used from a user account.</exception> | |||
| /// <exception cref="NullReferenceException">Thrown when the message is deleted.</exception> | |||
| public async Task<TEntity> DownloadAsync() | |||
| { | |||
| return await DownloadFunc(); | |||
| @@ -50,6 +52,8 @@ namespace Discord | |||
| /// Returns the cached entity if it exists; otherwise downloads it. | |||
| /// </summary> | |||
| /// <returns>An awaitable Task containing a cached or downloaded entity.</returns> | |||
| /// <exception cref="Discord.Net.HttpException">Thrown when used from a user account.</exception> | |||
| /// <exception cref="NullReferenceException">Thrown when the message is deleted and is not in cache.</exception> | |||
| public async Task<TEntity> GetOrDownloadAsync() => HasValue ? Value : await DownloadAsync(); | |||
| } | |||
| } | |||
| @@ -1,5 +1,6 @@ | |||
| using System; | |||
| using System.Threading.Tasks; | |||
| using Discord.Net; | |||
| namespace Discord.WebSocket | |||
| { | |||
| @@ -33,36 +34,36 @@ namespace Discord.WebSocket | |||
| remove { _messageReceivedEvent.Remove(value); } | |||
| } | |||
| private readonly AsyncEvent<Func<SocketMessage, Task>> _messageReceivedEvent = new AsyncEvent<Func<SocketMessage, Task>>(); | |||
| public event Func<Cacheable<SocketMessage, ulong>, ISocketMessageChannel, Task> MessageDeleted | |||
| public event Func<Cacheable<IMessage, ulong>, ISocketMessageChannel, Task> MessageDeleted | |||
| { | |||
| add { _messageDeletedEvent.Add(value); } | |||
| remove { _messageDeletedEvent.Remove(value); } | |||
| } | |||
| private readonly AsyncEvent<Func<Cacheable<SocketMessage, ulong>, ISocketMessageChannel, Task>> _messageDeletedEvent = new AsyncEvent<Func<Cacheable<SocketMessage, ulong>, ISocketMessageChannel, Task>>(); | |||
| public event Func<Cacheable<SocketMessage, ulong>, SocketMessage, ISocketMessageChannel, Task> MessageUpdated | |||
| private readonly AsyncEvent<Func<Cacheable<IMessage, ulong>, ISocketMessageChannel, Task>> _messageDeletedEvent = new AsyncEvent<Func<Cacheable<IMessage, ulong>, ISocketMessageChannel, Task>>(); | |||
| public event Func<Cacheable<IMessage, ulong>, SocketMessage, ISocketMessageChannel, Task> MessageUpdated | |||
| { | |||
| add { _messageUpdatedEvent.Add(value); } | |||
| remove { _messageUpdatedEvent.Remove(value); } | |||
| } | |||
| private readonly AsyncEvent<Func<Cacheable<SocketMessage, ulong>, SocketMessage, ISocketMessageChannel, Task>> _messageUpdatedEvent = new AsyncEvent<Func<Cacheable<SocketMessage, ulong>, SocketMessage, ISocketMessageChannel, Task>>(); | |||
| public event Func<Cacheable<SocketUserMessage, ulong>, ISocketMessageChannel, SocketReaction, Task> ReactionAdded | |||
| private readonly AsyncEvent<Func<Cacheable<IMessage, ulong>, SocketMessage, ISocketMessageChannel, Task>> _messageUpdatedEvent = new AsyncEvent<Func<Cacheable<IMessage, ulong>, SocketMessage, ISocketMessageChannel, Task>>(); | |||
| public event Func<Cacheable<IUserMessage, ulong>, ISocketMessageChannel, SocketReaction, Task> ReactionAdded | |||
| { | |||
| add { _reactionAddedEvent.Add(value); } | |||
| remove { _reactionAddedEvent.Remove(value); } | |||
| } | |||
| private readonly AsyncEvent<Func<Cacheable<SocketUserMessage, ulong>, ISocketMessageChannel, SocketReaction, Task>> _reactionAddedEvent = new AsyncEvent<Func<Cacheable<SocketUserMessage, ulong>, ISocketMessageChannel, SocketReaction, Task>>(); | |||
| public event Func<Cacheable<SocketUserMessage, ulong>, ISocketMessageChannel, SocketReaction, Task> ReactionRemoved | |||
| private readonly AsyncEvent<Func<Cacheable<IUserMessage, ulong>, ISocketMessageChannel, SocketReaction, Task>> _reactionAddedEvent = new AsyncEvent<Func<Cacheable<IUserMessage, ulong>, ISocketMessageChannel, SocketReaction, Task>>(); | |||
| public event Func<Cacheable<IUserMessage, ulong>, ISocketMessageChannel, SocketReaction, Task> ReactionRemoved | |||
| { | |||
| add { _reactionRemovedEvent.Add(value); } | |||
| remove { _reactionRemovedEvent.Remove(value); } | |||
| } | |||
| private readonly AsyncEvent<Func<Cacheable<SocketUserMessage, ulong>, ISocketMessageChannel, SocketReaction, Task>> _reactionRemovedEvent = new AsyncEvent<Func<Cacheable<SocketUserMessage, ulong>, ISocketMessageChannel, SocketReaction, Task>>(); | |||
| public event Func<Cacheable<SocketUserMessage, ulong>, ISocketMessageChannel, Task> ReactionsCleared | |||
| private readonly AsyncEvent<Func<Cacheable<IUserMessage, ulong>, ISocketMessageChannel, SocketReaction, Task>> _reactionRemovedEvent = new AsyncEvent<Func<Cacheable<IUserMessage, ulong>, ISocketMessageChannel, SocketReaction, Task>>(); | |||
| public event Func<Cacheable<IUserMessage, ulong>, ISocketMessageChannel, Task> ReactionsCleared | |||
| { | |||
| add { _reactionsClearedEvent.Add(value); } | |||
| remove { _reactionsClearedEvent.Remove(value); } | |||
| } | |||
| private readonly AsyncEvent<Func<Cacheable<SocketUserMessage, ulong>, ISocketMessageChannel, Task>> _reactionsClearedEvent = new AsyncEvent<Func<Cacheable<SocketUserMessage, ulong>, ISocketMessageChannel, Task>>(); | |||
| private readonly AsyncEvent<Func<Cacheable<IUserMessage, ulong>, ISocketMessageChannel, Task>> _reactionsClearedEvent = new AsyncEvent<Func<Cacheable<IUserMessage, ulong>, ISocketMessageChannel, Task>>(); | |||
| //Roles | |||
| public event Func<SocketRole, Task> RoleCreated | |||
| @@ -59,36 +59,36 @@ namespace Discord.WebSocket | |||
| remove { _messageReceivedEvent.Remove(value); } | |||
| } | |||
| private readonly AsyncEvent<Func<SocketMessage, Task>> _messageReceivedEvent = new AsyncEvent<Func<SocketMessage, Task>>(); | |||
| public event Func<Cacheable<SocketMessage, ulong>, ISocketMessageChannel, Task> MessageDeleted | |||
| public event Func<Cacheable<IMessage, ulong>, ISocketMessageChannel, Task> MessageDeleted | |||
| { | |||
| add { _messageDeletedEvent.Add(value); } | |||
| remove { _messageDeletedEvent.Remove(value); } | |||
| } | |||
| private readonly AsyncEvent<Func<Cacheable<SocketMessage, ulong>, ISocketMessageChannel, Task>> _messageDeletedEvent = new AsyncEvent<Func<Cacheable<SocketMessage, ulong>, ISocketMessageChannel, Task>>(); | |||
| public event Func<Cacheable<SocketMessage, ulong>, SocketMessage, ISocketMessageChannel, Task> MessageUpdated | |||
| private readonly AsyncEvent<Func<Cacheable<IMessage, ulong>, ISocketMessageChannel, Task>> _messageDeletedEvent = new AsyncEvent<Func<Cacheable<IMessage, ulong>, ISocketMessageChannel, Task>>(); | |||
| public event Func<Cacheable<IMessage, ulong>, SocketMessage, ISocketMessageChannel, Task> MessageUpdated | |||
| { | |||
| add { _messageUpdatedEvent.Add(value); } | |||
| remove { _messageUpdatedEvent.Remove(value); } | |||
| } | |||
| private readonly AsyncEvent<Func<Cacheable<SocketMessage, ulong>, SocketMessage, ISocketMessageChannel, Task>> _messageUpdatedEvent = new AsyncEvent<Func<Cacheable<SocketMessage, ulong>, SocketMessage, ISocketMessageChannel, Task>>(); | |||
| public event Func<Cacheable<SocketUserMessage, ulong>, ISocketMessageChannel, SocketReaction, Task> ReactionAdded | |||
| private readonly AsyncEvent<Func<Cacheable<IMessage, ulong>, SocketMessage, ISocketMessageChannel, Task>> _messageUpdatedEvent = new AsyncEvent<Func<Cacheable<IMessage, ulong>, SocketMessage, ISocketMessageChannel, Task>>(); | |||
| public event Func<Cacheable<IUserMessage, ulong>, ISocketMessageChannel, SocketReaction, Task> ReactionAdded | |||
| { | |||
| add { _reactionAddedEvent.Add(value); } | |||
| remove { _reactionAddedEvent.Remove(value); } | |||
| } | |||
| private readonly AsyncEvent<Func<Cacheable<SocketUserMessage, ulong>, ISocketMessageChannel, SocketReaction, Task>> _reactionAddedEvent = new AsyncEvent<Func<Cacheable<SocketUserMessage, ulong>, ISocketMessageChannel, SocketReaction, Task>>(); | |||
| public event Func<Cacheable<SocketUserMessage, ulong>, ISocketMessageChannel, SocketReaction, Task> ReactionRemoved | |||
| private readonly AsyncEvent<Func<Cacheable<IUserMessage, ulong>, ISocketMessageChannel, SocketReaction, Task>> _reactionAddedEvent = new AsyncEvent<Func<Cacheable<IUserMessage, ulong>, ISocketMessageChannel, SocketReaction, Task>>(); | |||
| public event Func<Cacheable<IUserMessage, ulong>, ISocketMessageChannel, SocketReaction, Task> ReactionRemoved | |||
| { | |||
| add { _reactionRemovedEvent.Add(value); } | |||
| remove { _reactionRemovedEvent.Remove(value); } | |||
| } | |||
| private readonly AsyncEvent<Func<Cacheable<SocketUserMessage, ulong>, ISocketMessageChannel, SocketReaction, Task>> _reactionRemovedEvent = new AsyncEvent<Func<Cacheable<SocketUserMessage, ulong>, ISocketMessageChannel, SocketReaction, Task>>(); | |||
| public event Func<Cacheable<SocketUserMessage, ulong>, ISocketMessageChannel, Task> ReactionsCleared | |||
| private readonly AsyncEvent<Func<Cacheable<IUserMessage, ulong>, ISocketMessageChannel, SocketReaction, Task>> _reactionRemovedEvent = new AsyncEvent<Func<Cacheable<IUserMessage, ulong>, ISocketMessageChannel, SocketReaction, Task>>(); | |||
| public event Func<Cacheable<IUserMessage, ulong>, ISocketMessageChannel, Task> ReactionsCleared | |||
| { | |||
| add { _reactionsClearedEvent.Add(value); } | |||
| remove { _reactionsClearedEvent.Remove(value); } | |||
| } | |||
| private readonly AsyncEvent<Func<Cacheable<SocketUserMessage, ulong>, ISocketMessageChannel, Task>> _reactionsClearedEvent = new AsyncEvent<Func<Cacheable<SocketUserMessage, ulong>, ISocketMessageChannel, Task>>(); | |||
| private readonly AsyncEvent<Func<Cacheable<IUserMessage, ulong>, ISocketMessageChannel, Task>> _reactionsClearedEvent = new AsyncEvent<Func<Cacheable<IUserMessage, ulong>, ISocketMessageChannel, Task>>(); | |||
| //Roles | |||
| public event Func<SocketRole, Task> RoleCreated | |||
| @@ -1292,7 +1292,7 @@ namespace Discord.WebSocket | |||
| after = SocketMessage.Create(this, State, author, channel, data); | |||
| } | |||
| var cacheableBefore = new Cacheable<SocketMessage, ulong>(before, data.Id, async () => await channel.GetMessageAsync(data.Id) as SocketMessage); | |||
| var cacheableBefore = new Cacheable<IMessage, ulong>(before, data.Id, async () => await channel.GetMessageAsync(data.Id)); | |||
| await _messageUpdatedEvent.InvokeAsync(cacheableBefore, after, channel).ConfigureAwait(false); | |||
| } | |||
| @@ -1318,7 +1318,7 @@ namespace Discord.WebSocket | |||
| } | |||
| var msg = SocketChannelHelper.RemoveMessage(channel, this, data.Id); | |||
| var cacheable = new Cacheable<SocketMessage, ulong>(msg, data.Id, async () => await channel.GetMessageAsync(data.Id) as SocketUserMessage); | |||
| var cacheable = new Cacheable<IMessage, ulong>(msg, data.Id, async () => await channel.GetMessageAsync(data.Id)); | |||
| await _messageDeletedEvent.InvokeAsync(cacheable, channel).ConfigureAwait(false); | |||
| } | |||
| @@ -1340,7 +1340,7 @@ 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 cacheable = new Cacheable<SocketUserMessage, ulong>(cachedMsg, data.MessageId, async () => await channel.GetMessageAsync(data.MessageId) as SocketUserMessage); | |||
| var cacheable = new Cacheable<IUserMessage, ulong>(cachedMsg, data.MessageId, async () => await channel.GetMessageAsync(data.MessageId) as IUserMessage); | |||
| cachedMsg?.AddReaction(reaction); | |||
| @@ -1364,7 +1364,7 @@ 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 cacheable = new Cacheable<SocketUserMessage, ulong>(cachedMsg, data.MessageId, async () => await channel.GetMessageAsync(data.MessageId) as SocketUserMessage); | |||
| var cacheable = new Cacheable<IUserMessage, ulong>(cachedMsg, data.MessageId, async () => await channel.GetMessageAsync(data.MessageId) as IUserMessage); | |||
| cachedMsg?.RemoveReaction(reaction); | |||
| @@ -1386,7 +1386,7 @@ namespace Discord.WebSocket | |||
| if (channel != null) | |||
| { | |||
| SocketUserMessage cachedMsg = channel.GetCachedMessage(data.MessageId) as SocketUserMessage; | |||
| var cacheable = new Cacheable<SocketUserMessage, ulong>(cachedMsg, data.MessageId, async () => await channel.GetMessageAsync(data.MessageId) as SocketUserMessage); | |||
| var cacheable = new Cacheable<IUserMessage, ulong>(cachedMsg, data.MessageId, async () => await channel.GetMessageAsync(data.MessageId) as IUserMessage); | |||
| cachedMsg?.ClearReactions(); | |||
| @@ -1416,7 +1416,7 @@ namespace Discord.WebSocket | |||
| foreach (var id in data.Ids) | |||
| { | |||
| var msg = SocketChannelHelper.RemoveMessage(channel, this, id); | |||
| var cacheable = new Cacheable<SocketMessage, ulong>(msg, id, async () => await channel.GetMessageAsync(id) as SocketMessage); | |||
| var cacheable = new Cacheable<IMessage, ulong>(msg, id, async () => await channel.GetMessageAsync(id)); | |||
| await _messageDeletedEvent.InvokeAsync(cacheable, channel).ConfigureAwait(false); | |||
| } | |||
| } | |||