private async Task DiscordReactionAdded(DiscordClient sender, MessageReactionAddEventArgs e) { await Task.Delay(0); if (!e.User.IsCurrent && !e.User.IsBot) { if (MessageReactionListeners.TryGetValue(e.Guild.Id, out var guildMessageReactionListeners)) { if (guildMessageReactionListeners.TryGetValue(e.Message.Id, out var reactionListeners)) { foreach (var listener in reactionListeners) { try { await listener.OnReactionAdd(e); } catch (Exception exc) { await SendException(this, new SendExceptionEventArgs { Exception = exc, Channel = e.Channel, LogExceptionType = "GenericExceptionNotCaught" }); } } } } } }
public void AddReactionListener(object sender, ulong guildId, ulong messageId, IReactionListener reactionListener) { if (!MessageReactionListeners.ContainsKey(guildId)) { MessageReactionListeners.Add(guildId, new Dictionary <ulong, List <IReactionListener> >()); } if (!MessageReactionListeners[guildId].ContainsKey(messageId)) { MessageReactionListeners[guildId].Add(messageId, new List <IReactionListener> { reactionListener }); } else { MessageReactionListeners[guildId][messageId].Add(reactionListener); } }
public void RemoveReactionListener(object sender, ulong guildId, ulong messageId, IReactionListener reactionListener) { if (MessageReactionListeners.ContainsKey(guildId) && MessageReactionListeners[guildId].ContainsKey(messageId)) { MessageReactionListeners[guildId][messageId].Remove(reactionListener); if (MessageReactionListeners[guildId][messageId].Count == 0) { MessageReactionListeners[guildId].Remove(messageId); } if (MessageReactionListeners[guildId].Count == 0) { MessageReactionListeners.Remove(guildId); } } if (reactionListener is IDisposable disposable) { disposable.Dispose(); } }
public async Task RemoveCommand(object o, ulong guildId, string classTerm) { var command = GuildCommands[guildId][classTerm]; int messageListenerCount = 0; int reactionListenerCount = 0; if (GuildMessageListeners.ContainsKey(guildId)) { foreach (var messageListener in GuildMessageListeners[guildId].Where(ml => ml.Command == command).ToList()) { RemoveMessageListener(o, guildId, messageListener); ++messageListenerCount; } } if (MessageReactionListeners.ContainsKey(guildId)) { foreach (var messageId in MessageReactionListeners[guildId].Keys.ToList()) { foreach (var reactionListener in MessageReactionListeners[guildId][messageId].Where(rl => rl.Command == command).ToList()) { RemoveReactionListener(o, guildId, messageId, reactionListener); ++reactionListenerCount; } } } GuildCommands[guildId].Remove(classTerm); if (command is IDisposable disposable) { disposable.Dispose(); } Log(this, new LogEventArgs { Type = LogType.Log, Message = $"Successfully unloaded module {command.GetType().FullName}, {messageListenerCount} message listener{(messageListenerCount == 1 ? string.Empty : "s")}, and {reactionListenerCount} reaction listener{(reactionListenerCount == 1 ? string.Empty : "s")}" }); await Task.Delay(0); }