iT邦幫忙

2023 iThome 鐵人賽

DAY 23
0
Software Development

selenium爬蟲應用至discord bot系列 第 23

[DAY23]Discord bot斜槓指令(slash command)

  • 分享至 

  • xImage
  •  

在discord中輸入指令時往往是使用機器人的指令前綴加上指令名稱,但其實也可以使用slash command讓使用指令的方式更為簡單,以下簡單說一下斜槓命令(slash command)的優點。

使用 Discord Slash Command 相較於傳統文字指令,有以下幾個主要優點和不同之處:

  1. 使用者體驗更好 - Slash Command 有參數提示、說明等,使用起來更直覺。

  2. 減少使用者輸入錯誤 - Slash Command 的參數有類型,可以避免使用者輸入格式錯誤。

  3. 支援交互式參數 - Slash Command 支援讓使用者透過選單、下拉選項等方式輸入參數,體驗更好。

  4. 支援同步申請 - Slash Command 可以主動提交申請,無需等待使用者觸發。

  5. 參數提示直觀 - 滑鼠移到 Slash Command 上會看到參數提示,增加可發現性。

  6. 支援權限設定 - Slash Command 可以設定使用者權限,控管更精細。

總結來說,Slash Command 提供更好、更直觀的使用者體驗,並有更多控管能力,是未來 Discord bot 的重要發展方向。


讓我們來說說如何使用斜槓指令,discord.py有許多方式可以為機器人建立斜槓指令的方法,這裡用最簡單的@bot.hybrid_command()修飾器來做示範,使用這個修飾器可以使指令不但可以註冊為斜槓指令的同時也可以用原本的指令前綴方式來輸入。

如果只想使用單純斜槓指令可以考慮使用@bot.tree.command()方法來定義。

現在先來定義一個指令:

@bot.command(name='hello', help='Greets the user')  
async def hello(ctx):
    await ctx.send("Hello World!")

接著我們要將其改為使用@bot.hybrid_command()來註冊斜槓指令,方法很簡單把@bot.command()修飾器換為@bot.hybrid_command()即可。

@bot.hybrid_command(name='hello', help='Greets the user')  
async def hello(ctx):
    await ctx.send("Hello World!")

這樣就定義好一個斜槓指令了。

但是當你去discord輸入/hello會發現甚麼事都沒發生,但若是使用指令前綴的方式依然可使用,這是斜槓指令還未被同步到discord的原因。

可以使用bot.tree.sync()方式來將斜槓指令同步到discord。

@bot.event
async def on_ready():
    try:
        synced = await bot.tree.sync()
        print(f"Synced {synced} commands")
    except Exception as e:
        print("An error occurred while syncing: ", e)

以上程式碼可以在機器人啟動成功後去同步定義或更改過的斜槓指令,並將以同步的命令印出來。

會看到以下結果

Synced [<AppCommand id=1139849087160700959 name='hello' type=<AppCommandType.chat_input: 1>>] commands

bot.tree.sync()是用於將在代碼中定義的斜槓命令同步到Discord。當創建了一個新的斜槓命令或修改了現有的斜槓命令時,會需要調用此方法來將更改同步到Discord。
詳細可參照以下官方文件。
https://discordpy.readthedocs.io/en/stable/interactions/api.html?highlight=tree#discord.app_commands.CommandTree.sync

成功後會看到機器人的資訊出現了一個綠色圖示,且當在訊息框打上/後可以發現自己機器人的斜槓指令。

@bot.hybrid_command()可以傳入以下常用的參數:

  • name:命令的名稱。如果未指定,則默認為函數的名稱。
  • help:命令的幫助文本。
  • brief:命令的簡要描述。
  • usage:命令的使用方法。
  • aliases:命令的別名列表。
  • enabled:指定命令是否啟用。如果設置為False,則該命令將無法使用。
  • hidden:指定命令是否隱藏。如果設置為True,則該命令將不會出現在幫助信息中。
  • rest_is_raw:指定是否將剩餘的參數作為原始字符串傳遞給命令。
  • with_app_command:指定是否將該命令作為應用程序命令(即斜槓命令)註冊。

參數設定基本上跟@bot.command()不會差很多,但有些參數是只會在使用指令前綴時才會生效,例如aliases別名參數。詳細可見官方文檔。
https://discordpy.readthedocs.io/en/stable/ext/commands/api.html#discord.ext.commands.hybrid_command


而當我們的指令需要傳入參數時可以加一些參數的說明,如下:

@bot.hybrid_command(name='helloworld', help='Greets the user')
async def helloworld(
    ctx, 
    name: str, # 用戶名
    age: Optional[int] = None # 可選年齡
):
    """
    Parameters:
        name (str): 用戶名
        age (Optional[int]): 可選年齡
    """
    if age:
        await ctx.send(f"Hello {name}! You are {age} years old.") 
    else:
        await ctx.send(f"Hello {name}!")

就跟python為函式定義參數說明的方式是一樣的,利用三個雙引號將說明包起來即可。


如果想要建一個group的斜槓指令的話使用方式也是跟原先的@bot.group()極其類似,如下:

@bot.hybrid_group()
async def greet(ctx):
    pass

@greet.command()
async def hello(ctx):
    await ctx.send("Hello!")

@greet.command() 
async def bye(ctx):
    await ctx.send("Bye!")

這裡先用斜槓指令定義group的根命令greet,然后使用@greet.command()來註冊group下的子命令,此時的子命令也同時會是斜槓命令。


以上就是斜槓指令的用法,透過使用斜槓命令可以使機器人所擁有的功能更明瞭,使用起來更簡單也可以透過再輸入框輸入?或是!符號來查詢指令,十分方便。


上一篇
[DAY22]補充: MultiThreading 多線程 & MultiProcessing 多進程
下一篇
[DAY24]Discord bot定時(自動)指令
系列文
selenium爬蟲應用至discord bot30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言