discord.pyに関するTIPS

公開:2020/09/27
更新:2020/10/18
3 min読了の目安(約3000字TECH技術記事

discord.pyを利用したdiscordbot開発者向け情報です。

Discord Bot Portal JPのコミュニティ(Discordサーバー)内の情報を、
逐次反映していきます。

Botのプロフィールに「Nサーバーをプレイ中」を表示する

import discord
from discord.ext import tasks

# discordbot が持つ各種データの箱を用意します
# ログインする(on_readyが発火する)まではデータは空(None)のままです
client = discord.Client()

# 指定間隔(60秒に1回)で実行されます
@tasks.loop(seconds=60)
async def change_activity():
    # 「○○をプレイ中」の内容を変更します
    await client.change_presence(
        activity=discord.Game(name=f'{len(client.guilds)}サーバー')
    )

# tasks.loop の開始直前に実行されます
@change_activity.before_loop
async def before_change_activity():
    # botがログインするまで(on_readyが発火するまで)待機します
    await client.wait_until_ready()


# tasks.loop を開始します
change_activity.start()

# ログイン処理を行います
client.run('THi5IsDuMMyaCCesSTOK3n00.DUMMY.ThIsi5DUMMyAcc3s5ToKen0000')

数字の絵文字を扱う 1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣8️⃣9️⃣

1. 絵文字を直接使う

これが一番簡単だと思います。
(Macなら Ctrl+Cmd+Space で絵文字一覧を出せます)

await channel.send('1️⃣') # 絵文字のメッセージを送信
await message.reaction_add('1️⃣') # 絵文字をリアクションとして付与
if message.content == '1️⃣': # メッセージがこの絵文字の時
    pass
if str(message.reactions[0].emoji) == '1️⃣': # リアクションの最初がこの絵文字の時
    pass

2. Unicodeを利用する

R.Danny という bot に ?charinfo というコマンドがあり、
?charinfo 文字列 の形式でコマンドを打つと、
文字列の内の文字情報(主にUnicode)を教えてくれます。

これを活用して数字絵文字のUnicodeを取得しましょう。

しかしDiscordのメッセージは2000文字が上限のため、
このように多くの情報を要求すると弾かれます。
その場合は分割して情報を取得しましょう。

これらより、数字絵文字のUnicodeを一般化すると以下のようになります。

for n in range(1, 10, 1):
    print(f'\\U0000003{n}\\U0000fe0f\\U000020e3')

3. 絵文字名(?)を利用する

(正式名称が分かったら修正します)

Unicodeはどう頑張っても人が読むための文字列ではないので、
charinfoで取得したUnicodeの隣に明記されている名前を利用することもできます。
ただし、かなり長くなるので注意が必要です。

以下は数字のリアクションを順番に付与する例です。

emoji_digits = [
    '\N{DIGIT ONE}\N{VARIATION SELECTOR-16}\N{COMBINING ENCLOSING KEYCAP}'
    '\N{DIGIT TWO}\N{VARIATION SELECTOR-16}\N{COMBINING ENCLOSING KEYCAP}'
    '\N{DIGIT THREE}\N{VARIATION SELECTOR-16}\N{COMBINING ENCLOSING KEYCAP}'
    '\N{DIGIT FOUR}\N{VARIATION SELECTOR-16}\N{COMBINING ENCLOSING KEYCAP}'
    '\N{DIGIT FIVE}\N{VARIATION SELECTOR-16}\N{COMBINING ENCLOSING KEYCAP}'
    '\N{DIGIT SIX}\N{VARIATION SELECTOR-16}\N{COMBINING ENCLOSING KEYCAP}'
    '\N{DIGIT SEVEN}\N{VARIATION SELECTOR-16}\N{COMBINING ENCLOSING KEYCAP}'
    '\N{DIGIT EIGHT}\N{VARIATION SELECTOR-16}\N{COMBINING ENCLOSING KEYCAP}'
    '\N{DIGIT NINE}\N{VARIATION SELECTOR-16}\N{COMBINING ENCLOSING KEYCAP}'
]

for digit in emoji_digits:
    await message.reaction_add(digit)