首先先定義一個機器人如下。
import discord
from discord.ext import commands
intents= discord.Intents.all()
bot = commands.Bot(command_prefix='^^', intents=intents)
這裡允許機器人有所有的權限並且將指令前綴設定為^^。
接著定義命令。例如,要定義一個ping命令,可以這樣寫:
@bot.command()
async def ping(ctx):
await ctx.send("pong!")
在這裡,我們用@bot.command()
decorator來定義一個ping命令。當有人在Discord中輸入"^^ping"時,bot就會調用ping函數,並回覆"pong!"。
此外command decorator可以傳入一些參數來定制命令:
例如:
@bot.command(name='hello', aliases=['hi'], help='Greets the user')
async def greet(ctx):
await ctx.send(f'Hello {ctx.author.name}!')
此外,ctx參數是必須的,它包含了許多與命令相關的上下文信息,例如調用命令的channel、author等。可以通過ctx來取得相關信息。
這裡需要注意的是
^^greet
時會報CommandNotFound錯誤訊息。^^hello
或是^^hi
。^^help
或是^^help hello
來查看描述訊息。^^help
內容裡,而help的描述訊息會優先顯示在^^help hello
裡。如下:假如同時設定了 help
和 brief
參數,則它們都會顯示在不同的位置。help
參數提供了命令的詳細說明,當您使用內置的 help
命令查看特定命令的詳細信息時,將顯示 help
說明。而 brief
參數提供了命令的簡短說明,當您使用內置的 help
命令查看命令列表時,將顯示 brief
說明。
例如,如果您定義了一個名為 hello
的命令,並且設置了 help='Greets the user'
和 brief='Greets the user HELLO!'
,則當您使用 ^^help hello
命令查看該命令的詳細信息時,將看到類似以下內容:
hello
Greets the user
而當您使用 ^^help
命令查看命令列表時,將看到類似以下內容:
hello - Greets the user HELLO!
在上面的示例中,hello - Greets the user HELLO!
是命令列表中顯示的 brief
說明,而 Greets the user
是查看特定命令詳細信息時顯示的 help
說明。
另外,可以使用command groups將命令分組:
@bot.group()
async def utils(ctx):
pass
@utils.command()
async def info(ctx):
await ctx.send('...info...')
@utils.command()
async def config(ctx):
await ctx.send('...config...')
這樣就可以用"^^utils info" 和 "^^utils config" 調用不同的命令了。
此外可將
@bot.group()
async def utils(ctx):
pass
改寫成
@bot.group()
async def utils(ctx):
if ctx.invoked_subcommand is None:
await ctx.send('You need to specify a subcommand!')
由於ctx包含著我們傳入進去的訊息上下文因此可以調用invoked_subcommand方法來觀察是否有輸入子命令,如果沒有責打印出'You need to specify a subcommand!'。
總結一下,在discord.py中主要是通過定義command decorator來處理bot命令,可以方便地自定義命令的名稱、別名、描述等信息,並通過ctx取得相關上下文。
有關更多命令處理的資訊可參考以下網站:
https://discordpy.readthedocs.io/en/latest/ext/commands/api.html?highlight=command#commands