private async ValueTask HandleMessageReceived(object sender, MessageReceivedEventArgs e) { BotMessageReceivedEventArgs args = null; if (MessageReceivedServices.Length > 0) { args = new BotMessageReceivedEventArgs(e); foreach (var service in MessageReceivedServices) { try { await service.OnMessageReceived(args).ConfigureAwait(false); } catch (Exception ex) { Logger.LogError(ex, "An exception occurred while executing {0}.{1}().", service.GetType().Name, nameof(DiscordBotService.OnMessageReceived)); } } } if ((args == null || args.ProcessCommands) && e.Message is IGatewayUserMessage message) { var isCommand = await Bot.ProcessCommandsAsync(message, e.Channel).ConfigureAwait(false); if (isCommand) { return; } } if (NonCommandReceivedServices.Length > 0) { args ??= new BotMessageReceivedEventArgs(e); foreach (var service in NonCommandReceivedServices) { try { await service.OnNonCommandReceived(args).ConfigureAwait(false); } catch (Exception ex) { Logger.LogError(ex, "An exception occurred while executing {0}.{1}().", service.GetType().Name, nameof(DiscordBotService.OnNonCommandReceived)); } } } }
/// <summary> /// Fires after a message is received and is known not to be a command, i.e. /// messages sent by bots, messages without a prefix, system messages, etc. /// This also fires for messages with <see cref="BotMessageReceivedEventArgs.ProcessCommands"/> set to <see langword="false"/>. /// </summary> /// <param name="e"> The event data. </param> /// <returns> /// A <see cref="ValueTask"/> representing the handler work. /// </returns> /// <seealso cref="BotMessageReceivedEventArgs.ProcessCommands"/> protected internal virtual ValueTask OnNonCommandReceived(BotMessageReceivedEventArgs e) => default;