Discord.NET C# MessageReceived 被调用太多次

Posted

技术标签:

【中文标题】Discord.NET C# MessageReceived 被调用太多次【英文标题】:Discord.NET C# MessageReceived getting called too many times 【发布时间】:2018-02-09 19:52:16 【问题描述】:

我尝试了从 discord.net 的 github 页面复制的这段代码,这个代码运行良好:

using Discord;
using Discord.WebSocket;
using System;
using System.Threading.Tasks;


namespace Adivisor

public class Program

    private DiscordSocketClient _client;
    public static void Main(string[] args) => new Program().MainAsync().GetAwaiter().GetResult();

    public async Task MainAsync()
    
        _client = new DiscordSocketClient();
        _client.Log += Log;
        _client.MessageReceived += MessageReceived;

        string token = ":P"; 

        await _client.LoginAsync(TokenType.Bot, token);
        await _client.StartAsync();
        await Task.Delay(-1);

    

    private async Task MessageReceived(SocketMessage message)
    
        if (message.Content == "!hi")
        
            await message.Channel.SendMessageAsync("Hello!");
        
    

    private Task Log(LogMessage msg)
    
        Console.WriteLine(msg.ToString());
        return Task.CompletedTask;
    

   

在我对 MessageReceived 进行了一些编辑后,现在它看起来像这样:

private async Task MessageReceived(SocketMessage message)

    await message.Channel.SendMessageAsync("Hello!");

实际上我只是删除了 if,但有很大的不同,似乎没有 if MessageReceived 被永远调用......

【问题讨论】:

那是因为“你好!”触发MessageReceived,从而导致无限循环。 谢谢现在一切都说得通了:D 如果没记错的话,我应该从下面的列表中选择一个答案,但你没有回答而是发表评论,所以......可以这样留下问题吗? 是的,没关系。 【参考方案1】:

就像 Xiaoy312 所说的,每当您的机器人发送消息时,它也会收到它自己的消息。 (这同样适用于您自己的用户帐户!尝试在聊天中执行 @everyone ping,即使是您发送的,您也会看到它被突出显示。)

您可以通过执行以下操作让您的机器人忽略其他机器人消息:

//Ignores all bots messages
//Where message is your received SocketMessage
if (message.Author.IsBot)  return; 

或者你可以让它检查消息的作者 ID 是否等于机器人的 ID。您可以查看文档here。

【讨论】:

以上是关于Discord.NET C# MessageReceived 被调用太多次的主要内容,如果未能解决你的问题,请参考以下文章

Discord.NET C# MessageReceived 被调用太多次

C# Discord.Net“上下文”

Discord.NET c# SocketUser 返回 null

对于 AddModulesAsync (C# Discord.Net),我没有正确的论据

C# Discord.NET 加入语音频道时出错

如何使用嵌入discord.net webhook c#发送文件附件