如何通过DiscordSocketClient搜索具有特定“作者”的消息嵌入?

问题描述

我正在构建一个新的discord机器人(当然),并且我一直在使用Tweetinvi进行Twitter集成。我已经使大多数Twitter流媒体位正常工作(至少,据我在简化测试中所知),但是如果随后删除了Tweet,我希望让该机器人在discord中修改/删除帖子。 tweetinvi一个TweetDeleted事件,我可以用它来检测它是否是流中的一部分,但是我很难弄清楚如何在discord中找到该帖子。

想要要做的是“简单”:

  1. 搜索作者的帖子(嵌入)(由原始Tweet定义)
  2. 在嵌入中找到具有匹配的.Url值的帖子
  3. 用“ THIS TWEET WAS DELETED ”之类的消息替换该帖子。

但是,我遇到的问题是我似乎找不到找到“步骤1”的方法-搜索并返回指定作者的任何帖子。到目前为止,我发现的唯一选择是GetMessagesAsync方法,但这似乎没有过滤结果的方法。另外,由于有100条消息的“软限制”,我担心仍然找不到要删除的消息。

我在班级中使用discordSocketClient对象发布嵌入内容

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

我已经开始为删除/修改做类似的事情,但是我想我现在只是在旋转轮子:

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

我可能正沉着和/或完全忽略了某些东西,但是一旦获得它,我什至不知道该怎么办。我当时正在考虑使用.Select(Of TResult),但我想我只是太纠结了。我不一定需要一个完整的解决方案,但我真的可以请别人朝正确的方向推一下我。

解决方法

  1. Discord没有为Bot提供终结点来根据特定条件进行搜索/过滤。检索消息的唯一方法是使用GetMessagesAsync()方法
  2. 从技术上讲,GetMessagesAsync()的限制为Int32.MaxValue。您看到的100只是默认值。这是因为Discord将分块返回;一次100条消息。例如,如果将限制设置为1000,则会得到10个100的块。
  3. 检索大量消息可能有问题吗?主要问题是检索消息所花费的时间长,这可能会阻塞网关,除非将过程分担给自己的任务。

一个可能的解决方案是实施您自己的系统,以将Twitter帖子链接和存储到不和谐的帖子。可能就像Twitter帖子ID和Discord帖子ID的字典一样简单,这将使您轻松找到与给定Twitter帖子相关的消息ID。