7
6

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.

Discord botがエラーを吐いたときにエラーIDを発行して通知する

Last updated at Posted at 2019-10-08

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ですね。
しかし、

  1. UUIDを使うのは大袈裟すぎる
  2. いちいちimportするまでもない
  3. もっと別のいい方法がある

と言う理由により別の方法に。
ではどうするか。別のチャンネルに転送するのだからそのメッセージIDを使えばいいじゃないか、と。
URLも生成できますし。

ソースコード

というわけでソースコードです

bot.py
@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.py
@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])

みたいな感じになります。

7
6
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
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?