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

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

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

![332193C1-1DE5-459A-A2B4-E60C937D5139.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107984/b959e100-b9ce-aa1b-f095-f1f368ee5b90.jpeg)
([Nextcord API](https://docs.nextcord.dev/en/stable/api.html#message))

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

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

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

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

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

https://aiacademy.jp/texts/show/?id=516

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

```py: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107984/0b6b8691-14be-f5a6-001a-3cde9c8520de.jpeg)


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


### なにこのif

さて、今回`if`文を使いました。
ifは条件分岐で、条件式が正しければ下の関数を実行するというものです。
```py
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

https://emojipedia.org

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

:::note warn
もしかしたら新しすぎる絵文字には対応してないかもしれません。
その場合、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ってなんぞやって方が大半だと思うので、そういう方には下の記事が参考になると思われます。

https://qiita.com/Arusu_Dev/items/683aef9da468725e778a

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

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

`await message.add_reaction("🐱")`

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


```py: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107984/6d19733e-d826-647c-a14c-05beae0f7609.jpeg)

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


https://twitter.com/daruyanagi/status/1554334583629352961

（勝手に引用）

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

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

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