接續上一篇 基礎bot.py
今天要來教各位簡單的指令和條件觸發

今日的內容寫在前一篇介紹的兩個區塊中間喔

指令

首先是非常基礎的結構

1
2
3
@bot.command()
async def command(ctx,arg):
await ctx.send()

這裡仔細介紹一下各部分

  • @bot.command()
    使用裝飾器的方式登錄此函式為一個可呼叫的指令
    凡是文字指令前面都需要加此裝飾器

  • async def command()
    此處為函式定義,函式名稱即為指令名稱
    以此段程式為例,到時候可用>command呼叫

  • ctx
    每一個指令函式都必須有此參數
    Discord會使用此參數傳入包含該指令被呼叫時的所有資訊組成的物件
    其本體為discord.ext.commands.Context如:
    ctx.channel = 發送該指令的頻道物件
    ctx.author = 發送該指令的使用者物件
    ctx.send() = 可呼叫的方法,在該頻道發送訊息
    可至機器人Context的文檔查看所有屬性
    若有需要可指定ctx:commands.Context以獲取編輯器的自動建議內容

  • arg
    不限定每一個指令必有此參數
    可指定指令接收參數,名稱可自取,數量不限,也可接受*arg**kwarg,此教學以arg為範例

應用: 回傳Hi

1
2
3
4
5
@bot.command()
async def hi(ctx):

# ctx.send()函數,可在發送指令的頻道發送訊息
await ctx.send(f'Hi, {ctx.author.name}')

機器人回復

1
Hi, (user)

如果需要提及使用者可以換成ctx.author.mention

應用: 機器人代替你說話

1
2
3
4
5
6
7
@bot.command()
async def say(ctx,*,content:str)

# ctx.channel儲存的是發送指令的頻道物件
# 頻道物件有purge()函數,代表刪除訊息,limit為數量
await ctx.channel.purge(limit=1)
await ctx.send(content)

文字指令可被視為一則訊息
令機器人刪除原訊息後再次發送
可達到機器人代替你說話的效果

觸發條件

1
2
3
@bot.event
async def on_ready()
await print('Bot is ready!')
  • `@bot.event
    使用裝飾器的方式登錄此函式為需要呼叫的條件
    不同於指令,此裝飾器不需要加()
    凡是觸發條件前面都需要加此裝飾器

觸發條件有特定的函式,不可像指令一樣自訂
每個函式有自己的參數,可參閱事件的文檔取得全部可用的觸發條件和參數

此處作為範例的on_ready沒有參數,會在機器人啟動時被呼叫
如此就可在機器人做好準備啟動時在終端印出 Bot is ready

應用: 歡迎訊息

on_member_join會在有人加入伺服器時被呼叫

1
2
3
4
5
6
7
@bot.event
async def on_member_join(member):
# 使用bot的get_channel()來取得指定頻道組成的物件
channel = await bot.get_channel(頻道ID)

# 使用channel的send()在該頻道發送歡迎訊息
await channel.send(f'歡迎{member.mention}')

應用: 關鍵字觸發

on_message會在有訊息被發送時呼叫
也有人用這個方式做指令
不是不行,只是維護上比較不方便,而且不好處理參數;從可以直接取用,變成需要用split分開參數,也難處理*arg

1
2
3
4
5
6
@bot.event
async def on_message(message):
if "你好" in message:

# 如果訊息包含你好,則回傳訊息
await message.channel.send(f'你好,{message.author.name}')

教學系列