akitig / akitig/wankoro_bot

匿名の「いまひま?」定期アンケートを追加する

Offen
#51 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
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.

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.