diff --git a/TouchPortalApi/Interfaces/IMessageProcessor.cs b/TouchPortalApi/Interfaces/IMessageProcessor.cs index 1bc94fe..aa3056b 100644 --- a/TouchPortalApi/Interfaces/IMessageProcessor.cs +++ b/TouchPortalApi/Interfaces/IMessageProcessor.cs @@ -4,15 +4,23 @@ namespace TouchPortalApi.Interfaces { public delegate void ActionEventHandler(string actionId, List dataList); + public delegate void HoldActionEventHandler(string actionId, bool held, List dataList); public delegate void ListChangeEventHandler(string actionId, string listId, string instanceId, string value); public delegate void CloseEventHandler(); public delegate void ConnectEventHandler(); + public delegate void SettingEventHandler(List> settings); + public delegate void BroadcastEventHandler(string eventType, string pageName); + public delegate void ExitHandler(); public interface IMessageProcessor { event ActionEventHandler OnActionEvent; + event HoldActionEventHandler OnHoldActionEvent; event ListChangeEventHandler OnListChangeEventHandler; event CloseEventHandler OnCloseEventHandler; event ConnectEventHandler OnConnectEventHandler; + event SettingEventHandler OnSettingEventHandler; + event BroadcastEventHandler OnBroadcastEventHandler; + event ExitHandler OnExitHandler; Task Listen(); Task TryPairAsync(); diff --git a/TouchPortalApi/MessageProcessor.cs b/TouchPortalApi/MessageProcessor.cs index e23d755..d58da84 100644 --- a/TouchPortalApi/MessageProcessor.cs +++ b/TouchPortalApi/MessageProcessor.cs @@ -2,6 +2,8 @@ using Newtonsoft.Json; using System; using System.Buffers; +using System.Collections.Generic; +using System.Net.Sockets; using System.Threading; using System.Threading.Tasks; using TouchPortalApi.Configuration; @@ -25,9 +27,13 @@ public class MessageProcessor : IMessageProcessor { #region Event Handlers public event ActionEventHandler OnActionEvent; + public event HoldActionEventHandler OnHoldActionEvent; public event ListChangeEventHandler OnListChangeEventHandler; public event CloseEventHandler OnCloseEventHandler; public event ConnectEventHandler OnConnectEventHandler; + public event SettingEventHandler OnSettingEventHandler; + public event BroadcastEventHandler OnBroadcastEventHandler; + public event ExitHandler OnExitHandler; #endregion @@ -61,6 +67,9 @@ public async Task Listen() { while (!_cancellationToken.IsCancellationRequested) { try { await _tPClient.ProcessPipes(); + } catch (SocketException) { + OnExitHandler?.Invoke(); + return; } catch (Exception ex) { Console.WriteLine(ex); } @@ -91,7 +100,11 @@ private void ProcessLine(ReadOnlySequence line) { switch (responseModel.Type.ToLower().Trim()) { case "info": - HandlePairEvent(JsonConvert.DeserializeObject(result)); + PairResponse pairResponse = JsonConvert.DeserializeObject(result); + HandlePairEvent(pairResponse); + if(pairResponse.Settings != null) { + HandleSettingEvent(new TPSettingChange { Values = pairResponse.Settings }); + } break; case "action": HandleActionEvent(JsonConvert.DeserializeObject(result)); @@ -102,6 +115,18 @@ private void ProcessLine(ReadOnlySequence line) { case "closeplugin": HandleCloseEvent(); break; + case "settings": + HandleSettingEvent(JsonConvert.DeserializeObject(result)); + break; + case "broadcast": + HandleBroadcastEvent(JsonConvert.DeserializeObject(result)); + break; + case "up": + HandleHoldActionEvent(JsonConvert.DeserializeObject(result), false); + break; + case "down": + HandleHoldActionEvent(JsonConvert.DeserializeObject(result), true); + break; default: Console.WriteLine($"No operation defined for: {responseModel.Type.ToLower().Trim()}"); break; @@ -124,6 +149,22 @@ private void HandlePairEvent(PairResponse response) { } } + /// + /// Handle setting event + /// + /// The new settings + private void HandleSettingEvent(TPSettingChange setting) { + OnSettingEventHandler?.Invoke(setting.Values); + } + + /// + /// Handle broadcast event + /// + /// The broadcast event + private void HandleBroadcastEvent(TPBroadcast broadcast) { + OnBroadcastEventHandler?.Invoke(broadcast.Event, broadcast.PageName); + } + /// /// Handle an action event /// @@ -132,6 +173,15 @@ private void HandleActionEvent(TPAction action) { OnActionEvent?.Invoke(action.ActionId, action.Data); } + /// + /// Handle an on hold event + /// + /// The action being triggered + /// True if held, false when released + private void HandleHoldActionEvent(TPAction action, bool held) { + OnHoldActionEvent?.Invoke(action.ActionId, held, action.Data); + } + /// /// Handle a list change event /// diff --git a/TouchPortalApi/Models/Initialization/PairResponse.cs b/TouchPortalApi/Models/Initialization/PairResponse.cs index c854e06..1bc83a4 100644 --- a/TouchPortalApi/Models/Initialization/PairResponse.cs +++ b/TouchPortalApi/Models/Initialization/PairResponse.cs @@ -1,4 +1,5 @@ -using TouchPortalApi.Models.TouchPortal.Responses; +using System.Collections.Generic; +using TouchPortalApi.Models.TouchPortal.Responses; namespace TouchPortalApi.Models.Initialization { internal class PairResponse : TPResponseBase { @@ -6,5 +7,7 @@ internal class PairResponse : TPResponseBase { public string TPVersionString { get; set; } public string TPVersionCode { get; set; } public string PluginVersion { get; set; } + + public List> Settings { get; set; } } } diff --git a/TouchPortalApi/Models/StateCreate.cs b/TouchPortalApi/Models/StateCreate.cs index 58a4d29..a5ac62c 100644 --- a/TouchPortalApi/Models/StateCreate.cs +++ b/TouchPortalApi/Models/StateCreate.cs @@ -9,5 +9,6 @@ public class StateCreate public string Id { get; set; } public string Desc { get; set; } public string DefaultValue { get; set; } + public string ParentGroup { get; set; } } } diff --git a/TouchPortalApi/Models/TouchPortal/Responses/TPBroadcast.cs b/TouchPortalApi/Models/TouchPortal/Responses/TPBroadcast.cs new file mode 100644 index 0000000..1132b12 --- /dev/null +++ b/TouchPortalApi/Models/TouchPortal/Responses/TPBroadcast.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; + +namespace TouchPortalApi.Models.TouchPortal.Responses { + /// + /// Class for the TP Response type of broadcast + /// + internal class TPBroadcast : TPShared { + /// + /// Event type + /// + public string Event { get; set; } + + /// + /// Name of the page that was switched to + /// + public string PageName { get; set; } + } +} diff --git a/TouchPortalApi/Models/TouchPortal/Responses/TPSettingChange.cs b/TouchPortalApi/Models/TouchPortal/Responses/TPSettingChange.cs new file mode 100644 index 0000000..fe8a054 --- /dev/null +++ b/TouchPortalApi/Models/TouchPortal/Responses/TPSettingChange.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; + +namespace TouchPortalApi.Models.TouchPortal.Responses { + /// + /// Class for the TP Response type of Setting Change + /// + /// + internal class TPSettingChange : TPShared { + /// + /// New values + /// + public List> Values { get; set; } + } +} diff --git a/TouchPortalApi/TPClient.cs b/TouchPortalApi/TPClient.cs index ed1e099..604a688 100644 --- a/TouchPortalApi/TPClient.cs +++ b/TouchPortalApi/TPClient.cs @@ -5,6 +5,7 @@ using System.Buffers; using System.IO.Pipelines; using System.Net; +using System.Net.Sockets; using System.Runtime.CompilerServices; using System.Text; using System.Threading; @@ -62,7 +63,7 @@ private void InitializeConnection() { /// The cancellation token public async Task SendAsync(object model, CancellationToken cancellationToken = default) { string request = PrepareMessage(model); - var bytesSent = Encoding.ASCII.GetBytes(request); + var bytesSent = Encoding.UTF8.GetBytes(request); await _tpsocket.SendAsync(bytesSent, cancellationToken); } @@ -85,6 +86,8 @@ public async Task ProcessPipes() { Task reading = ReadPipeAsync(pipe.Reader); await Task.WhenAll(reading, writing).ConfigureAwait(false); + if(!_tpsocket.Connected) + throw new SocketException(); } /// diff --git a/TouchPortalApi/TouchPortalApi.csproj b/TouchPortalApi/TouchPortalApi.csproj index 7dbe7a0..f9bb12d 100644 --- a/TouchPortalApi/TouchPortalApi.csproj +++ b/TouchPortalApi/TouchPortalApi.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netcoreapp3.1 0.3.3.0 0.3.3 true @@ -14,6 +14,7 @@ 2020 0.3.3.0 + AnyCPU