using System; using System.Linq; using System.Threading.Tasks; using Discord.WebSocket; using JetBrains.Annotations; namespace Discord.Net.Examples.WebSocket { [PublicAPI] internal class BaseSocketClientExamples { #region ReactionAdded public void HookReactionAdded(BaseSocketClient client) => client.ReactionAdded += HandleReactionAddedAsync; public async Task HandleReactionAddedAsync(Cacheable cachedMessage, Cacheable originChannel, SocketReaction reaction) { var message = await cachedMessage.GetOrDownloadAsync(); if (message != null && reaction.User.IsSpecified) Console.WriteLine($"{reaction.User.Value} just added a reaction '{reaction.Emote}' " + $"to {message.Author}'s message ({message.Id})."); } #endregion #region ChannelCreated public void HookChannelCreated(BaseSocketClient client) => client.ChannelCreated += HandleChannelCreated; public Task HandleChannelCreated(SocketChannel channel) { if (channel is SocketGuildChannel guildChannel) Console.WriteLine($"A new channel '{guildChannel.Name}'({guildChannel.Id}, {guildChannel.GetType()})" + $"has been created at {guildChannel.CreatedAt}."); return Task.CompletedTask; } #endregion #region ChannelDestroyed public void HookChannelDestroyed(BaseSocketClient client) => client.ChannelDestroyed += HandleChannelDestroyed; public Task HandleChannelDestroyed(SocketChannel channel) { if (channel is SocketGuildChannel guildChannel) Console.WriteLine( $"A new channel '{guildChannel.Name}'({guildChannel.Id}, {guildChannel.GetType()}) has been deleted."); return Task.CompletedTask; } #endregion #region ChannelUpdated public void HookChannelUpdated(BaseSocketClient client) => client.ChannelUpdated += HandleChannelRename; public Task HandleChannelRename(SocketChannel beforeChannel, SocketChannel afterChannel) { if (beforeChannel is SocketGuildChannel beforeGuildChannel && afterChannel is SocketGuildChannel afterGuildChannel) if (beforeGuildChannel.Name != afterGuildChannel.Name) Console.WriteLine( $"A channel ({beforeChannel.Id}) is renamed from {beforeGuildChannel.Name} to {afterGuildChannel.Name}."); return Task.CompletedTask; } #endregion #region MessageReceived private readonly ulong[] _targetUserIds = {168693960628371456, 53905483156684800}; public void HookMessageReceived(BaseSocketClient client) => client.MessageReceived += HandleMessageReceived; public Task HandleMessageReceived(SocketMessage message) { // check if the message is a user message as opposed to a system message (e.g. Clyde, pins, etc.) if (!(message is SocketUserMessage userMessage)) return Task.CompletedTask; // check if the message origin is a guild message channel if (!(userMessage.Channel is SocketTextChannel textChannel)) return Task.CompletedTask; // check if the target user was mentioned var targetUsers = userMessage.MentionedUsers.Where(x => _targetUserIds.Contains(x.Id)); foreach (var targetUser in targetUsers) Console.WriteLine( $"{targetUser} was mentioned in the message '{message.Content}' by {message.Author} in {textChannel.Name}."); return Task.CompletedTask; } #endregion #region MessageDeleted public void HookMessageDeleted(BaseSocketClient client) => client.MessageDeleted += HandleMessageDelete; public async Task HandleMessageDelete(Cacheable cachedMessage, Cacheable cachedChannel) { // check if the message exists in cache; if not, we cannot report what was removed if (!cachedMessage.HasValue) return; // gets or downloads the channel if it's not in the cache IMessageChannel channel = await cachedChannel.GetOrDownloadAsync(); var message = cachedMessage.Value; Console.WriteLine( $"A message ({message.Id}) from {message.Author} was removed from the channel {channel.Name} ({channel.Id}):" + Environment.NewLine + message.Content); } #endregion } }