Saltar al contenido principal

Cogs

Cogs, often known as modules or extensions, are used to organize commands into groups. This is useful for grouping commands that have the same general idea (such as moderation commands). This also helps to avoid making your bot's files messy and cluttered.

Getting Started

First, you'll need to create a folder to store your cogs, e.g. cogs/.

Then, create a file inside the folder, e.g. cogs/greetings.py. By convention, the file name should be the same as the name of the cog or module.

We can then create the cog.

./cogs/greetings.py
import discord
from discord.ext import commands

class Greetings(commands.Cog): # create a class for our cog that inherits from commands.Cog
# this class is used to create a cog, which is a module that can be added to the bot

def __init__(self, bot): # this is a special method that is called when the cog is loaded
self.bot = bot

@commands.command() # creates a prefixed command
async def hello(self, ctx): # all methods now must have both self and ctx parameters
await ctx.send('Hello!')

@discord.slash_command() # we can also add application commands
async def goodbye(self, ctx):
await ctx.respond('Goodbye!')

@discord.user_command()
async def greet(self, ctx, member: discord.Member):
await ctx.respond(f'{ctx.author.mention} says hello to {member.mention}!')

math = discord.SlashCommandGroup("math", "Spooky math stuff") # create a Slash Command Group called "math"
advanced_math = math.create_subgroup(
"advanced",
"super hard math commands!"
)

@math.command()
async def add(self, a: int, b: int):
c = a + b
await ctx.respond(f"{a} + {b} is {c}.")

@advanced_math.command()
async def midpoint(self, x1: float, y1: float, x2: float, y2: float):
mid_x = (x1 + x2)/2
mid_y = (y1 + y2)/2
await ctx.respond(f"The midpoint between those coordinates is ({mid_x}, {mid_y}).")

@commands.Cog.listener() # we can add event listeners to our cog
async def on_member_join(self, member): # this is called when a member joins the server
# you must enable the proper intents
# to access this event.
# See the Popular-Topics/Intents page for more info
await member.send('Welcome to the server!')

def setup(bot): # this is called by Pycord to setup the cog
bot.add_cog(Greetings(bot)) # add the cog to the bot

You can add any number of commands to your cog, as well as event listeners. However, this code will not work on its own. In your main bot file, you must add the following code:

bot.load_extension('cogs.greetings')

This loads the file cogs/greetings.py and adds it to the bot. The argument of load_extension should be your cog's path (e.g. cogs/greetings.py) without the file extension and with the / replaced with .

If you have multiple cogs, you can add them all at once by adding the following code:

cogs_list = [
'greetings',
'moderation',
'fun',
'owner'
]

for cog in cogs_list:
bot.load_extension(f'cogs.{cog}')

Cog Rules

When using a cog instead of the main file, there are some changes you have to make to your code. This is because cogs work slightly different from a regular file.

The self variable

The self variable is a variable that represents a class. In the case of cogs, self represents the cog. In the __init__ function, you can see that we have self.bot = bot. bot represents your discord.Bot or discord.ext.commands.Bot instance, which is used for some functions.

This means that instead of using functions that would usually be accessed via bot, you now need to access them via self.bot

Because we're in a class, all of our commands are methods of that class. Because of this, all of our functions need to have self as the first parameter, where self is the cog. Without this, we wouldn't be able to access our bot instance.

Creating Commands

When creating prefixed commands, your decorator would usually be something like @bot.command(). If you're using cogs, this isn't the case. In a cog, you can't access the bot instance outside of functions, so to register a function as a command, you must instead use @commands.command().

Similar to prefixed commands, you'll have to use either the @discord.slash_command(), @discord.user_command(), or @discord.message_command() decorators for Application Commands.

Also, when creating a command, make sure that it is indented. If we want a command to be actually inside a cog, it has to be inside your cog's class. If the command is not inside the cog, your command becomes useless.

Events

When creating events, you can no longer use @bot.event as a decorator. This is because we cannot access the bot variable outside a function. To make an event, you have to use the ext.commands method, @commands.Cog.listener(). Events also need self as their first parameter.

And that's it! Cogs are a simple and easy way of organizing your code. Now you can check out how to create a help command here.