using AxCopilot.SDK; using AxCopilot.Services; using AxCopilot.Themes; namespace AxCopilot.Handlers; /// /// Phase L3-9: 뽀모도로 타이머 핸들러. "pomo" 프리픽스로 사용합니다. /// /// 사용법: /// pomo → 현재 타이머 상태 표시 /// pomo start → 집중 타이머 시작 (25분) /// pomo break → 휴식 타이머 시작 (5분) /// pomo stop → 타이머 중지 /// pomo reset → 타이머 초기화 /// /// Enter → 해당 명령 실행. /// public class PomoHandler : IActionHandler { public string? Prefix => "pomo"; public PluginMetadata Metadata => new( "Pomodoro", "뽀모도로 타이머 — pomo", "1.0", "AX", "집중/휴식 타이머를 관리합니다."); public Task> GetItemsAsync(string query, CancellationToken ct) { var q = query.Trim().ToLowerInvariant(); var svc = PomodoroService.Instance; var items = new List(); // ─── 명령 분기 ──────────────────────────────────────────────────────── if (q is "start" or "focus") { items.Add(new LauncherItem("집중 타이머 시작", $"{svc.FocusMinutes}분 집중 모드 시작 · Enter로 실행", null, "__START__", Symbol: Symbols.Timer)); return Task.FromResult>(items); } if (q is "break" or "rest") { items.Add(new LauncherItem("휴식 타이머 시작", $"{svc.BreakMinutes}분 휴식 모드 시작 · Enter로 실행", null, "__BREAK__", Symbol: Symbols.Timer)); return Task.FromResult>(items); } if (q is "stop" or "pause") { items.Add(new LauncherItem("타이머 중지", "현재 타이머를 중지합니다 · Enter로 실행", null, "__STOP__", Symbol: Symbols.MediaPlay)); return Task.FromResult>(items); } if (q == "reset") { items.Add(new LauncherItem("타이머 초기화", "타이머를 처음 상태로 초기화합니다 · Enter로 실행", null, "__RESET__", Symbol: Symbols.Restart)); return Task.FromResult>(items); } // ─── 기본: 현재 상태 + 명령 목록 ───────────────────────────────────── var remaining = svc.Remaining; var timeStr = $"{(int)remaining.TotalMinutes:D2}:{remaining.Seconds:D2}"; var stateStr = svc.Mode switch { PomodoroMode.Focus => svc.IsRunning ? $"집중 중 {timeStr} 남음" : $"집중 일시정지 {timeStr} 남음", PomodoroMode.Break => svc.IsRunning ? $"휴식 중 {timeStr} 남음" : $"휴식 일시정지 {timeStr} 남음", _ => "대기 중", }; // 상태 카드 items.Add(new LauncherItem( "🍅 뽀모도로 타이머", stateStr, null, null, Symbol: Symbols.Timer)); // 빠른 명령들 if (!svc.IsRunning) { items.Add(new LauncherItem("집중 시작", $"{svc.FocusMinutes}분 집중 모드 시작 · Enter로 실행", null, "__START__", Symbol: Symbols.Timer)); } else { items.Add(new LauncherItem("타이머 중지", "현재 타이머를 중지합니다 · Enter로 실행", null, "__STOP__", Symbol: Symbols.MediaPlay)); } if (svc.Mode == PomodoroMode.Focus && svc.IsRunning) { items.Add(new LauncherItem("휴식 시작", $"{svc.BreakMinutes}분 휴식 모드로 전환 · Enter로 실행", null, "__BREAK__", Symbol: Symbols.Timer)); } items.Add(new LauncherItem("타이머 초기화", "타이머를 처음 상태로 초기화합니다 · Enter로 실행", null, "__RESET__", Symbol: Symbols.Restart)); return Task.FromResult>(items); } public Task ExecuteAsync(LauncherItem item, CancellationToken ct) { if (item.Data is not string cmd) return Task.CompletedTask; var svc = PomodoroService.Instance; switch (cmd) { case "__START__": svc.StartFocus(); break; case "__BREAK__": svc.StartBreak(); break; case "__STOP__": svc.Stop(); break; case "__RESET__": svc.Reset(); break; } return Task.CompletedTask; } }