如何通过 DiscordSocketClient 搜索具有特定 'author' 的消息(嵌入)?

How can I search for messages (embeds) with a particular 'author' through DiscordSocketClient?

我正在构建一个新的 Discord 机器人(当然),并且我一直在使用 Tweetinvi 进行 Twitter 集成。我已经让大多数 Twitter 流媒体位正常工作(至少,据我在简化测试中所知道的那样),但我想在 Discord 中使用 bot modify/delete posts 如果推文随后被删除。 Tweetinvi 有一个 TweetDeleted 事件,我可以用它来检测它作为我的流的一部分,但我很难弄清楚如何在 Discord 中找到 post。

喜欢做的是“简单”:

  1. 从作者(由原始推文定义)搜索 posts(嵌入)
  2. 在嵌入
  3. 中找到具有匹配 .Url 值的 post
  4. 将 post 替换为类似“THIS TWEET WAS DELETED”的消息。

我 运行 遇到的问题是,我似乎无法找到执行“第 1 步”的方法 - 搜索并 return 任何 post来自指定的作者。到目前为止我发现的唯一选项是 GetMessagesAsync 方法,但它似乎没有办法过滤结果。另外,有了 100 条消息的“软限制”,我担心我仍然找不到要删除的消息。

我 post 在我的 class 中使用 DiscordSocketClient 对象的嵌入是这样的:

Me.A1FDiscordClient.GetGuild(Server.ID).GetTextChannel(PostingChannel).SendMessageAsync(MessageText.Trim, False, TweetBuilder.Build)

我已经开始为 deletion/modification 做一些类似的事情,但我想我现在只是在转动我的轮子:

Dim Messages = Me.A1FDiscordClient.GetGuild(Server.ID).GetTextChannel(PostingChannel).GetMessagesAsync(100)

我可能太笨了 and/or 完全忽略了一些东西,但我什至不确定一旦我拥有它该怎么办。我正在考虑使用 .Select(Of TResult),但我想我只是把自己搞得太扭曲了。我不一定需要一个完整的解决方案,但我真的可以请别人给我一个正确的方向。

  1. Discord 不会根据特定标准为 search/filter 机器人提供端点。检索消息的唯一方法是使用 GetMessagesAsync() 方法
  2. 技术上 GetMessagesAsync() 的限制是 Int32.MaxValue。您看到的 100 只是默认值。这是因为 Discord 将 return 分块;一次 100 条消息。例如,如果您将限制设置为 1000,您将获得 10 个 100 块。
  3. 检索大量消息可能会出现问题?主要问题是检索消息所花费的时间长度,这可能会阻塞网关,除非将该过程卸载到它自己的任务中。

一个可能的解决方案是实现您自己的系统,用于链接和存储 Twitter posts 到 discord posts。可以像 Twitter post id 和 discord post id 的字典一样简单,它可以让你轻松找到与给定 twitter post.

相关的消息 id