using System; using JXHelper.Config; using JXHelper.Platform; namespace JXHelper.Core; /// /// Đại diện cho một phiên điều khiển tab game độc lập (INV-FSM-SINGLE-OWNER). /// Mỗi tab game có một BotBrain, BotConfig và trạng thái riêng biệt. /// public class BotSession { public GameWindowInfo WindowInfo { get; set; } public BotConfig Config { get; set; } public BotBrain Brain { get; } public bool IsChecked { get; set; } = true; public string StatusText { get; set; } = "Đang chờ"; public TimeSpan RemainingTime { get; set; } = TimeSpan.Zero; public bool IsRunning => Brain.CurrentState != BotState.Idle; public string CharacterName => !string.IsNullOrEmpty(Config.CharacterName) ? Config.CharacterName : WindowInfo.CharacterName; public event Action? OnStateUpdated; public event Action? OnLogReceived; public BotSession(GameWindowInfo windowInfo, BotConfig config) { WindowInfo = windowInfo; Config = config; Brain = new BotBrain(); Brain.OnStateChanged += state => { StatusText = state switch { BotState.Idle => "Dừng", BotState.Running => "Luyện công", BotState.ReturningToTown => "Về thành", BotState.WaitingMapLoad => "Nạp map", BotState.OpeningBag => "Mở rương", BotState.ClickingRepairItem => "Sửa đồ", BotState.ClosingBag => "Đóng rương", BotState.FinishedCycle => "Xong chu kỳ", BotState.Paused => "Tạm dừng", BotState.Error => "Lỗi", _ => state.ToString() }; OnStateUpdated?.Invoke(this); }; Brain.OnCountdownTick += remaining => { RemainingTime = remaining; OnStateUpdated?.Invoke(this); }; Brain.OnLog += msg => { OnLogReceived?.Invoke(this, msg); }; } public void Start() { WindowManager.RestoreIfMinimized(WindowInfo.Handle); Brain.Start(WindowInfo.Handle, Config); } public void Stop() { Brain.Stop(); StatusText = "Dừng"; RemainingTime = TimeSpan.Zero; OnStateUpdated?.Invoke(this); } }