Giter Club home page Giter Club logo

discord-reminderbot's People

Contributors

p-yon-kity avatar tetsuya-ki avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

discord-reminderbot's Issues

Unknown Guildで落ちるバグ(Stickerの影響で発生)

原因

# Sticker取得のため、ギルドの取得
guild = await self.bot.fetch_guild(remind[2])
  • fetch_guildメソッドで例外が発生したが、try-catchされていないためbackground task 'printer'が終了

エラーログ

2023-05-19 20:35:24,659@ discord.ext.tasks [ERROR] _error: Unhandled exception in internal background task 'printer'.
Traceback (most recent call last):
  File "/home/ubuntu/python/discord-reminderbotpublic3/.venv/lib/python3.10/site-packages/discord/ext/tasks/init.py", line 239, in _loop
    await self.coro(*args, **kwargs)
  File "/home/ubuntu/python/discord-reminderbotpublic3/cogs/remindercog.py", line 70, in printer
    guild = await self.bot.fetch_guild(remind[2])
  File "/home/ubuntu/python/discord-reminderbotpublic3/.venv/lib/python3.10/site-packages/discord/client.py", line 2246, in fetch_guild
    data = await self.http.get_guild(guild_id, with_counts=with_counts)
  File "/home/ubuntu/python/discord-reminderbotpublic3/.venv/lib/python3.10/site-packages/discord/http.py", line 740, in request
    raise NotFound(response, data)
discord.errors.NotFound: 404 Not Found (error code: 10004)

チャンネル未指定でリマインド登録するとエラーが発生する

エラーが発生しました(local variable 'channel_id' referenced before assignment)

channel_idがない状態で、
_remind_makeの以下のところへ到達してエラーが発生

id = await self.remind.make(guild_id, ctx.author.id, remind_datetime, message, channel_id, status, repeat_flg,
                       repeat_interval, repeat_count, repeat_max_count)

#16 の対応で生まれたバグ

DMでリマインドがキャンセルできない

エラーメッセージ

エラーが発生しました('NoneType' object has no attribute 'id')

下記部分のせいでダメ
ファイル: remindercog.py
メソッド: remind_cancel

await self.remind.update_status(id, ctx.guild.id, self.remind.STATUS_CANCELED)

メッセージの改行について

こちらのreminderbotを使用させていただいております。
いつもありがとうございます。
こちら/remind-makeのmessageで改行を使用する方法はございますでしょうか?

messegeで アプリコマンドの実行について

お世話になっております。今現在、使わせて運用しているのですが
message: のところで、/ スラッシュコマンド 使って、スラッシュコマンドアプリを
実行するということはできるのでしょうか?

あるテキストチャンネル内で、一定時間の間隔で、
ある スラッシュコマンド を実行したい、というのを
試しに出来るか、権限とかも一応設定の上したのですが、平打ち文がでてきて
出来ない感じでした。

こうすればできる、あるいはまだ未実装であるならば
是非実装いただけたらと思います。

image

リマインド先のチャンネルへの投稿権限がBotにない場合、例外が発生しTaskが終了してしまう

  • try-catchで囲う
  • 投稿失敗した場合、(善意があるギルドの場合は)絶対にあると思われる、Botのファイル添付用のチャンネルにお知らせしてあげたほうが良さそう(こっそりログにだけだして、エラーだと不親切)
    • 本当は、投稿できません的なチェックをするべきだと思うけど、、、うーん.。。。
2021-09-05 15:01:05,061@ asyncio [ERROR] default_exception_handler: Task exception was never retrieved
future: <Task finished name='Task-252' coro=<Loop._loop() done, defined at /opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/tasks/__init__.py:88> exception=Forbidden('403 Forbidden (error code: 50001): Missing Access')>
Traceback (most recent call last):
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/tasks/__init__.py", line 125, in _loop
    raise exc
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/tasks/__init__.py", line 101, in _loop
    await self.coro(*args, **kwargs)
  File "/home/runner/discord-reminderbot/cogs/remindercog.py", line 73, in printer
    await channel.send(remind[5])
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord_slash/dpy_overrides.py", line 323, in send_override
    return await send(channel, *args, **kwargs)
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord_slash/dpy_overrides.py", line 300, in send
    data = await state.http.send_message(
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/http.py", line 248, in request
    raise Forbidden(r, data)
discord.errors.Forbidden: 403 Forbidden (error code: 50001): Missing Access

リマインドの繰り返し実行に対応

オプションで繰り返し間隔を設定させる

  • XX分: XXmi
  • XX時間: XXh
  • X日: Xd
  • Xヶ月: Xm
  • X年: 1y
  • 特殊
    • 平日: 平日
    • 休日: 休日
    • 月初: 月初
    • 月末: 月末
      • 2文字の時のみ発動
    • 曜日: 月水金
      • 実装の際の注意点
      • それぞれをrruleのbyweekdayリストに詰めて、startが翌日、endが1週間後で最初のやつを使う

DMへのリマインダーで対象のユーザーが送れない場合Exceptionが発生し、リマインドが送信されなくなる

こういうエラーになってしまい、リマインドしなくなるのでtry-catchで対処が必要。

2022-04-29 15:09:09,879@ asyncio [ERROR] default_exception_handler: Task exception was never retrieved
future: <Task finished name='Task-651' coro=<Loop._loop() done, defined at /opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/tasks/__init__.py:88> exception=TypeError("'NoneType' object is not iterable")>
Traceback (most recent call last):
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/tasks/__init__.py", line 125, in _loop
    raise exc
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/tasks/__init__.py", line 101, in _loop
    await self.coro(*args, **kwargs)
  File "/home/runner/discord-reminderbotpublic3/cogs/remindercog.py", line 53, in printer
    for remind in self.remind.remind_rows:
TypeError: 'NoneType' object is not iterable
Unhandled exception in internal background task 'printer'.
Traceback (most recent call last):
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/tasks/__init__.py", line 101, in _loop
    await self.coro(*args, **kwargs)
  File "/home/runner/discord-reminderbotpublic3/cogs/remindercog.py", line 67, in printer
    remind_msg = await channel.send(remind[5])
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord_slash/dpy_overrides.py", line 323, in send_override
    return await send(channel, *args, **kwargs)
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord_slash/dpy_overrides.py", line 300, in send
    data = await state.http.send_message(
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/http.py", line 248, in request
    raise Forbidden(r, data)
discord.errors.Forbidden: 403 Forbidden (error code: 50007): Cannot send messages to this user

キャンセルやスキップについてギルド管理者はギルド内実行可能とする(Botオーナーはなんでも実行可能とする)

  • 現在の仕様
    • キャンセルやスキップについて、本人しか実行できない
  • 今後の仕様
    • ギルド管理者の場合、ギルド内のリマインドのキャンセル、スキップが実行可能
      • ギルド管理者はギルド内のいろいろできるべき
    • Botオーナーの場合、全リマインドのキャンセル、スキップが実行可能
      • BotオーナーはリマインドBotについて何でもできるべき

繰り返し間隔のチェックがない

9b09f55 で追加しましたが、今までは繰り返し間隔はノーチェックでした...

そのため、繰り返し間隔が不正とわかったとき、こっそり処理をしないようにしていました...
今回、そのチェックを追加しました。数字がなく、単位のみの場合、1があるとみなすようにしました。

  • 例: y → 1y(1年間隔とみなす)

repeat_max_countにチェックがないので不正な繰り返し上限が登録されてしまう

それでこういうエラーが発生して、Taskが中止されて、リマインドされない事態になっている気がする
今まで登録されちゃったものもあると思うので、printerメソッドの繰り返し回数チェックのところに、remind[8].isdecimal()みたいなチェックを追加しようかな

2021-09-05 14:41:39,664@ asyncio [ERROR] default_exception_handler: Task exception was never retrieved
future: <Task finished name='Task-66' coro=<Loop._loop() done, defined at /opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/tasks/__init__.py:88> exception=TypeError("'<' not supported between instances of 'int' and 'str'")>
Traceback (most recent call last):
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/tasks/__init__.py", line 125, in _loop
    raise exc
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/tasks/__init__.py", line 101, in _loop
    await self.coro(*args, **kwargs)
  File "/home/runner/discord-reminderbot/cogs/remindercog.py", line 94, in printer
    if remind[8] is None or repeat_count < remind[8]:
TypeError: '<' not supported between instances of 'int' and 'str'

sqlite3のDBファイルの暗号化

現状

  • dbファイルを読み込めば、他人の情報も閲覧できてしまう

対応

  • AES暗号化を使ってdbファイルを暗号化する(AESなのは簡単に暗号化できそうだったから)
  • 暗号化キー、未指定の場合はトークンを使おうかなぁ?(公開しないだろうし)
  • 基本的には環境変数で予め設定されたパスワードを素に暗号/複合する、、、はず

予約投稿の時間がズレることがある

平日の9時、12時、15時に予約投稿をし、repeatの機能で自動で再登録、という形で使わせていただいております。

普段は問題なく稼働しているのですが、週に1~2度ほど、予約投稿が行われずに、17時過ぎとか終わってから順次9時、12時、15時の投稿がされていくといった事象が起きております。

こちらを解消したいのですが、この投稿時間は何の時間を参照しているのでしょうか。
Discord側の設定に依存するものでしょうか。

一時的なリマインドキャンセル機能

一時的なリマインドキャンセル機能(もしくは2種の繰り返し間隔設定)があるとありがたいです。
例として、[毎日][6:00]から[1時間]毎に送信されるリマインドを作成し、その日のリマインドをキャンセルしても翌日にはまた同じリマインドが再開される、というような事ができると助かります。

返信の非表示について

先日は改行のご対応ありがとうございました。
もう1点やり方を教えて頂きたく質問させていただきます。
report_interval 1dで設定しており、毎日リマインド後に返信で『次回のリマインドを登録しました(No,00000)』が毎回出てきます
こちらreply_is_hiddenを設定しても、他の方から見えてるようで…
見えなくする方法はございますでしょうか?
image

/remind-makeを実行すると、ずっと「 xxxxBot が考え中...」が表示される

現象

  • /remind-makeコマンドでリマインドを作成すると、レスポンス?で「 xxxxBot が考え中...」が表示され、消えない

問題

  • await ctx.respond()をしたまま、なんのレスポンスも返していないのが原因(respondしたならなんかsendしないとダメ)
  • 公式レファレンスのMigrate To 1.0.9に載ってた>これ
    • ctx.send ()だけでもいいのだけど、最初にctx.respond()を するのがオススメらしい
    • 時間がちょっとかかるなら、ctx.respond()をつけるべきだし、15分以上かかるならctx.defer()`が必要とのこと

対処

  • 公式の以下の記述がとても参考になる
    • 一旦は、全部見える形にしよう
    • 別途、環境変数でデフォルトをきめておき、オプションでなんかできるようにしようかな(choiceで選ばせる)
# Case 1
await ctx.respond()  # This is optional, but still recommended to.
msg = await ctx.send("Hello, World! This is initial message.")
await msg.edit(content="Or nevermind.")
await msg.delete()
await ctx.send("This is followup message.")

# Case 2
await ctx.respond(eat=True)  # Again, this is optional, but still recommended to.
await ctx.send("This is secret message.", hidden=True)

repeat_intervalの機能の入力方法について

毎日9:00に投稿できるようなbotがないかと探しており、こちらにたどり着きました。
早速使わせていただいております、ありがとうございます!

repeat_interval機能についてですが、こちらの登録を試しているのですが「繰り返し間隔が不正のため、リマインドを登録できませんでした」と出て登録ができません。/rimind-makeで表示されるテンプレートからと、下記のように直接入力の両方を試しております。
入力方法に不備がありますでしょうか。repeat_intervalを外せば登録はできます。

/remind-make date:0705 time:12:41 message:テスト投稿 repeat_interval:平日

〇やりたいこと
理想は平日のAM9:00にメッセージを投稿したいと考えております。
毎日手動で7/2、7/3と1件ずつ登録していくのが手間なので、理想は平日というカテゴリーで登録をかけたいのですがエラーが解消できませんので、質問させていただきました。

オプションで返答が見えるか見えないか選べるようにする

  • 機能について
    • デフォルトは見える
    • オプションで見えないようにできる
      • 返答が見えないやつだとどんな入力したかが分からなくて不便なことがある
  • その他の修正
    • 全般的に、エラー返答は消えてもいいので、見えないようにした方がいいかも

スレッドにリマインドできない

掲題の通り。スレッドはチャンネルと違うので、登録できなかった。
ちょっと一手間かければ登録可能であるため、対処。

リマインド先にDMを選べるようにする

概要

  • チャンネルに「DM」って書いてあったらDBに「DM」と登録する
  • Taskで通知するリマインドを取得した際に、チャンネルに「DM」と書いてあったら、authorからDMのオブジェクトを生成し、そこに通知する

気になること

  • そこまでして隠したいなら、リマインドの存在自体を隠さなければならないのでは????という疑問もある
    • slashコマンドでhiddenすれば見えないはず
    • 環境変数で選べるようにする?(デフォルトhiddenで???)
  • 意識していなかったがBotとのDMで使ったらどうなるんだ???と思って試したらコマンドが使えなかった
Ignoring exception in command None:
discord.ext.commands.errors.CommandNotFound: Command "remind-list" is not found

ギルドのデータ削除する機能

ギルドでリマインドを辞めたくなった時、ギルドのデータを一気に削除する機能が必要。
論理削除だけじゃなくて物理削除までやる。

Heroku対応

現状

  • 指定されたファイルパスに存在するdbファイルを読み込んでいる
  • Herokuでは、少なくとも1日1回はリフレッシュされ、削除されてしまうので、現状のBotは役に立たない

対処

  • discord-bot-herokuのリアクションチャンネラー機能でやった対応をする
    • 環境変数IS_HEROKUがTrueの場合、Herokuモードになる
    • 初期化/リマインドが更新された場合にギルドの指定のチャンネルにファイルが添付されているか確認しにいく
    • 添付があれば保存する
    • チャンネルがなかったら 勝手に作成する

自分のデータを削除する機能

リマインドを辞めたくなった時、自分のデータを一気に削除する機能が必要。
論理削除だけじゃなくて物理削除までやる。

ボイスチャンネルのテキストチャンネルにリマインドを送ろうとするとエラー(タスクが停止)

  • replitで動かしているやつだけ、AttributeErrorの場合DMへ送るようにした
  • 登録するときに、チャンネルの属性にsendがあるかチェックして、ないなら登録できないようにするかな
  • もし可能なら、送ることができるようにしたい(最新のマニュアルみたら書いてあるかも)
2022-07-10 23:45:01,221@ reminderbot [INFO] _remind_task_check: remindのTaskを確認するぜ2022-07-10 23:45:01,221@ reminderbot [INFO] check_printer_is_running: Taskが停止していたので再起動します2022-07-10 23:45:01,222@ asyncio [ERROR] default_exception_handler: Task exception was never retrieved
future: <Task finished name='Task-4590' coro=<Loop._loop() done, defined at /opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/tasks/init.py:88> exception=AttributeError("'VoiceChannel' object has no attribute 'send'")>
Traceback (most recent call last):
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/tasks/init.py", line 125, in _loop
    raise exc
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/tasks/init.py", line 101, in _loop
    await self.coro(*args, **kwargs)
  File "/home/runner/discord-reminderbotpublic3/cogs/remindercog.py", line 81, in printer
    remind_msg = await channel.send(remind[5])
AttributeError: 'VoiceChannel' object has no attribute 'send'

日付に年も含めて登録できなくなった(バグ)

年部分含み登録するとエラーになってしまう状態になっています。10月中に修正しますので、来年以降のリマインドは11月に登録してください。年内のリマインドの場合は年を省略して登録してください

多分、以下の対応で埋めたバグです。
1cec073 fix #48 - tetsuya-ki

だめ
date:2022/10/20 time:10:00
こうする
date:10/20 time:10:00

リマインダーの消し方を教えてください

こんにちは。今後こちらのBOTを使わせていただきたく、テストをしてみたのですが、
/remind-cancelを実行してもNoが違いますと出てしまい、取り消しすることができませんでした。
こちらの過去ログも見てみたのですが、リマインドキャンセルができるオーナーになるためには
どのような作業が必要なのでしょうか?
テスト自体は自分がサーバーのオーナーで管理者のサーバーで実施しています。
こういったことに詳しくなく、的はずれな質問でしたら大変申し訳ございません。
お手数をおかけしますが、ご返信いただけますと幸いです。
よろしくお願いいたします。

remind_listが空の時、400 Bad Requestが発生

現象

  • remind_listが空になるユーザーで、/remind-listを実行すると、エラーが発生する

エラーメッセージ

INFO:cogs.remindercog:remindをlistするぜ!
INFO:cogs.modules.remind:
ERROR:discord_slash:An exception has occurred while executing command `remind-list`:
Traceback (most recent call last):
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord_slash/client.py", line 690, in invoke_command
    await func.invoke(ctx, **args)
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord_slash/model.py", line 131, in invoke
    return await self.func(self.cog, *args, **kwargs)
  File "/home/runner/discord-reminderbot/cogs/remindercog.py", line 144, in remind_list
    await ctx.send(content=rows)
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord_slash/context.py", line 184, in send
    resp = await self._http.post(base, self.interaction_id, self.__token, files=files)
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/http.py", line 247, in request
    raise HTTPException(r, data)
discord.errors.HTTPException: 400 Bad Request (error code: 50006): Cannot send an empty message

Task再起動後、繰り返しリマインドのところでエラーが発生してしまう可能性がある

int型なのにisdecimal()とか無いぞという至極当たり前のエラーが出たので、修正が必要
なんでいつもはエラーが出ないんだろう?

2021-10-01 12:44:21,645@ reminderbot [INFO] check_printer_is_running: Taskが停止していたので再起動します2021-10-01 12:44:21,645@ asyncio [ERROR] default_exception_handler: Task exception was never retrieved
future: <Task finished name='Task-28' coro=<Loop._loop() done, defined at /opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/tasks/__init__.py:88> exception=AttributeError("'int' object has no attribute 'isdecimal'")>
Traceback (most recent call last):
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/tasks/__init__.py", line 125, in _loop
    raise exc
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/tasks/__init__.py", line 101, in _loop
    await self.coro(*args, **kwargs)
  File "/home/runner/discord-reminderbotaj/cogs/remindercog.py", line 117, in printer
    if remind[8] is None or (remind[8].isdecimal() and repeat_count < remind[8]):
AttributeError: 'int' object has no attribute 'isdecimal'

reminderが使用できなくなりました。

こちらのreminderを毎日繰り返しで使用しておりますが、(81)からremindをしなくなりました。
1/3まではリマインドできていましたが、原因をご確認いただけますでしょうか
よろしくお願いいたします。
No. 306908 No. 306910

チャンネルの読み込み権限を与えずにBotを登録されると、エラーが発生しました(403 Forbidden (error code: 50001): Missing Access)が発生して何もできなくなる

ちゃんとtry-catchしておくべきだった...
こういうこうとされてしまうと、そもそもギルドにチャンネルを勝手に作って云々っていうのが悪んじゃないか?って気がしてくる。DMのときのように指定のギルドへファイル添付で済ませておけば、問題は発生しなかったはず。
その場合でも指定のギルドが使えなくなった場合に困ってしまうが...。

Bot管理者が特定のDiscord IDの使用を禁止するコマンドを作る

banlist的なテーブル作って、Discord IDを保存。
そこに登録された場合、リマインドを登録できない。
表示とかもできないようにするかは考えてない。

いつまで使えないかも登録できる

id DiscordID startDate EndDate createDate

作りたい理由。reminderbotの使い方がおかしい人がいるかもしれないため(例えば、1分間に1回リマインドを超たくさん作って荒らすなど)
それを教えてもらうため、運営者にメッセージを送るコマンドも必要なのかもしれない(やりたくない....)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.