Advertisement
KingAesthetic

DiscordBotExample

Jan 24th, 2025
29
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const { Client, GatewayIntentBits, REST, Routes, EmbedBuilder } = require('discord.js');
  2. const fs = require('fs');
  3. require('dotenv').config();
  4.  
  5. // My Client Instance
  6. const client = new Client({ intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages] });
  7.  
  8. // Defining slash commands :)
  9. const commands = [
  10.     {
  11.         name: 'ping',
  12.         description: 'Replies with bot and API latency!',
  13.     },
  14.     {
  15.         name: 'kick',
  16.         description: 'Kicks a user from the server.',
  17.         options: [
  18.             {
  19.                 name: 'user',
  20.                 type: 6, // USER type
  21.                 description: 'The user to kick.',
  22.                 required: true,
  23.             },
  24.         ],
  25.     },
  26.     {
  27.         name: 'ban',
  28.         description: 'Bans a user from the server.',
  29.         options: [
  30.             {
  31.                 name: 'user',
  32.                 type: 6, // USER type
  33.                 description: 'The user to ban.',
  34.                 required: true,
  35.             },
  36.         ],
  37.     },
  38.     {
  39.         name: 'timeout',
  40.         description: 'Timeout (mute) a user for a specified duration.',
  41.         options: [
  42.             {
  43.                 name: 'user',
  44.                 type: 6, // USER type
  45.                 description: 'The user to timeout.',
  46.                 required: true,
  47.             },
  48.             {
  49.                 name: 'duration',
  50.                 type: 4, // INTEGER type
  51.                 description: 'The duration in seconds.',
  52.                 required: true,
  53.             },
  54.         ],
  55.     },
  56.     {
  57.         name: 'clear',
  58.         description: 'Deletes a number of messages from a channel.',
  59.         options: [
  60.             {
  61.                 name: 'amount',
  62.                 type: 4, // INTEGER type
  63.                 description: 'Number of messages to delete (1-100).',
  64.                 required: true,
  65.             },
  66.         ],
  67.     },
  68.     {
  69.         name: 'level',
  70.         description: 'Check your level and XP.',
  71.     },
  72.     {
  73.         name: 'leaderboard',
  74.         description: 'Shows the top 10 users by XP.',
  75.     }
  76. ];
  77.  
  78. // Slash Commands Registration
  79. const rest = new REST({ version: '10' }).setToken(process.env.TOKEN);
  80.  
  81. (async () => {
  82.     try {
  83.         console.log('Started refreshing application (/) commands.');
  84.         await rest.put(
  85.             Routes.applicationGuildCommands(process.env.CLIENT_ID, '1266754889661550652'),
  86.             { body: commands }
  87.         );
  88.  
  89.         console.log('Successfully reloaded application (/) commands.');
  90.     } catch (error) {
  91.         console.error(error);
  92.     }
  93. })();
  94.  
  95. // Leveling system roles
  96. const roles = [
  97.   { level: 1, role: 'Bronze I' },
  98.   { level: 5, role: 'Bronze II' },
  99.   { level: 10, role: 'Bronze III' },
  100.   { level: 15, role: 'Silver I', additionalRole: 'Cub' },
  101.   { level: 20, role: 'Silver II' },
  102.   { level: 25, role: 'Silver III' },
  103.   { level: 30, role: 'Gold I', additionalRole: 'Young Cub' },
  104.   { level: 35, role: 'Gold II' },
  105.   { level: 40, role: 'Gold III' },
  106.   { level: 45, role: 'Platinum I', additionalRole: 'Young Adult' },
  107.   { level: 50, role: 'Platinum II' },
  108.   { level: 55, role: 'Platinum III' },
  109.   { level: 60, role: 'Diamond I', additionalRole: 'Adult' },
  110.   { level: 65, role: 'Diamond II' },
  111.   { level: 70, role: 'Diamond III' },
  112.   { level: 100, role: 'Tiger Champion', additionalRole: 'Full Grown Adult' }
  113. ];
  114.  
  115. // File to store user data (XP and Level)
  116. const userDataFile = './userData.json';
  117.  
  118. // Check if the user data file exists, or just create one duh
  119. if (!fs.existsSync(userDataFile)) {
  120.     fs.writeFileSync(userDataFile, JSON.stringify({ users: {} }, null, 4));
  121. }
  122.  
  123. // Load user data
  124. function loadUserData() {
  125.     return JSON.parse(fs.readFileSync(userDataFile, 'utf8'));
  126. }
  127.  
  128. // Save user data
  129. function saveUserData(data) {
  130.     fs.writeFileSync(userDataFile, JSON.stringify(data, null, 4));
  131. }
  132.  
  133. // When the bot is ready
  134. client.once('ready', () => {
  135.     console.log(`Logged in as ${client.user.tag}!`);
  136. });
  137.  
  138. // Handle slash commands
  139. client.on('interactionCreate', async (interaction) => {
  140.     if (!interaction.isCommand()) return;
  141.  
  142.     const { commandName, options } = interaction;
  143.  
  144.     if (commandName === 'ping') {
  145.         const embed = new EmbedBuilder()
  146.             .setColor(0x00ff00)
  147.             .setTitle('🏓 Pong!')
  148.             .addFields(
  149.                 { name: 'Bot Latency', value: `${Date.now() - interaction.createdTimestamp}ms`, inline: true },
  150.                 { name: 'API Latency', value: `${Math.round(client.ws.ping)}ms`, inline: true }
  151.             )
  152.             .setFooter({ text: 'Latency Checker', iconURL: client.user.displayAvatarURL() });
  153.  
  154.         await interaction.reply({ embeds: [embed] });
  155.     } else if (commandName === 'kick') {
  156.         const user = options.getUser('user');
  157.         const member = interaction.guild.members.cache.get(user.id);
  158.  
  159.         if (!member) {
  160.             return interaction.reply({ content: 'User not found!', ephemeral: true });
  161.         }
  162.  
  163.         try {
  164.             await member.kick();
  165.             const embed = new EmbedBuilder()
  166.                 .setColor(0xff0000)
  167.                 .setTitle('✅ User Kicked')
  168.                 .setDescription(`Successfully kicked ${user.tag}.`)
  169.                 .setTimestamp();
  170.  
  171.             interaction.reply({ embeds: [embed] });
  172.         } catch (error) {
  173.             interaction.reply({ content: `❌ Failed to kick ${user.tag}.`, ephemeral: true });
  174.         }
  175.     } else if (commandName === 'ban') {
  176.         const user = options.getUser('user');
  177.         const member = interaction.guild.members.cache.get(user.id);
  178.  
  179.         if (!member) {
  180.             return interaction.reply({ content: 'User not found!', ephemeral: true });
  181.         }
  182.  
  183.         try {
  184.             await member.ban();
  185.             const embed = new EmbedBuilder()
  186.                 .setColor(0xff0000)
  187.                 .setTitle('✅ User Banned')
  188.                 .setDescription(`Successfully banned ${user.tag}.`)
  189.                 .setTimestamp();
  190.  
  191.             interaction.reply({ embeds: [embed] });
  192.         } catch (error) {
  193.             interaction.reply({ content: `❌ Failed to ban ${user.tag}.`, ephemeral: true });
  194.         }
  195.     } else if (commandName === 'timeout') {
  196.         const user = options.getUser('user');
  197.         const duration = options.getInteger('duration');
  198.         const member = interaction.guild.members.cache.get(user.id);
  199.  
  200.         if (!member) {
  201.             return interaction.reply({ content: 'User not found!', ephemeral: true });
  202.         }
  203.  
  204.         try {
  205.             await member.timeout(duration * 1000);
  206.             const embed = new EmbedBuilder()
  207.                 .setColor(0xffa500)
  208.                 .setTitle('✅ User Timed Out')
  209.                 .setDescription(`${user.tag} has been timed out for ${duration} seconds.`)
  210.                 .setTimestamp();
  211.  
  212.             interaction.reply({ embeds: [embed] });
  213.         } catch (error) {
  214.             interaction.reply({ content: `❌ Failed to timeout ${user.tag}.`, ephemeral: true });
  215.         }
  216.     } else if (commandName === 'clear') {
  217.         const amount = options.getInteger('amount');
  218.  
  219.         if (amount < 1 || amount > 100) {
  220.             return interaction.reply({ content: '❌ You can only delete between 1 and 100 messages.', ephemeral: true });
  221.         }
  222.  
  223.         try {
  224.             const messages = await interaction.channel.bulkDelete(amount, true);
  225.             const embed = new EmbedBuilder()
  226.                 .setColor(0x00ff00)
  227.                 .setTitle('✅ Messages Cleared')
  228.                 .setDescription(`Successfully deleted ${messages.size} messages.`)
  229.                 .setTimestamp();
  230.  
  231.             interaction.reply({ embeds: [embed] });
  232.         } catch (error) {
  233.             interaction.reply({ content: `❌ Failed to delete messages.`, ephemeral: true });
  234.         }
  235.     } else if (commandName === 'level') {
  236.         // Get user data
  237.         const data = loadUserData();
  238.         const userID = interaction.user.id;
  239.         const user = data.users[userID];
  240.  
  241.         if (!user) {
  242.             return interaction.reply({ content: 'You have not gained any XP yet!', ephemeral: true });
  243.         }
  244.  
  245.         const embed = new EmbedBuilder()
  246.             .setColor(0x00ff00)
  247.             .setTitle(`${interaction.user.tag}'s Level`)
  248.            .addFields(
  249.                { name: 'Level', value: `${user.level}`, inline: true },
  250.                { name: 'XP', value: `${user.xp}`, inline: true }
  251.            )
  252.            .setTimestamp();
  253.  
  254.        interaction.reply({ embeds: [embed] });
  255.    } else if (commandName === 'leaderboard') {
  256.        // Get all users and sort by XP
  257.        const data = loadUserData();
  258.        const users = Object.entries(data.users)
  259.            .map(([id, { xp, level }]) => ({ id, xp, level }))
  260.            .sort((a, b) => b.xp - a.xp); // Sort by XP in descending order
  261.  
  262.        const leaderboard = users.slice(0, 10); // Get top 10 users
  263.  
  264.        // Create leaderboard embed
  265.        const embed = new EmbedBuilder()
  266.            .setColor(0x00ff00)
  267.            .setTitle('Top 10 Users by XP')
  268.            .setTimestamp();
  269.  
  270.        leaderboard.forEach((user, index) => {
  271.            const member = interaction.guild.members.cache.get(user.id);
  272.            embed.addFields({
  273.                name: `#${index + 1} ${member ? member.user.tag : 'Unknown'}`,
  274.                value: `Level: ${user.level} | XP: ${user.xp}`,
  275.                inline: false,
  276.            });
  277.        });
  278.  
  279.        interaction.reply({ embeds: [embed] });
  280.    }
  281. });
  282.  
  283. // Handle messages and XP
  284. client.on('messageCreate', async (message) => {
  285.    if (message.author.bot) return;
  286.  
  287.    // Load user data
  288.    let data = loadUserData();
  289.    const userID = message.author.id;
  290.    let user = data.users[userID];
  291.  
  292.    // Initialize user if they don't exist in the data
  293.     if (!user) {
  294.         data.users[userID] = { xp: 0, level: 1 };
  295.         user = data.users[userID];
  296.     }
  297.  
  298.     // Calculate XP based on message length
  299.     let xpGained = Math.floor(message.content.split(' ').length / 5) * 10; // 10 XP per 5 words
  300.  
  301.     user.xp += xpGained;
  302.  
  303.     // Check for level-up
  304.     const levelRoles = roles.filter(role => role.level <= user.level);
  305.     if (levelRoles.length > 0) {
  306.         const latestRole = levelRoles[levelRoles.length - 1];
  307.  
  308.         // Assign role if not already assigned
  309.         const member = message.guild.members.cache.get(userID);
  310.         if (member && !member.roles.cache.some(role => role.name === latestRole.role)) {
  311.             await member.roles.add(latestRole.role);
  312.             // Check for additional role
  313.             if (latestRole.additionalRole) {
  314.                 await member.roles.add(latestRole.additionalRole);
  315.                 message.reply(`🎊 Congratulations! You've reached level ${user.level}. An additional role ${latestRole.additionalRole} has been added to you.`);
  316.            } else {
  317.                message.reply(`🎊 Congratulations! You've reached level ${user.level} and gained the ${latestRole.role} role.`);
  318.             }
  319.         }
  320.     }
  321.  
  322.     // Check if user has leveled up
  323.     const nextLevel = Math.floor(user.xp / 100) + 1;
  324.     if (user.level < nextLevel) {
  325.         user.level = nextLevel;
  326.     }
  327.  
  328.     // Save updated data Yippe!
  329.     saveUserData(data);
  330. });
  331.  
  332. client.login(process.env.TOKEN);
  333.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement