はじめに
Discordのbotの定期的に変わるステータスをよく見かけるので実装する方法を紹介します。
この記事の対象者
- ある程度Pythonの知識があり、discord.pyで定期的に変わるbotのステータスを実装したい。
前提知識
- 基本的なPythonの記法と仕様を理解している
- discord.pyの基本的な使い方を知っている
実装
実際のコード
main.py
import asyncio
import discord
# ステータス変更
async def change_status(statuses: dict, interval: int):
while True:
key = list(statuses.keys())[0]
value = statuses.pop(key)
statuses[key] = value
if value == "playing": # ~をプレイ中
status = discord.Activity(type=discord.ActivityType.playing, name=key)
elif value == "streaming": # ~を配信中
status = discord.Activity(type=discord.ActivityType.streaming, name=key)
elif value == "listening": # ~を再生中
status = discord.Activity(type=discord.ActivityType.listening, name=key)
elif value == "watching": # ~を視聴中
status = discord.Activity(type=discord.ActivityType.watching, name=key)
elif value == "competing": # ~に参戦中
status = discord.Activity(type=discord.ActivityType.competing, name=key)
else: # その他
status = discord.Activity(type=discord.ActivityType.custom, name=key)
await bot.change_presence(activity=status)
await asyncio.sleep(interval) # インターバル(秒)
# ステータス定義 ({key}を{value}中)
statuses = {
"Minecraft": "playing",
"YouTube": "watching",
"Spotify": "listening"
}
@bot.event
async def on_ready():
print(f'Logged in as {bot.user.name}')
await change_status(statuses, 30)
解説
change_status()
関数
この非同期関数は、与えられたステータスとインターバルに基づいて、botのステータスを変更するループを作成します。ステータスは辞書形式で与えられ、キーは表示したいアクティビティ、値はそのアクティビティのタイプです。各アクティビティにはそれぞれ適切なdiscord.ActivityType
が割り当てられます。例えば、"playing"
の場合はdiscord.ActivityType.playing
が、"watching"
の場合はdiscord.ActivityType.watching
が使用されます。よって、"Minecraft": "playing"
とした場合、botのステータスは"Minecraftをプレイ中"
と表示されます。キーと値は上から順に取り出され、循環するように処理されます。
on_ready()
デコレータ
そしてon_ready()
デコレータはbotが起動し準備が完了したときに実行されます。このイベントが発生すると、change_status
関数を呼び出します。
終わりに
最後まで読んで頂きありがとうございます。不備があれば是非コメントで指摘して下さい。