Beranda Blog Programming Cara Membuat Bot Discord Dengan Python D...

Programming

Cara Membuat Bot Discord Dengan Python Dari Awal Hingga Deployment

A
Admin
27 menit baca
Cara Membuat Bot Discord Dengan Python Dari Awal Hingga Deployment

Membuat bot Discord dengan Python adalah salah satu cara paling praktis untuk belajar otomasi, event-driven programming, integrasi API, dan deployment aplikasi kecil yang nyata digunakan komunitas. Dengan library seperti discord.py, bot dapat merespons pesan, menjalankan command, memvalidasi input, memberi role, mencatat aktivitas server, hingga terhubung dengan API eksternal. Tutorial ini menggunakan pendekatan langkah demi langkah, sekaligus membahas alasan di balik setiap keputusan teknis agar Anda tidak hanya menyalin kode, tetapi juga memahami cara kerja bot Discord secara profesional.

Discord banyak digunakan oleh komunitas gim, developer, edukasi, hingga organisasi internal. Bot membantu meningkatkan pengalaman pengguna dengan mengotomasi tugas berulang, menyediakan informasi, dan menambahkan fitur interaktif. Python cocok untuk kebutuhan ini karena sintaksnya mudah dibaca, ekosistemnya matang, dan tersedia library seperti discord.py yang menyediakan akses ke Discord API secara lebih sederhana.

Ringkasan Opsi Membuat Bot Discord dengan Python

Sebelum masuk ke implementasi, penting untuk memahami beberapa pendekatan umum. Banyak tutorial bot Discord Python menggunakan discord.py karena library ini populer, mudah dipahami, dan mendukung konsep penting seperti event, command, intents, serta modularisasi dengan cogs.

Opsi Pembuatan Bot Discord Python

Kelebihan Utama

Kekurangan Utama

Cocok Untuk

discord.py langsung

Fleksibel, dokumentasi luas, cocok belajar dasar API Discord

Struktur bisa berantakan jika proyek membesar

Pemula hingga menengah

discord.ext.commands

Command lebih rapi, mudah validasi input

Perlu memahami prefix/slash command dan context

Bot komunitas dan utilitas

Template bot dengan cogs

Modular, mudah dikembangkan tim

Setup awal lebih kompleks

Proyek jangka panjang

Slash command / application command

Modern, user-friendly di Discord

Sinkronisasi command perlu perhatian

Bot publik dan profesional

Hosting lokal

Mudah untuk testing

Bot mati jika komputer dimatikan

Belajar dan prototyping

Deployment cloud/VPS

Bot online 24/7

Perlu konfigurasi environment dan keamanan token

Bot produksi

Catatan penting: Untuk tutorial ini, kita mulai dari discord.py dan discord.ext.commands karena pendekatan ini memberi fondasi kuat: Anda belajar event, command, validasi input, error handling, dan struktur proyek yang bisa dikembangkan.

Background

Bot Discord bekerja sebagai aplikasi yang terhubung ke Discord melalui API. Ketika ada aktivitas di server, seperti pesan baru, member bergabung, atau command dipanggil, Discord mengirimkan event ke bot. Bot lalu menjalankan fungsi Python yang sesuai.

Konsep ini dikenal sebagai event-driven programming. Artinya, program tidak berjalan secara linear seperti skrip biasa, tetapi menunggu peristiwa tertentu. Misalnya:

  1. User mengirim pesan.

  2. Discord mengirim event on_message.

  3. Bot membaca isi pesan.

  4. Bot menentukan apakah perlu merespons.

  5. Bot mengirim balasan ke channel.

Library discord.py menyederhanakan komunikasi dengan Discord API. Anda tidak perlu membuat koneksi WebSocket manual, menyusun request HTTP sendiri, atau menangani payload mentah dari Discord. Library ini menyediakan class dan decorator seperti commands.Bot, @bot.event, dan @bot.command().

Dalam praktik profesional, bot Discord biasanya digunakan untuk:

  1. Moderasi server, seperti menghapus spam, memberi peringatan, atau mencatat aktivitas.

  2. Informasi otomatis, seperti menampilkan aturan, jadwal, statistik, atau pengumuman.

  3. Integrasi API eksternal, seperti cuaca, GitHub, game server, atau sistem internal.

  4. Interaksi komunitas, seperti kuis, leveling, polling, dan command hiburan.

  5. Manajemen role, seperti memberi role otomatis saat user bergabung.

Challenge/Problem

Masalah utama saat membuat bot Discord bukan hanya menulis kode yang bisa membalas pesan. Banyak pemula mengalami hambatan seperti token bocor, bot tidak online, command tidak merespons, intents belum diaktifkan, atau struktur kode sulit dikembangkan.

Beberapa tantangan umum:

  1. Token bot tidak aman
    Token adalah kredensial rahasia. Jika token dibagikan ke GitHub atau chat publik, orang lain dapat mengendalikan bot.

  2. Intents belum dikonfigurasi
    Discord menggunakan intents untuk menentukan event apa saja yang boleh diterima bot. Jika message_content tidak aktif, bot mungkin online tetapi tidak bisa membaca isi pesan.

  3. Event dan command saling bertabrakan
    Jika menggunakan on_message tanpa memanggil bot.process_commands(message), command berbasis prefix bisa berhenti bekerja.

  4. Struktur proyek tidak scalable
    Satu file besar mungkin cukup untuk bot sederhana, tetapi akan sulit dirawat saat fitur bertambah.

  5. Deployment tidak stabil
    Bot yang berjalan di laptop pribadi akan offline saat laptop dimatikan. Untuk server komunitas aktif, deployment cloud atau VPS lebih tepat.

  6. Error handling kurang baik
    Bot yang tidak menangani error akan membingungkan user. Misalnya, ketika user memasukkan command tanpa argumen, bot sebaiknya memberi pesan bantuan yang jelas.

Approach

Pendekatan tutorial ini adalah membuat bot dari dasar, lalu meningkatkannya secara bertahap. Kita akan mulai dari setup aplikasi di Discord Developer Portal, menyiapkan environment Python, membuat bot sederhana, menambahkan command, menangani error, lalu menyusun struktur proyek yang lebih profesional.

Alurnya sebagai berikut:

  1. Menyiapkan aplikasi bot di Discord Developer Portal agar Discord mengenali bot Anda.

  2. Mengaktifkan intents yang diperlukan supaya bot bisa menerima event tertentu.

  3. Mengundang bot ke server dengan permission yang sesuai.

  4. Membuat virtual environment Python agar dependency proyek terisolasi.

  5. Menginstal discord.py dan python-dotenv untuk API Discord dan pengelolaan token.

  6. Membuat file konfigurasi .env agar token tidak ditulis langsung di kode.

  7. Menulis bot dasar untuk memverifikasi koneksi.

  8. Menambahkan command interaktif agar user bisa menggunakan bot.

  9. Menambahkan validasi dan error handling supaya bot lebih aman dan ramah pengguna.

  10. Menyusun opsi deployment untuk menjalankan bot secara stabil.

Pendekatan ini selaras dengan praktik umum dalam pengembangan bot Python: mulai dari event dasar, lanjut ke command, validasi input, penggunaan API, dan deployment.

Perbandingan Library dan Pendekatan

Saat membangun bot Discord dengan Python, pilihan paling umum adalah menggunakan library yang membungkus Discord API. Berikut perbandingan praktisnya.

Kriteria

discord.py

Template dengan Cogs

Slash Command

Kemudahan untuk pemula

Tinggi

Sedang

Sedang

Struktur proyek besar

Sedang

Tinggi

Tinggi

Command berbasis teks

Sangat baik

Sangat baik

Tidak fokus

Pengalaman user modern

Baik

Baik

Sangat baik

Waktu setup awal

Cepat

Lebih lama

Sedang

Cocok untuk produksi

Bisa

Sangat cocok

Sangat cocok

Rekomendasi Berdasarkan Use Case

Use Case

Rekomendasi

Alasan

Belajar pertama kali

discord.py dasar

Cepat dipahami dan mudah diuji

Bot komunitas kecil

discord.ext.commands

Command lebih rapi dan mudah dikembangkan

Bot komunitas besar

Cogs + deployment cloud

Modular dan stabil

Bot publik profesional

Slash command

Lebih sesuai pengalaman Discord modern

Bot eksperimen lokal

Hosting lokal

Setup sederhana

Bot 24/7

VPS atau cloud app platform

Tidak bergantung pada komputer pribadi

Tips: Jika Anda baru mulai, jangan langsung membuat struktur terlalu kompleks. Pahami dulu event, command, intents, dan token. Setelah itu, barulah pindahkan fitur ke cogs atau modul terpisah.

Prerequisites

Sebelum mengikuti langkah-langkah teknis, pastikan Anda sudah menyiapkan beberapa hal berikut.

Kebutuhan

Versi/Rekomendasi

Mengapa Penting

Akun Discord

Aktif dan bisa membuat server

Dibutuhkan untuk membuat aplikasi bot

Server Discord

Server milik sendiri atau punya izin admin

Bot perlu tempat untuk diuji

Python

Python 3.10+ direkomendasikan

Kompatibel dengan library modern

Code editor

VS Code, PyCharm, atau editor lain

Memudahkan editing dan debugging

Terminal

Command Prompt, PowerShell, Terminal macOS/Linux

Untuk menjalankan command

Dasar Python

Function, async, variable, import

Membantu memahami kode bot

Git opsional

Direkomendasikan

Berguna untuk version control

Struktur Proyek yang Akan Dibuat

TEXT
discord-python-bot/
├── bot.py
├── .env
├── .gitignore
└── requirements.txt

Setiap file memiliki fungsi:

  1. bot.py berisi kode utama bot.

  2. .env menyimpan token rahasia.

  3. .gitignore mencegah file sensitif masuk ke Git.

  4. requirements.txt mencatat dependency Python.

Peringatan: Jangan pernah membagikan token bot. Jika token terlanjur bocor, segera reset token dari Discord Developer Portal.

Step 1: Membuat Aplikasi Bot di Discord Developer Portal

  1. Buka Discord Developer Portal di browser.

  2. Masuk menggunakan akun Discord Anda.

  3. Klik tombol New Application.

  4. Masukkan nama aplikasi, misalnya Python Community Bot.

  5. Klik Create.

Langkah ini penting karena bot Discord harus terdaftar sebagai aplikasi resmi di sistem Discord. Aplikasi ini menjadi identitas utama bot, termasuk nama, avatar, token, permission, dan pengaturan OAuth2.

Setelah aplikasi dibuat:

  1. Buka menu Bot.

  2. Klik Add Bot.

  3. Konfirmasi pembuatan bot.

  4. Atur nama dan avatar bot jika diperlukan.

Catatan penting: Aplikasi dan bot adalah dua konsep yang berkaitan tetapi tidak identik. Aplikasi adalah container, sedangkan bot adalah user otomatis yang akan masuk ke server.

Step 2: Mengaktifkan Privileged Gateway Intents

  1. Masuk ke halaman aplikasi bot.

  2. Buka menu Bot.

  3. Cari bagian Privileged Gateway Intents.

  4. Aktifkan Message Content Intent.

  5. Aktifkan Server Members Intent jika bot perlu membaca data member.

  6. Simpan perubahan.

Intents penting karena Discord membatasi jenis event yang dapat diterima bot. Jika Anda ingin bot membaca isi pesan untuk command berbasis prefix seperti !halo, maka Message Content Intent harus aktif.

Di kode Python, intents juga harus diaktifkan:

PYTHON
import discord
from discord.ext import commands

intents = discord.Intents.default()
intents.message_content = True

bot = commands.Bot(command_prefix="!", intents=intents)

Mengaktifkan intents hanya di portal tidak cukup. Anda juga harus mendeklarasikannya di kode. Sebaliknya, mengaktifkannya di kode saja juga tidak cukup jika intent tersebut termasuk privileged intent di portal.

Peringatan: Jika bot online tetapi tidak merespons command berbasis pesan, periksa Message Content Intent di portal dan kode.

Step 3: Mengundang Bot ke Server Discord

  1. Buka menu OAuth2.

  2. Pilih URL Generator.

  3. Centang scope bot.

  4. Centang scope applications.commands jika ingin memakai slash command nanti.

  5. Pilih permission yang dibutuhkan, misalnya:

    1. Send Messages

    2. Read Message History

    3. View Channels

    4. Manage Messages jika bot akan moderasi

  6. Salin generated URL.

  7. Buka URL tersebut di browser.

  8. Pilih server tujuan.

  9. Klik Authorize.

Permission sebaiknya diberikan sesuai kebutuhan. Bot sederhana tidak perlu permission administrator. Prinsip least privilege membuat bot lebih aman jika token atau aksesnya bermasalah.

Fitur Bot

Permission Minimum

Membalas pesan

View Channels, Send Messages

Membaca riwayat

Read Message History

Menghapus spam

Manage Messages

Memberi role

Manage Roles

Membuat embed

Send Messages, Embed Links

Tips: Untuk tahap belajar, gunakan server test pribadi. Jangan langsung menguji bot di server besar karena error command bisa mengganggu member.

Step 4: Menyiapkan Folder Proyek dan Virtual Environment

  1. Buat folder proyek baru:
BASH
mkdir discord-python-bot
cd discord-python-bot
  1. Buat virtual environment:
BASH
python -m venv .venv
  1. Aktifkan virtual environment di Windows:
BASH
.venv\Scripts\activate
  1. Aktifkan virtual environment di macOS atau Linux:
BASH
source .venv/bin/activate

Virtual environment penting agar dependency bot tidak bercampur dengan dependency Python global. Ini membuat proyek lebih mudah dipindahkan ke komputer lain atau dideploy ke server.

Jika berhasil, biasanya terminal akan menampilkan prefix seperti:

TEXT
(.venv) $

Tips: Jika command python tidak dikenali di Windows, coba gunakan py:

BASH
py -m venv .venv

Step 5: Menginstal Library yang Dibutuhkan

  1. Instal discord.py dan python-dotenv:

BASH
pip install discord.py python-dotenv
  1. Simpan dependency ke requirements.txt:
BASH
pip freeze > requirements.txt

discord.py digunakan untuk berinteraksi dengan Discord API. python-dotenv digunakan untuk membaca token dari file .env, sehingga token tidak perlu ditulis langsung di kode.

Contoh isi requirements.txt akan terlihat seperti:

TEXT
discord.py==2.4.0
python-dotenv==1.0.1

Versi bisa berbeda tergantung waktu instalasi.

Catatan penting: Menyimpan dependency di requirements.txt membantu deployment. Server produksi dapat menginstal dependency dengan pip install -r requirements.txt.

Step 6: Menyimpan Token Bot dengan Aman

  1. Buka Discord Developer Portal.

  2. Masuk ke aplikasi bot.

  3. Buka menu Bot.

  4. Klik Reset Token atau Copy Token.

  5. Buat file .env di folder proyek.

  6. Isi file .env seperti berikut:

ENV
DISCORD_TOKEN=isi_token_bot_anda_di_sini
  1. Buat file .gitignore:
GITIGNORE
.env
.venv/
__pycache__/
*.pyc

Langkah ini penting karena token adalah akses penuh ke bot. Jika token bocor, pihak lain dapat menjalankan bot, mengirim pesan, atau menyalahgunakan permission yang dimiliki bot.

Peringatan: Jangan commit .env ke GitHub. Jika token sudah pernah masuk repository publik, anggap token tersebut bocor dan reset segera.

Step 7: Membuat Bot Dasar

  1. Buat file bot.py.

  2. Tulis kode berikut:

PYTHON
import os

import discord
from discord.ext import commands
from dotenv import load_dotenv

load_dotenv()

token = os.getenv("DISCORD_TOKEN")

intents = discord.Intents.default()
intents.message_content = True

bot = commands.Bot(command_prefix="!", intents=intents)


@bot.event
async def on_ready():
    print(f"Bot berhasil login sebagai {bot.user}")


bot.run(token)
  1. Jalankan bot:
BASH
python bot.py

Expected output di terminal:

TEXT
Bot berhasil login sebagai Python Community Bot#1234

Kode ini melakukan beberapa hal penting:

  1. Memuat environment variable dari .env.

  2. Mengambil token menggunakan os.getenv.

  3. Membuat konfigurasi intents.

  4. Membuat instance bot dengan prefix !.

  5. Menjalankan event on_ready saat bot berhasil login.

  6. Menghubungkan bot ke Discord menggunakan token.

Tips: Jika output berhasil muncul dan status bot online di Discord, berarti koneksi dasar sudah benar.

Step 8: Menambahkan Command Pertama

  1. Tambahkan command halo ke bot.py:

PYTHON
@bot.command(name="halo")
async def halo(ctx):
    await ctx.send(f"Halo, {ctx.author.mention}! Bot siap membantu.")
  1. Letakkan command sebelum baris bot.run(token).

  2. Jalankan ulang bot:

BASH
python bot.py
  1. Ketik command di channel Discord:
TEXT
!halo

Expected output di Discord:

TEXT
Halo, @NamaUser! Bot siap membantu.

Command ini menggunakan ctx, singkatan dari context. Objek ctx berisi informasi tentang pesan, author, channel, guild, dan command yang dipanggil.

Contoh lengkap sampai tahap ini:

PYTHON
import os

import discord
from discord.ext import commands
from dotenv import load_dotenv

load_dotenv()

token = os.getenv("DISCORD_TOKEN")

intents = discord.Intents.default()
intents.message_content = True

bot = commands.Bot(command_prefix="!", intents=intents)


@bot.event
async def on_ready():
    print(f"Bot berhasil login sebagai {bot.user}")


@bot.command(name="halo")
async def halo(ctx):
    await ctx.send(f"Halo, {ctx.author.mention}! Bot siap membantu.")


bot.run(token)

Catatan penting: Function command harus menggunakan async def karena komunikasi ke Discord berjalan secara asynchronous.

Step 9: Membuat Command dengan Argumen

  1. Tambahkan command penjumlahan:
PYTHON
@bot.command(name="tambah")
async def tambah(ctx, angka_pertama: int, angka_kedua: int):
    hasil = angka_pertama + angka_kedua
    await ctx.send(f"Hasil: {hasil}")
  1. Jalankan bot.

  2. Ketik command:

TEXT
!tambah 10 25

Expected output:

TEXT
Hasil: 35

Mengapa type hint int penting? discord.py dapat mencoba mengonversi argumen string dari pesan menjadi integer. Jika user mengetik !tambah sepuluh dua, command akan gagal karena input tidak valid. Ini memberi kesempatan untuk menambahkan error handling yang baik.

Tips: Gunakan type hint untuk validasi dasar. Ini membuat command lebih aman dan mengurangi parsing manual.

Step 10: Menambahkan Error Handling

  1. Tambahkan handler error untuk command:
PYTHON
@tambah.error
async def tambah_error(ctx, error):
    if isinstance(error, commands.MissingRequiredArgument):
        await ctx.send("Format salah. Gunakan: `!tambah 10 25`")
    elif isinstance(error, commands.BadArgument):
        await ctx.send("Argumen harus berupa angka. Contoh: `!tambah 10 25`")
    else:
        await ctx.send("Terjadi error saat menjalankan command.")
  1. Uji command tanpa argumen:
TEXT
!tambah

Expected output:

TEXT
Format salah. Gunakan: !tambah 10 25
  1. Uji command dengan argumen salah:
TEXT
!tambah ayam 25

Expected output:

TEXT
Argumen harus berupa angka. Contoh: !tambah 10 25

Error handling penting karena user tidak selalu menggunakan command dengan benar. Pesan error yang jelas akan mengurangi kebingungan dan membuat bot terasa lebih profesional.

Peringatan: Jangan menampilkan detail error internal ke user biasa. Simpan detail teknis di log terminal atau sistem logging.

Step 11: Membuat Command Embed

Embed membuat output bot terlihat lebih rapi dibanding pesan teks biasa. Cocok untuk help menu, profil user, statistik server, atau pengumuman.

  1. Tambahkan command info:
PYTHON
@bot.command(name="info")
async def info(ctx):
    embed = discord.Embed(
        title="Info Bot",
        description="Bot Discord berbasis Python untuk otomasi komunitas.",
        color=discord.Color.blue(),
    )
    embed.add_field(name="Prefix", value="`!`", inline=True)
    embed.add_field(name="Library", value="`discord.py`", inline=True)
    embed.add_field(name="Server", value=ctx.guild.name, inline=False)
    embed.set_footer(text=f"Diminta oleh {ctx.author}")

    await ctx.send(embed=embed)
  1. Ketik command:
TEXT
!info

Expected output:

TEXT
Embed berjudul "Info Bot" dengan field Prefix, Library, dan Server.

Menggunakan embed penting untuk informasi yang punya struktur. User lebih mudah membaca field dibanding paragraf panjang.

Tips: Gunakan embed secukupnya. Untuk respons sederhana seperti Pong!, teks biasa lebih cepat dan cukup.

Step 12: Menambahkan Event Saat Member Bergabung

Jika bot Anda membutuhkan fitur komunitas, event on_member_join berguna untuk menyambut member baru.

  1. Aktifkan Server Members Intent di Developer Portal.

  2. Tambahkan intents di kode:

PYTHON
intents.members = True
  1. Tambahkan event:
PYTHON
@bot.event
async def on_member_join(member):
    channel = discord.utils.get(member.guild.text_channels, name="general")
    if channel:
        await channel.send(f"Selamat datang, {member.mention}! Jangan lupa baca aturan server.")

Event ini mencari channel bernama general, lalu mengirim pesan sambutan. Jika server Anda memakai nama channel lain seperti welcome, sesuaikan bagian name="general".

Peringatan: Event ini tidak akan berjalan jika Server Members Intent belum aktif di portal dan kode.

Step 13: Menghindari Masalah on_message

Kadang developer ingin membaca pesan manual menggunakan event on_message. Namun, jika tidak hati-hati, command bot bisa berhenti.

Contoh yang kurang lengkap:

PYTHON
@bot.event
async def on_message(message):
    if message.author == bot.user:
        return

    if "python" in message.content.lower():
        await message.channel.send("Python terdeteksi!")

Masalahnya, command seperti !halo bisa tidak diproses karena event ini mengambil alih pesan. Solusinya adalah memanggil bot.process_commands(message).

Kode yang benar:

PYTHON
@bot.event
async def on_message(message):
    if message.author == bot.user:
        return

    if "python" in message.content.lower():
        await message.channel.send("Python terdeteksi!")

    await bot.process_commands(message)

Mengapa ini penting? commands.Bot memiliki sistem command internal. Saat Anda override on_message, Anda harus meneruskan pesan ke sistem command agar command tetap berjalan.

Catatan penting: Jika bot online tetapi semua command tidak merespons setelah Anda menambahkan on_message, kemungkinan besar bot.process_commands(message) belum dipanggil.

Step 14: Membuat Command Moderasi Sederhana

Command moderasi membutuhkan permission khusus. Contoh berikut membuat command untuk menghapus sejumlah pesan.

  1. Pastikan bot memiliki permission Manage Messages.

  2. Tambahkan command berikut:

PYTHON
@bot.command(name="clear")
@commands.has_permissions(manage_messages=True)
async def clear(ctx, jumlah: int):
    if jumlah < 1 or jumlah > 100:
        await ctx.send("Jumlah harus antara 1 sampai 100.")
        return

    deleted = await ctx.channel.purge(limit=jumlah + 1)
    await ctx.send(f"Menghapus {len(deleted) - 1} pesan.", delete_after=5)
  1. Tambahkan error handling:
PYTHON
@clear.error
async def clear_error(ctx, error):
    if isinstance(error, commands.MissingPermissions):
        await ctx.send("Anda tidak punya izin untuk menggunakan command ini.")
    elif isinstance(error, commands.MissingRequiredArgument):
        await ctx.send("Format salah. Gunakan: `!clear 10`")
    elif isinstance(error, commands.BadArgument):
        await ctx.send("Jumlah harus berupa angka. Contoh: `!clear 10`")
    else:
        await ctx.send("Gagal menghapus pesan.")
  1. Uji command:
TEXT
!clear 5

Expected output:

TEXT
Menghapus 5 pesan.

Mengapa validasi jumlah penting? Discord membatasi dan mengatur operasi bulk delete. Selain itu, membatasi input mencegah user menghapus terlalu banyak pesan secara tidak sengaja.

Peringatan: Command moderasi sebaiknya hanya diberikan kepada role tertentu. Jangan memberi permission luas ke semua member.

Step 15: Menyusun Kode Lengkap Bot Sederhana

Berikut versi lengkap bot.py yang mencakup koneksi, command, embed, error handling, event member, dan moderasi dasar.

PYTHON
import os

import discord
from discord.ext import commands
from dotenv import load_dotenv

load_dotenv()

token = os.getenv("DISCORD_TOKEN")

if token is None:
    raise RuntimeError("DISCORD_TOKEN belum diatur di file .env")

intents = discord.Intents.default()
intents.message_content = True
intents.members = True

bot = commands.Bot(command_prefix="!", intents=intents)


@bot.event
async def on_ready():
    print(f"Bot berhasil login sebagai {bot.user}")


@bot.event
async def on_member_join(member):
    channel = discord.utils.get(member.guild.text_channels, name="general")
    if channel:
        await channel.send(f"Selamat datang, {member.mention}! Jangan lupa baca aturan server.")


@bot.event
async def on_message(message):
    if message.author == bot.user:
        return

    if "python" in message.content.lower():
        await message.channel.send("Python terdeteksi!")

    await bot.process_commands(message)


@bot.command(name="halo")
async def halo(ctx):
    await ctx.send(f"Halo, {ctx.author.mention}! Bot siap membantu.")


@bot.command(name="tambah")
async def tambah(ctx, angka_pertama: int, angka_kedua: int):
    hasil = angka_pertama + angka_kedua
    await ctx.send(f"Hasil: {hasil}")


@tambah.error
async def tambah_error(ctx, error):
    if isinstance(error, commands.MissingRequiredArgument):
        await ctx.send("Format salah. Gunakan: `!tambah 10 25`")
    elif isinstance(error, commands.BadArgument):
        await ctx.send("Argumen harus berupa angka. Contoh: `!tambah 10 25`")
    else:
        await ctx.send("Terjadi error saat menjalankan command.")


@bot.command(name="info")
async def info(ctx):
    embed = discord.Embed(
        title="Info Bot",
        description="Bot Discord berbasis Python untuk otomasi komunitas.",
        color=discord.Color.blue(),
    )
    embed.add_field(name="Prefix", value="`!`", inline=True)
    embed.add_field(name="Library", value="`discord.py`", inline=True)
    embed.add_field(name="Server", value=ctx.guild.name, inline=False)
    embed.set_footer(text=f"Diminta oleh {ctx.author}")

    await ctx.send(embed=embed)


@bot.command(name="clear")
@commands.has_permissions(manage_messages=True)
async def clear(ctx, jumlah: int):
    if jumlah < 1 or jumlah > 100:
        await ctx.send("Jumlah harus antara 1 sampai 100.")
        return

    deleted = await ctx.channel.purge(limit=jumlah + 1)
    await ctx.send(f"Menghapus {len(deleted) - 1} pesan.", delete_after=5)


@clear.error
async def clear_error(ctx, error):
    if isinstance(error, commands.MissingPermissions):
        await ctx.send("Anda tidak punya izin untuk menggunakan command ini.")
    elif isinstance(error, commands.MissingRequiredArgument):
        await ctx.send("Format salah. Gunakan: `!clear 10`")
    elif isinstance(error, commands.BadArgument):
        await ctx.send("Jumlah harus berupa angka. Contoh: `!clear 10`")
    else:
        await ctx.send("Gagal menghapus pesan.")


bot.run(token)

Expected output saat dijalankan:

TEXT
Bot berhasil login sebagai Python Community Bot#1234

Expected command di Discord:

Command

Input

Output

Halo

!halo

Bot menyapa user

Tambah

!tambah 10 25

Hasil: 35

Info

!info

Embed info bot

Clear

!clear 5

Menghapus 5 pesan

Keyword

Pesan berisi python

Python terdeteksi!

Step 16: Membuat Struktur Modular dengan Cogs

Untuk proyek kecil, satu file bot.py masih cukup. Namun, jika fitur bertambah, struktur modular lebih baik. Komunitas pengembang bot Discord Python sering menggunakan cogs agar command dipisahkan berdasarkan kategori.

Struktur modular:

TEXT
discord-python-bot/
├── bot.py
├── cogs/
│   ├── general.py
│   └── moderation.py
├── .env
├── .gitignore
└── requirements.txt
  1. Buat folder cogs.

  2. Buat file cogs/general.py:

PYTHON
import discord
from discord.ext import commands


class General(commands.Cog):
    def __init__(self, bot):
        self.bot = bot

    @commands.command(name="halo")
    async def halo(self, ctx):
        await ctx.send(f"Halo, {ctx.author.mention}! Bot siap membantu.")

    @commands.command(name="info")
    async def info(self, ctx):
        embed = discord.Embed(
            title="Info Bot",
            description="Bot modular berbasis cogs.",
            color=discord.Color.green(),
        )
        embed.add_field(name="Prefix", value="`!`", inline=True)
        embed.add_field(name="Library", value="`discord.py`", inline=True)
        await ctx.send(embed=embed)


async def setup(bot):
    await bot.add_cog(General(bot))
  1. Ubah bot.py agar memuat cog:
PYTHON
import asyncio
import os

import discord
from discord.ext import commands
from dotenv import load_dotenv

load_dotenv()

token = os.getenv("DISCORD_TOKEN")

if token is None:
    raise RuntimeError("DISCORD_TOKEN belum diatur di file .env")

intents = discord.Intents.default()
intents.message_content = True

bot = commands.Bot(command_prefix="!", intents=intents)


@bot.event
async def on_ready():
    print(f"Bot berhasil login sebagai {bot.user}")


async def load_extensions():
    await bot.load_extension("cogs.general")


async def main():
    async with bot:
        await load_extensions()
        await bot.start(token)


asyncio.run(main())

Mengapa cogs penting? Cogs membuat fitur lebih mudah dipelihara. Misalnya, semua command umum masuk ke general.py, command moderasi ke moderation.py, command musik ke music.py, dan seterusnya.

Tips: Gunakan cogs ketika bot memiliki lebih dari 5-10 command atau dikerjakan oleh lebih dari satu developer.

Step 17: Menambahkan Logging Sederhana

Logging membantu Anda melacak error dan aktivitas bot.

  1. Tambahkan import logging:
PYTHON
import logging
  1. Konfigurasi logging:
PYTHON
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s %(levelname)s %(name)s: %(message)s",
)
  1. Gunakan logger:
PYTHON
logger = logging.getLogger("discord_bot")


@bot.event
async def on_ready():
    logger.info("Bot berhasil login sebagai %s", bot.user)

Logging lebih baik daripada hanya print untuk proyek yang akan dideploy. Anda bisa mengatur level seperti INFO, WARNING, dan ERROR.

Expected output:

TEXT
2025-01-10 10:15:00 INFO discord_bot: Bot berhasil login sebagai Python Community Bot#1234

Catatan penting: Jangan menulis token ke log. Log sering disimpan oleh platform deployment.

Step 18: Deployment Bot Discord Python

Setelah bot stabil di lokal, Anda bisa menjalankannya 24/7. Ada beberapa opsi deployment.

Opsi Deployment Bot Discord Python

Kelebihan

Kekurangan

Best For

Laptop pribadi

Gratis, mudah

Tidak stabil, harus selalu menyala

Belajar

VPS

Kontrol penuh, stabil

Perlu setup Linux dan security

Produksi kecil-menengah

Platform cloud app

Praktis, mudah scale

Bisa punya batas free tier

Bot komunitas

Docker

Konsisten lintas environment

Setup awal lebih teknis

Tim dan produksi

Raspberry Pi

Hemat daya, lokal

Perlu perangkat tambahan

Hobi dan server kecil

Contoh Deployment di VPS Linux

  1. Upload proyek ke server.

  2. Instal Python dan pip.

  3. Buat virtual environment.

  4. Instal dependency:

BASH
pip install -r requirements.txt
  1. Buat file .env di server:
ENV
DISCORD_TOKEN=token_produksi_anda
  1. Jalankan bot:
BASH
python bot.py

Untuk menjalankan bot sebagai service, Anda bisa memakai systemd.

Contoh file service:

INI
[Unit]
Description=Discord Python Bot
After=network.target

[Service]
WorkingDirectory=/home/ubuntu/discord-python-bot
ExecStart=/home/ubuntu/discord-python-bot/.venv/bin/python bot.py
Restart=always
User=ubuntu
Environment=PYTHONUNBUFFERED=1

[Install]
WantedBy=multi-user.target
  1. Aktifkan service:
BASH
sudo systemctl enable discord-bot
sudo systemctl start discord-bot
sudo systemctl status discord-bot

Expected output status:

TEXT
Active: active (running)

Peringatan: Pastikan file .env di server hanya dapat dibaca oleh user yang menjalankan bot.

Common Errors dan Troubleshooting

Bot Tidak Online

Kemungkinan Penyebab

Cara Memperbaiki

Token salah

Reset dan salin ulang token

.env tidak terbaca

Pastikan file bernama .env, bukan .env.txt

Dependency belum terinstal

Jalankan pip install -r requirements.txt

Salah environment Python

Aktifkan .venv sebelum menjalankan bot

Contoh error:

TEXT
discord.errors.LoginFailure: Improper token has been passed.

Solusi:

  1. Reset token dari Developer Portal.

  2. Perbarui DISCORD_TOKEN di .env.

  3. Pastikan tidak ada spasi tambahan:

ENV
DISCORD_TOKEN=token_tanpa_spasi

Command Tidak Merespons

Kemungkinan Penyebab

Cara Memperbaiki

Message Content Intent belum aktif

Aktifkan di Developer Portal dan kode

Prefix salah

Pastikan command memakai ! jika command_prefix="!"

on_message tidak meneruskan command

Tambahkan await bot.process_commands(message)

Bot tidak punya akses channel

Cek permission channel

Contoh checklist:

  1. Ketik !halo, bukan /halo, jika masih memakai prefix command.

  2. Pastikan bot dapat melihat channel.

  3. Pastikan intents.message_content = True.

  4. Restart bot setelah mengubah intents.

Error ModuleNotFoundError

Contoh error:

TEXT
ModuleNotFoundError: No module named 'discord'

Solusi:

  1. Aktifkan virtual environment:
BASH
source .venv/bin/activate
  1. Instal dependency:
BASH
pip install discord.py python-dotenv
  1. Jalankan ulang bot:
BASH
python bot.py

Error Permission Saat Moderasi

Contoh error:

TEXT
discord.errors.Forbidden: 403 Forbidden

Solusi:

  1. Pastikan bot punya permission Manage Messages.

  2. Pastikan role bot lebih tinggi dari role target jika mengelola role/member.

  3. Cek permission channel, bukan hanya permission server.

  4. Jangan gunakan permission administrator jika tidak diperlukan.

Bot Membalas Dirinya Sendiri

Jika bot membaca pesan dan membalas tanpa filter, bot bisa memicu loop.

Solusi:

PYTHON
@bot.event
async def on_message(message):
    if message.author == bot.user:
        return

    await bot.process_commands(message)

Filter ini mencegah bot merespons pesannya sendiri.

Case Study: Bot Komunitas Belajar Python

Background

Sebuah komunitas belajar Python di Discord memiliki sekitar 500 member. Setiap minggu, moderator sering menjawab pertanyaan berulang seperti link aturan, jadwal mentoring, dan cara mendapatkan role. Selain itu, channel diskusi kadang penuh pesan spam ringan saat event berlangsung.

Komunitas membutuhkan bot sederhana yang bisa:

  1. Menyapa member baru.

  2. Menampilkan informasi server.

  3. Menjawab command bantuan.

  4. Menghapus pesan dalam jumlah terbatas.

  5. Memberi respons otomatis saat keyword tertentu muncul.

Challenge/Problem

Masalah utama komunitas adalah beban moderator. Dalam satu minggu, moderator bisa menjawab pertanyaan yang sama puluhan kali. Respons manual menyebabkan keterlambatan, terutama saat moderator sedang offline.

Tantangan teknisnya:

  1. Bot harus mudah dipelihara oleh pengurus yang belum semuanya mahir programming.

  2. Token harus aman karena repository proyek akan disimpan di Git.

  3. Command moderasi tidak boleh bisa digunakan semua member.

  4. Bot harus tetap responsif meskipun banyak pesan masuk saat event.

  5. Fitur harus bisa ditambah bertahap.

Approach

Tim memilih Python dengan discord.py karena sintaksnya mudah dipahami dan banyak contoh pembelajaran yang membahas event, command, input validation, serta integrasi API. Untuk tahap pertama, bot dibuat dalam satu file agar cepat diuji. Setelah command bertambah, fitur dipindahkan ke cogs.

Pendekatan MVP:

Fitur

Prioritas

Alasan

!halo

Tinggi

Verifikasi interaksi dasar

!info

Tinggi

Menjawab pertanyaan umum

Welcome message

Sedang

Membantu onboarding

!clear

Sedang

Membantu moderator saat spam

Keyword responder

Rendah

Menambah interaksi komunitas

Slash command

Lanjutan

Untuk pengalaman user lebih modern

Implementation

  1. Membuat aplikasi bot di Discord Developer Portal.

  2. Mengaktifkan Message Content Intent dan Server Members Intent.

  3. Mengundang bot dengan permission minimum.

  4. Menyiapkan environment Python dan dependency.

  5. Menyimpan token di .env.

  6. Mengimplementasikan command dan event.

  7. Menambahkan validasi permission untuk command moderasi.

  8. Menguji command di server staging sebelum masuk server utama.

Contoh command informasi komunitas:

PYTHON
@bot.command(name="jadwal")
async def jadwal(ctx):
    await ctx.send(
        "Jadwal mentoring minggu ini:\n"
        "- Selasa 19.30: Dasar Python\n"
        "- Kamis 19.30: Project Review\n"
        "- Sabtu 10.00: Latihan Algoritma"
    )

Contoh command aturan:

PYTHON
@bot.command(name="aturan")
async def aturan(ctx):
    embed = discord.Embed(
        title="Aturan Komunitas",
        description="Baca aturan sebelum bertanya agar diskusi tetap nyaman.",
        color=discord.Color.orange(),
    )
    embed.add_field(name="1", value="Gunakan bahasa yang baik dan benar.", inline=False)
    embed.add_field(name="2", value="Cari jawaban terlebih dahulu sebelum bertanya.", inline=False)
    embed.add_field(name="3", value="Jangan spam atau promosi tanpa izin.", inline=False)
    await ctx.send(embed=embed)

Results

Setelah bot digunakan selama satu bulan, hasil yang realistis untuk komunitas kecil-menengah adalah:

Metrik

Sebelum Bot

Setelah Bot

Dampak

Pertanyaan berulang per minggu

40-60

15-25

Turun sekitar 50%

Waktu respons info dasar

10-30 menit

Kurang dari 5 detik

Jauh lebih cepat

Intervensi moderator saat spam ringan

8-12 kali/minggu

3-5 kali/minggu

Lebih terkendali

Member baru yang mendapat pesan onboarding

Tidak konsisten

Hampir otomatis

Onboarding lebih rapi

Angka ini bergantung pada ukuran server, aktivitas komunitas, dan kelengkapan command. Namun, pola umumnya jelas: bot mengurangi pekerjaan berulang dan membuat informasi lebih mudah diakses.

Key Learnings

  1. Mulai dari fitur kecil yang langsung menyelesaikan masalah nyata.

  2. Jangan menaruh token di kode sumber.

  3. Gunakan intents dengan benar agar event tidak gagal diam-diam.

  4. Tambahkan error handling sejak awal.

  5. Pisahkan fitur ke cogs saat command mulai banyak.

  6. Uji permission di server test sebelum bot digunakan publik.

  7. Catat command populer untuk menentukan fitur berikutnya.

Tips Praktis Agar Bot Lebih Profesional

  1. Gunakan prefix yang jelas dan tidak bentrok, misalnya ! atau ?.

Tips: Jika server sudah punya banyak bot, pilih prefix unik seperti py! agar command tidak bertabrakan.

  1. Batasi command sensitif dengan permission.
PYTHON
@commands.has_permissions(manage_messages=True)

Peringatan: Jangan hanya mengandalkan nama role di kode jika struktur role server sering berubah.

  1. Validasi semua input user.
PYTHON
if jumlah < 1 or jumlah > 100:
    await ctx.send("Jumlah harus antara 1 sampai 100.")
    return

Catatan penting: Input dari user selalu harus dianggap tidak terpercaya sampai divalidasi.

  1. Simpan konfigurasi di environment variable.
ENV
DISCORD_TOKEN=token_anda
COMMAND_PREFIX=!

Tips: Untuk proyek lebih besar, prefix, ID channel, dan ID role sebaiknya juga disimpan sebagai konfigurasi.

  1. Gunakan logging untuk deployment.
PYTHON
logger.info("Command %s digunakan oleh %s", ctx.command, ctx.author)

Peringatan: Jangan log data sensitif seperti token, pesan privat, atau informasi user yang tidak diperlukan.

  1. Dokumentasikan command.

Command

Fungsi

Contoh

!halo

Menyapa user

!halo

!info

Menampilkan info bot

!info

!tambah

Menjumlahkan angka

!tambah 10 25

!clear

Menghapus pesan

!clear 10

!jadwal

Menampilkan jadwal

!jadwal

Checklist Pengujian Sebelum Bot Dipakai

  1. Pastikan bot bisa online.

  2. Pastikan command dasar seperti !halo merespons.

  3. Pastikan command dengan argumen menangani input salah.

  4. Pastikan permission moderasi hanya bisa dipakai user berwenang.

  5. Pastikan .env tidak masuk Git.

  6. Pastikan intents aktif di portal dan kode.

  7. Pastikan bot tidak membalas dirinya sendiri.

  8. Pastikan log tidak menampilkan token.

  9. Pastikan bot tetap berjalan setelah terminal ditutup jika dideploy.

  10. Pastikan dokumentasi command tersedia untuk moderator.

Perbandingan Akhir: Prefix Command vs Slash Command

Meskipun tutorial ini berfokus pada prefix command karena mudah dipahami untuk pemula, slash command semakin umum dipakai di Discord modern.

Kriteria

Prefix Command

Slash Command

Contoh

!halo

/halo

Setup awal

Lebih sederhana

Sedikit lebih kompleks

Autocomplete Discord

Tidak otomatis

Didukung

Validasi input UI

Terbatas

Lebih baik

Cocok untuk belajar

Sangat cocok

Cocok setelah dasar paham

Cocok untuk bot publik

Bisa

Lebih direkomendasikan

Rekomendasi Use Case

  1. Gunakan prefix command jika Anda sedang belajar dasar event, command, dan intents.

  2. Gunakan slash command jika bot akan dipakai banyak user dan membutuhkan pengalaman yang lebih modern.

  3. Gunakan kombinasi keduanya jika Anda sedang migrasi dari bot lama ke bot baru.

  4. Gunakan cogs jika command sudah banyak dan perlu dipisahkan berdasarkan kategori.

  5. Gunakan deployment cloud atau VPS jika bot harus online 24/7.

Troubleshooting Cepat Berdasarkan Gejala

Gejala

Penyebab Paling Mungkin

Solusi Cepat

Bot offline

Token salah atau script tidak berjalan

Cek .env, jalankan python bot.py

Bot online tapi diam

Intent belum aktif

Aktifkan Message Content Intent

Command berhenti setelah tambah on_message

process_commands belum dipanggil

Tambahkan await bot.process_commands(message)

Error import discord

Library belum terinstal

Jalankan pip install discord.py

Command moderasi gagal

Permission kurang

Cek permission server dan channel

Welcome message tidak muncul

Members intent belum aktif

Aktifkan Server Members Intent

Bot crash saat token kosong

.env tidak terbaca

Cek nama file dan variable

Pesan embed tidak tampil

Permission embed kurang

Aktifkan Embed Links

Contoh Pengembangan Lanjutan

Setelah bot dasar berjalan, Anda bisa menambahkan fitur lanjutan secara bertahap.

Fitur Lanjutan

Manfaat

Tingkat Kesulitan

Slash command

UX lebih modern

Sedang

Database SQLite/PostgreSQL

Menyimpan data user

Sedang

Role otomatis

Onboarding lebih cepat

Sedang

Sistem leveling

Meningkatkan engagement

Sedang

Integrasi API eksternal

Menambah informasi real-time

Sedang-tinggi

Dashboard web

Konfigurasi lebih mudah

Tinggi

Docker deployment

Environment konsisten

Sedang

Contoh integrasi API eksternal sederhana bisa berupa command yang mengambil data dari layanan cuaca, GitHub, atau endpoint internal. Namun, untuk integrasi seperti ini, Anda perlu memahami request HTTP asynchronous, rate limit, dan error handling jaringan.

PYTHON
@bot.command(name="ping")
async def ping(ctx):
    latency_ms = round(bot.latency * 1000)
    await ctx.send(f"Pong! Latency: {latency_ms} ms")

Expected output:

TEXT
Pong! Latency: 85 ms

Command ping berguna untuk memeriksa respons bot. Jika latency terlalu tinggi, kemungkinan ada masalah jaringan, hosting, atau beban server.

Praktik Keamanan yang Wajib Diikuti

  1. Jangan membagikan token bot.

  2. Jangan memberi permission administrator tanpa alasan kuat.

  3. Gunakan .env untuk konfigurasi rahasia.

  4. Reset token jika pernah bocor.

  5. Batasi command moderasi dengan permission.

  6. Validasi input user sebelum diproses.

  7. Hindari menyimpan data pribadi user tanpa kebutuhan jelas.

  8. Gunakan repository privat jika bot berisi konfigurasi sensitif.

  9. Review dependency secara berkala.

  10. Monitor log saat bot dideploy.

Peringatan: Bot dengan permission tinggi dapat merusak server jika disalahgunakan. Selalu gunakan permission minimum yang sesuai fungsi bot.


Referensi

Leravio. (2026). Cara membuat bot Discord dengan Python.

Real Python. (2026). How to make a Discord bot in Python.

PyTutorial. (2026). Python Discord API bot development guide.

GeeksforGeeks. (2026). Creating a Discord bot in Python.

Codezup. (2026). Build a Discord bot in Python: Step-by-step coding tutorial.

GitHub. (2026). Templat bot Discord Python Indonesia.

YouTube. (2026). Creating a Discord bot in Python: Setup and basics.

CodeGenes. (2026). Creating a Discord bot with Python: A comprehensive guide.