namespace OcrDaemon; using System.Text.Json; using System.Text.Json.Serialization; using Tesseract; static class Daemon { private static readonly JsonSerializerOptions JsonOptions = new() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, }; public static int Run() { ScreenCapture.InitDpiAwareness(); // Pre-create the Tesseract OCR engine (reused across all requests) var tessdataPath = Path.Combine(AppContext.BaseDirectory, "tessdata"); var tessLang = File.Exists(Path.Combine(tessdataPath, "poe2.traineddata")) ? "poe2" : "eng"; TesseractEngine tessEngine; try { tessEngine = new TesseractEngine(tessdataPath, tessLang, EngineMode.LstmOnly); tessEngine.DefaultPageSegMode = PageSegMode.SingleBlock; tessEngine.SetVariable("preserve_interword_spaces", "1"); Console.Error.WriteLine($"Tesseract engine loaded with language: {tessLang}"); } catch (Exception ex) { WriteResponse(new ErrorResponse($"Failed to create Tesseract engine: {ex.Message}. Ensure tessdata/eng.traineddata exists.")); return 1; } // Signal ready WriteResponse(new ReadyResponse()); var ocrHandler = new OcrHandler(tessEngine); var gridHandler = new GridHandler(); var detectGridHandler = new DetectGridHandler(); // Main loop: read one JSON line, handle, write one JSON line string? line; while ((line = Console.In.ReadLine()) != null) { line = line.Trim(); if (line.Length == 0) continue; try { var request = JsonSerializer.Deserialize(line, JsonOptions); if (request == null) { WriteResponse(new ErrorResponse("Failed to parse request")); continue; } object response = request.Cmd?.ToLowerInvariant() switch { "ocr" => ocrHandler.HandleOcr(request), "screenshot" => ocrHandler.HandleScreenshot(request), "capture" => ocrHandler.HandleCapture(request), "snapshot" => ocrHandler.HandleSnapshot(request), "diff-ocr" => ocrHandler.HandleDiffOcr(request), "grid" => gridHandler.HandleGrid(request), "detect-grid" => detectGridHandler.HandleDetectGrid(request), _ => new ErrorResponse($"Unknown command: {request.Cmd}"), }; WriteResponse(response); } catch (Exception ex) { WriteResponse(new ErrorResponse(ex.Message)); } } return 0; } private static void WriteResponse(object response) { var json = JsonSerializer.Serialize(response, JsonOptions); Console.Out.WriteLine(json); Console.Out.Flush(); } }