【问题标题】:Receiving a Discord.Net 2000 character limit warning when I am not sending a message当我不发送消息时收到 Discord.Net 2000 字符限制警告
【发布时间】:2020-04-20 17:00:07
【问题描述】:

我在下面有一个命令,它应该向上下文通道发送一个随机单词。

[Command("word"), Summary("Chooses a random English word.")]
public async Task RandomWord(string culture = "uk")
{
    if (culture == "uk")
    {
        // Reads all the lines of the word list.  
        var allLines = File.ReadAllLines(Resources.english_uk_wordlist);

        // Chooses a random line and its word.
        var word = allLines[_random.Next(0, allLines.Length - 1)];

        // Sends random chosen word to channel.
        await ReplyAsync(word.First().ToString().ToUpper() + word.Substring(1));
    }
}

但是,我收到错误消息,提示我已超出 Discord 在此行的 2000 个字符消息限制。

var allLines = File.ReadAllLines(Resources.english_uk_wordlist);

这对我来说很奇怪,因为阅读这些行应该与 Discord.Net 或 Discord 的 API 无关。需要注意的是,当我将此文本文件放在我的Resources.resx 之外时,它可以正常工作。

我也尝试过使用StreamReader,这会导致同样的问题。如果有帮助,allLines.Length 的值为 854236。

谢谢。

【问题讨论】:

  • 答案属于 answers,未编辑到问题中。当其中一个答案接受时,问题已成功回答,而不是编辑问题的标题。如果您希望检索内容并使用它来编写答案,您编辑到问题中的答案仍然在编辑历史记录中可用。
  • 我的错,我没有看到你的 cmets。我会在适当的时候做出必要的改变。
  • @Damien_The_Unbeliever:我认为你的 cmets 已经过时了,因为 OP 在答案中回答了这个问题。

标签: c# bots discord discord.net


【解决方案1】:

如果你能分辨出allLines.Length的值,那么ReadAllLines一定是成功的。我认为await 让调试器感到困惑。

await 的行上设置断点。在调试模式下编译和运行。那么 Discord 将不会受到影响。它还可以让您查看 word 变量中的内容。

请注意,Random.Next(min, max) 的上限是独占的。所以应该是_random.Next(0, allLines.Length),除非最后一行是空的。

【讨论】:

  • 我也怀疑过;然而,情况似乎并非如此。如果我注释掉除var allLines = File.ReadAllLines(Resources.english_uk_wordlist); 之外的所有内容,我仍然会收到 2000 字符限制错误。在调试器中,allLinesword 的值似乎是null
  • @MatthewTrip:如果代码不存在,有几个选项:a)你正在调试一个过时的程序集,b)你正在使用一个过时的 pdb,c )您正在调试程序集/ pdb 不匹配(进行发布构建可能会导致这种情况),d)您的 IDE 搞砸了,需要重新启动。 e) 您没有使用来自System.IOFile。在任何情况下;你在哪里File.ReadAllLines(Resources.english_uk_wordlist)discord无关;这样该行就不会导致错误。
  • @Stefan 我已经解决了我的问题 :) 请查看帖子中的编辑。
【解决方案2】:

问题在于Resources.english_wordlist_uk 是字符串,而不是路径。

代码 A

var location = Resources.english_wordlist_uk;
var readText = File.ReadAllLines(location);

上面的代码读取Resources.english_wordlist_uk并将其内容用作路径。它不会将文件本身识别为路径。

代码 B

var location = Resources.english_wordlist_uk;
using (StringReader sr = new StringReader(location))
{
    var readText = sr.ReadToEndAsync();
}

此代码读取Resources.english_wordlist_uk 的内容,就好像它是一个字符串,导致readText 是文件的全部内容。

说明

我收到 2000 个字符限制错误的原因是 代码 A。由于Resources.english_uk_wordlist 的内容不是路径,因此错误消息类似于:“指定的路径(文件内容)不存在。”

由于我的命令处理程序在通道中发送错误消息,并且错误消息是数十万个字符,因此 Discord 无法发送错误消息。 代码 B 是我的问题的干净解决方案。

【讨论】:

  • 您好,如果回答了您的问题,请将您的答案标记为答案?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-20
  • 1970-01-01
  • 2023-03-19
  • 2018-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多