Discord js Отправка сообщений через BroadEval

я немного гуглю и не могу найти реального ответа, так как шардинг кажется не очень популярным аргументом, тогда мы здесь.

Я пытаюсь справиться с шардингом в своем боте, и у меня возникла проблема. У меня есть пользовательские события, которые принимают сообщения в качестве параметра, и я схожу с ума, чтобы позволить им работать с трансляцией Eval.

я пробовал ${message} и не работает, так как он сериализует только текст, и мне нужен объект

я пробовал JSON.stringify и не работает по той же причине

я немного застрял. я использую дискорд JS

это функция вызывающего абонента

  function test2(_guild_id, _args, _message, gameInfo, _originalMessage, reaction_id){

   let msg = JSON.stringify(_message);
   let cmd = "command";
   let args = "args";
   let rights = 0;

   let stringToEval = `
   this.emit("SHARE_DATA", "${_message}", {
     guild_id: ${_guild_id},
     cmd: ${cmd},
     args: ${args},
     rights: ${rights}
   });
   `;
   log.debug(stringToEval);
/*
   // this is not working. I receive any sort of exceptions related to the fact
   // that it is serializing the text of the message only
   discordClient.shard.broadcastEval(stringToEval);
/*/
// this is working as intended
discordClient.emit("SHARE_DATA", _message, {
    guild_id: _guild_id,
    cmd: cmd,
    args: args,
    rights: rights
  });
//*/

}

а это слушатель

client.on("SHARE_DATA", (message, support) => {
  log.debug("Let's see if this shard id can be found .... it should be "+registered_shard_id);
  log.debug(`received message ${message} with support ${support}`);
  log.debug("we are on shard "+JSON.stringify(client.shard));
});

с обычными событиями и приложением с одним сегментом, как сейчас, когда событие срабатывает правильно, без проблем, я просто добавляю discordClient.emit, и все в порядке. но BroadEval хочет строку, поэтому мне нужно сериализовать сообщение

Обновлено: широковещательная оценка с использованием переменной msg (JSON.stringified) вызывает эту ошибку

[DEBUG] [2020-12-14_09:58:35] [1|GodCommands]: 
   this.emit("SHARE_DATA", "{"channelID":"752335384037294160","deleted":false,"id":"787981855374442526","type":"DEFAULT","content":",test2","authorID":"323030704348987404","pinned":false,"tts":false,"nonce":"787981857693106176","system":false,"embeds":[],"attachments":[],"createdTimestamp":1607939914316,"editedTimestamp":null,"webhookID":null,"applicationID":null,"activity":null,"flags":0,"reference":null,"guildID":"511487725849804804","cleanContent":",test2"}", {
     guild_id: 511487725849804804,
     cmd: command,
     args: args,
     rights: 0
   });
   
[ERROR] [2020-12-14_09:58:35] [1|RotBot]: SyntaxError: missing ) after argument list
    at Client._eval (E:\Sviluppo\Swgoh\Bot\RotBot2\node_modules\discord.js\src\client\Client.js:391:17)
    at ShardClientUtil._handleMessage (E:\Sviluppo\Swgoh\Bot\RotBot2\node_modules\discord.js\src\sharding\ShardClientUtil.js:185:82)
    at process.emit (events.js:326:22)
    at emit (internal/child_process.js:906:12)
    at processTicksAndRejections (internal/process/task_queues.js:81:21)

Работает ли `this.emit("SHARE_DATA", ${msg}, {`?

PLASMA chicken 14.12.2020 08:36

@PLASMAchicken, к сожалению, нет, я получаю ошибки во время выполнения

Alex75 14.12.2020 10:56

При редактировании вы использовали ${msg} или "${msg}"?

PLASMA chicken 15.12.2020 12:33

@PLASMAchicken извините за задержку, я на самом деле использовал совершенно другую стратегию. я думаю, что пробовал оба

Alex75 13.01.2021 12:40
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
526
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я закончил использовать другой подход На самом деле я сохраняю сериализованный объект в базе данных только с данными и без методов.

затем я просто отправляю идентификатор БД, и обработчик событий реконструирует сообщение, подобное этому

    message = new Discord.Message(discordClient, {
      id: msg.id,
      type: msg.type,
      content: msg.content,
      author: usr,
      pinned: msg.pinned,
      tts: msg.tts,
      embeds: msg.embeds,
      attachments: msg.attachments,
      nonce: "123" // idfk
  }, channel
  );

сериализация выполняется просто

let serialMessage = JSON.stringify(message);

РЕДАКТИРОВАТЬ (TNX PLASMA Chicken): другая версия решения:

let serialMessage = JSON.stringify(message);
// other code
message = new Discord.Message(discordClient, serialMessage, channel);
message = new Discord.Message(discordClient, msg, channel); тоже сработает. Кстати, одноразовый номер не имеет значения, он используется только разногласиями, так что разногласия знают, что если они получают 2 запроса на одну и ту же операцию отправки, они игнорируют 2-й пакет.
PLASMA chicken 14.01.2021 15:38

tnx @PLASMAchicken

Alex75 29.01.2021 13:51

Другие вопросы по теме