Skip to content

おみくじが引けるかどうかを開く前に分かるようにする - #236

Merged
kojira merged 3 commits into
mainfrom
claude/ranking-feature-bug-a8nq2k
Aug 4, 2026
Merged

おみくじが引けるかどうかを開く前に分かるようにする#236
kojira merged 3 commits into
mainfrom
claude/ranking-feature-bug-a8nq2k

Conversation

@kojira

@kojira kojira commented Aug 4, 2026

Copy link
Copy Markdown
Member

背景

引けるかどうかは前回いつ引いたかだけで決まり、それは前回引いた瞬間に確定している。
にもかかわらずどこにも覚えていなかったため、「おみくじ」を開くたびに

トークン取得 → omikujiGo(peek) の往復(関数がコールドなら数秒)

を待たされ、そのあとで初めて「まだ引けない」と分かる状態だった。押してから待たされた
末に引けないと知らされるのが一番つらい。

変更

次に引ける時刻と前回の結果を localStorage に持つ(web/utils/omikujiCooldown.js)。
キーに github_id を含め、アカウント切替で前の人のものを見せない。

  • トップページ: クールダウン中は「次のおみくじまで ◯時間◯分」を表示し、ボタンを
    「前回のおみくじ」に変える。引ければ「おみくじを引く」に戻る。
    ここではサーバーに問い合わせない
  • おみくじページ: 保存した結果とカウントダウンを通信を待たずに出す。
    「前回のおみくじ」を押せばその場で過去の結果が見える
  • ヘッダ: 同じく引けないときは「前回のおみくじ」表記

カウントダウンは明ける時刻(絶対時刻)から毎回計算する。残り秒を1秒ずつ引くと、
タブが背面のとき setInterval が間引かれて実際より長い残り時間を表示し、
「引けるのに引けないと見える」という直したかった症状が再発するため。

方針

表示を先出しするだけで、実際に引けるかは常にサーバーが決める(端末の時計は
書き換えられる)。残り時間は8時間(最長のクールダウン)で頭打ち。別端末では保存が
無いので、従来どおり peek の応答から復元される。

テスト

web/scripts/test-omikuji-cooldown.jsnode で実行):

  • 保存した残り時間と結果が読める / 時間が進めば減る
  • 期限切れでも前回の結果は残す(「前回のおみくじ」を出せるように)
  • 別ユーザーの記録は見えない
  • 壊れた値は捨てる / 端末の時計ずれは8時間で頭打ち
  • localStorage が使えなくても落ちない / 表示整形

yarn generate 通過。

Co-Authored-By: Claude Opus 5 noreply@anthropic.com


Generated by Claude Code

kojira and others added 3 commits August 4, 2026 00:32
次に引ける時刻は前回引いた瞬間に確定しているのに、どこにも覚えていなかった。
そのため「おみくじ」を開くたびに トークン取得 → omikujiGo(peek) の往復を
待たされ、そのあとで初めて「まだ引けない」と分かっていた。押してから待たされた
末に引けないと知らされるのが体感として一番つらい。

- 次に引ける時刻を localStorage に覚える(utils/omikujiCooldown.js)。
  キーに github_id を含め、アカウント切替で前の人の残り時間を見せない
- おみくじページはそれを読んで、通信を待たずにクールダウン表示から始める。
  peek の応答が来たら上書きする(正はサーバー)
- ヘッダのリンクは引けないとき「前回のおみくじ」になる。開く前に、引けるのか
  前回の結果を見に行くだけなのかが分かる

表示を先出しするだけで、実際に引けるかは常にサーバーが決める。端末の時計は
信用せず8時間で頭打ちにする。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
引けるかどうかは前回いつ引いたかだけで決まり、それは前回引いた瞬間に確定して
いる。にもかかわらずどこにも覚えていなかったため、開くたびに omikujiGo(peek)
の往復を待たされ、そのあとで初めて「まだ引けない」と分かっていた。

- 次に引ける時刻と前回の結果を localStorage に持つ(utils/omikujiCooldown.js)
- トップページにカウントダウンを出す。クールダウン中はボタンを
  「前回のおみくじ」にする。ここではサーバーに問い合わせない
- おみくじページは保存した結果とカウントダウンを通信を待たずに出す。
  「前回のおみくじ」を押せばその場で過去の結果が見える
- ヘッダのリンクも同じ表記にする

表示を先出しするだけで、実際に引けるかは常にサーバーが決める。端末の時計は
信用せず8時間で頭打ち。別端末では保存が無いので従来どおり peek から復元する。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
残り秒を1秒ずつ引いていたため、タブが背面にあると setInterval が間引かれて
(止まることもある)実際より長い残り時間を表示していた。戻ってきたときに
「引けるのに引けないと見える」ことになり、今回直したかった症状そのものが
再発する。

- おみくじページ: 明ける時刻を決めて毎tickそこから計算する
- トップページ: 保存済みの「次に引ける時刻」から毎tick計算し直す
- 残り時間の整形を omikujiCooldown.js に一本化し、両ページで同じ表記にする

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@cursor

cursor Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@kojira
kojira merged commit 64a81c5 into main Aug 4, 2026
3 checks passed
kojira added a commit that referenced this pull request Aug 20, 2026
おみくじを引くボタンを押して演出(matter.js)が始まった直後に、引く前の画面へ
戻される。リロードではなく Vue の状態が上書きされている。

保存済みの状態で通信を待たずに画面を出すようにした(#236)結果、peek の応答が
返る前からボタンが押せる。押すと state が animating になるが、その後に到着した
peek の応答が applyResponse で state を available/cooldown に戻すため、演出が
畳まれて元の画面に戻っていた。

- 問い合わせが1度でも完了するまでボタンを disabled にする(statusChecked)。
  確認中であることも表示する
- 演出中に届いた peek の応答は state を触らない(抽選側が状態を持っている)
- 演出中にクールダウンが明けたときのタイマーも state を触らない
- startScene の入口でも確認前は止める

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
kojira added a commit that referenced this pull request Aug 20, 2026
おみくじを引くボタンを押して演出(matter.js)が始まった直後に、引く前の画面へ
戻される。リロードではなく Vue の状態が上書きされている。

保存済みの状態で通信を待たずに画面を出すようにした(#236)結果、peek の応答が
返る前からボタンが押せる。押すと state が animating になるが、その後に到着した
peek の応答が applyResponse で state を available/cooldown に戻すため、演出が
畳まれて元の画面に戻っていた。

- 問い合わせが1度でも完了するまでボタンを disabled にする(statusChecked)。
  確認中であることも表示する
- その問い合わせより後に演出が始まっていたら応答を捨てる(sceneCount の世代)。
  「今 animating か」で判定してはいけない。演出が結果より先に終わったときの
  取り直し(onLanded)はまだ animating のまま呼ぶため、捨てると演出が閉じずに固まる
- 演出中にクールダウンが明けたときのタイマーも state を触らない
- startScene の入口でも確認前は止める

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant