using System; using LavishScriptAPI; using LavishVMAPI; using Microsoft.Extensions.Logging; using MRBot.Api; using MRBot.IsxEq2; namespace MRBot.UI; internal class MainWindow : IWindow { private const string BotControllerScript = "mr/bot/bot.iss"; private const string BotControllerObject = "MRBotController"; private readonly BotApi _botApi; private readonly ILogger _logger; private bool UiAttached { get { var command = $"${{{BotControllerObject}.UIAttached}}"; var uiAttached = false; return LavishScript.DataParse(command, ref uiAttached) && uiAttached; } } public MainWindow(BotApi botApi, ILogger logger) { _botApi = botApi; _logger = logger; } public string Name => WindowNames.MainWindow; public event EventHandler OnWindowClose; public void Show() { _logger.LogTrace("Showing MainWindow."); LavishScript.ExecuteCommand($"run {BotControllerScript}"); while(!UiAttached) { _logger.LogTrace("Waiting for UI to attach."); Frame.Wait(false); } LavishScript.Events.AttachEventTarget("OnBotToggle", OnBotToggle); LavishScript.Events.AttachEventTarget("OnBotClose", CloseBot); _logger.LogTrace("MainWindow shown and events are attached."); } public void Hide() { _logger.LogTrace("Hiding MainWindow."); LavishScript.Events.DetachEventTarget("OnBotToggle", OnBotToggle); LavishScript.Events.DetachEventTarget("OnBotClose", CloseBot); _logger.LogTrace("MainWindow hidden and events are detached."); } private void CloseBot(object sender, LSEventArgs args) { OnWindowClose?.Invoke(this, args); } private void OnBotToggle(object sender, LSEventArgs args) { _logger.LogInformation("Bot Toggled."); _botApi.FollowPlayer(Extension.Me.Target.Name); } public void Dispose() { LavishScript.Events.DetachEventTarget("OnBotToggle", OnBotToggle); LavishScript.Events.DetachEventTarget("OnBotClose", CloseBot); try { LavishScript.ExecuteCommand($"endscript {BotControllerScript}"); } catch (Exception e) { Console.WriteLine(e); } } }