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