disord.js получите последнюю версию msg в канале в качестве глобальной переменной

#javascript #node.js #discord.js #global-variables

Вопрос:

В настоящее время я программирую discordbot с обработкой голоса в текст, поэтому мне нужна глобальная переменная msg для доступа к командам, таким как «msg.reply», «msg.channel.send», «msg.guild» для использования моими функциями.

Я не хочу вызывать свою функцию каждый раз, когда было отправлено новое сообщение, и не хочу передавать «msg» через параметры функции

Есть ли способ извлечь последнюю/текущую msg из следующей функции, чтобы сделать ее доступной по всему миру (в каждой функции)?

 discordClient.on('message', async (msg) => {
    try {
        if (!('guild' in msg) || !msg.guild) return; // prevent private messages to bot
        await process_command(msg);
        } catch (e) {
        console.log('discordClient message: '   e)
        await msg.reply('Error#180: Something went wrong, try again or contact the developers if this keeps happening.');
    }
})
 

Ответ №1:

Хотя я категорически не согласен с предпосылкой вопроса (об использовании глобальной переменной), и я не совсем понимаю, что вы пытаетесь сделать с этой глобальной переменной, ни почему вы не хотите вызывать функцию несколько раз, ни почему вы не хотите передавать объект в качестве параметра, есть ли причина, по которой вы не можете просто

 var lastMsg;

/* ... */

discordClient.on('message', async (msg) => {
    try {
        if (!msg.guild) return; // prevent private messages to bot
        lastMsg = msg;
    } catch (e) {
        console.log('discordClient message: '   e)
        await msg.reply('Error#180: Something went wrong, try again or contact the developers if this keeps happening.');
    }
});
 

Вот lastMsg глобальная переменная, которая означает, что каждый раз, когда кто-либо отправляет сообщение боту в любой гильдии, оно будет перезаписано этим новым сообщением. Если вы делаете это, вы должны быть очень уверены, что это желаемое поведение. В целом, особенно для асинхронных вычислений, хранение промежуточных данных в глобальных переменных известно как очень и очень плохая идея.

Комментарии:

1. Спасибо. Знаете ли вы какие-либо другие варианты доступа к msg.reply или извлекаете только определенные части msg, такие как канал и гильдия ? быть глобально доступным, если это уменьшит сложность этого объекта. Я думаю, что было бы лучше всего создать новый объект msg, который просто включает в себя эти функции (ту же структуру, что и msg), и сделать его доступным во всем мире вместо всего объекта msg

2. Нет, у вас вообще не должно быть глобальной переменной для этого. Каждый раз, когда кто-то отправляет сообщение в гильдию, оно перезаписывает ваш объект сообщения. Это означает, например, что если два человека отправят сообщения в две разные гильдии почти в одно и то же время, то первое сообщение будет почти сразу же перезаписано вторым сообщением. Даже если вы обработаете первое сообщение, lastMsg.reply() ответите во второй гильдии. Почему вы хотите «уменьшить сложность этого объекта»? О каком объекте идет речь? Помните, что msg объект передается по ссылке при вызове функции.

3. Я хочу использовать функцию «process_command(msg);» не только для асинхронной функции (msg), но и в моей функции асинхронной обработки речи. Поэтому мне также нужен текущий объект msg, чтобы ответить или получить гильдию, идентификатор канала и т. Д.

4. @jackobhusein Я предполагаю, что это означает, что после получения определенной команды вы хотите, чтобы бот прослушал пользователя, затем произвел некоторую обработку речи, а затем отправил ответ. В этом случае я мог бы порекомендовать создать новый объект, содержащий полученные msg данные , а затем записать аудиоданные в этот объект. Как только вы закончите запись звука, вы можете отправить весь объект в функцию обработки, и вы сможете обработать звук, а затем ответить на правильный канал. Я отмечу, что из-за характера вашего бота есть много других вещей, которые могут пойти не так.

5. Хм, все не так просто. Это больше похоже на то, что у меня есть определенный набор команд, например «присоединиться, помочь,…» в моей функции process_command. Я хочу получить к ним доступ не только через запись в канале, но и через обработку речи. Таким образом, основная последовательность будет выглядеть следующим образом: 1: пользователь написал *присоединиться 2. бот обрабатывает команду и присоединяется к каналу 3. пользователь ГОВОРИТ» помощь» 4. бот обрабатывает команду и отправляет справку msg на канал 5. пользователь написал «помощь» 4. бот обрабатывает команду и отправляет справку msg на канал