Cog是Discord機器人的模組
可以像Python一樣將不同功能分開管理
最後引入機器人內即可完成
也可以做到群組指令

主檔案bot.py

首先,在根目錄建立一個資料夾用來存放cog檔案,此處以cogs為例
先引入os模組,接著在main()函數上方貼上以下內容(非常重要,一定要在main()前面):

1
2
3
4
5
async def load_ext():
for filename in os.listdir("./cogs"): # 遍歷一次每個檔案
if filename.endswith(".py"): # 如果該檔案是.py結尾
await bot.load_extension(f"cogs.{filename[:-3]}") # 載入"cogs.檔案"
print(f"Loaded {filename}") # 印出訊息

這個函數會遍歷一次cogs資料夾的內容,並且當檔案是python檔時就用bot.load_extension()載入
關於os.listdir()可以參考送出圖片

最後在main()函數內呼叫此函數:

1
2
3
4
async def main():
discord.utils.setup_logging()
await load_ext() # 這裡會呼叫剛剛載入cog的函數
await bot.start("你的token")

這樣在啟動時,機器人會載入cogs資料夾內的檔案

Cog檔案

類別

Cog的本質上是一個類別衍伸出來的物件
所以主要以物件寫法為主,可參考類別

首先需引入以下三個模組,與主檔案相同

1
2
3
import discord
from discord.ext import commands
from discord import app_commands

接著定義一個類別,並繼承commands.Cog
初始化函數只需要bot

1
2
3
class MyCog(commands.Cog):
def __init__(self,bot:commands.Bot):
self.bot = bot

接著,可以把指令與事件放進類別的方法內
但需注意:

  • @bot.tree.command()替換成@app_commands.command()
  • @bot.event替換成@commands.Cog.lisener()
  • 由於是類別中的方法,參數一律需有self

self主要在實作中的用處是存取需要用bot的地方,改用self.bot
因為這個檔案內並沒有定義bot是什麼,但Cog類別內有定義

轉換範例

以下是原本寫法轉換至Cog的範例
使用API與機器人實作的範例程式

1
2
3
4
5
6
7
8
9
# 原始寫法
@bot.tree.command()
async def cat(interaction:discord.Interaction):
await interaction.response.defer()

url = "https://api.thecatapi.com/v1/images/search"
response = requests.get(url=url).json()
image_url = response[0]["url"]
await interaction.followup.send(image_url)
1
2
3
4
5
6
7
8
9
10
11
12
13
#  Cog內
class Cat(commands.Cog):
def __init__(self, bot:commands.Bot):
self.bot = bot

@app_commands.command()
async def cat(self, interaction:discord.Interaction):
await interaction.response.defer()

url = "https://api.thecatapi.com/v1/images/search"
response = requests.get(url=url).json()
image_url = response[0]["url"]
await interaction.followup.send(image_url)

結尾

跳出類別的縮排,在整個檔案的結尾加上以下這串

1
2
async def setup(bot):
await bot.add_cog(類別名稱(bot))

此動作呼叫bot.add_cog()函數,並且傳入了一個由剛剛寫的類別衍生出來的物件,並且填入了bot
此處會由主檔案的bot處理,將自身提供給這個物件,這樣在物件內使用self.bot的時候,存取的就是正在運行的bot

注意事項

  • 如果需使用模組,import請在cog檔案內而不是主檔案內
  • 單一類別裡面可以存放多個方法,以此可以在同一個檔案內存放相同分類的指令
  • 主檔案內的指令可以與cog同時存在並混用