Crafting Your First Discord Bot with Discord.js: A Beginner's Journey

Jan 25, 2025

🤖

Let's create a digital companion that can chat, play games, and help manage your Discord server! Perfect for first-time coders.

🧭 Getting Started: What You'll Need

ToolWhat It Does
Node.jsRuns JavaScript outside browsers
discord.js v14Makes bot creation easier
Code EditorWhere we'll write our magic (VS Code recommended)
Discord AccountTo create and test your bot

🚀 Step 1: Creating Your Bot Identity

  1. Go to Discord Developer Portal
  2. Click "New Application" and name your bot
  3. Navigate to "Bot" > "Add Bot"
🔒

Your bot token is like a password! Save it in a .env file and never share it.

⚙️ Setting Up Your Project

Create a new folder and run these commands in your terminal:

pnpm init -y              # Creates package.json
pnpm install discord.js   # Main bot library
pnpm install dotenv       # Keeps secrets safe

📁 File Structure Basics

your-bot/
├── bot.js            # Main bot code
├── commands/         # Slash commands folder
   └── ping.js       # Example command
├── .env              # Stores your bot token
└── package.json      # Project dependencies

💡 Core Bot Code Explained

Create bot.js with this starter code:

// Load environment variables from .env file
require('dotenv').config();

// Import necessary Discord.js components
const { Client, GatewayIntentBits } = require('discord.js');

// Create our bot client with required permissions
const bot = new Client({
  intents: [
    GatewayIntentBits.Guilds,          // Access server info
    GatewayIntentBits.GuildMessages,   // Read messages
    GatewayIntentBits.MessageContent   // See message content
  ]
});

// Bot startup confirmation
bot.on('ready', () => {
  console.log(`${bot.user.tag} is online!`);
});

// Basic message response
bot.on('messageCreate', async (message) => {
  if (message.content === '!hello') {
    await message.reply('👋 Hey there!');
  }
});

// Start the bot using our token
bot.login(process.env.DISCORD_TOKEN);
🔌

Create a .env file with:
DISCORD_TOKEN=your-bot-token-here

🎨 Creating Your First Slash Command

Make commands/ping.js:

const { SlashCommandBuilder } = require('discord.js');

module.exports = {
  data: new SlashCommandBuilder()
    .setName('ping')         // Command name
    .setDescription('Check bot latency'), // Description
    
  // What happens when command is used
  async execute(interaction) {
    const start = Date.now();
    await interaction.reply('🏓 Pinging...');
    const latency = Date.now() - start;
    
    await interaction.editReply(
      `🏓 Pong! Latency: ${latency}ms`
    );
  }
};

🚀 Deploying Commands

Create deploy-commands.js:

const { REST, Routes } = require('discord.js');
require('dotenv').config();

// List all your commands here
const commands = [
  require('./commands/ping.js').data.toJSON()
];

// Prepare REST client
const rest = new REST({ version: '10' }).setToken(process.env.DISCORD_TOKEN);

// Deployment script
(async () => {
  try {
    console.log('🔄 Deploying commands...');
    
    // Update commands globally
    await rest.put(
      Routes.applicationCommands(process.env.CLIENT_ID),
      { body: commands }
    );
    
    console.log('✅ Commands deployed successfully!');
  } catch (error) {
    console.error('❌ Deployment failed:', error);
  }
})();
💡

Find your CLIENT_ID in Discord Developer Portal > Application > General Information

🌟 Creative Command Ideas

🎮 Rock-Paper-Scissors Game

// commands/rps.js
const { SlashCommandBuilder } = require('discord.js');
const choices = ['🪨 Rock', '📄 Paper', '✂️ Scissors'];

module.exports = {
  data: new SlashCommandBuilder()
    .setName('rps')
    .setDescription('Play Rock-Paper-Scissors!'),
    
  async execute(interaction) {
    const botChoice = choices[Math.floor(Math.random() * 3)];
    const userChoice = choices[Math.floor(Math.random() * 3)];
    
    await interaction.reply(
      `🤖 ${botChoice} vs ${userChoice} 🧑💻\n` +
      (botChoice === userChoice ? "It's a tie!" : 
      ((botChoice === '🪨 Rock' && userChoice === '✂️ Scissors') ||
       (botChoice === '📄 Paper' && userChoice === '🪨 Rock') ||
       (botChoice === '✂️ Scissors' && userChoice === '📄 Paper')) 
       ? "I win! 😎" : "You win! 🎉")
    );
  }
};

🐱 Random Cat Fact

// commands/catfact.js
const { SlashCommandBuilder } = require('discord.js');
const facts = [
  "Cats can jump 5 times their height!",
  "A group of cats is called a clowder",
  "Cats sleep 12-16 hours daily",
  "Cats have 32 muscles in each ear"
];

module.exports = {
  data: new SlashCommandBuilder()
    .setName('catfact')
    .setDescription('Get a random cat fact'),
    
  async execute(interaction) {
    const fact = facts[Math.floor(Math.random() * facts.length)];
    await interaction.reply(`🐱 Did you know? ${fact}`);
  }
};

🛠️ Hosting Your Bot 24/7

PlatformBest For
Railway.appEasy deployment with free tier
AWS EC2Full control and scalability
Raspberry PiAlways-on home hosting

🚨 Common Issues & Fixes

⚠️
Troubleshooting Guide:
  • Bot not responding? Check if it's added to your server
  • Commands not showing? Redeploy with deploy-commands.js
  • Getting errors? Restart the bot with node bot.js
  • Permission issues? Check bot roles in server settings

🌈 What's Next?

💡
Future Project Ideas:
  1. Server member count tracker
  2. Music player with YouTube integration
  3. Auto-moderation system
  4. Trivia game with score leaderboards
  5. Weather command using OpenWeather API
// Keep your bot running forever
bot.on('disconnect', () => {
  console.log('🔌 Bot disconnected... Reconnecting');
  bot.login(process.env.DISCORD_TOKEN);
});
🎉

Congratulations! You've just created your first Discord bot. The coding journey never ends - what will you create next?

BotSuccess=Curiosity×PracticeFearOfFailure\text{BotSuccess} = \frac{\text{Curiosity} \times \text{Practice}}{\text{FearOfFailure}}

👋

Stuck or want to show off your creation? Join the official Discord.js support Server for help and inspiration!

Philip30