Discord.js reaction role collecter switch - discord.js

Hello Stackoverflow community!
I'm having a bit of an issue with a reaction collecter switch I'm trying to creation and got kind of stuck. What I want this piece of code to do is simple; when people react on a color, they get the color role, their reaction gets removed, so if they want to change they just react to a new color, and so on.
But I can't seem to make it work. I don't get any error messages, I just don't get any roles. Thank you in advance!! Much appreciated!
Code:
const Discord = require("discord.js");
module.exports.run = async (bot, message, args, client) => {
const RandomColour = ("000000" + Math.random().toString(16).slice(2, 8).toUpperCase()).slice(-6);
message.delete();
const black = message.guild.roles.get("595509263754067969");
const white = message.guild.roles.get("595510495902040074");
const magenta = message.guild.roles.get("595510495902040074");
const purple = message.guild.roles.get("595507863355654154");
const red = message.guild.roles.get("595506989212106802");
const orange = message.guild.roles.get("595507331396009986");
const yellow = message.guild.roles.get("595507180183093248");
const green = message.guild.roles.get("595507124574879744");
const blue = message.guild.roles.get("595507043629268993");
const filter = (reaction, user) => reaction.emoji.name === [
'black' ,
'white' ,
'magenta' ,
'purple' ,
'red' ,
'orange' ,
'yellow' ,
'green' ,
'blue'].includes(reaction.emoji.name) && user.id === message.member.id;
const embed = new Discord.RichEmbed()
.setAuthor("Available Roles")
.setDescription(`
Black ${black.toString()} | ⬛
White ${white.toString()} | ⬜
Magenta ${magenta.toString()} | 💟
Purple ${purple.toString()} | 🟪
Red ${red.toString()} | 🟥
Orange ${orange.toString()} | 🟧
Yellow ${yellow.toString()} | 🟨
Green ${green.toString()} | 🟩
Blue ${blue.toString()} | 🟦
`)
.setFooter("React on the right emoji to get a colour.")
.setColor(RandomColour)
.setTimestamp()
message.channel.send(embed).then(async function (message) {
await message.react("⬛");
await message.react("⬜");
await message.react("💟");
await message.react("🟪");
await message.react("🟥");
await message.react("🟧");
await message.react("🟨");
await message.react("🟩");
await message.react("🟦");
message.awaitReactions(filter).then(async function (collected) {
const reaction = collected.first();
switch (reaction.emoji.name) {
case 'black':
if (message.member.roles.has(black.id)) {
return;
} else {
message.member.addRole(black).catch(err => {
console.log(err);
return message.member.send(`Error adding you to this role: **${err}**`)
})
message.member.send(`You've reacted on ⬛ and gained then **${black.name} role!`)
}
break;
case 'white':
if (message.member.roles.has(white.id)) {
return;
} else {
message.member.addRole(white).catch(err => {
console.log(err);
return message.member.send(`Error adding you to this role: **${err}**`)
})
message.member.send(`You've reacted on ⬜ and gained then **${white.name} role!`)
}
break;
case 'magenta':
if (message.member.roles.has(magenta.id)) {
return;
} else {
message.member.addRole(magenta).catch(err => {
console.log(err);
return message.member.send(`Error adding you to this role: **${err}**`)
})
message.member.send(`You've reacted on 💟 and gained then **${magenta.name} role!`)
}
break;
case 'purple':
if (message.member.roles.has(purple.id)) {
return;
} else {
message.member.addRole(purple).catch(err => {
console.log(err);
return message.member.send(`Error adding you to this role: **${err}**`)
})
message.member.send(`You've reacted on 🟪 and gained then **${purple.name} role!`)
}
break;
case 'red':
if (message.member.roles.has(red)) {
return;
} else {
reaction.message.member.addRole(red).catch(err => {
console.log(err);
return message.member.send(`Error adding you to this role: **${err}**`)
})
message.member.send(`You've reacted on 🟥 and gained then **${red.name} role!`)
}
break;
case 'orange':
if (message.member.roles.has(orange.id)) {
return;
} else {
message.member.addRole(orange).catch(err => {
console.log(err);
return message.member.send(`Error adding you to this role: **${err}**`)
})
message.member.send(`You've reacted on 🟧 and gained then **${orange.name} role!`)
}
break;
case 'yellow':
if (message.member.roles.has(yellow.id)) {
return;
} else {
message.member.addRole(yellow).catch(err => {
console.log(err);
return message.member.send(`Error adding you to this role: **${err}**`)
})
message.member.send(`You've reacted on 🟨 and gained then **${yellow.name} role!`)
}
break;
case 'green':
if (message.member.roles.has(green.id)) {
return;
} else {
message.member.addRole(green).catch(err => {
console.log(err);
return message.member.send(`Error adding you to this role: **${err}**`)
})
message.member.send(`You've reacted on 🟩 and gained then **${green.name} role!`)
}
break;
case 'blue':
if (message.member.roles.has(blue.id)) {
return;
} else {
message.member.addRole(blue).catch(err => {
console.log(err);
return message.member.send(`Error adding you to this role: **${err}**`)
})
message.member.send(`You've reacted on 🟦 and gained then **${blue.name} role!`)
}
break;
}
}).catch(collected => {
return message.channel.send("I couldn't add you to this role. If this keeps occouring, contact staff.")
}).catch(err => console.log(err))
}).catch(err => console.log(err))
}
module.exports.help = {
name: "reactroles",
aliases: []
}

The problem is, reaction.emoji.name === unicode reaction name
So for white is will be ⬜, not white
The one way is no hardCode, just createArray with some parametors, and check it :)
const Discord = require("discord.js");
module.exports.run = async (bot, message, args, client) => {
const reactionRoles = [
{
name: 'white',
reaction: '⬜',
reactionRole: message.guild.roles.get('595510495902040074'),
},
{
name: 'black',
reaction: '⬛',
reactionRole: message.guild.roles.get('595509263754067969'),
},
];
const RandomColour = Math.floor(Math.random() * Math.floor(16777215));
const embed = new Discord.RichEmbed()
.setAuthor('Available Roles')
.setDescription(`${reactionRoles.map(r => `${r.name} | ${r.reactionRole.name} | ${r.reaction}`).join('\n')}`)
.setFooter('React on the right emoji to get a colour.')
.setColor(RandomColour)
.setTimestamp();
message.channel
.send(embed)
.then(async msg => {
for (const r of reactionRoles) {
await msg.react(r.reaction);
}
const filter = (reaction, user) => {
return reactionRoles.map(r => r.reaction).includes(reaction.emoji.name) && user.id === message.author.id;
};
msg.awaitReactions(filter, { max: 1 })
.then(collected => {
const reaction = collected.first();
let role = reactionRoles.find(r => r.reaction === reaction.emoji.name);
if (message.member.roles.has(role.reactionRole)) return message.reply('You are already has this role');
message.member.addRole(role.reactionRole);
})
.catch(collected => {
return message.channel.send("I couldn't add you to this role. If this keeps occouring, contact staff.");
})
.catch(err => console.log(err));
})
.catch(err => console.log(err));
};

Related

How to compare member id and bots id on the server

I get the ids of all bots on the server but I can't compare them with the user id
How do I do this?
-- Comment --
I know that I can't compare the user id with the id of all bots just by writing this, but I don't know how to compare the user id with each id in the list
-- Part of the code --
module.exports = {
data: new SlashCommandBuilder()
.setName("pay")
.setDescription("🥁│Дать деньги другому пользователю")
.addNumberOption((option) => option.setName("amount").setDescription("🧩│Кол-во денег которое хочешь перевести").setRequired(true))
.addUserOption((option) => option.setName("target").setDescription("🎯│Выбрать кому перевести деньги").setRequired(true))
.setDefaultMemberPermissions(PermissionFlagsBits.SendMessages),
async execute(interaction) {
const target = interaction.options.getUser("target")
const member = await interaction.guild.members.cache.get(target.id)
const bots = await interaction.guild.members.cache.filter(m => m.user.bot).map(i => i.user.id)
if (!member) {
await interaction.reply({ content: "**🧩│The user is not identified or he has left the server**" }).then(() => {
setTimeout(async () => {
await interaction.deleteReply().catch((error) => {
if (error.code !== RESTJSONErrorCodes.UnknownMessage) {
return
} else {
return
}
})
}, ms("3s"))
})
} else if (member.user.id == interaction.user.id) {
await interaction.reply({ content: "**🧩│You can't transfer money to yourself**" }).then(() => {
setTimeout(async () => {
await interaction.deleteReply().catch((error) => {
if (error.code !== RESTJSONErrorCodes.UnknownMessage) {
return
} else {
return
}
})
}, ms("3s"))
})
} else if (member.user.id == bots || member.user.id == interaction.guild.members.me.id) {
await interaction.reply({ content: "**🧩│You can't transfer money to a bot**" }).then(() => {
setTimeout(async () => {
await interaction.deleteReply().catch((error) => {
if (error.code !== RESTJSONErrorCodes.UnknownMessage) {
return;
} else {
return;
}
})
}, ms("3s"))
})
}
}
}
There is a .bot property on the User Class which you can use like this:
if(member.user.bot) {
// Do something if bot
}
Using this, will be easier to check whether the user is a bot or not.

Can you change user.challengeName in Amplify

I'm trying to give the end-user an option on the UI to reset MFA if the end-user loses access to the device they've been using.
I want to change the user.challangeName response from "SOFTWARE_TOKEN_MFA" to "MFA_SETUP". Is this something that can be done? Can I change the challangeName through UI?
Code here
const login = async (email, password) => {
try {
const user = await Auth.signIn(email, password);
if (user) {
if (user.challengeName === 'MFA_SETUP') {
dispatch({
type: AUTH_RESULT_USER,
payload: user
});
navigate('/auth-login');
} else if (user.challengeName === 'SOFTWARE_TOKEN_MFA') {
dispatch({
type: AUTH_RESULT_USER,
payload: user
});
navigate('/auth-post-login');
} else if (user.challengeName === 'NEW_PASSWORD_REQUIRED') {
const attr = user.challengeParam?.userAttributes || null;
if (attr) {
dispatch({
type: AUTH_RESULT_USER,
payload: user
});
}
// console.log('before', user);
navigate('/set-password');
} else {
getUserDetails(user, user.signInUserSession.idToken.jwtToken);
}
}
} catch (e) {
console.log('error', e);
// await logout();
throw e;
}
};

i have made a discord bot my ban commands works but my kick command is not working

const { getUserFromMention } = require("../userinfo/getuser.js");
module.exports = {
name: "kick",
description: "kick a player",
execute(message, client) {
const split = message.content.split(/ +/);
const args = split.slice(1);
const member = getUserFromMention(args[0], client);
if (!member) {
return message.reply("Say the name lets dew it !");
}
if (!message.member.permissions.has("KICK_MEMBERS")) {
return message.reply("I can't kick this user.");
}
return message.guild.members
.kick(member)
.then(() => message.reply(`${member.username} was kicked.`))
.catch((error) => message.reply("They are above my paygrade"));
},
};
You can use the kick function in the member object itself
Try this
return member.kick()
.then(() => message.reply(`${member.user.username} was kicked.`))
.catch(error => message.reply('They are above my paygrade'));
Try This
const { getUserFromMention } = require("../userinfo/getuser.js");
module.exports = {
name: "kick",
description: "kick a player",
execute(message, client) {
const split = message.content.split(/ +/);
const args = split.slice(1);
const member = getUserFromMention(args[0], client);
if (!member) {
return message.reply("Say the name lets dew it !");
}
if (!message.member.permissions.has("KICK_MEMBERS")) {
return message.reply("I can't kick this user.");
}
return member.kick()
.then(() => message.reply(`${member.user.username} was kicked.`))
.catch(error => message.reply('They are above my paygrade'));
},
};

Discord JS // Trying to add role & remove roles by reacting to the message

I am trying to code a role reaction for my discord bot. Currently, right now I am stuck on how to make it so multiple people can react to the message to receive a role(s) or remove role(s). I would also like the embed message to be a constant message.
Any guidance would be helpful as I have been trying to code this for several days and I just cant get it.
This is my current code:
const Discord = require("discord.js");
const colors = require("../colors");
const botconfig = require("../botconfig")
module.exports.run = async (bot, message, args) => {
const eRole = message.guild.roles.get('688477690344374283'); // Events
const uRole = message.guild.roles.get('688477558982836344'); // Updates
const pRole = message.guild.roles.get('688477868078137369'); // Polls
const smRole = message.guild.roles.get('687498488295981069'); // Social Media
const qRole = message.guild.roles.get('688477467840872452'); // QOTD
const filter = (reaction, user) => ['❤️', '🧡', '💛', '💚','💙'].includes(reaction.emoji.name) && user.id === message.author.id;
let embed = new Discord.RichEmbed()
.setTitle('Pinged Roles')
.setDescription(`
❤️ ${eRole.toString()}
🧡 ${uRole.toString()}
💛 ${pRole.toString()}
💚 ${smRole.toString()}
💙 ${qRole.toString()}
`)
.addField("**TIP:**", "Double react to remove a role")
.setColor(colors.aqua)
.setTimestamp()
.setFooter(`mc.advancius.net`,bot.user.displayAvatarURL)
message.channel.send(embed).then(async msg => {
await msg.react('❤️');
await msg.react('🧡');
await msg.react('💛');
await msg.react('💚');
await msg.react('💙');
msg.awaitReactions(filter, {
max:1,
}).then(collected => {
const reaction = collected.first();
switch (reaction.emoji.name) {
case '❤️':
if (message.member.roles.has(eRole.id)) {
return message.channel.send('You are already in this role!').then(m => m.delete(3000));
}
message.member.addRole(eRole).catch(err => {
console.log(err);
return message.channel.send(`Error adding you to this role: **${err.message}**.`);
});
message.channel.send(`You have been added to the **${eRole.name}** role!`).then(m => m.delete(3000));
break;
case '🧡':
if (message.member.roles.has(uRole.id)) {
return message.channel.send('You are already in this role!').then(m => m.delete(3000));
}
message.member.addRole(uRole).catch(err => {
console.log(err);
return message.channel.send(`Error adding you to this role: **${err.message}**.`);
});
message.channel.send(`You have been added to the **${uRole.name}** role!`).then(m => m.delete(3000));
break;
case '💛':
if (message.member.roles.has(pRole.id)) {
return message.channel.send('You are already in this role!').then(m => m.delete(3000));
}
message.member.addRole(pRole).catch(err => {
console.log(err);
return message.channel.send(`Error adding you to this role: **${err.message}**.`);
});
message.channel.send(`You have been added to the **${pRole.name}** role!`).then(m => m.delete(3000));
break;
case '💚':
if (message.member.roles.has(smRole.id)) {
return message.channel.send('You are already in this role!').then(m => m.delete(3000));
}
message.member.addRole(smRole).catch(err => {
console.log(err);
return message.channel.send(`Error adding you to this role: **${err.message}**.`);
});
message.channel.send(`You have been added to the **${smRole.name}** role!`).then(m => m.delete(3000));
break;
case '💙':
if (message.member.roles.has(qRole.id)) {
return message.channel.send('You are already in this role!').then(m => m.delete(3000));
}
message.member.addRole(qRole).catch(err => {
console.log(err);
return message.channel.send(`Error adding you to this role: **${err.message}**.`);
});
message.channel.send(`You have been added to the **${qRole.name}** role!`).then(m => m.delete(3000));
break;
};
});
})
};
exports.help = {
name: 'roles2'
};
Instead of a collector, I would advise to save that message's object or ID to a JSON and, listen for messageReactionAdd and messageReactionRemove event to check the emoji used to add and remove role.
Example:
bot.on("messageReactionAdd", (reaction, user) => {
if (reaction.message.id != "stored_msg_id") return; // or you can compare the message objects
const eRole = message.guild.roles.get('688477690344374283');
switch (reaction.emoji.name) {
case "❤️": reaction.message.guild.member(user).addRole(eRole); break;
// etc.
}
});
Things might change depending on your version of discord.js version

action is triggering a series of remote methods and returning rejected

I have an action that is getting dispatched that is triggering multiple remote methods and returning'TALK_SUBMIT_REJECTED' The strange thing however, is that all of the data that I am getting is still returned and updating the store as expected.
I am however getting these two errors in the process:
xhr.js:178 POST http://localhost:3000/api/talks/talkSubmit 500
(Internal Server Error)
createError.js:16 Uncaught (in promise) Error: Request failed with
status code 500
at e.exports (createError.js:16)
at e.exports (settle.js:18)
at XMLHttpRequest.m.(:3000/anonymous function)
(http://localhost:3000/bundle.js:6:2169)
I have thrown in two dozen console.logs recording all of the data I am sending and receiving and everything returning as expected.
I apologize in advance for the long post but I have been struggling with this bug for a while.
to give a brief summery of what my code is doing:
I have a form that upon submission, triggers an action that starts a chain of remote methods.
This is the first method:
function talkSubmit(speakerInfo, talkInfo, date) {
return new Promise((resolve, reject) => {
const { Talk, Speaker, Event } = app.models;
return Speaker.create(speakerInfo)
.then(response => {
let speakerId = response.id
return getMeetups()
.then(meetups => {
const index = meetups.findIndex((item) =>
item.date == date);
let name = meetups[index].name;
let details = meetups[index].description;
let meetupId = meetups[index].meetupId;
if (index === -1)
return reject(new Error('NO meetup with that
date found!'));
return Event.findOrCreate({ date, name, details,
meetupId })
.then(event => {
let eventId = event[0].id
return Talk.create({ ...talkInfo,
speakerId, eventId })
.then(talk => resolve(talk))
.catch(err => console.log(err))
})
.catch(err => reject(err))
})
.catch(err => reject(err))
})
.catch(err => reject(err))
})
}
module.exports = { talkSubmit };
//this is the get meetups function that is called by talkSubmit
function getMeetups() {
return new Promise((resolve, reject) => {
let currentDate = new Date();
currentDate.setMonth(currentDate.getMonth() + 3);
const date ='${ currentDate.getFullYear() } -${
currentDate.getMonth() } -${
currentDate.
getDay()
} ';
axios.get(`https://api.meetup.com/sandiegojs/events?
no_later_than = ${ date } `)
return resolve(response.data.map(event => ({
meetupId: event.id,
name: event.name,
date: event.local_date,
time: event.local_time,
link: event.link,
description: event.description,
})))
.catch(err => reject(new Error('getMeetups failed to get SDJS
meetups')))
})
}
module.exports = { getMeetups };
//This is the after remote method that is triggered when talkSubmit is
//completed.
Talk.afterRemote('talkSubmit', function (ctx, modelInstance, next) {
const speakerId = ctx.result.speakerId;
const eventId = ctx.result.eventId;
const approved = false;
const pending = true;
formatTalkForEmail(speakerId, eventId)
.then((response) => {
const speakerName = response.speakerName;
const speakerEmail = response.speakerEmail;
const meetupTitle = response.meetupTitle;
const meetupDate = response.meetupDate;
sendEmailToSpeaker(process.env.ADMIN_EMAIL, approved,
pending, speakerEmail, speakerName, meetupTitle, meetupDate)
.then(() => next())
.catch(err => next(err));
})
.catch(err => next(err));
});
//this is the formatTalkForEmail method called in the remote method
function formatTalkForEmail(speakerId, eventId) {
return new Promise((resolve, reject) => {
if (speakerId == undefined) {
return reject(new Error('speakerId is undefined'));
}
if (eventId == undefined) {
return reject(new Error('eventId is undefined'));
}
const { Speaker, Event } = app.models;
Speaker.findById(speakerId)
.then(speaker => {
const speakerName = speaker.speakerName;
const speakerEmail = speaker.speakerEmail
return Event.findById(eventId)
.then(selectedEvent => {
const meetupTitle = selectedEvent.name;
const meetupDate = selectedEvent.date;
resolve({
speakerName,
speakerEmail,
meetupTitle,
meetupDate
})
})
.catch(err => reject( err ))
})
.catch(err => reject(err))
})
}
module.exports = { formatTalkForEmail };
//and finally this is the sendEmailToSpeaker method:
function sendEmailToSpeaker(adminEmail, approved, pending,
speakerEmail, speakerName, meetupTitle, meetupDate) {
return new Promise((resolve, reject) => {
let emailContent;
if (approved && !pending) {
emailContent = `Congratulations! Your request to speak at
${ meetupTitle } on ${ meetupDate } has been approved.`
}
if (!approved && !pending) {
emailContent = `We're sorry your request to speak at
${ meetupTitle } on ${ meetupDate } has been denied.`
}
if (pending) {
emailContent = `Thank you for signing up to speak
${ meetupTitle } on ${ meetupDate }.You will be notified as soon as
a
SDJS admin reviews your request.`
sendEmailToAdmin(adminEmail, meetupDate, meetupTitle,
speakerEmail, speakerName)
.catch(err => console.log(err));
}
const email = {
to: speakerEmail,
from: adminEmail,
subject: 'SDJS Meetup Speaker Request',
templateId: process.env.ADMIN_SPEAKER_EMAIL_TEMPLATE,
dynamic_template_data: {
emailContent: emailContent,
sdjsBtn: false,
title: 'SDJS Meetup Speaker Request'
}
}
sgMail.send(email)
.then(() => resolve({ email }))
.catch(err => {
console.log(err);
reject(err);
});
})
}
in conclusion I have no clue what part of talkSubmit is throwing those two errors and yet both emails are getting automatically sent and the store is updating with all the proper data despite the initial action creator returning rejected. I appreciate any help anyone can offer.
Ok so I think the main problem is here:
axios.get(`https://api.meetup.com/sandiegojs/events?no_later_than = ${ date } `)
return resolve(response.data.map(event => ({
meetupId: event.id,
name: event.name,
date: event.local_date,
time: event.local_time,
link: event.link,
description: event.description,
})))
it should look like that (I recommend to extract mapping method):
axios.get(`https://api.meetup.com/sandiegojs/events?no_later_than = ${ date} `)
.then( response => resolve(response.data.map(event => ({
meetupId: event.id,
name: event.name,
date: event.local_date,
time: event.local_time,
link: event.link,
description: event.description,
}))))
.catch(err => reject(new Error('getMeetups failed to get SDJS meetups')))
and a few words about Promises. You can chain them like that:
method()
.then(method2())
.then(method3())
.then(method4())
...
.catch(err =>...
also I don't understand why you wrap content of method in return new Promise((resolve, reject) => { I think is not needed in your case
so you can change talkSubmit method to something like that (this is just a draft, I recommend to extract methods from then blocks)
function talkSubmit(speakerInfo, talkInfo, date) {
const { Talk, Speaker, Event } = app.models;
return getMeetups()
.then(meetups => {
const index = meetups.findIndex((item) => item.date == date);
let name = meetups[index].name;
let details = meetups[index].description;
let meetupId = meetups[index].meetupId;
if (index === -1)
return reject(new Error('NO meetup with that date found!'));
return Promise.all([
Event.findOrCreate({
date, name, details,
meetupId
}),
Speaker.create(speakerInfo)])
})
.then(([event, speaker]) => {
let eventId = event[0].id
let speakerId = speaker.id
return Talk.create({
...talkInfo,
speakerId, eventId
})
})
}

Resources