跟基礎指令有什麼區別?

應用程式指令是指斜線指令

輸入斜線/之後可以被列在指令選單中 如果有需要的參數,也會自動列出來
slash para

還可以做更多應用

Discord官方正努力推動這種格式的指令,因為這種方式可以讓使用者更容易取用,而不須先了解有什麼指令、指令需要什麼參數、參數是什麼格式

基本語法

此處想做到的是

輸入/hello Jack
機器人會回你「Hello, Jack」

1
2
3
@bot.tree.command()
async def hello(interaction:discord.Interaction,name:str):
await interaction.response.send_message(f'Hello, {name}')

內容講解

@bot.tree.command()

此處與基本指令不同

應用程式指令是一個樹狀的概念,所有指令統整成一個樹
此部分不須特別理解,只須記得裝飾器是這個即可

async def hi(interaction:discord.Interaction,name:str):

跟基本指令差不多,只是此處有幾個地方不同

interaction是互動的意思
可以想像成應用程式指令提供操作的方式有點類似給你一個電視遙控器
而基礎指令是給你說明書,請你自己去按電視上的按鈕

特別注意,每一個參數都要加上型別標註,比如此處的name:str

await interaction.response.send_message(f'Hello, {name}')

就是ctx.send的意思
但此處用法有些特殊,後面會介紹

最後運行前加上以下內容

1
2
3
@bot.event
async def on_ready():
await bot.tree.sync()

特殊語法1: 多次傳訊息

有時候一次動作會傳送比較多訊息
比如說完Hello, Jack之後,再說My name is Latte

在基礎指令時,可以多次使用ctx.send() 來多次傳訊息
但在應用程式指令,則無法這樣寫,於是我們需要修改

1
2
3
4
@bot.tree.command()
async def hello(interaction:discord.Interaction,name:str):
await interaction.response.send_message(f'Hello, {name}')
await interaction.followup.send('My name is Latte')

interaction.response在一次指令中只能使用一次,作為初始回應

如果需要第二次的話,就須使用interaction.followup
followup會使用webhook的方式,有點像留下一個可以後續操作的方法

特殊語法2: 思考

有時候傳進來的參數如果是需要進行I/O操作的,例如抓取API或是讀取資料庫
Discord給予interaction.response 3秒的時間回應,如果超過就會顯示錯誤

但我們不可能永遠確保回應在3秒內回覆,特別是上述I/O操作
這時候我們會讓機器人顯示正在思考,而時間限制會被延長至15分鐘

defer

1
2
3
4
@bot.tree.command()
async def hello(interaction:discord.Interaction,name:str):
await interaction.response.defer()
await interaction.followup.send(f'Hello, {name}')

此方法使用defer() 讓機器人顯示思考中,然後由於response用過了,所以用followup來傳訊息