匿名の「いまひま?」定期アンケートを追加する
- Vorherrschende Sprache
- Python
- Sterne
- 0
- Forks
- 0
- PR-Merge-Kennzahlen
- Keine gemergten PRs in 30 T.
Beschreibung
## 概要
わんころBotから、匿名の「いまひま?」アンケートを定期投稿する。
利用者は次の3項目から現在の希望を1つ選択できる。
- VALORANT
- その他ゲーム
- 作業VC
公開メッセージには人数と足跡だけを表示し、回答者名は表示しない。
## 投稿スケジュール
タイムゾーンは`Asia/Tokyo`とする。
- 平日:20:00
- 土日祝:13:00、20:00
常時ポーリングは行わず、次回投稿時刻を計算して1回だけ待機する。
Bot再起動時は、現在時刻から次回投稿時刻を再計算する。
## 投稿文
```text
🐶 いまひま? by わんころ
あそぼ!はなそ!
あしあと感覚で押してみてね🐾
押すと今の結果も見られるよ!
あとから選び直せるよ!
名前は出ず、あしあとだけ残るから安心してね✨
```
## 集計表示
```text
🎯 VALORANT 🐾🐾🐾(3)
🎮 その他ゲーム 🐾🐾(2)
🗣️ 作業VC 🐾(1)
```
表示上限を設け、人数が多い場合は次のように省略してよい。
```text
🐾×12(12)
```
## ボタン
- `🎯 VALORANT`
- `🎮 その他ゲーム`
- `🗣️ 作業VC`
- `✖ 取り消す`
persistent Viewを使用する。
各ボタンには明示的な`custom_id`を設定する。
## 回答仕様
- 1人につき1回答
- 同じ投稿内では後から変更可能
- 同じ選択肢を再度押しても人数を重複加算しない
- 取り消し可能
- 選択変更時は旧選択から減算し、新選択へ加算
- 回答者名は公開しない
- Bot投稿は回答対象外
- 回答後、本人だけにephemeralで現在の集計結果を表示する
## 匿名性
公開表示には以下を含めない。
- Discord User ID
- ユーザー名
- mention
- 回答者一覧
選択変更を実現するため、内部状態にはDiscord User IDを保存してよい。
ただし、User ID、ユーザー名、回答内容をプロセスログへ出力しない。
「匿名」は他の一般利用者から回答者を特定できないという意味であり、
Bot管理者がruntime stateへアクセスできる点は設計上明記する。
## アンケートの世代管理
投稿ごとに一意のpoll IDを持つ。
新しいアンケートを投稿したら、前回アンケートを締め切る。
締め切られたアンケートではボタンを無効化する。
過去アンケートへの遅延Interactionで状態を変更しない。
## 永続化
保存対象:
```json
{
"active_poll": {
"poll_id": "2026-08-01T20:00:00+09:00",
"message_id": 0,
"channel_id": 0,
"opened_at": "2026-08-01T20:00:00+09:00",
"closed_at": null,
"answers": {
"123456789012345678": "valorant"
}
},
"next_run_at": "2026-08-02T13:00:00+09:00"
}
```
保存先:
```text
runtime root / availability_poll_state.json
```
本番想定:
```text
/var/lib/wankoro-bot/availability_poll_state.json
```
atomic writeを使用する。
## 設定
```env
AVAILABILITY_POLL_CHANNEL_ID=
AVAILABILITY_POLL_TIMEZONE=Asia/Tokyo
AVAILABILITY_POLL_WEEKDAY_TIMES=20:00
AVAILABILITY_POLL_HOLIDAY_TIMES=13:00,20:00
AVAILABILITY_POLL_STATE_PATH=
```
休日は土曜・日曜・日本の祝日とする。
## 設計
```text
Cog
↓
Service
↓
Repository
↓
storage/json_store.py
```
### Cog
- Discordイベント境界
- Button/View
- Config取得
- Service生成
- persistent View登録
- `cog_load`
- `cog_unload`
- `setup()`
### Service
- 次回投稿時刻計算
- 土日祝判定
- scheduler task管理
- アンケート投稿
- 前回アンケート締切
- 回答追加・変更・取消
- 集計生成
- Embed・View更新
- Interaction応答
- Discord API例外処理
- Logging
### Repository
- runtime JSON読込・保存
- active poll状態
- User IDと回答の対応
- message ID
- next run
- atomic write
## 受入条件
- [ ] 平日は20:00に投稿される
- [ ] 土日祝は13:00と20:00に投稿される
- [ ] `Asia/Tokyo`で計算される
- [ ] 常時ポーリングを行わない
- [ ] 再起動後に次回時刻を再計算できる
- [ ] 3種類から回答できる
- [ ] 1人1回答である
- [ ] 後から変更できる
- [ ] 回答を取り消せる
- [ ] 公開表示には人数と足跡だけが出る
- [ ] 回答者名は表示されない
- [ ] 回答後にephemeralで結果を確認できる
- [ ] 新規投稿時に前回アンケートを締め切る
- [ ] 古いボタンから状態を変更できない
- [ ] runtime stateがStateDirectory配下へ保存される
- [ ] Discord接続なしでテストできる
## 対象外
- 自動でゲーム募集を投稿する
- 回答者をmentionする
- DMを送信する
- VCへ自動参加させる
- 回答者一覧を管理者Commandで公開する
- 回答数に応じた自動募集
Beitragsleitfaden
Für dieses Repository ist kein Beitragsleitfaden indexiert
Bewertung
Dieses Issue wurde noch nicht bewertet.