Как я могу искать сообщения (встраивания) с определенным «автором» через DiscordSocketClient?

#vb.net #discord.net

#vb.net #discord.net

Вопрос:

Я нахожусь в процессе создания нового бота Discord (разумеется), и я работаю над интеграцией в Twitter с помощью Tweetinvi. У меня большая часть потоков в Twitter работает нормально (по крайней мере, насколько я могу судить по моему упрощенному тестированию), но я хотел, чтобы бот модифицировал / удалял сообщения в Discord, если твит впоследствии будет удален. У Tweetinvi есть TweetDeleted событие, которое я могу использовать, чтобы обнаружить это как часть моего потока, но мне трудно понять, как найти сообщение в Discord.

То, что я хотел бы сделать, это «просто»:

  1. Поиск сообщений (встраиваний) от автора (определенного оригинальным твитом)
  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. 1 Ваш единственный вариант извлечения сообщений — GetMessagesAsync () … discord не предоставляет конечную точку поиска для получения определенных сообщений. 2 Ограничение не равно 100, это значение по умолчанию, вы можете изменить его на все, что пожелаете (все еще не лучший подход). … В идеале вам нужно было бы настроить свой собственный кэш сообщений, который связывает идентификатор сообщения с идентификатором записи в Twitter или любым другим идентификатором, который вы хотите использовать. Когда сообщение в Twitter изменится, проверьте свой кэш на наличие сообщения и соответствующего идентификатора сообщения.

2. Спасибо, @Anu6is — Похоже, это должно быть опубликовано в качестве ответа. Я предполагаю, что моим лучшим вариантом, вероятно, было бы сохранить эти идентификаторы в базе данных SQLite или что-то в этом роде. Это было бы не слишком сложно добавить к боту, хотя я вроде как надеялся избежать добавления еще одного файла и зависимостей в моем приложении. Тем не менее, я мог бы использовать это для какой-то другой цели в моем боте (возможно, я поработаю над мелочью или чем-то еще).

3. В отношении » мягкого ограничения» в 100, о котором я упоминал, когда я пытался найти способ сделать это, многие сообщения в разных местах предполагали, что возврат более 100 вызвал «необычное поведение». Я уже нахожусь на новой территории, поэтому я хочу избежать как можно большего количества потенциальных проблем.

4. Не уверен, почему они так говорят. Кроме задержки при получении большого объема, чего следовало ожидать, потенциальных проблем нет. Библиотека обрабатывает любые возможные сценарии ограничения скорости, которые могут возникнуть

Ответ №1:

  1. Discord не предоставляет ботам конечных точек для поиска / фильтрации по определенным критериям. Единственный способ получить сообщения — использовать GetMessagesAsync() метод
  2. Ограничение для GetMessagesAsync() является технически Int32.MaxValue . 100, которые вы видите, — это просто значение по умолчанию. Это потому, что Discord будет возвращаться порциями; по 100 сообщений за раз. Например, если вы установите ограничение на 1000, вы получите 10 фрагментов из 100.
  3. Возможные проблемы с извлечением большого количества сообщений? Основной проблемой было бы время, необходимое для извлечения сообщений, что могло бы заблокировать шлюз, если не разгрузить процесс для его собственной задачи.

Возможным решением было бы реализовать вашу собственную систему для связывания и хранения сообщений Twitter с сообщениями discord. Это может быть так же просто, как словарь идентификаторов сообщений Twitter и discord post id, который позволил бы вам легко найти идентификатор сообщения, относящийся к данному сообщению в Twitter.