Как ограничить команду сервером, на котором она была вызвана? - PullRequest
0 голосов
/ 03 июля 2019

Я создал бота Discord, в котором есть несколько команд, генерирующих ридделы и ответы на ридделы.

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

Я пытался сохранить идентификатор сервера и пытался написать с ним некоторые условия, но не сработал.

на первом сервере: server 1

на втором сервере: server 2

Я хочу, чтобы команда работала для каждого сервера, но не для всех из них

let CommandRunned = CommandRunnedWithSpace.trim().toLowerCase()
let argsWithOutSpace = receivedMess.content.toLowerCase().slice(mentionNumber).trim().split(' ');
const cmd = argsWithOutSpace.shift().toLowerCase();
const args = argsWithOutSpace.join(' ');

if (CommandRunned === 'startriddle') {

    if (RiddleMap.get('check') === true) {
        receivedMess.reply("Riddle Already Started (can't start two riddels at the sametime)");
    } else {
        currentCluesArray = [];

        clueI = 0;

        getRndNum = (min, max) => {
            return Math.floor(Math.random() * (max - min + 1)) + min;
        }

        let randomNum = getRndNum(0, RiddlesApi.Riddles.length - 1)

        RiddlesApi.Riddles.filter((Riddel) => {

            if (Riddel.id === randomNum) {
                RiddleMessage = Riddel.Riddle
                answer = Riddel.Answer
                clues = Riddel.clues
            }
        })

        StartRiddleModuel.startRiddle(receivedMess, RiddleMessage);
        RiddleMap.set('check', true);
    }
}


if (cmd === 'answer') {
    if (answerCooldown.has(receivedMess.author.id)) {
        receivedMess.delete();
        receivedMess.reply('You have to wait ' + answercdseconds + ' seconds befor answering again')
    } else {
        if (RiddleMap.get('check') === true) {
            if (args === answer) {
                RiddleMap.set('check', false);
                receivedMess.reply("Correct :hushed: ")
                receivedMess.react('✅');
            } else if (args === '') {
                receivedMess.reply("Well you didnt enter anything.How you want me to know your answer then.")
                receivedMess.react('?');
            } else {
                receivedMess.reply("That wasnt the right answer try again :smirk: ")
                receivedMess.react('❌');
            }
            answerCooldown.add(receivedMess.author.id);
        } else {
            receivedMess.reply("No Riddles did started");
        }
    }
}

1 Ответ

0 голосов
/ 05 июля 2019

Без полного кода довольно сложно указать, какие строки кода следует изменить.Тем не менее, общая идея состоит в том, чтобы сравнивать идентификатор гильдии каждый раз, когда вы запускаете команду.В объекте Message вы можете найти идентификатор гильдии, например:

msg.guild.id

Когда пользователь запрашивает загадку, вы должны сохранить идентификатор гильдии, а затем сравнить его с идентификатором из команды ответа.


Однако есть еще одно решение, которое может лучше соответствовать вашим потребностям: awaitMessages метод из TextChannel класс.

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

Пример из документации должен помочь вам правильно включить его в ваш сценарий (мои комментарии и небольшие изменения):

// Here you need to create a filter to 'catch' only desired messages
// E.g. filter I use to check if my bot was pinged is as below
// message.mentions.users.some(mention => mention.id === client.user.id)
const filter = m => m.content.includes('answer');

// Here you specify max: 1 as you want to catch and respond to each message
channel.awaitMessages(filter, { max: 1, time: 60000, errors: ['time'] })
  .then(collected => console.log('If correct command was sent, program enters here'))
  .catch(collected => console.log('In case errors or timeout, put commands here'));

Единственное, чего не хватает, это зациклить awaitMessages (чтобы оно не заканчивалось после того, как найдено одно сообщение) и установить отдельный таймер, чтобы вы знали, когда заканчивается время ответа.

...