Bot 待命中,需要特定關鍵字才會啟動。
| 情境 | 行為 | 下一狀態 |
|---|---|---|
| 群組中觸發 | 建立 1:1 對話 → 發表單到私訊 | asking_form |
| 私訊中觸發 | 直接顯示表單 | asking_form |
使用者一次填完 6 個欄位再送出。
| 欄位 | 必填 | 格式 / 範例 | 預設值 |
|---|---|---|---|
| 主題 | ✅ | 自由文字 | — |
| 參與者 | ✅ | 逗號或頓號分隔,支援本名 / 英文名 / 暱稱 | 群組成員 |
| 時長 | 30 分鐘 1 小時 2 小時 | 1 小時 | |
| 會議方式 | 線上 或 實體 | 線上 | |
| 日期區間 | 本週 下週 7/8-7/12 7/10 | 今天 +7 天 | |
| 投票截止 | 今天 18:00 明天中午前 | 明天 18:00 |
系統自動處理,使用者不需輸入。
| 步驟 | 說明 |
|---|---|
| 1. 拆分與會者 | 把參與者名字轉成 email |
| 2. 查行事曆 | 透過 Graph API 查每人的 calendarView |
| 3. 彙整結果 | 合併所有人的忙碌時段 |
| 4. 找共同空檔 | 排除忙碌 / 週末 / 午休,合併連續時段,用字母 A B C… 編號 |
核心決策點。系統會根據輸入的代號數量自動判斷模式。
| 使用者輸入 | 效果 | 下一狀態 |
|---|---|---|
2~5 個代號A, C, F A 14:00, C | 自動進入投票模式 | confirm_vote_picks |
時段範圍C1300-1600 C 13:00-16:00 | 按會議時長自動展開成多個選項,進投票模式 | confirm_vote_picks |
1 個代號C C 10:00 | 自動進入直接預約 | asking_meeting_room 或 asking_materials |
投票 A, C | 強制投票模式 | confirm_vote_picks |
直接約 C 直接 C | 強制直接預約模式 | asking_meeting_room 或 asking_materials |
重新選日期 換日期 重選 | 輸入新日期區間 | re_asking_date |
直接打日期7/8-7/9 本週 下週 | 直接重新查行事曆 | querying_calendar |
C1300-1600 → 展開為 C 13:00、C 14:00、C 15:00(3 個投票選項)
| 使用者輸入 | 效果 | 下一狀態 |
|---|---|---|
確認 沒問題 OK 好 | 發送投票 DM 給所有與會者 | voting_in_progress |
重選 重新選 取消 | 回到時段選擇 | confirm_slots |
| 投票者可用的輸入 | ||
|---|---|---|
| 輸入 | 效果 | |
數字(如 1 3) | 記錄投票,可複選 | |
中文數字(如 一 三) | 同上 | |
都可以 全部 都行 | 全選 | |
| 再次投票 | 覆蓋先前的選擇 | |
| 發起人可用的輸入 | ||
|---|---|---|
| 輸入 | 效果 | 下一狀態 |
查看結果 結果 | 顯示目前票數 + 誰尚未回覆 | (維持本狀態) |
確認 N(如 確認 1) | 提前定案,跳過等待 | asking_meeting_room 或 asking_materials |
| 使用者輸入 | 效果 | 下一狀態 |
|---|---|---|
確認 1 ~ 確認 N | 選定時段 | asking_meeting_room(實體) asking_materials(線上) |
| 使用者輸入 | 效果 | 下一狀態 |
|---|---|---|
名稱(陽光植物)或數字(1)或中文數字(一) | 記錄會議室 | asking_materials |
重選 上一步 換時段 | 回到時段選擇 | confirm_slots |
| 使用者輸入 | 效果 | 下一狀態 |
|---|---|---|
沒有 不用 不需要 無 | 不附資料 | confirm_event |
| 其他任何文字 | 存為會前資料 | confirm_event |
重選 上一步 換時段 | 回到時段選擇 | confirm_slots |
| 使用者輸入 | 效果 | 下一狀態 |
|---|---|---|
確認 沒問題 OK 好 | 建立會議 + 發通知 | create_event |
修改資料 重填資料 改資料 | 退回重新輸入會前資料 | asking_materials |
取消 重來 | 清除所有資料,重新開始 | idle |
系統自動處理,兩條平行路徑。
| 步驟 | 有群組的情況 | 沒群組的情況 |
|---|---|---|
| 1. 最終通知 | 發到群組 | 逐一 DM 給每位與會者 |
| 2. HMAC 簽章 | 簽章 Writer Service 請求(HMAC-SHA256) | |
| 3. 建立行事曆 | 呼叫 Writer Service 建立 Outlook 行事曆邀請 | |
| 4. 通知發起人 | 回報成功 ✅ 或失敗 ⚠️ | |
| 使用者輸入 | 效果 | 下一狀態 |
|---|---|---|
本週 下週 7/14-7/18 7/15 | 重新查行事曆 | querying_calendar |
輸入 C1300-1600 或 C 13:00-16:00,系統依會議時長自動切割成多個投票選項。支援 - – ~ 作為分隔符。
在 confirm_slots 直接打 7/8-7/9 或 下週,自動重新查行事曆,不需先打「重新選日期」。
三層搜尋:精確匹配 → 忽略大小寫 → 部分匹配。多個別名對應同一 email 時會自動去重,不會誤判為撞名。
在任何狀態下輸入觸發關鍵字(如「安排會議」),會清除當前 session 並重新開始。
發投票 DM 後,投票者回覆會自動轉到正確的 session,即使對話 ID 不同。
每小時掃描一次,投票截止時間到了會自動通知發起人,並附上當前投票結果。
| 項目 | 規則 |
|---|---|
| 上班時間 | 09:00–18:00 |
| 午休排除 | 12:00–13:00 不排會 |
| 週末 | 自動排除 |
| tentative 事件 | 視為忙碌 |
| 會議室 | 陽光植物、透明大盒子、透明小盒子、角落生物 |
| 行事曆建立 | 透過 Writer Service(HMAC-SHA256 簽章)+ Outlook 邀請 |
| 投票上限 | 2~5 個時段 |
| 投票截止掃描 | 每小時(cron) |
| 與會者上限 | 50 人(Writer Service 限制) |
| 允許的 email 網域 | tsubi.world、h-and.world、goteamstate.org |
idle
→ asking_form
→ querying_calendar
→ confirm_slots (2+ picks)
→ confirm_vote_picks
→ voting_in_progress
→ organizer_confirming
→ asking_meeting_room*
→ asking_materials
→ confirm_event
→ create_event
* 實體會議才有
idle
→ asking_form
→ querying_calendar
→ confirm_slots (1 pick)
→ asking_meeting_room*
→ asking_materials
→ confirm_event
→ create_event
* 實體會議才有