1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

クリスマスまでにPythonを使ってDiscordのBOTを作るAdvent Calendar 2022

Day 12

【12日目】メッセージオブジェクトの関数【PythonでDiscordBOTを作ろう!】

Last updated at Posted at 2022-12-11

メッセージオブジェクトの関数

メッセージオブジェクト(nextcord.Message)には、データと関数が含まれています。
他にも、多くのオブジェクトにはデータと関数の両方が含まれています。
今回は関数についてご紹介しましょう。

関数

APIリファレンス内でMethodsと書かれているところにあるものです。
nextcordであれば以下の通りです。

332193C1-1DE5-459A-A2B4-E60C937D5139.jpeg
(Nextcord API)

と、関数名の左にasyncdefの2種類があるのにお気づきでしょうか。
このasyncdefは非同期関数か否かを示しています。
asyncと付いているものは非同期なのでawaitをつける必要があります。
defは同期関数なのでawaitはつけません。

よく使われるものを紹介します。

await reply()

Message.reply()として実行できる、非同期関数です。

これは結構使われる関数です。
リプライ、つまり返信を行います。
送られてきたメッセージに対して返信します。

第一引数が送りたいメッセージの本文です。

すこし遊んでみましょう。

main.py - async def on_message
@bot.event
async def on_message(message: nextcord.Message):
    if not message.author.bot:
        await message.reply("なんか用かい?")

これを実行するとこうなります。

BFC32C72-125E-4889-9C45-2B974804F467.jpeg

ついにBOTが喋りましたね!!!!
態度悪そうだけど!

なにこのif

さて、今回if文を使いました。
ifは条件分岐で、条件式が正しければ下の関数を実行するというものです。

if 条件式:
    正しければ実行される

message.author.botは、送信ユーザーがBOTであればTrue、そうでなければFalse となります。
ifの後につけたnotでそれが否定されて、送信ユーザーがBOTでなければメッセージの返信が実行されます。

さて、なんでこんなことをしたのでしょうか。
勘のいい人は気づいてると思います。
冒険家の方は、このifを外してやってみてください。

...

自分がメッセージを送信すると、それをトリガーにBOTがメッセージを返信します。さらに、BOT自身の返信メッセージをトリガーにBOTがメッセージを返信して、さらにBOTがそれをトリガーに返信して...(ry

無限ループッッッ!!!

というわけで、初めてBOTを開発していた頃、このif文を忘れていた影響で「猫」が無限に増殖するような状態になってしまった私も、今となっては流石にそんなミスはしな...い...はずですので、皆さんも気をつけましょう。

await add_reaction()

Message.add_reaction()として実行できる、非同期関数です。

これは、メッセージに対してリアクション(絵文字のやつ)をつける関数です。

第一引数は絵文字なんですが、これの指定方法が少しめんどくさいっちゃめんどくさいです。
絵文字は「Unicode Character Name」か「Unicode」か「Discord絵文字」か「絵文字」で指定します。

Unicode Character Name

ここら辺のサイトから絵文字の名前を取得できます。
例として「Fire」(🔥)にしましょう。
そしたら"\N{FIRE}"と書きます。
つまり、await message.add_reaction("\N{FIRE}")と書くことになります。

もしかしたら新しすぎる絵文字には対応してないかもしれません。
その場合、Unknownなんちゃらーって出るので、気長に次の方法をお試しの上お待ちください。

Unicode

さっきのに似てますが、こっちは本当にコードです。
例えば「Smiling Face」(☺️)にしましょう。
そしたら、絵文字のコードを調べます。
すると、U+263Aと出ました。
そしたら、"\u263A"と書きます。
もし、コードが4桁より小さかったら0埋めをします。(U+1"\u0001"

中には、コードが4桁より多いものもあります。
例として「Heart Hands」(🫶)にしましょう。
絵文字のコードはU+1FAF6と表示されました。
4桁同様に今度は8桁になるように0埋めをします。
そしたら"\U0001FAF6"となります。
先ほどはUが小文字でしたが、8桁の場合は大文字になります。気をつけましょう。

Discord絵文字

Discordの各サーバーではカスタム絵文字を設定できます。
それも、ちゃんとリアクションとして使えます。(スタンプは別なので注意!)
<:絵文字名:絵文字ID:>です。

まぁ、絵文字IDってなんぞやって方が大半だと思うので、そういう方には下の記事が参考になると思われます。

一応補足しておくと、そのBOTが参加しているサーバーでの絵文字しか利用できませんのでご注意ください。

絵文字

私的にはあんまり推奨されません。
理由としては、一部のエディタ環境によっては崩れて見えてしまったりするからです。
もちろん、ぱっと見でわかりやすくもありますが...(VSCodeでは一部の絵文字は絵文字じゃなくてUnicodeで表示される)
やり方はこんな感じです。

await message.add_reaction("🐱")

つまり、コード内に直接絵文字を埋め込むということです。

main.py - async def on_message
@bot.event
async def on_message(message: nextcord.Message):
    await message.add_reaction("\N{FIRE}")
    await message.add_reaction("\u263A")
    await message.add_reaction("\U0001FAF6")
    await message.add_reaction("🐱")

すると...

8C35429C-8F17-4928-92FA-E80A90726B5E.jpeg

すごいですね。どこからともなくリアクションが現れました。
1人と1BOTしかいないサーバーでも賑わってる感ありますよね。
これだけでもぼっち回避にいいですね。
Teamsの1人チャットより寂しくないです。

(勝手に引用)

次回予告

このままこのアドベントカレンダーシリーズを読み進めていけば、自作バーチャル(彼女|彼氏)も夢じゃないです。
次回はmessage.contentと正規表現について少しだけ踏み込んで進めたらなと思っております。

ちなみにどうでもいいですが、私絶賛体調不良ですが、Qiitaの記事を書くだけの体力はあります()

というわけで、今日の記事はここまでです。
もしよろしければ記事へのいいねをして、次回記事をお楽しみに!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?