Advertisement
Djadjd

Code

Apr 7th, 2025
296
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 6.61 KB | Source Code | 0 0
  1. const { Client, GatewayIntentBits, EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js');
  2. const client = new Client({
  3.     intents: [
  4.         GatewayIntentBits.Guilds,
  5.         GatewayIntentBits.GuildMessages,
  6.         GatewayIntentBits.GuildMembers,
  7.         GatewayIntentBits.MessageContent,
  8.         GatewayIntentBits.GuildMessageReactions
  9.     ]
  10. });
  11.  
  12. // Configuration
  13. const config = {
  14.     channelId: 'YOUR_CHANNEL_ID', // Channel where the message will be
  15.     messageId: null, // Will be set when we create the message
  16.     trackedRoles: new Map() // Stores role IDs and their display names
  17. };
  18.  
  19. // Initialize with some roles if needed
  20. // Format: trackedRoles.set('ROLE_ID', 'Display Name');
  21.  
  22. client.once('ready', async () => {
  23.     console.log(`Logged in as ${client.user.tag}`);
  24.     await checkOrCreateMessage();
  25.     setInterval(() => updateRoleListMessage(), 60000); // Update every minute to catch any missed events
  26. });
  27.  
  28. // Command handler
  29. client.on('messageCreate', async message => {
  30.     if (message.author.bot) return;
  31.     if (!message.content.startsWith('!')) return;
  32.  
  33.     const args = message.content.slice(1).trim().split(/ +/);
  34.     const command = args.shift().toLowerCase();
  35.  
  36.     if (command === 'add') {
  37.         if (!message.member.permissions.has('ADMINISTRATOR')) {
  38.             return message.reply('You need administrator permissions to use this command.');
  39.         }
  40.  
  41.         const role = message.mentions.roles.first();
  42.         if (!role) return message.reply('Please mention a role to track.');
  43.  
  44.         const roleName = args.slice(1).join(' ') || role.name;
  45.         config.trackedRoles.set(role.id, roleName);
  46.         await updateRoleListMessage();
  47.         await message.reply(`Now tracking role: ${roleName}`);
  48.     }
  49.  
  50.     if (command === 'remove') {
  51.         if (!message.member.permissions.has('ADMINISTRATOR')) {
  52.             return message.reply('You need administrator permissions to use this command.');
  53.         }
  54.  
  55.         const role = message.mentions.roles.first();
  56.         if (!role) return message.reply('Please mention a role to stop tracking.');
  57.  
  58.         if (config.trackedRoles.has(role.id)) {
  59.             const roleName = config.trackedRoles.get(role.id);
  60.             config.trackedRoles.delete(role.id);
  61.             await updateRoleListMessage();
  62.             await message.reply(`Stopped tracking role: ${roleName}`);
  63.         } else {
  64.             await message.reply('That role isn\'t being tracked.');
  65.         }
  66.     }
  67.  
  68.     if (command === 'refresh') {
  69.         await updateRoleListMessage();
  70.         await message.reply('Role list refreshed!');
  71.     }
  72. });
  73.  
  74. // Handle role changes
  75. client.on('guildMemberUpdate', async (oldMember, newMember) => {
  76.     const oldRoles = oldMember.roles.cache.map(r => r.id);
  77.     const newRoles = newMember.roles.cache.map(r => r.id);
  78.    
  79.     // Check if any tracked roles were added or removed
  80.     const needsUpdate = Array.from(config.trackedRoles.keys()).some(roleId =>
  81.         oldRoles.includes(roleId) !== newRoles.includes(roleId)
  82.     );
  83.    
  84.     if (needsUpdate) {
  85.         await updateRoleListMessage();
  86.     }
  87. });
  88.  
  89. // Handle role deletions
  90. client.on('roleDelete', async role => {
  91.     if (config.trackedRoles.has(role.id)) {
  92.         config.trackedRoles.delete(role.id);
  93.         await updateRoleListMessage();
  94.     }
  95. });
  96.  
  97. // Main function to update the role list message
  98. async function updateRoleListMessage() {
  99.     if (!config.channelId) return;
  100.  
  101.     const channel = await client.channels.fetch(config.channelId).catch(console.error);
  102.     if (!channel) return;
  103.  
  104.     // Create the embed with all tracked roles
  105.     const embed = new EmbedBuilder()
  106.         .setTitle('Server Staff')
  107.         .setColor('#2b2d31')
  108.         .setTimestamp();
  109.  
  110.     // Add a field for each tracked role
  111.     for (const [roleId, roleName] of config.trackedRoles) {
  112.         const role = await channel.guild.roles.fetch(roleId).catch(() => null);
  113.         if (!role) {
  114.             config.trackedRoles.delete(roleId);
  115.             continue;
  116.         }
  117.  
  118.         const members = role.members.map(m => m.user.toString());
  119.         embed.addFields({
  120.             name: roleName,
  121.             value: members.length > 0 ? members.join('\n') : 'No members',
  122.             inline: true
  123.         });
  124.     }
  125.  
  126.     // Add buttons for management
  127.     const buttons = new ActionRowBuilder().addComponents(
  128.         new ButtonBuilder()
  129.             .setCustomId('add_role')
  130.             .setLabel('Add Role')
  131.             .setStyle(ButtonStyle.Primary),
  132.         new ButtonBuilder()
  133.             .setCustomId('refresh')
  134.             .setLabel('Refresh')
  135.             .setStyle(ButtonStyle.Secondary)
  136.     );
  137.  
  138.     // Update or create the message
  139.     try {
  140.         if (config.messageId) {
  141.             const message = await channel.messages.fetch(config.messageId);
  142.             await message.edit({ embeds: [embed], components: [buttons] });
  143.         } else {
  144.             const message = await channel.send({ embeds: [embed], components: [buttons] });
  145.             config.messageId = message.id;
  146.         }
  147.     } catch (error) {
  148.         console.error('Error updating role list message:', error);
  149.         // Message might have been deleted, send a new one
  150.         const message = await channel.send({ embeds: [embed], components: [buttons] });
  151.         config.messageId = message.id;
  152.     }
  153. }
  154.  
  155. // Check if we have a message or need to create one
  156. async function checkOrCreateMessage() {
  157.     if (!config.channelId) return;
  158.  
  159.     const channel = await client.channels.fetch(config.channelId).catch(console.error);
  160.     if (!channel) return;
  161.  
  162.     if (config.messageId) {
  163.         try {
  164.             await channel.messages.fetch(config.messageId);
  165.         } catch {
  166.             // Message doesn't exist, reset the ID
  167.             config.messageId = null;
  168.             await updateRoleListMessage();
  169.         }
  170.     } else {
  171.         await updateRoleListMessage();
  172.     }
  173. }
  174.  
  175. // Handle button interactions
  176. client.on('interactionCreate', async interaction => {
  177.     if (!interaction.isButton()) return;
  178.  
  179.     if (interaction.customId === 'refresh') {
  180.         await interaction.deferUpdate();
  181.         await updateRoleListMessage();
  182.     }
  183.  
  184.     if (interaction.customId === 'add_role') {
  185.         if (!interaction.member.permissions.has('ADMINISTRATOR')) {
  186.             return interaction.reply({ content: 'You need administrator permissions to use this.', ephemeral: true });
  187.         }
  188.  
  189.         await interaction.reply({
  190.             content: 'Use `!add @role Role Name` to add a role to track.',
  191.             ephemeral: true
  192.         });
  193.     }
  194. });
  195.  
  196. client.login('YOUR_BOT_TOKEN');
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement