diff --git a/MosswartMassacre/MosswartMassacre.csproj b/MosswartMassacre/MosswartMassacre.csproj index 33a1c87..ac9acd5 100644 --- a/MosswartMassacre/MosswartMassacre.csproj +++ b/MosswartMassacre/MosswartMassacre.csproj @@ -92,7 +92,6 @@ Resources.resx - diff --git a/MosswartMassacre/PluginCore.cs b/MosswartMassacre/PluginCore.cs index b12285f..95e1858 100644 --- a/MosswartMassacre/PluginCore.cs +++ b/MosswartMassacre/PluginCore.cs @@ -25,7 +25,6 @@ namespace MosswartMassacre public static bool HttpServerEnabled { get; set; } = false; public static string CharTag { get; set; } = ""; public static bool TelemetryEnabled { get; set; } = false; - public bool WebSocketEnabled { get; set; } = false; private static Queue rareMessageQueue = new Queue(); private static DateTime _lastSent = DateTime.MinValue; private static readonly Queue _chatQueue = new Queue(); @@ -40,7 +39,6 @@ namespace MosswartMassacre // Subscribe to chat message event CoreManager.Current.ChatBoxMessage += new EventHandler(OnChatText); - CoreManager.Current.ChatBoxMessage += new EventHandler(AllChatText); CoreManager.Current.CommandLineText += OnChatCommand; CoreManager.Current.CharacterFilter.LoginComplete += CharacterFilter_LoginComplete; @@ -56,8 +54,6 @@ namespace MosswartMassacre ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12; //Enable vTank interface vTank.Enable(); - //lyssna på commands - WebSocket.OnServerCommand += HandleServerCommand; } catch (Exception ex) { @@ -77,7 +73,6 @@ namespace MosswartMassacre // Unsubscribe from chat message event CoreManager.Current.ChatBoxMessage -= new EventHandler(OnChatText); CoreManager.Current.CommandLineText -= OnChatCommand; - CoreManager.Current.ChatBoxMessage -= new EventHandler(AllChatText); // Stop and dispose of the timer if (updateTimer != null) @@ -91,9 +86,6 @@ namespace MosswartMassacre MainView.ViewDestroy(); //Disable vtank interface vTank.Disable(); - // sluta lyssna på commands - WebSocket.OnServerCommand -= HandleServerCommand; - WebSocket.Stop(); MyHost = null; } @@ -110,7 +102,6 @@ namespace MosswartMassacre // Apply the values RareMetaEnabled = PluginSettings.Instance.RareMetaEnabled; - WebSocketEnabled = PluginSettings.Instance.WebSocketEnabled; RemoteCommandsEnabled = PluginSettings.Instance.RemoteCommandsEnabled; HttpServerEnabled = PluginSettings.Instance.HttpServerEnabled; TelemetryEnabled = PluginSettings.Instance.TelemetryEnabled; @@ -118,47 +109,11 @@ namespace MosswartMassacre MainView.SetRareMetaToggleState(RareMetaEnabled); if (TelemetryEnabled) Telemetry.Start(); - if (WebSocketEnabled) - WebSocket.Start(); + } - private static string NormalizeChatLine(string raw) - { - if (string.IsNullOrEmpty(raw)) - return raw; - // 1) Remove all <…> tags - var noTags = Regex.Replace(raw, "<[^>]+>", ""); - - // 2) Trim trailing newline or carriage-return - var trimmed = noTags.TrimEnd('\r', '\n'); - - // 3) Collapse multiple spaces into one - var collapsed = Regex.Replace(trimmed, @"[ ]{2,}", " "); - - return collapsed; - } - private void AllChatText(object sender, ChatTextInterceptEventArgs e) - { - try - { - - var cleaned = NormalizeChatLine(e.Text); - - _ = WebSocket.SendChatTextAsync(e.Color, cleaned); - } - catch (Exception ex) - { - PluginCore.WriteToChat("Error sending chat over WS: " + ex.Message); - } - } - private void HandleServerCommand(CommandEnvelope env) - { - // Skicka commands - DispatchChatToBoxWithPluginIntercept(env.Command); - CoreManager.Current.Actions.InvokeChatParser($"/a Executed '{env.Command}' from Mosswart Overlord"); - } private void OnChatText(object sender, ChatTextInterceptEventArgs e) { try @@ -452,39 +407,11 @@ namespace MosswartMassacre WriteToChat("Usage: /mm telemetry "); } break; - case "ws": - if (args.Length > 1) - { - if (args[1].Equals("enable", StringComparison.OrdinalIgnoreCase)) - { - WebSocketEnabled = true; - WebSocket.Start(); - PluginSettings.Instance.WebSocketEnabled = true; - WriteToChat("WS streaming ENABLED."); - } - else if (args[1].Equals("disable", StringComparison.OrdinalIgnoreCase)) - { - WebSocketEnabled = false; - WebSocket.Stop(); - PluginSettings.Instance.WebSocketEnabled = false; - WriteToChat("WS streaming DISABLED."); - } - else - { - WriteToChat("Usage: /mm ws "); - } - } - else - { - WriteToChat("Usage: /mm ws "); - } - break; case "help": WriteToChat("Mosswart Massacre Commands:"); WriteToChat("/mm report - Show current stats"); WriteToChat("/mm loc - Show current location"); - WriteToChat("/mm telemetry - Telemetry streaming enable|disable"); - WriteToChat("/mm ws - Websocket streaming enable|disable"); + WriteToChat("/mm telemetry - Telemetry streaming enable|disable"); // NEW WriteToChat("/mm reset - Reset all counters"); WriteToChat("/mm meta - Toggle rare meta state"); WriteToChat("/mm http - Local http-command server enable|disable"); diff --git a/MosswartMassacre/PluginSettings.cs b/MosswartMassacre/PluginSettings.cs index 37d1826..e59f09e 100644 --- a/MosswartMassacre/PluginSettings.cs +++ b/MosswartMassacre/PluginSettings.cs @@ -17,7 +17,6 @@ namespace MosswartMassacre private bool _rareMetaEnabled = true; private bool _httpServerEnabled = false; private bool _telemetryEnabled = false; - private bool _webSocketEnabled = false; private string _charTag = "default"; public static PluginSettings Instance => _instance @@ -124,11 +123,7 @@ namespace MosswartMassacre get => _telemetryEnabled; set { _telemetryEnabled = value; Save(); } } - public bool WebSocketEnabled - { - get => _webSocketEnabled; - set { _webSocketEnabled = value; Save(); } - } + public string CharTag { get => _charTag; diff --git a/MosswartMassacre/WebSocket.cs b/MosswartMassacre/WebSocket.cs deleted file mode 100644 index fd641cf..0000000 --- a/MosswartMassacre/WebSocket.cs +++ /dev/null @@ -1,255 +0,0 @@ -// WebSocket.cs -using System; -using System.Net.WebSockets; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using Decal.Adapter; -using Newtonsoft.Json; - -namespace MosswartMassacre -{ - // 1) The envelope type for incoming commands - public class CommandEnvelope - { - [JsonProperty("player_name")] - public string PlayerName { get; set; } - - [JsonProperty("command")] - public string Command { get; set; } - } - - public static class WebSocket - { - // ─── configuration ────────────────────────── - private static readonly Uri WsEndpoint = new Uri("wss://mosswart.snakedesert.se/websocket/"); - private const string SharedSecret = "your_shared_secret"; - private const int IntervalSec = 5; - private static string SessionId = ""; - - // ─── runtime state ────────────────────────── - private static ClientWebSocket _ws; - private static CancellationTokenSource _cts; - private static bool _enabled; - private static readonly SemaphoreSlim _sendLock = new SemaphoreSlim(1, 1); - - /// - /// Fires when a valid CommandEnvelope arrives for this character. - /// - public static event Action OnServerCommand; - - // ─── public API ───────────────────────────── - - public static void Start() - { - if (_enabled) return; - _enabled = true; - _cts = new CancellationTokenSource(); - - PluginCore.WriteToChat("[WebSocket] connecting…"); - _ = Task.Run(ConnectAndLoopAsync); - - } - - public static void Stop() - { - if (!_enabled) return; - _enabled = false; - - _cts.Cancel(); - _ws?.Abort(); - _ws?.Dispose(); - _ws = null; - - PluginCore.WriteToChat("[WebSocket] DISABLED"); - } - - // ─── connect / receive / telemetry loop ────────────────────── - - private static async Task ConnectAndLoopAsync() - { - while (_enabled && !_cts.IsCancellationRequested) - { - try - { - // 1) Establish connection - _ws = new ClientWebSocket(); - _ws.Options.SetRequestHeader("X-Plugin-Secret", SharedSecret); - await _ws.ConnectAsync(WsEndpoint, _cts.Token); - PluginCore.WriteToChat("[WebSocket] CONNECTED"); - SessionId = $"{CoreManager.Current.CharacterFilter.Name}-{DateTime.UtcNow:yyyyMMdd-HHmmss}"; - - // ─── Register this socket under our character name ─── - var registerEnvelope = new - { - type = "register", - player_name = CoreManager.Current.CharacterFilter.Name - }; - var regJson = JsonConvert.SerializeObject(registerEnvelope); - await SendEncodedAsync(regJson, _cts.Token); - PluginCore.WriteToChat("[WebSocket] REGISTERED"); - - var buffer = new byte[4096]; - - // 2) Fire-and-forget receive loop - var receiveTask = Task.Run(async () => - { - while (_ws.State == WebSocketState.Open && !_cts.Token.IsCancellationRequested) - { - WebSocketReceiveResult result; - try - { - result = await _ws.ReceiveAsync(new ArraySegment(buffer), _cts.Token); - } - catch (OperationCanceledException) - { - break; - } - catch (Exception ex) - { - PluginCore.WriteToChat($"[WebSocket] receive error: {ex.Message}"); - break; - } - - if (result.MessageType == WebSocketMessageType.Close) - break; - - var msg = Encoding.UTF8.GetString(buffer, 0, result.Count).Trim(); - - // 3) Parse into CommandEnvelope - CommandEnvelope env; - try - { - env = JsonConvert.DeserializeObject(msg); - } - catch (JsonException) - { - continue; // skip malformed JSON - } - - // 4) Filter by this character name - if (string.Equals( - env.PlayerName, - CoreManager.Current.CharacterFilter.Name, - StringComparison.OrdinalIgnoreCase)) - { - OnServerCommand?.Invoke(env); - } - } - }); - - // 5) Inline telemetry loop - while (_ws.State == WebSocketState.Open && !_cts.Token.IsCancellationRequested) - { - var json = BuildPayloadJson(); - await SendEncodedAsync(json, _cts.Token); - - try - { - await Task.Delay(TimeSpan.FromSeconds(IntervalSec), _cts.Token); - } - catch (OperationCanceledException) - { - break; - } - } - - // Wait for receive loop to finish - await receiveTask; - } - catch (OperationCanceledException) - { - break; - } - catch (Exception ex) - { - PluginCore.WriteToChat($"[WebSocket] error: {ex.Message}"); - } - finally - { - _ws?.Abort(); - _ws?.Dispose(); - _ws = null; - } - - // Pause before reconnecting - try { await Task.Delay(2000, CancellationToken.None); } catch { } - } - } - - - // ─── fire-and-forget chat sender ──────────────────── - - public static async Task SendChatTextAsync(int colorIndex, string chatText) - { - var envelope = new - { - type = "chat", - character_name = CoreManager.Current.CharacterFilter.Name, - text = chatText, - color = colorIndex - - }; - var json = JsonConvert.SerializeObject(envelope); - await SendEncodedAsync(json, CancellationToken.None); - } - - // ─── shared send helper with locking ─────────────── - - private static async Task SendEncodedAsync(string text, CancellationToken token) - { - await _sendLock.WaitAsync(token); - try - { - if (_ws == null || _ws.State != WebSocketState.Open) - return; - - var bytes = Encoding.UTF8.GetBytes(text); - await _ws.SendAsync(new ArraySegment(bytes), - WebSocketMessageType.Text, - true, - token); - } - catch (Exception ex) - { - PluginCore.WriteToChat("[WebSocket] send error: " + ex.Message); - _ws?.Abort(); - _ws?.Dispose(); - _ws = null; - } - finally - { - _sendLock.Release(); - } - } - - // ─── payload builder ────────────────────────────── - - - - private static string BuildPayloadJson() - { - var coords = Coordinates.Me; - var payload = new - { - type = "telemetry", - character_name = CoreManager.Current.CharacterFilter.Name, - char_tag = PluginCore.CharTag, - session_id = SessionId, - timestamp = DateTime.UtcNow.ToString("o"), - ew = coords.EW, - ns = coords.NS, - z = coords.Z, - kills = PluginCore.totalKills, - onlinetime = (DateTime.Now - PluginCore.statsStartTime) - .ToString(@"dd\.hh\:mm\:ss"), - kills_per_hour = PluginCore.killsPerHour.ToString("F0"), - deaths = 0, - rares_found = PluginCore.rareCount, - prismatic_taper_count = 0, - vt_state = VtankControl.VtGetMetaState() - }; - return JsonConvert.SerializeObject(payload); - } - } -} diff --git a/MosswartMassacre/lib/utank2-i.dll b/MosswartMassacre/lib/utank2-i.dll deleted file mode 100644 index 7696f05..0000000 Binary files a/MosswartMassacre/lib/utank2-i.dll and /dev/null differ