Files
AX-Copilot-Codex/.decompiledproj/AxCopilot/Handlers/DateCalcHandler.cs

123 lines
4.5 KiB
C#

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Threading;
using AxCopilot.SDK;
namespace AxCopilot.Handlers;
public class DateCalcHandler : IActionHandler
{
private static readonly string[] DateFormats = new string[5] { "yyyy-MM-dd", "yyyy/MM/dd", "yyyyMMdd", "MM/dd/yyyy", "dd-MM-yyyy" };
public string? Prefix => "date";
public PluginMetadata Metadata => new PluginMetadata("DateCalc", "날짜 계산 · D-day · 타임스탬프 변환", "1.0", "AX");
public Task<IEnumerable<LauncherItem>> GetItemsAsync(string query, CancellationToken ct)
{
string text = query.Trim();
DateTime now = DateTime.Now;
List<LauncherItem> list = new List<LauncherItem>();
if (string.IsNullOrWhiteSpace(text))
{
string value = now.ToString("dddd", new CultureInfo("ko-KR"));
list.Add(Item($"{now:yyyy-MM-dd} ({value})", $"{now:HH:mm:ss} · {now:yyyy-MM-dd}"));
list.Add(Item($"유닉스 타임스탬프: {new DateTimeOffset(now).ToUnixTimeSeconds()}", "현재 시각의 Unix epoch"));
list.Add(Item($"올해 {now.DayOfYear}일째 / 남은 일: {(new DateTime(now.Year, 12, 31) - now).Days}일", $"ISO 주차: {ISOWeek.GetWeekOfYear(now)}주"));
return Task.FromResult((IEnumerable<LauncherItem>)list);
}
Match match = Regex.Match(text, "^([+-])(\\d+)([dDwWmMyY])$");
if (match.Success)
{
int num = ((match.Groups[1].Value == "+") ? 1 : (-1));
int num2 = int.Parse(match.Groups[2].Value) * num;
string text2 = match.Groups[3].Value.ToLowerInvariant();
if (1 == 0)
{
}
DateTime dateTime = text2 switch
{
"d" => now.AddDays(num2),
"w" => now.AddDays(num2 * 7),
"m" => now.AddMonths(num2),
"y" => now.AddYears(num2),
_ => now,
};
if (1 == 0)
{
}
DateTime value2 = dateTime;
string value3 = value2.ToString("dddd", new CultureInfo("ko-KR"));
int days = (value2.Date - now.Date).Days;
string subtitle = ((days >= 0) ? $"오늘로부터 {days}일 후" : $"오늘로부터 {Math.Abs(days)}일 전");
list.Add(Item($"{value2:yyyy-MM-dd} ({value3})", subtitle));
return Task.FromResult((IEnumerable<LauncherItem>)list);
}
if (Regex.IsMatch(text, "^\\d{10,13}$") && long.TryParse(text, out var result))
{
long seconds = ((result > 9999999999L) ? (result / 1000) : result);
DateTime localDateTime = DateTimeOffset.FromUnixTimeSeconds(seconds).LocalDateTime;
string value4 = localDateTime.ToString("dddd", new CultureInfo("ko-KR"));
list.Add(Item($"{localDateTime:yyyy-MM-dd HH:mm:ss} ({value4})", $"Unix {result} → 로컬 시간"));
return Task.FromResult((IEnumerable<LauncherItem>)list);
}
if (text.Equals("unix", StringComparison.OrdinalIgnoreCase) || text.Equals("to unix", StringComparison.OrdinalIgnoreCase))
{
long value5 = new DateTimeOffset(now).ToUnixTimeSeconds();
list.Add(Item($"{value5}", $"현재 시각 ({now:yyyy-MM-dd HH:mm:ss}) → Unix 타임스탬프"));
return Task.FromResult((IEnumerable<LauncherItem>)list);
}
if (DateTime.TryParseExact(text, DateFormats, CultureInfo.InvariantCulture, DateTimeStyles.None, out var result2))
{
string value6 = result2.ToString("dddd", new CultureInfo("ko-KR"));
int days2 = (result2.Date - now.Date).Days;
if (1 == 0)
{
}
string text3 = ((days2 > 0) ? $"D-{days2} (앞으로 {days2}일)" : ((days2 != 0) ? $"D+{Math.Abs(days2)} ({Math.Abs(days2)}일 지남)" : "오늘"));
if (1 == 0)
{
}
string subtitle2 = text3;
list.Add(Item($"{result2:yyyy-MM-dd} ({value6})", subtitle2));
return Task.FromResult((IEnumerable<LauncherItem>)list);
}
list.Add(new LauncherItem("날짜 형식을 인식할 수 없습니다", "예: +30d, -100d, 2026-12-25, 1711584000, unix", null, null, null, "\ue7ba"));
return Task.FromResult((IEnumerable<LauncherItem>)list);
}
private static LauncherItem Item(string title, string subtitle)
{
return new LauncherItem(title, subtitle + " · Enter로 복사", null, title, null, "\ue823");
}
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
{
}
}
return Task.CompletedTask;
}
}