#javascript #discord.js
Вопрос:
В настоящее время я пытаюсь написать команду, в которой вы можете порекомендовать серверу новую идею. Я хочу, чтобы команда могла (сама по себе) проверять, когда было 3 эмодзи 👍 или👎. Затем бот удалит старое сообщение и отправит новое, в котором будет указано, была ли команда одобрена или отклонена.
async run(client, message, args){
const channelToSend = message.guild.channels.cache.find(channel => channel.name === '👍-recommendations');
const Author = message.author; ;
const newEmbed = new Discord.MessageEmbed()
.setColor('#FFB6C1')
.setTitle(`Server Recommendation:`)
.setDescription(args.slice(0).join(' '))
.setAuthor(message.author.tag, message.author.avatarURL())
const errorEmbed = new Discord.MessageEmbed()
.setColor('#FFB6C1')
.setDescription('You need to reccomend something.');
const sentEmbed = new Discord.MessageEmbed()
.setColor('RANDOM')
.setDescription('Recommendation sent! Thank you.');
try {
gogo();
} catch(e) {
}
async function gogo() {
if(message.length <= '0' || message.content == null || message.content == undefined){
message.channel.send(errorEmbed);
} else{
const question = await channelToSend.send(newEmbed);
let ryC = 0;
let rnC = 0;
['👍', '👎'].forEach(async el => await question.react(el));
const collector = question.createReactionCollector(filter, { max: 4, time: 5000 });
collector.on('collect', r =>
{
if(r == '👍'){
ryc ;
} else if (r == '👎'){
rnC ;
}
});
collector.on('end', async collected => {
if(ryC >= rnC){
const verifiedEmbed = new Discord.MessageEmbed()
.setColor('#FFB6C1')
.setTitle(`Server Recommendation:`)
.setDescription(args.slice(0).join(' '))
.setAuthor(message.author.tag, message.author.avatarURL())
.setFooter('**Recommendation Approved**');
await question.delete();
channelToSend.send(verifiedEmbed);
}
if(rnC > ryC){
const verifiedEmbed = new Discord.MessageEmbed()
.setColor('#FFB6C1')
.setTitle(`Server Recommendation:`)
.setDescription(args.slice(0).join(' '))
.setAuthor(message.author.tag, message.author.avatarURL())
.setFooter('**Recommendation Denied**');
await question.delete();
channelToSend.send(verifiedEmbed);
}
});
}
}
}
Ответ №1:
Вы можете сделать обратный звонок, чтобы реагировать каждый раз, когда публикуется реакция на эмодзи. Вы подсчитываете смайлики и реагируете соответственно.
client.on('messageReactionAdd', (reaction, author) => {
if(reaction.message.author == bot){
//Here you can check the message itself, the author, a tag on the message or in its content, title ...
if(reaction.message.reactions.cache.get('👍').count == 3){
//Delete message
//Post New message
}
}
}
Было бы лучше добавить обратный вызов непосредственно в сообщение, но я не знаю, как это сделать.
Еще лучше, вы можете прикрепить обратный вызов, когда публикуете свою рекомендацию, и отсоединить его, когда emoji >= 3 с помощью client.off(‘messageReactionAdd’, …).
Изменить : Я изменил оператор if. Поскольку вы не хотите хранить сообщение в памяти, вам просто нужно найти подходящий способ определить, является ли это сообщение рекомендацией.
Комментарии:
1. Проблема в том, что я не хочу указывать текущую рекомендацию, я хочу, чтобы она могла выполняться на своих собственных условиях. По сути, пользователь отправит команду, затем код распознает, что сообщение имеет (скажем, здесь) три реакции, затем сообщение удалится и сообщит всем, что оно было одобрено.
2. Сообщение является обновлением. Скажи мне, что ты думаешь.
3. В настоящее время я работаю над исправлением, используя событие messageReactionAdd. Вот фрагмент моего кода. @Zekovski
async run(client, message){ recChannel = '773052032151715846'; if(message.channel.id == '773052032151715846'){ if(message.embed.title.content.includes('Recommendation')){ if(message.reactions.cace.get('👍').count >=3){
Ответ №2:
Попробуйте создать глобальную переменную, которая увеличивается, когда кто-то нажимает на определенную реакцию. Каждый раз, когда нажимается одна из реакций, вы можете проверить, какая из них уже имеет 3 реакции.
Ответ №3:
После некоторого времени переоценки и частичного ответа от @Zekovski я придумал этот код.
По сути, я не могу вечно перепроверять сообщение, пока в нем не будет так много реакций, поэтому я добавил событие messageReactionAdd, оттуда я проверяю, находится ли канал, по которому отправляются реакции, затем мы убеждаемся, что сообщение является внедрением, оттуда мы видим, имеет ли сообщение три 👍 реакции или три 👎 реакции.
Наконец, мы берем исходную вставку и редактируем ее, добавляя » да » и «нет». Тогда отправь его!
const baseEvent = require("../BaseClasses/baseEvent");
const Discord = require('discord.js')
module.exports = class messageReactionAdd extends baseEvent {
constructor(){
super('messageReactionAdd');
}
async run(client, reaction){
const recChannel = '773052032151715846';
if(reaction.message.channel.id == recChannel){
if(reaction.message.embeds[0].title.includes('Recommendation')){
let yC = reaction.message.reactions.cache.get('👍').count;
let nC = reaction.message.reactions.cache.get('👎').count;
let total = [];
reaction.message.reactions.cache.forEach(e => {
if(e.emoji.name == '👍'){
//yC = yC 1;
console.log(yC);
}
else if(e.emoji.name == '👎'){
//nC = nC 1;
console.log(nC);
}
});
console.log(`${yC} : yesses , ${nC} : no's`);
console.log(total);
if(yC >=2){
const oldEmbed = reaction.message.embeds[0];
const verifiedEmbed = new Discord.MessageEmbed(oldEmbed)
.addFields(
{ name: 'Total 👍:', value: yC, inline: true },
{ name: 'Total 👎:', value: nC, inline: true}
).setFooter('**Recommendation Approved**');
reaction.message.delete();
reaction.message.channel.send(verifiedEmbed);
} else if(nC >=3){
const oldEmbed = reaction.message.embeds[0];
const deniedEmbed = new Discord.MessageEmbed(oldEmbed).setFooter('**Recommendation Denied**');
reaction.message.delete();
recChannel.send(deniedEmbed);
}
}
}
}
}