#javascript #node.js #discord #discord.js
#javascript #node.js #Discord #discord.js
Вопрос:
Попытка создать команду бота, которая продолжается только при выполнении точного количества слов.
Я изо всех сил пытаюсь найти какую-то документацию по нужной мне информации. По сути, я пытаюсь заставить бота ожидать ответа, и в ответе должно быть ровно 4 слова, в противном случае он будет проходить через альтернативный ответ.
Я думал, что этот фрагмент ниже поможет мне куда-нибудь попасть, но я не думаю, что я делаю это правильно. Кто-нибудь знает, как это исправить?
if (collected.first().content.length == 4 ) {}
Фактический код приведен ниже. Спасибо за чтение!
bot.on('message', (message) => {
if (message.content === '!host') {
message.reply('Please send (Insert 4 word requirement here)');
message.channel.awaitMessages(m => m.author.id == message.author.id, {
max: 1,
time: 30000
}).then(collected => {
if (collected.first().content.length == 4) { //This is where I'm struggling. I want the bot to check if the collected message has exactly 4 words. If not, it should give the else if response.
var embed = new Discord.RichEmbed()
.setAuthor(message.author.username, message.author.avatarURL)
.setDescription(collected.first().content 'n n(Insert message here).')
.setTimestamp(new Date())
.setColor('0x7346EE');
DChannel.send(embed); //This section is another part of my working bot.
} else if (collected.first().content.length != "4") {
message.channel.send('Please try again in the correct format.');
}
});
}
});
Ответ №1:
Вы на правильном пути, но допускаете небольшую ошибку. Вы проверяете .length
свойство для собранного содержимого сообщения, которое представляет собой строку. Вызов .length
его даст вам длину строки (таким образом, количество символов, которое в нем есть), поэтому вашему заявлению будет соответствовать только сообщение из 4 букв if
.
Сначала разделив содержимое сообщения на пробел, мы можем получить количество слов в сообщении. Взгляните на приведенный ниже пример кода и попробуйте.
.then(collected => {
// Check if we got a message before moving on
if (!collection.size) return;
// Get the first collected message and split its contents on a space
const messageWords = collection.first().content.split(' ');
// Check if the array of words has a length of 4
if (messageWords.length === 4) {
var embed = new Discord.RichEmbed()
.setAuthor(message.author.username, message.author.avatarURL)
.setDescription(collected.first().content 'n n(Insert message here).')
.setTimestamp(new Date())
.setColor('0x7346EE');
DChannel.send(embed);
} else {
message.channel.send('Please try again in the correct format.');
}
});
Обновление на основе комментария
Если вы хотите, чтобы каждое слово было в новой строке, есть два способа сделать это. Вы можете использовать .addField()
метод для каждого слова или один раз для всего массива.
Если вам нужно новое поле для каждого слова, вы можете сделать следующее после определения вашего встраивания и перед его отправкой. Для каждого слова будет добавлено новое поле с:
messageWords.forEach((word, index) => {
embed.addField(`Word ${index}`, word);
});
Если вы хотите добавить только одно поле со всеми словами, разделенными символом новой строки, вы можете сделать следующее (снова после определения вставки и перед ее отправкой):
embed.addField('Message words', messageWords.join('n'));
Комментарии:
1. Хорошо!! Я понял, большое спасибо. Мне было любопытно, знаете ли вы, как использовать подобные вещи, чтобы разделить каждое «слово» и отправить его в отдельной строке во внедрении? Например, если бот собрал пользователя со словами «1 2 3 4», он отправит свои собственные строки? Я думаю, что это будет включать поле, но я не уверен, как поместить в него содержимое сообщения.
2. @Cressy Я обновил ответ, попробуйте и дайте мне знать, как это происходит