どうして作ろうと思ったか
最近は友人とグループでDiscordを使って会話をすることが多く、わざわざ返事を書くほどでもないけど反応はしたいと言う気持ちでリアクションを使っていました。しかし、リアクションをされた側は通知がこないので
A「昨日の投稿見た?」
B「リアクションつけたよ」
Aが確認してから
A「本当だ、気づかなかった」
ということが何度かありました。そこで、リアクションに通知がくればいいじゃないかとBotを書いてみました。
できないこと(追記)
コメントで@1ntegrale9のこの実装の弱点を教えてもらったのでここに追記しておきます。
以下に書く方法ではBotが起動してから受信したメッセージ以外に対して反応できません(botにキャッシュされているメッセージにしか反応ができないようです)。つまり、Herokuのように1日に1回再起動するような仕様のPaaSを利用している場合あまり使えない実装となっております。
完成品
作り方も下に書いてありますが一応完成したものはここにDiscord-Reactorと言う名前で置いてあります
一応README.md
を見ればある程度分かるように書いたつもりですがわからないところがあれば、ここのコメントでもissueでも何でも質問してください。
作り方
Botを作る
とりあえずまずBotがないといけないので私が以前書いたまあまあアクセスがあってビビってる下の記事を参考にBotを作って見てください。
Botが動くのを確認できたら次に進んでください
リアクションに反応する
上の記事ではメッセージに反応するために
@client.event
async def on_message(message):
のような関数を書きました。リアクションも似たようなものです。下のように書きます。
@client.event
async def on_reaction_add(reaction, user):
ここの引数の説明を軽くすると
-
reaction
-
discord.Reaction
のクラス。リアクションの種類やreaction.message
でリアクションがついたメッセージを参照できたりする。
-
-
user
-
discord.User
のクラス。リアクションをつけた人のデータ。
-
これを利用することでメッセージを投稿した人に「リアクションがつきました」と通知ができます!
実装
特に説明する要素がない気がするので最小限のコードだけ載せておきます。
import discord
client = discord.Client()
@client.event
async def on_reaction_add(reaction, user):
# author: リアクションがついたメッセージを書いた人
author = reaction.message.author
await client.send_message(author, f"{user} さんがリアクションをしました")
client.run("あなたのBotのトークン")
このコードを実行すると、誰かがあなたの投稿にリアクションをつけると通知がくるようになります。
最後に
このbotを入れてからTwitterの良いね感覚でリアクションが使えるのでかなり便利です。
このbotはできればPublicにして誰でも使えるようにしたかったのですが自分のサーバーがかなり貧弱なので諦めました。もし誰か強いサーバーが余ってる方がいましたらぜひやってくれると嬉しいです。
追記 2018/7/31
コメントでこの実装がサーバーに載せずらいことが分かりました。