2022年2月4日追記
修正版を公開したので新規の方はそちらへどうぞ
作ろうと思ったきっかけ
私のBotはHerokuで運営しているのですが、エラーを吐いたときにいちいち確認するのが面倒なのと、ログが多いのでその中から発掘するのが大変なので作りました。
https://qiita.com/Taku_427_T/items/9caaf59a5fad011b6841
もともとはこれが便利そうなので作ろうと思っただけですが。
ソースの流用は一切してないです。
環境
ソフトウェア | バージョン |
---|---|
開発OS | Ubuntu 18.04.3 LTS |
実行OS | Ubuntu 18.04.3 LTS(Heroku) |
Python | Python3.7 |
Discord.py | 1.2.3 |
インストールは割愛します。 |
エラーIDをどうするか
エラーIDは絶対に重複させてはいけません。
どれかわからなくなるからですね。
では何を使うか。絶対重複しないIDといえばUUIDですね。
しかし、
- UUIDを使うのは大袈裟すぎる
- いちいちimportするまでもない
- もっと別のいい方法がある
と言う理由により別の方法に。
ではどうするか。別のチャンネルに転送するのだからそのメッセージIDを使えばいいじゃないか、と。
URLも生成できますし。
ソースコード
というわけでソースコードです
@bot.event
async def on_command_error(ctx, error):
ch = int型のチャンネルID
embed = discord.Embed(title="エラー情報", description="", color=0xf00)
embed.add_field(name="エラー発生サーバー名", value=ctx.guild.name, inline=False)
embed.add_field(name="エラー発生サーバーID", value=ctx.guild.id, inline=False)
embed.add_field(name="エラー発生ユーザー名", value=ctx.author.name, inline=False)
embed.add_field(name="エラー発生ユーザーID", value=ctx.author.id, inline=False)
embed.add_field(name="エラー発生コマンド", value=ctx.message.content, inline=False)
embed.add_field(name="発生エラー", value=error, inline=False)
m = await bot.get_channel(ch).send(embed=embed)
await ctx.send(f"何らかのエラーが発生しました。ごめんなさい。\nこのエラーについて問い合わせるときはこのコードも一緒にお知らせください:{m.id}")
解説
on_command_error
でエラーを受信(?)します。
次にembedを生成します。
- サーバー名
- サーバーID
- ユーザー名
- ユーザーID
- 実行コマンド
- 発生したエラーの内容
ですね。
これをch
変数で指定したチャンネルに送信します。
エラーが発生したチャンネルにその送信したメッセージIDと一緒にメッセージを送信する、といった感じですね。
エラーIDからエラー情報へ行くには
https://discord.com/channels/serverID/channelID/messageID
でできます。
コマンドで取得したい場合は
@bot.command()
@commands.is_owner()
async def get_error(ctx, error_id):
await ctx.send(embed = (await bot.get_channel(チャンネルID).fetch_message(error_id)).embeds[0])
みたいな感じになります。