Как создать динамический чат в боте Discord.js? - PullRequest
0 голосов
/ 22 сентября 2019

Под этим я подразумеваю чат, подобный боту React for Roles: когда вы выполняете команду rr!reactionrole для создания новой роли реакции, он просит вас ввести канал, и ПОСЛЕ того, как вы ответили полностьюновое сообщение, сообщение бота редактируется, и вы должны ответить на новый вопрос в другом новом сообщении.Как это возможно?Я надеюсь, что объяснил себя правильно.Спасибо

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Discord.js имеет метод, который можно использовать для этой цели, MessageCollector.Как только вы установите его на TextChannel, он будет собирать сообщения, в зависимости от CollectorFilter и MessageCollectorOptions.

То есть, чтобы получитьответы, но чтобы легко редактировать исходное сообщение вопроса, он просто использует Message#edit() для сохраненного метода идентификации сообщения.

Например:

const questions = ['What role?', 'What message?', 'What emoji?'];

const question = await message.channel.send(questions[0]); // store the question message object to a constant to be used later

const filter = msg => msg.author.id === message.author.id; // creates the filter where it will only look for messages sent by the message author
const collector = message.channel.createMessageCollector(filter, { time: 60 * 1000 }); // creates a message collector with a time limit of 60 seconds - upon that, it'll emit the 'end' event

const answers = []; // basic way to store to the answers, for this example

collector.on('collect', msg => { // when the collector finds a new message
  answers.push(msg.content);
  questions.shift();
  if (questions.length <= 0) return collector.stop('done'); // sends a string so we know the collector is done with the answers
  question.edit(questions[0]).catch(error => { // catch the error if the question message was deleted - or you could create a new question message
    console.error(error);
    collector.stop();
  });
});

collector.on('end', (collected, reason) => {
  if (reason && reason === 'stop') {
    // when the user has answered every question, do some magic
  }
  message.channel.send('You did not answer all the questions in time or the original message was deleted!');
});

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

0 голосов
/ 24 сентября 2019

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

var state = 0;

//on rr!reactionrole
{
switch(state) {
 case 0: //start the conversation and change the state to 1; break;
 case 1: //continue the conversation, edit the message, set state to 2; break;
 //other cases
}
}
...