iT邦幫忙

2023 iThome 鐵人賽

DAY 24
0

今天我們要來把我們的程式碼利用cog來歸類一下,首先我們需要在main.py的同層建立一下資料夾cmds,以及建立一個一個classes.py來放置每一個class都會用到的__init__

discordbot
│
├── main.py          # 主機器人檔案
├── classes.py       # 用於繼承class
└── cmds             # cmds 資料夾
    ├── event.py     # event.py 檔案
    ├── test.py      # test.py 檔案
    └── load.py      # load.py 檔案

先把classes.py完成

這個檔案的用途就是可以讓其他檔案都繼承他,可以精簡我們的程式碼

import discord
from discord.ext import commands

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

再來將原本main.py的那些function一一分類到各個檔案內

cmds             # cmds 資料夾
└── test.py      # test.py 檔案
    ├──test      # 這些是function
    ├──ping
    └──picture

編輯我們的test.py吧

import discord
from discord.ext import commands
from classes import Cog_Extension # 引入calsses用來繼承

class TEST(Cog_Extension):# 繼承classes內的Cog_Extension
    

    # @bot.command()
    # async def ping(ctx):
        # await ctx.send(f'{round(bot.latency*1000)}ms')

    @commands.command()
    async def ping(self, ctx):
        await ctx.send(f'{round(self.bot.latency*1000)}ms')
    
    @commands.command()
    async def test(self, ctx):
        await ctx.send("Hi")

    
    @commands.command()
    async def picture(self, ctx):
        pic=discord.File('C:\\Users\\OUOQUQ\\Desktop\\webcrawler\\images\\明君旅棧\\住宿相片集4.jpg')
        await ctx.send(file=pic)

async def setup(bot):
    await bot.add_cog(TEST(bot))

在第8-10行可以看到是我們原本在main.py內的寫法,但是因為我們繼承了Cog_Extension,所以我們必須改寫成@commands.command(),還有每個function內都必須使用到self,最後原本的bot.latency也要改寫成self.bot.latency,每一個function的寫法都要改變

以main.py去讀取檔案

import os

@bot.event
async def on_ready():
    print('bot is ready')
    
    #在bot剛啟動時讀取所有檔案
    for filename in os.listdir("./cmds"): # 移動到cmds的資料夾內
        if filename.endswith(".py"): # 找出所有結尾是.py的檔案
           await bot.load_extension(f"cmds.{filename[:-3]}")
            # 讀取.py之前的檔案名稱

這樣的檔案讀取及分類方式,可以讓我們的程式碼可讀性更高,並且方便我們日後維護bot時容易找出錯誤在哪

明天就來講講load的三個用法吧


上一篇
[Day 23]Cog是個好東西
下一篇
[Day 25] LOADING...
系列文
30天來打造一個方便的訂房機器人30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言