BUMP案内パネルとクールダウン管理を追加する
- Ngôn ngữ chính
- Python
- Star
- 0
- Fork
- 0
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Mô tả
## 概要
DISBOARDの`/bump`を簡単に実行できる常設パネルを、チャンネル
`1432640140911575060`へ追加する。
前回のBUMP成功時刻を保存し、2時間のクールダウン終了後に
BUMP可能状態へ自動で切り替える。
常時ポーリングは行わず、BUMP成功時に次回可能時刻を計算し、
その時刻まで待機する方式とする。
## 背景
現在、DISBOARDの`/bump`を実行するには、利用者がコマンドを
覚えて入力する必要がある。
BUMP専用チャンネルに状態表示と操作導線を常設し、
BUMP可能なタイミングと実行方法を分かりやすくしたい。
## 対象チャンネル
```text
1432640140911575060
```
## 期待する動作
### BUMP可能時
チャンネル最下部付近に、次の状態のパネルを表示する。
```text
🟢 BUMPできます
サーバーを上位表示できます。
下のボタンからBUMPコマンドを開いてください。
```
- 緑色の`BUMPする`ボタンを表示
- ボタンは押下可能
- ボタン押下時、本人だけにSlash Commandメンションを表示
- Slash Commandメンションをクリックすると、入力欄へ
DISBOARDの`/bump`を展開できる
表示例:
```text
こちらを押してください:
```
### クールダウン中
```text
⏳ BUMP待機中
次回BUMP可能:
```
- ボタンはグレー表示
- ボタンはdisabled
- 次回可能時刻をDiscord timestampで表示
## BUMP成功検知
次の条件を組み合わせて、DISBOARDのBUMP成功メッセージを判定する。
- 対象チャンネルである
- 送信者が設定済みのDISBOARD Bot IDである
- Application Command応答である場合は、コマンド名が`bump`
- 必要に応じてEmbedや本文の成功表現も補助条件として使用する
メッセージ本文だけに強く依存しないこと。
成功判定が不確実な場合は状態を更新しないこと。
## クールダウン
既定値:
```text
7200秒
```
環境変数で変更可能にする。
```env
BUMP_COOLDOWN_SECONDS=7200
```
次回可能時刻:
```text
BUMP成功時刻 + BUMP_COOLDOWN_SECONDS
```
## スケジューリング
常時ポーリングは禁止する。
BUMP成功時に次を行う。
1. 成功時刻を保存
2. 次回可能時刻を保存
3. パネルを待機中へ更新
4. 次回可能時刻まで1回だけ待機
5. パネルをBUMP可能状態へ更新
Bot再起動時は保存済み状態を復元する。
- 次回可能時刻を過ぎている場合:即時BUMP可能
- まだ待機中の場合:残り時間だけ待機
- 状態ファイルが存在しない場合:BUMP可能状態
## パネル管理
チャンネル内にはパネルを1件だけ保持する。
保存する情報:
```json
{
"last_bumped_at": null,
"next_bump_at": null,
"panel_message_id": 0
}
```
パネルメッセージが削除されていた場合は再作成する。
BUMP成功時は、DISBOARDの成功メッセージより後ろへ配置するため、
既存パネルを削除して再投稿してよい。
一般投稿が行われるたびに再投稿する処理は行わない。
## 設定
```env
BUMP_CHANNEL_ID=1432640140911575060
DISBOARD_BOT_ID=302050872383242240
DISBOARD_BUMP_COMMAND_ID=
BUMP_COOLDOWN_SECONDS=7200
```
`DISBOARD_BUMP_COMMAND_ID`が未設定の場合は、ボタン押下後に
通常テキストの`/bump`と実行手順を表示するfallbackを用意する。
## 設計
```text
cogs/bump_panel.py
services/bump_panel_service.py
repositories/bump_panel_repository.py
```
保存先:
```text
STATE_DIRECTORY/bump_panel_state.json
```
Configから最終Pathを解決し、RepositoryはPathだけを受け取る。
依存方向:
```text
Cog
↓
Service
↓
Repository
↓
storage/json_store.py
```
## Cogの責務
- Discordイベント受付
- persistent View
- Button callback
- Service生成
- Config値の注入
- `setup()`
## Serviceの責務
- BUMP成功判定
- cooldown計算
- 次回可能判定
- 待機タスク管理
- パネル作成・更新・再投稿
- Button押下時の案内
- Bot起動時の状態復元
- Discord API操作
- Logging
## Repositoryの責務
- state JSON読込
- state JSON保存
- 初期構造
- last_bumped_at
- next_bump_at
- panel_message_id
- atomic write
## ログへ出さない情報
- メッセージ本文全文
- User ID
- Discord Token
- Runtime JSON本文
- Interactionの入力内容
## 受入条件
- [ ] 対象チャンネルにパネルが1件だけ存在する
- [ ] 初期状態ではBUMP可能になる
- [ ] BUMP可能時のみ緑ボタンが押せる
- [ ] ボタン押下後、本人だけに`/bump`導線が表示される
- [ ] コマンドID設定時はSlash Commandメンションになる
- [ ] 未設定時は通常テキストのfallbackになる
- [ ] BUMP成功を検知すると待機中表示になる
- [ ] 次回可能時刻が相対時刻で表示される
- [ ] クールダウン終了後にボタンが有効化される
- [ ] 常時ポーリングを行わない
- [ ] 再起動後も状態が復元される
- [ ] パネル削除時に再作成できる
- [ ] Runtime JSONは`STATE_DIRECTORY`配下へ保存される
- [ ] 既存機能のテストを壊さない
- [ ] Discord接続なしで自動テストできる
## 対象外
- BotによるDISBOARD `/bump`の自動実行
- ユーザー代理でのSlash Command実行
- BUMP報酬
- BUMP回数ランキング
- 常時監視ポーリング
- 一般投稿ごとのパネル再投稿
Hướng dẫn đóng góp
Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này
Đánh giá
Issue này chưa được đánh giá.