這是我目前使用的兩種方法(或許還有其他方法)
@commands.Cog.listener()
async def on_message(self, msg):
Help = ["Help", "help", "H", "h"]
Commands = ["./help"]
for words in Help:
if msg.content.find(words) >= 0 and msg.author != self.bot.user and msg.content not in Commands:
await msg.channel.send("pls input ***./help*** to see more information.")
break
Q1 : 程式碼功能說明:
A1 :
利用 on_message() 特性,偵測到 Help List 裡面的任一個字串,便會發出「pls input ./help to see more information.」的訊息。
目的為製作 bot 引導程式。
Q2 : 程式碼 on_message() 原理說明:
A2 :
on_message() 會在 bot 啟動時,自動檢測在所有頻道內輸入的所有文字,一直執行。
可以藉由此特性撰寫偵測特定關鍵字的程式。
Q3 : 實際運行狀況:
A3 :
例如 使用者A 想了解麼用你的 bot ,於是他打出 「help」 這個訊息在有你 bot 的群組裡。
這時程式便會偵測到訊息並跳出資訊,可以當成引導程式來提供使用 bot 的必要訊息。
ctx,context,上下文。此參數包括了許多訊息。
其中,ctx.message 包括了使用者資訊,我們可以藉由此特性來擷取特定資訊。
@commands.command(aliases = ["t-3"])
async def test_3(self, ctx):
def user_input() -> str:
message = ctx.message.content
# 取出完整的 input 內容,(去除指令名稱 <test_3> + 一個空格即可)
"""
e.g.
input : ./test_3 你好
index : 012345678 9 10
擷取字串中 char 9 10 為使用者輸入
"""
user_message = "" + message[9 : len(message)]
return user_message
await ctx.send(f"output : \n{user_input()}")
Q1 : 程式碼功能說明:
A1 :
提取 ctx 中使用者的純文字輸入訊息
去除 指令提示語(字串前面的 ./test_3 ),獲取使用者真正的輸入訊息。
Q2 : 程式碼 @commands.command() 原理說明:
A2 :
@commands.command() 會在 discord 被呼叫時才有所動作,是一種命令。
可以藉由此特性撰寫更高自由度的程式。
Q3 : 實際運行狀況:
A3 :
可以完美的擷取到使用者的輸入,之後也可以藉由分割字串的動作完成子命令的規劃。
備註:關於在 bot 上撰寫自定義函數
可以先在本地先單純用 python 做好,編譯執行。
之後再放到 bot 裡,只需要改輸入、輸出的部分。(記得注意變數的型態變化)