クソアプリ Advent Calendar 2021 17日目の記事です。
初めに
どうも、最近Javascriptばっか使ってて、Pythonを忘れかけてる人です。
この記事では、pycordというPythonのライブラリを使ってDiscord botを使ったので、その紹介をしていきます。
作ったBOT紹介
Discordの通知をDiscordでします。
コマンド
n.join
通知をonにします。
このコマンドを実行すると、コマンドを実行したサーバーのメッセージのうち、botが閲覧できるメッセージの送信通知が全部DMで送られてきます。
n.leave
通知をoffにします。
これで、あのうるさいピコピコ音にうんざりしなくて済みます。
招待URL
Pycord
この記事で紹介したbotは、このライブラリを使って開発しました。
pythonでdiscord botといえばdiscord.pyが主流でした。しかし、とある理由で開発が中止となってしまいました。
そんなdiscord.pyの後継者として、いま注目を浴びてるのが、このライブラリ
docsもどこか懐かしい感じがします。
インストール
pip install -U py-cord
基本機構
import discord
class MyClient(discord.Client):
async def on_ready(self):
print(f'Logged on as {self.user}!')
async def on_message(self, message):
print(f'Message from {message.author}: {message.content}')
client = MyClient()
client.run('my token goes here')
この記事で紹介したbotのコードは、このコードをベースに作りました。
簡易コマンド
コマンドの実装方法には複数あります。
- Slash Command
- ext.commands
- message.content
こんな感じかな?
このbotで使った方法は、message.contentを使った方式です。
上で書いた基本機構のon_message
で受け取った引数message
を使ってコマンドを実装します。
if message.content.startswith('n.join'):
# 処理
こんな感じ
イコールを使ってもよかったけど、のちに他の人を強制的に通知onにするいたずら機構も作ろうと思い、.startswith()
を使いました。
DMへメッセージ送信
DMへのメッセージ送信は、discord.Memberにsend()することでできます。
Intents問題
通知対象のdiscord idをdictで保管してます。
メッセージを受け取ったら、通知をするためにそのidからメンバーを取得します。
しかし、最初は、このintentsを設定していなかったため、メンバーを取得できませんでした。
二時間くらいかけて、解決
intents = discord.Intents.all()
client = MyClient(intents=intents)
こいつをclient.run()の前に追加してあげると、解決
Herokuにデプロイしよう!
こんな記事があります。
requirements.txtに、discord.pyと書いてあるので、py-cordに書き換えましょう
- discord.py[voice]>=1.7.3
+ py-cord>=1.7.3
バージョンはお好みで
デフォルトのPythonのバージョンは3.8.5なので、気に入らない人は、
runtime.txt
を書き換えましょう。
各種URL
最後に
楽しかった。
少し改良して、特定の人が送信したメッセージだけ送信したり、通知メッセージにチャンネルへのリンクを埋め込んだり、他人の通知を強制的にonにするいたずらをしたり、、、
夢がありますね!
また、次の記事で会いましょう ノシ