using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Threading; using AxCopilot.Models; using AxCopilot.SDK; using AxCopilot.Services; namespace AxCopilot.Handlers; public class JournalHandler : IActionHandler { public string? Prefix => "journal"; public PluginMetadata Metadata => new PluginMetadata("Journal", "업무 일지 자동 생성 — journal", "1.0", "AX"); public Task> GetItemsAsync(string query, CancellationToken ct) { string text = query.Trim(); DateTime targetDate; if (string.IsNullOrWhiteSpace(text)) { targetDate = DateTime.Today; } else { if (!DateTime.TryParse(text, out var result)) { return Task.FromResult((IEnumerable)new _003C_003Ez__ReadOnlySingleElementList(new LauncherItem("날짜 형식 오류", "예: journal 2026-03-25 또는 journal (오늘)", null, null, null, "\ue7ba"))); } targetDate = result.Date; } int days = (DateTime.Today - targetDate).Days; List stats = UsageStatisticsService.GetStats(Math.Max(days + 1, 1)); DailyUsageStats dailyUsageStats = stats.FirstOrDefault((DailyUsageStats s) => s.Date == targetDate.ToString("yyyy-MM-dd")); List list = new List(); if (dailyUsageStats == null) { list.Add(new LauncherItem($"{targetDate:yyyy-MM-dd} — 기록 없음", "해당 날짜의 사용 기록이 없습니다", null, null, null, "\ue946")); return Task.FromResult((IEnumerable)list); } double value = (double)dailyUsageStats.ActiveSeconds / 3600.0; StringBuilder stringBuilder = new StringBuilder(); StringBuilder stringBuilder2 = stringBuilder; StringBuilder stringBuilder3 = stringBuilder2; StringBuilder.AppendInterpolatedStringHandler handler = new StringBuilder.AppendInterpolatedStringHandler(14, 2, stringBuilder2); handler.AppendLiteral("## 업무 일지 — "); handler.AppendFormatted(targetDate, "yyyy-MM-dd"); handler.AppendLiteral(" ("); handler.AppendFormatted(targetDate, "dddd"); handler.AppendLiteral(")"); stringBuilder3.AppendLine(ref handler); stringBuilder.AppendLine(); stringBuilder2 = stringBuilder; StringBuilder stringBuilder4 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(18, 1, stringBuilder2); handler.AppendLiteral("- **PC 활성 시간**: "); handler.AppendFormatted(value, "F1"); handler.AppendLiteral("시간"); stringBuilder4.AppendLine(ref handler); stringBuilder2 = stringBuilder; StringBuilder stringBuilder5 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(14, 1, stringBuilder2); handler.AppendLiteral("- **런처 호출**: "); handler.AppendFormatted(dailyUsageStats.LauncherOpens); handler.AppendLiteral("회"); stringBuilder5.AppendLine(ref handler); if (dailyUsageStats.CommandUsage.Count > 0) { stringBuilder.AppendLine(); stringBuilder.AppendLine("### 사용한 명령어"); foreach (KeyValuePair item in dailyUsageStats.CommandUsage.OrderByDescending, int>((KeyValuePair x) => x.Value).Take(10)) { stringBuilder2 = stringBuilder; StringBuilder stringBuilder6 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(8, 2, stringBuilder2); handler.AppendLiteral("- `"); handler.AppendFormatted(item.Key); handler.AppendLiteral("` — "); handler.AppendFormatted(item.Value); handler.AppendLiteral("회"); stringBuilder6.AppendLine(ref handler); } } stringBuilder.AppendLine(); stringBuilder.AppendLine("---"); stringBuilder2 = stringBuilder; StringBuilder stringBuilder7 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(21, 1, stringBuilder2); handler.AppendLiteral("*AX Copilot 자동 생성 · "); handler.AppendFormatted(DateTime.Now, "HH:mm"); handler.AppendLiteral("*"); stringBuilder7.AppendLine(ref handler); string data = stringBuilder.ToString(); IEnumerable values = from x in dailyUsageStats.CommandUsage.OrderByDescending, int>((KeyValuePair x) => x.Value).Take(3) select x.Key; string value2 = ((dailyUsageStats.CommandUsage.Count > 0) ? ("주요 명령: " + string.Join(", ", values)) : "명령어 사용 기록 없음"); list.Add(new LauncherItem($"{targetDate:yyyy-MM-dd} 업무 일지 — 클립보드로 복사", $"활성 {value:F1}h · 런처 {dailyUsageStats.LauncherOpens}회 · {value2}", null, data, null, "\ue70b")); list.Add(new LauncherItem($"PC 활성 시간: {value:F1}시간", "잠금 해제 시간 기준 누적", null, $"PC 활성 시간: {value:F1}시간", null, "\ue823")); list.Add(new LauncherItem($"런처 호출: {dailyUsageStats.LauncherOpens}회", "Alt+Space 또는 트레이 클릭", null, $"런처 호출: {dailyUsageStats.LauncherOpens}회", null, "\ue721")); if (dailyUsageStats.CommandUsage.Count > 0) { foreach (KeyValuePair item2 in dailyUsageStats.CommandUsage.OrderByDescending, int>((KeyValuePair x) => x.Value).Take(5)) { list.Add(new LauncherItem($"{item2.Key} — {item2.Value}회", "Enter로 복사", null, $"{item2.Key}: {item2.Value}회", null, "\ue756")); } } return Task.FromResult((IEnumerable)list); } public Task ExecuteAsync(LauncherItem item, CancellationToken ct) { object data = item.Data; string text = data as string; if (text != null && !string.IsNullOrWhiteSpace(text)) { try { Application current = Application.Current; if (current != null) { ((DispatcherObject)current).Dispatcher.Invoke((Action)delegate { Clipboard.SetText(text); }); } } catch { } NotificationService.Notify("업무 일지", "클립보드에 복사되었습니다"); } return Task.CompletedTask; } }