iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0

首先先定義一個機器人如下。

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可以傳入一些參數來定制命令:

  • name: 命令的名字,預設是函數名稱
  • aliases: 命令的別名列表
  • help: 命令的說明文字
  • brief: 命令的簡短說明文字

例如:

@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來取得相關信息。

這裡需要注意的是

  • name參數會取代掉原本函數定義的名稱,也就是說當輸入^^greet時會報CommandNotFound錯誤訊息。
  • 而aliases別名意味著可輸入^^hello或是^^hi
  • 然後help和brief參數如果有設定可以透過^^help或是^^help hello來查看描述訊息。
  • 但是如果兩個同時設定時brief的描述訊息會優先顯示在^^help內容裡,而help的描述訊息會優先顯示在^^help hello裡。如下:

假如同時設定了 helpbrief 參數,則它們都會顯示在不同的位置。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


上一篇
[DAY17]Discord bot連接和響應事件
下一篇
[DAY19]Discord bot接受與發送消息
系列文
selenium爬蟲應用至discord bot30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言