Discord adalah sebuah aplikasi pengirim pesan instan gratis dengan fitur VoIP, obrolan video dan fitur untuk mendukung permainan video seperti integrasi dengan Twitch.tv dan Steam. Discord ditujukan terutama untuk pemain, pembuat konten, pengembang, dan penjual permainan video. Discord digunakan oleh sekitar 56 juta pemain permainan video tiap bulannya karena adanya fitur yang mendukung permainan video. Discord dapat berjalan pada peramban web dan aplikasinya sendiri sumber Wikipedia.

Syarat

  • NodeJs silahkan baca di Tutorial cara install NodeJs.
  • Akun discord dan server discord (Kamu sebagai adminnya).

Mendaftarkan bot

Kita perlu mendapatkan :

  • Application ID
  • OAuth2 URL
  • Token

Kita harus mendaftarkan bot kita di dashboard developer Discord terlebih dahulu, caranya buka link https://discord.com/developers/applications lalu buat New Aplication lalu masukkan nama aplikasi kalian.

Aplication ID bisa didapatkan tab General Informations

OAuth2 Generated URL akan kita gunakan untuk menambahkan bot ke server, cara mendapatkannya dengan pindah ke tab OAuth2 lalu cari section OAuth2 URL Generator. Di bagian Scopes pilih bot dan applications.commands.

Sedangkan untuk Bot Permissions biar gampang langsung centang saja sebagai Administrator.

Contoh OAuth2 URL seperti https://discord.com/oauth2/authorize?client_id=1460560520947175642&permissions=0&integration_type=0&scope=applications.commands+bot

Sekarang kita buat token, pindah ke tab Bot dan klik tombol Reset Token

Tambahkan bot ke server

Buka OAuth URL di di browser untuk menambahkan bot ke server

Install discord.js

Selanjutnya adalah install discord.js, discord.js adalah library yang akan membantu kita berkomunikasi dengan API dari discord sehingga lebih mudah.

Buat folder baru dimana saja terserah kalian, lalu buka terminal / powershell dan arahkan foldernya ke folder yang baru kalian buat tadi. Selanjutnya, jalankan perintah dibawah ini.

npm init -y
npm install discord.js --save

Koding time

Struktur folder yang akan kita gunakan adalah

nixpoinbot/
├── config.json            # File konfigurasi bot (token, clientId, guildId, dll)
├── index.js               # File utama untuk menjalankan bot Discord
├── deploy-commands.js     # Script untuk mendaftarkan (deploy) slash commands ke Discord
├── package.json           # Informasi project dan daftar dependencies
├── package-lock.json      # Lock versi dependency agar konsisten
└── commands/              # Folder untuk semua slash command bot
    └── utility/           # Kategori command utilitas
        └── ping.js        # Command /ping percobaan

Contoh file config.json

//config.json
{
  "token": "MTQ2MDUzMTgxODk2ODEyNTQ3MQ.GCplUF.9M3sUgaXfXHdtcbDYLRLbQ22LXZAqYfSTdsdoA",
    "clientId": "1460531818968125471"
}

Contoh index.js:

//index.js
// Import module bawaan Node.js untuk membaca file dan path folder
const fs = require('node:fs');
const path = require('node:path');

// Import class dan enum yang dibutuhkan dari discord.js
const { Client, Events, GatewayIntentBits, Collection, MessageFlags } = require('discord.js');

// Ambil token bot dari file config.json
const { token } = require('./config.json');

// Membuat instance client Discord dengan intent Guilds (wajib untuk slash command)
const client = new Client({ intents: [GatewayIntentBits.Guilds] });

// Event yang dijalankan sekali saat bot berhasil login
client.once(Events.ClientReady, (readyClient) => {
  console.log(`Ready! Logged in as ${readyClient.user.tag}`);
});

// Membuat Collection untuk menyimpan semua command
client.commands = new Collection();

// Path ke folder commands
const foldersPath = path.join(__dirname, 'commands');

// Membaca semua sub-folder di dalam folder commands
const commandFolders = fs.readdirSync(foldersPath);

// Loop setiap folder command (contoh: utility)
for (const folder of commandFolders) {
  const commandsPath = path.join(foldersPath, folder);

  // Ambil semua file .js di dalam folder command
  const commandFiles = fs
    .readdirSync(commandsPath)
    .filter((file) => file.endsWith('.js'));

  // Loop setiap file command
  for (const file of commandFiles) {
    const filePath = path.join(commandsPath, file);

    // Import file command
    const command = require(filePath);

    // Pastikan command memiliki properti data dan execute
    if ('data' in command && 'execute' in command) {
      // Simpan command ke Collection dengan nama command sebagai key
      client.commands.set(command.data.name, command);
    } else {
      // Warning jika struktur command tidak sesuai
      console.log(
        `[WARNING] The command at ${filePath} is missing a required "data" or "execute" property.`
      );
    }
  }
}

// Event yang dipicu saat ada interaksi (slash command, button, dll)
client.on(Events.InteractionCreate, async (interaction) => {
  // Hanya proses slash command
  if (!interaction.isChatInputCommand()) return;

  // Ambil command berdasarkan nama yang dipanggil
  const command = interaction.client.commands.get(interaction.commandName);

  // Jika command tidak ditemukan
  if (!command) {
    console.error(`No command matching ${interaction.commandName} was found.`);
    return;
  }

  try {
    // Jalankan fungsi execute dari command
    await command.execute(interaction);
  } catch (error) {
    console.error(error);

    // Jika interaction sudah dibalas sebelumnya
    if (interaction.replied || interaction.deferred) {
      await interaction.followUp({
        content: 'There was an error while executing this command!',
        flags: MessageFlags.Ephemeral, // Pesan hanya terlihat oleh user
      });
    } else {
      // Jika interaction belum dibalas sama sekali
      await interaction.reply({
        content: 'There was an error while executing this command!',
        flags: MessageFlags.Ephemeral, // Pesan hanya terlihat oleh user
      });
    }
  }
});

// Login ke Discord menggunakan token bot
client.login(token);

Contoh file ping.js

//ping.js
// Import SlashCommandBuilder untuk membuat slash command
const { SlashCommandBuilder } = require('discord.js');

module.exports = {
  // Definisi data command (nama & deskripsi slash command)
  data: new SlashCommandBuilder()
    .setName('ping') // Nama command: /ping
    .setDescription('Replies with Pong!'), // Deskripsi command

  // Fungsi yang dijalankan saat command dipanggil
  async execute(interaction) {
    // Membalas interaksi user dengan pesan "Pong!"
    await interaction.reply('Pong!');
  },
};

Contoh file deploy-commands.js

//deploy-commands.js
// Import REST client dan Routes untuk registrasi slash command ke Discord API
const { REST, Routes } = require('discord.js');

// Ambil clientId, guildId (opsional), dan token dari config.json
const { clientId, guildId, token } = require('./config.json');

// Import module bawaan Node.js
const fs = require('node:fs');
const path = require('node:path');

// Array untuk menampung semua data slash command
const commands = [];

// Path ke folder commands
const foldersPath = path.join(__dirname, 'commands');

// Ambil semua sub-folder di dalam folder commands
const commandFolders = fs.readdirSync(foldersPath);

// Loop setiap folder command (contoh: utility)
for (const folder of commandFolders) {
  // Path ke folder command tertentu
  const commandsPath = path.join(foldersPath, folder);

  // Ambil semua file .js di folder tersebut
  const commandFiles = fs
    .readdirSync(commandsPath)
    .filter((file) => file.endsWith('.js'));

  // Loop setiap file command
  for (const file of commandFiles) {
    const filePath = path.join(commandsPath, file);

    // Import file command
    const command = require(filePath);

    // Pastikan command memiliki data dan execute
    if ('data' in command && 'execute' in command) {
      // Konversi SlashCommandBuilder ke format JSON lalu simpan
      commands.push(command.data.toJSON());
    } else {
      // Warning jika struktur command tidak sesuai
      console.log(
        `[WARNING] The command at ${filePath} is missing a required "data" or "execute" property.`
      );
    }
  }
}

// Membuat instance REST client dan set token bot
const rest = new REST().setToken(token);

// Jalankan proses deploy slash command
(async () => {
  try {
    console.log(`Started refreshing ${commands.length} application (/) commands.`);

    // Mengirim ulang (refresh) semua slash command ke Discord
    // Global command (berlaku di semua server, update bisa sampai ±1 jam)
    const data = await rest.put(
      Routes.applicationCommands(clientId),
      { body: commands }
    );

    console.log(`Successfully reloaded ${data.length} application (/) commands.`);
  } catch (error) {
    // Menangkap dan menampilkan error jika deploy gagal
    console.error(error);
  }
})();

Mendaftarkan Command

Jalankan file deploy-commands.js

node deploy-commands.js

Setelah itu kita jalankan botnya

node .

Jika tidak ada error, maka bot kalian akan berubah statusnya menjadi online

Kalau kalian mengirim pesan ke server dengan kata ping maka bot tersebut akan langsung menjawab dengan pong

Upload kode ke hosting

Bot kalian sudah berjalan lancar tapi agar bisa berjalan 24 jam nonstop, kita perlu men-hosting-nya. Disini saya menggunakan Heroku silahkan kalian daftar dulu disana.

Setelah mendaftar di Heroku.com selanjutnya install Heroku CLI, download file di link berikut untuk menginstallnya https://devcenter.heroku.com/articles/heroku-cli#download-and-install

Jika kalian sudah berhasil menginstall heroku CLI, jalankan perintah di bawah ini untuk login heroku via CLI

heroku login

Kita perlu membuat dan mengedit beberapa file agar kode kita bisa berjalan di Heroku.

Edit file package.json dan tambahkan baris

    "start": "node index.js"

Lihat gambar untuk lebih jelasnya

  • Buat juga file baru lainnya bernama .gitignore lalu isinya seperti
/node_modules
node_modules
npm-debug.log
.DS_Store
/*.env

Saatnya proses upload, jalankan perintah dibawah ini dan kode kalian akan terupload ke heroku

git init
git add .
git commit -m tesbot
heroku create
git push heroku master

Bot kalian akan langsung online lagi dan berjalan dengan lancar. Jika ingin menambahkan /command lain, kalian bisa ikuti panduan pada tulisan berikut Menambahkan Command Bot Discord dengan discord.js