iT邦幫忙

2

[Python] Discord Bot 獲取使用者輸入

  • 分享至 

  • xImage
  •  

Discord Bot 獲取使用者輸入的辦法

  • on_message()
  • 使用 ctx 參數裡的內容

這是我目前使用的兩種方法(或許還有其他方法)

一、@commands.Cog.listener() 的 on_message()

@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 的必要訊息。

9.png

小節結論

  • 特點:具有全域性、不是可被使用者呼叫的程式
  • 優點:方便入手使用
  • 缺點:容易觸發此程式,造成程式程序錯亂

二、@commands.command() 善用 ctx 參數

ctxcontext上下文。此參數包括了許多訊息。

其中,ctx.message 包括了使用者資訊,我們可以藉由此特性來擷取特定資訊。

  • 使用者資訊:
    • 使用者輸入的字串
    • 使用者發言所在頻道的 id
    • 使用者的 id、名稱
    • ...

5.png

@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 :

  1. 提取 ctx 中使用者的純文字輸入訊息

    • message = ctx.message.content
  2. 去除 指令提示語(字串前面的 ./test_3 ),獲取使用者真正的輸入訊息。

    • user_message = "" + message[9 : len(message)]

Q2 : 程式碼 @commands.command() 原理說明:
A2 :
@commands.command() 會在 discord 被呼叫時才有所動作,是一種命令。
可以藉由此特性撰寫更高自由度的程式。

Q3 : 實際運行狀況:
A3 :
可以完美的擷取到使用者的輸入,之後也可以藉由分割字串的動作完成子命令的規劃。

6.png
7.png

小節結論

  • 特點:具有局部性、可被使用者呼叫的程式
  • 優點:可用範圍廣、自由度大,也較實用
  • 缺點:需要有字串的前置處理動作,如果使用 aliases 簡化命令的要多加注意

備註:關於在 bot 上撰寫自定義函數
可以先在本地先單純用 python 做好,編譯執行。
之後再放到 bot 裡,只需要改輸入、輸出的部分。(記得注意變數的型態變化)


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言