Create a Discord Bot in Python

About the bot

:: Bot Usage ::
!mc help : shows help
!mc serverusage : shows system load in percentage
!mc serverstatus : shows if the server is online or offline
!mc whoisonline : shows who is online at the moment

Dependencies

$ python3 -m virtualenv .venv 
$ source .venv/bin/activate
$ pip install discord
$ pip install python-dotenv

Create the Discord Application

https://discord.com/api/oauth2/authorize?client_id=xxxxxxxxxxx&permissions=0&scope=bot

Developing the Discord Bot

DISCORD_TOKEN=xxxxxxxxx
$ cat .env 
DISCORD_TOKEN=your-unique-token-value-will-be-here
import discord 
import os
from dotenv import load_dotenv
BOT_NAME = "MinecraftBot"
load_dotenv()
DISCORD_TOKEN = os.getenv("DISCORD_TOKEN")
bot = discord.Client()
@bot.event async def on_ready():
print(f'{bot.user} has logged in.')
@bot.event async
def on_message(message):
if message.author == bot.user:
return
if message.content == 'hello':
await message.channel.send(f'Hey {message.author}')
if message.content == 'goodbye':
await message.channel.send(f'Goodbye {message.author}')
bot.run(DISCORD_TOKEN)
$ python mc_discord_bot.py 
MinecraftBot has logged in.
  • use the command !mc to trigger our bot and subcommands for what we want
  • able to see who is playing minecraft on our server at the moment
  • able to get the status if the minecraft server is online
  • able to get the server load percentage (as the bot runs on the minecraft server)
import discord
from discord.ext import commands
import requests
import os
from dotenv import load_dotenv
import random
import multiprocessing
# Variables
BOT_NAME = "MinecraftBot"
load_dotenv()
DISCORD_TOKEN = os.getenv("DISCORD_TOKEN")
minecraft_server_url = "lightmc.fun" # this is just an example, and you should use your own minecraft serverbot_help_message = """
:: Bot Usage ::
`!mc help` : shows help
`!mc serverusage` : shows system load in percentage
`!mc serverstatus` : shows if the server is online or offline
`!mc whoisonline` : shows who is online at the moment
"""
available_commands = ['help', 'serverusage', 'serverstatus', 'whoisonline']# Set the bot command prefix
bot = commands.Bot(command_prefix="!")
# Executes when the bot is ready
@bot.event
async def on_ready():
print(f'{bot.user} succesfully logged in!')
# Executes whenever there is an incoming message event
@bot.event
async def on_message(message):
print(f'Guild: {message.guild.name}, User: {message.author}, Message: {message.content}')
if message.author == bot.user:
return
if message.content == '!mc':
await message.channel.send(bot_help_message)
if 'whosonline' in message.content:
print(f'{message.author} used {message.content}')
await bot.process_commands(message)
# Executes when the command mc is used and we trigger specific functions
# when specific arguments are caught in our if statements
@bot.command()
async def mc(ctx, arg):
if arg == 'help':
await ctx.send(bot_help_message)
if arg == 'serverusage':
cpu_count = multiprocessing.cpu_count()
one, five, fifteen = os.getloadavg()
load_percentage = int(five / cpu_count * 100)
await ctx.send(f'Server load is at {load_percentage}%')
if arg == 'serverstatus':
response = requests.get(f'https://api.mcsrvstat.us/2/{minecraft_server_url}').json()
server_status = response['online']
if server_status == True:
server_status = 'online'
await ctx.send(f'Server is {server_status}')
if arg == 'whoisonline':
response = requests.get('https://api.mcsrvstat.us/2/{minecraft_server_url}').json()
players_status = response['players']
if players_status['online'] == 0:
players_online_message = 'No one is online'
if players_status['online'] == 1:
players_online_username = players_status['list'][0]
players_online_message = f'1 player is online: {players_online_username}'
if players_status['online'] > 1:
po = players_status['online']
players_online_usernames = players_status['list']
joined_usernames = ", ".join(players_online_usernames)
players_online_message = f'{po} players are online: {joined_usernames}'
await ctx.send(f'{players_online_message}')
bot.run(DISCORD_TOKEN)
$ python mc_discord_bot.py
!mc help

Resources

Thank You

--

--

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store