Files

204 lines
15 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media;
using System.Windows.Threading;
using AxCopilot.SDK;
using AxCopilot.Services;
using AxCopilot.Views;
namespace AxCopilot.Handlers;
public class HelpHandler : IActionHandler
{
private record HelpEntry(string Category, string Command, string Title, string Description, string Example, string Symbol, string ColorHex);
private readonly SettingsService? _settings;
private static readonly HelpEntry[] _baseEntries = new HelpEntry[47]
{
new HelpEntry("검색", "", "앱 · 파일 · 북마크 퍼지 검색", "앱 이름, 파일명, 한국어 초성, Chrome·Edge 북마크를 통합 검색", "chrome / 보고서 / ㅅㄷ (설정) / 북마크 제목", "\ue721", "#0078D4"),
new HelpEntry("계산", "=", "계산기", "수식 계산 · 단위 변환 · 실시간 환율", "= sqrt(144) / = 100 USD to KRW / = 15km to miles", "\ue8ef", "#4B5EFC"),
new HelpEntry("검색", "?", "웹 검색 (10개 엔진)", "?n 네이버 · ?g 구글 · ?y 유튜브 · ?gh 깃허브 · ?d DuckDuckGo · ?w 위키피디아 · ?nw 나무위키 · ?nm 네이버지도 · ?ni 네이버이미지 · ?gi 구글이미지", "? 오늘 날씨 / ?n 뉴스 / ?g python / ?nw 검색어 / ?y 음악 / ?gh axios", "\ue774", "#006EAF"),
new HelpEntry("클립보드", "#", "클립보드 히스토리", "복사 이력 검색 & 재사용 · Shift+↑↓로 여러 항목 병합", "# / # 회의록 / (Shift+↑↓ 선택 후 Shift+Enter 병합)", "\ue81c", "#B7791F"),
new HelpEntry("클립보드", "$", "클립보드 텍스트 변환 (12종)", "현재 클립보드 내용을 즉시 변환", "$json / $b64e / $upper / $url / $md5 / $trim", "\ue77f", "#8764B8"),
new HelpEntry("텍스트", ";", "텍스트 스니펫", "저장된 템플릿 불러오기 · 변수 치환 지원", ";addr / ;sig / ;greet", "\ue70b", "#0F6CBD"),
new HelpEntry("단축키", "@", "URL 단축키", "저장해둔 URL을 키워드로 바로 열기", "@gh / @notion / @jira", "\ue774", "#0078D4"),
new HelpEntry("단축키", "cd", "폴더 단축키", "저장해둔 폴더를 키워드로 바로 열기", "cd dl / cd work / cd desktop", "\ue8b7", "#107C10"),
new HelpEntry("단축키", ">", "터미널 명령 실행", "PowerShell 명령을 AX Commander에서 직접 실행", "> git status / > ipconfig / > cls", "\ue756", "#323130"),
new HelpEntry("창관리", "~", "워크스페이스 저장·복원", "현재 창 배치를 스냅샷으로 저장하고 언제든 복원", "~save 업무 / ~restore 업무 / ~list", "\ue8a1", "#C50F1F"),
new HelpEntry("창관리", "snap", "창 분할 레이아웃", "창을 화면의 특정 영역에 즉시 스냅", "snap left / snap right / snap tl / snap full", "\ue8a0", "#B45309"),
new HelpEntry("창관리", "cap", "스크린샷 캡처 (예약어 변경 가능)", "영역 선택 · 활성 창 · 스크롤 · 전체 화면. Shift+Enter로 지연 캡처(3/5/10초 타이머). 결과는 클립보드에 복사. 글로벌 단축키(PrintScreen 등)로 바로 캡처 가능. 설정 → 캡처 탭에서 예약어·단축키·스크롤 속도 변경", "cap region / cap window / cap scroll / cap screen / Shift+Enter → 지연 캡처", "\ue722", "#BE185D"),
new HelpEntry("시스템", "/", "시스템 명령", "잠금·절전·재시작·종료·타이머·알람", "/lock / /sleep / /shutdown / /timer 5m / /alarm 14:30", "\ue7e8", "#4A4A4A"),
new HelpEntry("시스템", "info · *", "시스템 정보", "IP · 배터리 · 볼륨 · 가동시간 · CPU · 디스크. `*` 입력으로도 동일하게 사용 가능", "info / info ip / info battery / * / * ip", "\ue7f4", "#5B4E7E"),
new HelpEntry("알림", "", "잠금 해제 사용시간 알림", "PC 잠금 해제 시 오늘 누적 사용 시간과 격려 문구·명언 팝업 표시. 설정 → 알림 탭에서 활성화", "설정 → 알림 탭: 활성화 토글 / 표시 위치(4방향) / 표시 간격(30분~4시간) / 자동 닫힘(5초~3분)", "\uea8f", "#EA8F00"),
new HelpEntry("시스템", "kill", "프로세스 종료", "프로세스 이름으로 검색 후 강제 종료", "kill chrome / kill node / kill teams", "\uea39", "#CC2222"),
new HelpEntry("시스템", "media", "미디어 제어", "재생·일시정지·이전·다음·볼륨 조절", "media play / media next / media vol+ / media mute", "\ue768", "#1A6B3C"),
new HelpEntry("개발", "json", "JSON 포맷 · 검증", "클립보드의 JSON을 정렬·압축·유효성 검사", "json → format / minify / validate", "\ue930", "#D97706"),
new HelpEntry("개발", "encode", "인코딩 · 해싱", "Base64 · URL · HTML · UTF-8 · MD5 · SHA256", "encode base64 / encode url / encode sha256", "\ue8cb", "#6366F1"),
new HelpEntry("개발", "color", "색상 변환", "HEX ↔ RGB ↔ HSL ↔ HSV 변환 및 색상명 지원", "color #FF5733 / color 255,87,51 / color red", "\ue771", "#EC4899"),
new HelpEntry("개발", "port", "포트 · 프로세스 조회", "포트 번호로 점유 프로세스 확인", "port 3000 / port 8080 / port 443", "\ue968", "#006699"),
new HelpEntry("개발", "env", "환경변수 조회", "시스템 환경변수 검색 및 클립보드 복사", "env / env PATH / env JAVA", "\ue8d7", "#0D9488"),
new HelpEntry("앱", "emoji", "이모지 피커", "300개+ 이모지 검색 · Enter로 클립보드 복사", "emoji / emoji 하트 / emoji wave / emoji 불꽃", "\ue76e", "#F59E0B"),
new HelpEntry("앱", "recent", "최근 파일", "Windows 최근 파일 목록 검색 & 바로 열기", "recent / recent 보고서 / recent xlsx", "\ue81c", "#059669"),
new HelpEntry("앱", "note", "빠른 메모", "간단한 메모를 저장하고 불러오기", "note 내일 회의 10시 / note", "\ue70b", "#7C3AED"),
new HelpEntry("앱", "uninstall", "앱 제거", "설치된 앱 검색 후 제거", "uninstall / uninstall kakao / uninstall zoom", "\ue74d", "#DC2626"),
new HelpEntry("유틸", "pick", "스포이드 색상 추출", "화면 아무 곳을 클릭하여 HEX 색상 코드 추출 · 돋보기로 실시간 미리보기 · 결과 반투명 창 5초 표시", "pick → 스포이드 모드 진입 → 클릭으로 색상 추출", "\ue771", "#EC4899"),
new HelpEntry("유틸", "date", "날짜 계산 · D-day · 타임스탬프", "날짜 가감(+30d), D-day 계산, Unix ↔ 날짜 변환, 요일·ISO 주차 조회", "date / date +30d / date 2026-12-25 / date 1711584000 / date unix", "\ue787", "#0EA5E9"),
new HelpEntry("시스템", "svc", "서비스 관리", "Windows 서비스 검색·시작·중지·재시작 + AX 클립보드 서비스 강제 재시작", "svc / svc spooler / svc restart clipboard", "\ue912", "#6366F1"),
new HelpEntry("유틸", "pipe", "클립보드 파이프라인", "변환을 > 로 체이닝: 대문자→공백제거→Base64 등 19종 필터 한 번에 적용", "pipe upper > trim > b64e / pipe sort > unique > number", "\ue8c8", "#8B5CF6"),
new HelpEntry("유틸", "journal", "업무 일지 자동 생성", "오늘 사용한 앱·명령어·활성 시간을 마크다운 요약으로 자동 생성. 스탠드업/일일 보고에 바로 사용", "journal / journal 2026-03-25", "\ue70b", "#0EA5E9"),
new HelpEntry("유틸", "routine", "루틴 자동화", "등록된 루틴(앱·폴더·URL 조합)을 한 번에 순서대로 실행. 출근/퇴근/회의 전 세팅", "routine / routine morning / routine endofday", "\ue82f", "#F59E0B"),
new HelpEntry("유틸", "batch", "텍스트 일괄 처리", "클립보드 각 줄에 동시 적용: 접두사·접미사·줄번호·정렬·중복제거·따옴표·치환·CSV 변환", "batch number / batch prefix >> / batch sort / batch replace A B", "\ue8c6", "#10B981"),
new HelpEntry("유틸", "diff", "텍스트/파일 비교", "클립보드 최근 2개 텍스트 또는 파일 2개를 줄 단위 비교. 추가·삭제·동일 줄 하이라이트", "diff / diff C:\\a.txt C:\\b.txt", "\ue89a", "#EF4444"),
new HelpEntry("유틸", "win", "윈도우 포커스 스위처", "열린 창을 타이틀·프로세스명으로 검색하여 Alt+Tab 없이 즉시 전환", "win / win chrome / win 보고서", "\ue8a7", "#6366F1"),
new HelpEntry("시스템", "^", "Windows 실행 명령", "Win+R 실행 창과 동일하게 명령어 실행. notepad, calc, cmd, control, mstsc 등 모든 Windows 실행 명령 지원", "^ notepad / ^ cmd / ^ calc / ^ control / ^ mspaint", "\ue7c4", "#E08850"),
new HelpEntry("유틸", "stats", "텍스트 통계 분석", "클립보드 텍스트 글자·단어·줄 수, 키워드 빈도, 읽기 시간 추정", "stats / stats 키워드 (클립보드 텍스트 분석)", "\ue8d2", "#6366F1"),
new HelpEntry("유틸", "fav", "즐겨찾기 (파일·폴더)", "자주 쓰는 경로를 등록하고 빠르게 열기", "fav / fav add 보고서 C:\\work\\report.xlsx / fav del 보고서", "\ue728", "#F59E0B"),
new HelpEntry("유틸", "rename", "파일 일괄 이름변경", "폴더 내 파일을 패턴·변수로 일괄 이름변경. {n}순번 {date}날짜 {orig}원본명", "rename C:\\work\\*.xlsx 보고서_{n}", "\ue8ac", "#8B5CF6"),
new HelpEntry("유틸", "monitor", "시스템 리소스 모니터", "CPU·메모리·디스크·프로세스 실시간 현황 조회", "monitor / monitor cpu / monitor mem / monitor disk", "\ue7f4", "#10B981"),
new HelpEntry("유틸", "scaffold", "프로젝트 스캐폴딩", "내장/사용자 템플릿으로 프로젝트 폴더 구조 일괄 생성", "scaffold / scaffold webapi / scaffold C:\\new-project webapi", "\ue8f1", "#0EA5E9"),
new HelpEntry("키보드", "Alt+Space", "AX Commander 열기 / 닫기", "어디서든 AX Commander를 토글", "설정 → 핫키에서 변경 가능", "\ue946", "#6B7280"),
new HelpEntry("키보드", "Enter", "실행", "선택된 항목 실행", "", "\ue946", "#6B7280"),
new HelpEntry("키보드", "Shift+Enter", "Large Type / 병합 실행 / 지연 캡처", "텍스트를 전체화면으로 표시 · 클립보드 항목 병합 · 캡처 모드에서는 지연 캡처(3초/5초/10초) 타이머 선택", "(#모드) Shift+↑↓ 선택 후 Shift+Enter 병합 / (cap모드) Shift+Enter → 타이머 선택", "\ue946", "#6B7280"),
new HelpEntry("키보드", "Tab", "자동완성", "선택 항목으로 입력 자동완성", "", "\ue946", "#6B7280"),
new HelpEntry("키보드", "→ (커서 끝)", "파일 액션 메뉴", "앱·파일 선택 후 → 키: 경로복사 · 탐색기 · 관리자 · 터미널", "", "\ue946", "#6B7280"),
new HelpEntry("키보드", "Ctrl+,", "설정 열기", "AX Copilot 설정 창", "", "\ue946", "#6B7280")
};
public string? Prefix => "help";
public PluginMetadata Metadata => new PluginMetadata("Help", "AX Commander 사용 설명서", "1.0", "AX");
public HelpHandler(SettingsService? settings = null)
{
_settings = settings;
}
private HelpEntry[] GetEntries()
{
string text = _settings?.Settings.ScreenCapture.Prefix ?? "cap";
if (string.IsNullOrWhiteSpace(text))
{
text = "cap";
}
string command = _settings?.Settings.Hotkey ?? "Alt+Space";
HelpEntry[] array = (HelpEntry[])_baseEntries.Clone();
for (int i = 0; i < array.Length; i++)
{
if (array[i].Title == "스크린샷 캡처 (예약어 변경 가능)")
{
array[i] = array[i]with
{
Command = text,
Example = $"{text} screen / {text} window / {text} region / {text} scroll / (설정 → 캡처 탭)"
};
}
if (array[i].Title == "AX Commander 열기 / 닫기")
{
array[i] = array[i]with
{
Command = command,
Example = "설정 → 핫키에서 변경 가능"
};
}
}
return array;
}
public Task<IEnumerable<LauncherItem>> GetItemsAsync(string query, CancellationToken ct)
{
string q = query.Trim();
HelpEntry[] entries = GetEntries();
if (string.IsNullOrEmpty(q))
{
int value = entries.Count((HelpEntry e) => e.Category != "키보드");
int value2 = entries.Count((HelpEntry e) => e.Category == "키보드");
return Task.FromResult((IEnumerable<LauncherItem>)new _003C_003Ez__ReadOnlySingleElementList<LauncherItem>(new LauncherItem("AX Commander — 전체 기능 목록 보기", $"총 {value}개 명령어 · {value2}개 단축키 · Enter → 기능 설명 창 열기", null, "__HELP_OVERVIEW__", null, "\ue946")));
}
IEnumerable<HelpEntry> source = entries.Where((HelpEntry e) => e.Category.Contains(q, StringComparison.OrdinalIgnoreCase) || e.Command.Contains(q, StringComparison.OrdinalIgnoreCase) || e.Title.Contains(q, StringComparison.OrdinalIgnoreCase) || e.Description.Contains(q, StringComparison.OrdinalIgnoreCase));
List<LauncherItem> list = source.Select((HelpEntry e) => new LauncherItem(FormatTitle(e), FormatSubtitle(e), null, e.Example, null, e.Symbol)).ToList();
if (list.Count == 0)
{
list.Add(new LauncherItem("'" + q + "'에 해당하는 명령어가 없습니다", "help만 입력하면 전체 기능 창을 열 수 있어요", null, null, null, "\ue946"));
}
return Task.FromResult((IEnumerable<LauncherItem>)list);
}
public Task ExecuteAsync(LauncherItem item, CancellationToken ct)
{
object data = item.Data;
string s = data as string;
if (s == null)
{
return Task.CompletedTask;
}
if (s == "__HELP_OVERVIEW__")
{
((DispatcherObject)Application.Current).Dispatcher.Invoke((Action)delegate
{
HelpEntry[] entries = GetEntries();
IEnumerable<HelpItemModel> items = entries.Select((HelpEntry e) => new HelpItemModel
{
Category = e.Category,
Command = (string.IsNullOrEmpty(e.Command) ? "(퍼지 검색)" : e.Command),
Title = e.Title,
Description = e.Description,
Example = e.Example,
Symbol = e.Symbol,
ColorBrush = ParseColor(e.ColorHex)
});
string globalHotkey = _settings?.Settings.Hotkey ?? "Alt+Space";
new HelpDetailWindow(items, entries.Count((HelpEntry e) => e.Category != "키보드"), globalHotkey).Show();
});
return Task.CompletedTask;
}
if (!string.IsNullOrWhiteSpace(s))
{
try
{
((DispatcherObject)Application.Current).Dispatcher.Invoke((Action)delegate
{
Clipboard.SetText(s);
});
}
catch
{
}
}
return Task.CompletedTask;
}
private static SolidColorBrush ParseColor(string hex)
{
try
{
Color color = (Color)ColorConverter.ConvertFromString(hex);
return new SolidColorBrush(color);
}
catch
{
return new SolidColorBrush(Colors.Gray);
}
}
private static string FormatTitle(HelpEntry e)
{
string text = (string.IsNullOrEmpty(e.Command) ? ("[" + e.Category + "]") : ("[" + e.Category + "] " + e.Command));
return text + " — " + e.Title;
}
private static string FormatSubtitle(HelpEntry e)
{
List<string> list = new List<string> { e.Description };
if (!string.IsNullOrEmpty(e.Example))
{
list.Add("예) " + e.Example);
}
return string.Join(" · ", list);
}
}