事件在做什麼

各種條件觸發,比如機器人上線、有人傳訊息、有人編輯訊息、頻道名稱被管理員更新等,成為事件
而這些事件是可以被機器人持續追蹤的,當這些事件發生時,如果機器人有對應的函式,就會呼叫函式並傳入參數,讓我們做處理

基本語法

1
2
3
@bot.event # 這裡不用()
async def on_ready():
# 動作
  • @bot.event
    事件的裝飾器長這樣,要特別注意不用括號

  • async def on_ready()
    此處函式名稱比較特殊,是固定的,不像指令可以自己取名字;名字由事件決定,此處的事件是「機器人上線時」
    而函式接受什麼參數也由套件預設決定

也就是說,我們可以自己定義的只有動作的部分

機器人上線

1
2
3
@bot.event
async def on_ready():
print(f"Logged in as {bot.user}")

如上一段提到的,這個事件是機器人上線時會觸發
上線時在控制台印出文字
其中bot.user在機器人上線時會被設定在bot物件內,是這個程式登入到的機器人

如果今天把token改成其他機器人的,這個值就會改成其他機器人
結果應該會印出Logged in as (你的機器人)

關鍵字訊息

1
2
3
4
@bot.event
async def on_message(msg:discord.Message):
if "哈哈" in msg.content:
await msg.channel.send("嘻嘻")

此處事件on_message 是在有任何訊息被傳送的時候會觸發,並且傳入該訊息的相關資料物件讓我們取用
msg物件有content屬性,代表訊息的文字部分,而我們用if判斷「哈哈」是否在裡面,如果有的話就傳「嘻嘻」

此處ctx.send,是因為傳入的參數是訊息不是上下文,沒有直接提供send方法,而頻道物件有提供這個方法,所以我們取用msg的channel,再傳送訊息

機器人會重複判斷自身送出的訊息,所以在前面可以加上以下內容

1
2
if msg.author.bot:
return

msg.author是一個物件,儲存了發訊息人的資料
其中有個屬性為bot,如果該使用者是機器人就會是True

注意,此功能不能和基礎指令混用,只能與應用程式指令混用