140 lines
5.9 KiB
C#
140 lines
5.9 KiB
C#
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<IEnumerable<LauncherItem>> 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<LauncherItem>)new _003C_003Ez__ReadOnlySingleElementList<LauncherItem>(new LauncherItem("날짜 형식 오류", "예: journal 2026-03-25 또는 journal (오늘)", null, null, null, "\ue7ba")));
|
|
}
|
|
targetDate = result.Date;
|
|
}
|
|
int days = (DateTime.Today - targetDate).Days;
|
|
List<DailyUsageStats> stats = UsageStatisticsService.GetStats(Math.Max(days + 1, 1));
|
|
DailyUsageStats dailyUsageStats = stats.FirstOrDefault((DailyUsageStats s) => s.Date == targetDate.ToString("yyyy-MM-dd"));
|
|
List<LauncherItem> list = new List<LauncherItem>();
|
|
if (dailyUsageStats == null)
|
|
{
|
|
list.Add(new LauncherItem($"{targetDate:yyyy-MM-dd} — 기록 없음", "해당 날짜의 사용 기록이 없습니다", null, null, null, "\ue946"));
|
|
return Task.FromResult((IEnumerable<LauncherItem>)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<string, int> item in dailyUsageStats.CommandUsage.OrderByDescending<KeyValuePair<string, int>, int>((KeyValuePair<string, int> 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<string> values = from x in dailyUsageStats.CommandUsage.OrderByDescending<KeyValuePair<string, int>, int>((KeyValuePair<string, int> 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<string, int> item2 in dailyUsageStats.CommandUsage.OrderByDescending<KeyValuePair<string, int>, int>((KeyValuePair<string, int> 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<LauncherItem>)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;
|
|
}
|
|
}
|