Skip to content

[discord-bot] Quest 申請を通知チャンネルへ投稿してレビューを促す #562

Description

@yu23ki14

依存: #530(Cron + subgraph ポーリング + 通知チャンネル設定の基盤)。#530 完了後に着手する。

背景

クエストの完了報告(submitCompletion)が出されるとクエストは PendingReview になるが、現状これに気づく手段は以下しかない。

  • Discord /quest submit の結果は実行者本人にしか見えない ephemeral followup
  • フロントエンドのクエスト詳細(/{treeId}/quest/{questId})を能動的に見に行く

結果、申請が放置されエスクローされたロールシェアが宙に浮く。#530 で Thanks 送付の通知基盤(Cron + subgraph ポーリング + 通知チャンネル)ができるので、これに乗せて申請も通知したい。

承認できるのは誰か(重要)

IHatsQuestModule.approve の仕様上、承認できるのは 「クエスト作成者の単独承認」または「ワークスペースメンバー 2 名の承認」 で、どちらかが揃うと Completed になりエスクローが申請者へ渡る。専用の管理者ロールは存在しない。通知文面はこの前提に合わせる。

ゴール

#530 と同じ Cron の中で、前回チェック以降に新規発生したクエスト申請を検出し、#530 で設定済みの通知チャンネルへ投稿してレビューを促す。

ポーリング設計

SubmissionAttempt には blockNumberworkspaceId も無く(submittedAt = ブロックタイムスタンプのみ)、Quest.blockNumber は作成時のまま更新されない。よって #530 のブロックカーソルは流用できない。既存スキーマのまま Quest を引く方式にする(サブグラフ変更なし)。

quests(
  where: { workspace: $treeId, status: PendingReview, submittedAt_gte: $cursor }
  orderBy: submittedAt
  orderDirection: asc
  first: $n
) { questId submitter amount hatId wearer creator submittedAt attemptCount metadata { title } }

カーソル

自然に成り立つ性質(追加実装不要)

  • ポーリング間隔内に申請 → 取り下げ / 却下された場合、statusOpen に戻り submittedAtnull になる(questMapping.ts)ため、クエリに引っかからず通知されない。レビュー不要なものは自動的に落ちる

実装メモ

メッセージ案

📝 クエストに完了報告が届きました
**{questTitle}** — {submitterLabel}
シェア {amount}
作成者の承認、またはメンバー2名の承認で完了します
{TOBAN_FRONTEND_URL}/{treeId}/quest/{questId}

変更対象(想定)

受け入れ条件

  • Cron 実行時、前回チェック以降に PendingReview になったクエストのみが通知される(取りこぼし・重複なし)
  • 通知に クエスト名 / 申請者 / シェア量 / クエスト詳細へのリンク が含まれる
  • 承認条件(作成者単独 or メンバー2名)が文面から分かる
  • 承認を促すためのメンションが付かない(本文の人物表示で ping も飛ばない)
  • 通知先は feat(discord-bot): Cron で subgraph 監視し Thanks 送付を指定チャンネルへ通知(複数workspace対応) #530 で設定した通知チャンネルと同じ
  • 「申請 → 却下 → 再申請」で 2 回通知される(questId + attemptCount で区別される)
  • ポーリング間隔内に申請が取り下げ / 却下された場合は通知されない
  • 導入直後に既存の PendingReview クエストが一斉通知されない
  • 1 つの workspace の失敗が他 workspace や Thanks 通知を止めない
  • identity / subgraph をインターフェース stub した、ネットワーク非依存の単体テストがある

スコープ外

関連

ブランチ

feat/discord-bot-notify-quest-submissionmain から)

Metadata

Metadata

Assignees

No one assigned

    Labels

    MiddlePriority Middle

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions