iT邦幫忙

2024 iThome 鐵人賽

DAY 6
1
Python

用 Python 打造你的 Discord BOT系列 第 6

[Day 06] 觸發條件 (一):事件

  • 分享至 

  • xImage
  •  

接下來這幾天,會介紹各種 Discord BOT 可以設定的觸發條件。

進度

Discord BOT 的執行腳本可以分成兩個部分:觸發條件與執行內容。觸發條件有很多種,其中,最常見的就是「事件」,也就是今天的主題。

這個分類方式是我自己定義的

事件 (Event)

事件指的是「某個在 Discord 發生的特定情況」,我們可以設定要監聽 (listen) 的事件,一旦那個情況出現,就可以觸發我們設定的腳本。

其實在前幾天的 Quickstart 範例程式中已經有出現過它的蹤跡:on_readyon_message。而他們所對應的特定情況是:

  • on_ready:Discord BOT (也就是 Client) 完成準備的時候
  • on_message:當一個訊息被建立並送出的時候

事件種類非常多,在 discord.py 的 API 文件中有完整列出所有可以被監聽的「事件」,以及該事件所需要的 intents 設定。

如何設定監聽事件

一共有兩種方法可以設定監聽事件:

  1. 使用 @event
  2. 繼承 Client class 並 override 特定的事件

方法一:@event

使用方法也很簡單,只要使用對應的事件名稱當函數名稱,就可以進行設定:

import discord

intents = discord.Intents.default()
client = discord.Client(intents=intents)

@client.event
async def on_ready():
    print('Ready!')

方法二:繼承 Client 並 override

import discord

class MyClient(discord.Client):
    async def on_ready(self):
        print('Ready!')

intents = discord.Intents.default()
client = MyClient(intents=intents)

常見的事件

前面有提到,事件種類非常多,因此這邊列幾個我覺得比較常見或重要的事件。

閘道 (Gateway)

  • 準備完成
    • on_ready()

這個通常是用來確認是否啟動完成而已,有需要的話可以記錄在日誌 (log) 中。

成員 (Members)

  • 新增成員
    • on_member_join(member)
      • member:加入的成員

這個常應用於「發送歡迎訊息」的功能。當有新的成員加入時,可以自動發送歡迎訊息、伺服器守則等資訊 (發在頻道內或是私人訊息)。

訊息 (Messages)

  • 傳送訊息
    • on_message(message)
      • message:傳送的訊息
  • 編輯訊息
    • on_message_edit(before, after)
      • before:原本的訊息
      • after:新的訊息
  • 刪除訊息
    • on_message_delete(message)
      • message:被刪除的訊息

on_message 算是最常用的事件了,只要設定好關鍵字,用戶就可以依據需求選擇對應的關鍵字來觸發想要的功能。除此之外,也還有很多種應用,像是:

  1. 經驗值系統 (透過在頻道發送訊息來獲取經驗值)
  2. 支語警察

反應 (Reactions)

這邊指的反應是按下表情符號

  • on_reaction_add(reaction, user)
    • reaction:增加的反應
    • user:做這件事的用戶

這個最常用在「自助領取身分組」的功能。使用者按下表情符號進行回應後,Discord BOT 就可以知道:

  1. 要增加的身分組是什麼 (根據 reaction)
  2. 要幫哪個用戶增加身分組 (根據 user)

附帶一提,可以用 reaction.message 取得「被反應」的訊息

簡單的範例

最後,讓我們來簡單示範一下幾個事件的用法。

總覺得文章中沒有 Demo 的話怪怪的

# day06.py

import discord

intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)


@client.event
async def on_ready():
    print(f"We have logged in as {client.user}")


@client.event
async def on_message(message: discord.Message):
    if message.author == client.user:
        return

    if message.content == "ping":
        await message.channel.send("pong")


@client.event
async def on_message_edit(before: discord.Message, after: discord.Message):
    await after.channel.send(
        f"{after.author} 編輯了訊息!原本的訊息是:{before.content}"
    )


@client.event
async def on_reaction_add(reaction: discord.Reaction, user: discord.User):
    await reaction.message.channel.send(f"{user} 做出了 {reaction.emoji} 回應!")

client.run("your token here")

這段程式是從 Quickstart 範例程式改的,除了加上了 on_message_editon_reaction_add 之外,也補上了 type hint,這樣在開發上比較方便~

首先是最基本的 ping pong 回應:

接下來,對剛剛的 ping 訊息按下表情符號:

最後,編輯 ping 訊息:

小結

今天介紹了 Discord BOT 觸發條件中的最常見的「事件」,並簡單的 Demo 了使用方法。明天會繼續介紹其他的觸發條件~


上一篇
[Day 05] BOT 權限
下一篇
[Day 07] 觸發條件 (二):指令 ── slash command
系列文
用 Python 打造你的 Discord BOT31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言