akitig / akitig/wankoro_bot

BUMP案内パネルとクールダウン管理を追加する

Đang mở
#49 0 bình luận 0 reaction 0 người được giao Xem trên GitHub
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á.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.