111 lines
3.0 KiB
JavaScript
111 lines
3.0 KiB
JavaScript
/**
|
|
* Simple Discord Reaction Role Bot
|
|
* Monitors a specific message for reactions and assigns roles
|
|
*/
|
|
|
|
const { Client, GatewayIntentBits, Partials } = require('discord.js');
|
|
|
|
// Configuration
|
|
const CONFIG = {
|
|
token: process.env.DISCORD_BOT_TOKEN || 'MTQ1ODIzNDU5MzcxNDExNDY0MA.GmFROz.V8GyvBWFD9LtpOWtOIUxHRDfyoPHQJU4XKXDWc',
|
|
guildId: '1449158500344270961',
|
|
messageId: '1464871902777708637', // Welcome message with reactions
|
|
channelId: '1464535949798150250', // #welcome
|
|
|
|
// Emoji to Role mappings
|
|
emojiRoles: {
|
|
'🔧': '1464871798116974703', // Builder
|
|
'🎵': '1464871799970861057', // Producer
|
|
'📈': '1464871801002786827', // Marketer
|
|
'🏢': '1464871802173001780', // Operator
|
|
'📰': '1464871803418705970', // Feed Subscriber
|
|
}
|
|
};
|
|
|
|
const client = new Client({
|
|
intents: [
|
|
GatewayIntentBits.Guilds,
|
|
GatewayIntentBits.GuildMembers,
|
|
GatewayIntentBits.GuildMessageReactions,
|
|
],
|
|
partials: [Partials.Message, Partials.Reaction, Partials.User],
|
|
});
|
|
|
|
client.once('ready', () => {
|
|
console.log(`✅ Reaction Role Bot logged in as ${client.user.tag}`);
|
|
console.log(`📍 Watching message ${CONFIG.messageId} in channel ${CONFIG.channelId}`);
|
|
console.log(`🎯 Emoji-Role mappings:`, CONFIG.emojiRoles);
|
|
});
|
|
|
|
// Handle reaction add
|
|
client.on('messageReactionAdd', async (reaction, user) => {
|
|
// Ignore bot reactions
|
|
if (user.bot) return;
|
|
|
|
// Fetch partial if needed
|
|
if (reaction.partial) {
|
|
try {
|
|
await reaction.fetch();
|
|
} catch (error) {
|
|
console.error('Error fetching reaction:', error);
|
|
return;
|
|
}
|
|
}
|
|
|
|
// Check if this is our tracked message
|
|
if (reaction.message.id !== CONFIG.messageId) return;
|
|
|
|
const emoji = reaction.emoji.name;
|
|
const roleId = CONFIG.emojiRoles[emoji];
|
|
|
|
if (!roleId) {
|
|
console.log(`Unknown emoji: ${emoji}`);
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const guild = await client.guilds.fetch(CONFIG.guildId);
|
|
const member = await guild.members.fetch(user.id);
|
|
await member.roles.add(roleId);
|
|
console.log(`✅ Added role ${roleId} to ${user.tag} (reacted with ${emoji})`);
|
|
} catch (error) {
|
|
console.error(`Error adding role:`, error);
|
|
}
|
|
});
|
|
|
|
// Handle reaction remove
|
|
client.on('messageReactionRemove', async (reaction, user) => {
|
|
// Ignore bot reactions
|
|
if (user.bot) return;
|
|
|
|
// Fetch partial if needed
|
|
if (reaction.partial) {
|
|
try {
|
|
await reaction.fetch();
|
|
} catch (error) {
|
|
console.error('Error fetching reaction:', error);
|
|
return;
|
|
}
|
|
}
|
|
|
|
// Check if this is our tracked message
|
|
if (reaction.message.id !== CONFIG.messageId) return;
|
|
|
|
const emoji = reaction.emoji.name;
|
|
const roleId = CONFIG.emojiRoles[emoji];
|
|
|
|
if (!roleId) return;
|
|
|
|
try {
|
|
const guild = await client.guilds.fetch(CONFIG.guildId);
|
|
const member = await guild.members.fetch(user.id);
|
|
await member.roles.remove(roleId);
|
|
console.log(`❌ Removed role ${roleId} from ${user.tag} (unreacted ${emoji})`);
|
|
} catch (error) {
|
|
console.error(`Error removing role:`, error);
|
|
}
|
|
});
|
|
|
|
// Login
|
|
client.login(CONFIG.token);
|