я немного гуглю и не могу найти реального ответа, так как шардинг кажется не очень популярным аргументом, тогда мы здесь.
Я пытаюсь справиться с шардингом в своем боте, и у меня возникла проблема. У меня есть пользовательские события, которые принимают сообщения в качестве параметра, и я схожу с ума, чтобы позволить им работать с трансляцией 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)
@PLASMAchicken, к сожалению, нет, я получаю ошибки во время выполнения
При редактировании вы использовали ${msg} или "${msg}"?
@PLASMAchicken извините за задержку, я на самом деле использовал совершенно другую стратегию. я думаю, что пробовал оба
Я закончил использовать другой подход На самом деле я сохраняю сериализованный объект в базе данных только с данными и без методов.
затем я просто отправляю идентификатор БД, и обработчик событий реконструирует сообщение, подобное этому
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-й пакет.
tnx @PLASMAchicken
Работает ли `this.emit("SHARE_DATA", ${msg}, {`?