akitig / akitig/wankoro_bot

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

未關閉
#51 0 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視
主要語言
Python
星號
0
分支
0
PR 合併指標
30 天內沒有已合併 PR

描述

## 概要

わんころ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で公開する
- 回答数に応じた自動募集

貢獻指南

這個儲存庫沒有索引到貢獻指南

研究方向

Start by locating the Cog, Service, Repository, and storage/json_store.py entry points described in the issue, then review how configuration, StateDirectory, and Discord event handling are currently organized. Check how scheduler tasks and persistent Views are loaded and unloaded. Done means the listed scheduling, anonymous response, poll-generation, persistence, error-handling, and Discord-free testing acceptance conditions are met.

由索引模型根據 Issue 內容生成。

評估

技術堆疊
python
領域
backend, databases, testing
Issue 類型
功能
難度
5/5
預估耗時
一週以上
活躍度
冷清
描述清晰度
基本清楚
新手友好度
45/100

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。