iT邦幫忙

2023 iThome 鐵人賽

DAY 25
0

Cog檔在Discord.py 中是一種將機器人指令和功能模組化的方式。

具體來說,Cog檔就是一個python類別,這個類別會繼承自discord.ext.commands中的Cog類別。在這個Cog類別中,可以定義機器人的事件處理器、指令、任務等功能。

Cog 檔在 Discord.py 中的主要用途和好處包括:

  1. 模組化命令與功能
  • 把相關的命令和功能寫在一個 Cog 類別中,比起全部堆在 main.py 中好管理很多。
  1. 易於擴充與維護
  • 新增功能時只需要新增一個 Cog 檔案,不需要動到主程式。
  1. 可以重新加载與卸載
  • 修改了 Cog 程式碼後,可以用 reload 指令重新加載,不需要重啟整個機器人。也可以隨時使用 unload 把 Cog 卸載掉。
  1. 分類命令與權限
  • 每個 Cog 都可以指定獨立的命令前綴詞,和讀取不同的權限設定。
  1. 共用程式碼
  • 多個 Cog 可以共用一些公用的功能。
  1. 更好的錯誤處理
  • 每個 Cog 都是獨立的,如果其中一個發生錯誤也不會影響到其他 Cog。
  1. 更好的事件處理
  • Cog 類別中可以定義事件處理函數。事件與命令可以分開管理。

所以簡單來說,Cog 就是 Discord.py 提供的一種組織和管理命令與功能的方式,可以讓程式碼擁有模塊化、可擴展、可維護。


接著來示範一下該如何建立。

首先,Cog 是 Discord.py 中將擴展功能模組化的一種方式。每個 Cog 都會被定義為一個類別,並且必須繼承自 commands.Cog

建立一個 Cog 檔的步驟如下:

  1. 建立一個資料夾下面放Cog檔,例如 mycog.py

  2. 在檔案中定義一個類別,並繼承 commands.Cog:

import discord
from discord.ext import commands

class MyCog(commands.Cog):

  def __init__(self, bot):
    self.bot = bot
  1. 在類別中定義擴展命令功能:
@commands.command()
async def ping(self, ctx):
  await ctx.send('Pong!')

這裡須注意的是Cog下的定義所有指令或函式都必須先傳入self
且原先的@bot必須換成@commands

  1. 最後將 Cog 加載到 Bot 中:
async def setup(bot):
    await bot.add_cog(MyCog(bot))

這樣就完成了一個簡單的 Cog 設置。在 Cog 中可以定義多個相關的命令類別,並通過 self.bot 訪問 Bot 的屬性和方法。這可以讓指令擁有模組化和可重複使用的。


接著可以使用bot.load_extension() bot.reload_extension() bot.unload_extension()
等方式來將Cog檔讀取、重新讀取或卸載。

例如,可以在主程式中加上以下指令:

import os

# 定義函式
async def load_cog():

  # 遍歷 cmds 目錄下的所有 py 檔
  for filename in os.listdir("./cogs"):
    
    # 判斷是否以 .py 結尾
    if filename.endswith(".py"):
        
      # 將檔案名稱設定為 extension_name,必須為位置加名稱
      extension_name = f"cogs.{filename[:-3]}"
      
      try:
        # 嘗試重新加載這個 cog
        await bot.reload_extension(extension_name)
      
      # 如果還沒有加載過這個 cog
      except commands.ExtensionNotLoaded:
      
        # 就加載這個新的 cog
        await bot.load_extension(extension_name)

然後當機器人準備好時將所有Cog檔進行讀取

@bot.event
async def on_ready():
    await load_cog()

接著可以額外加一些指令使得機器人不必重啟就可將Cog檔讀取、重新讀取或卸載

# 重新載入所有Cog檔案
@bot.command()
async def reload_all(ctx):
    await load_cog()
    await ctx.send("Reload all done.")
    
# 載入指令程式檔案
@bot.command()
async def load(ctx, extension):
    await bot.load_extension(f"cogs.{extension}")
    await ctx.send(f"Loaded {extension} done.")
    
# 卸載指令檔案
@bot.command()
async def unload(ctx, extension):
    await bot.unload_extension(f"cogs.{extension}")
    await ctx.send(f"UnLoaded {extension} done.")

# 重新載入程式檔案
@bot.command()
async def reload(ctx, extension):
    await bot.reload_extension(f"cogs.{extension}")
    await ctx.send(f"ReLoaded {extension} done.")

總結下來,Cog 的優點是可以將命令分類並組織在一起,使程式碼更易於維護。希望這樣的說明對你建立 Discord Cog 檔有所幫助!


上一篇
[DAY24]Discord bot定時(自動)指令
下一篇
[DAY26]Discord bot Embed訊息
系列文
selenium爬蟲應用至discord bot30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言