using System.IO; using System.Text.Json; namespace WindowsGotify.Services; public sealed class StateService { private sealed class StateData { public long LastMessageId { get; set; } } private readonly Logger _logger; private readonly string _statePath; private StateData _state = new(); public StateService(Logger logger) { _logger = logger; var dir = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "WindowsGotify"); Directory.CreateDirectory(dir); _statePath = Path.Combine(dir, "state.json"); } public async Task LoadAsync() { if (!File.Exists(_statePath)) return; try { await using var stream = File.OpenRead(_statePath); _state = await JsonSerializer.DeserializeAsync(stream) ?? new StateData(); } catch (Exception ex) { _logger.Error("State load failed.", ex); } } public long LastMessageId => _state.LastMessageId; public async Task SetLastMessageIdAsync(long id) { if (id <= _state.LastMessageId) return; _state.LastMessageId = id; await SaveAsync(); } private async Task SaveAsync() { await using var stream = File.Create(_statePath); await JsonSerializer.SerializeAsync(stream, _state, new JsonSerializerOptions { WriteIndented = true }); } }