From e72a42863a9132087d39241c9c08907f190811ba Mon Sep 17 00:00:00 2001 From: jaybz Date: Fri, 23 Apr 2021 20:53:13 +0800 Subject: [PATCH 1/8] Add support for plugin settings via MessageProcessor.OnSettingEventHandler() (cherry picked from commit f02b3e3c476de0c0523901e3a3a9f6b85a04117f) --- .../Interfaces/IMessageProcessor.cs | 2 ++ TouchPortalApi/MessageProcessor.cs | 19 ++++++++++++++++++- .../Models/Initialization/PairResponse.cs | 5 ++++- .../TouchPortal/Responses/TPSettingChange.cs | 14 ++++++++++++++ 4 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 TouchPortalApi/Models/TouchPortal/Responses/TPSettingChange.cs diff --git a/TouchPortalApi/Interfaces/IMessageProcessor.cs b/TouchPortalApi/Interfaces/IMessageProcessor.cs index 1bc94fe..6c9b89a 100644 --- a/TouchPortalApi/Interfaces/IMessageProcessor.cs +++ b/TouchPortalApi/Interfaces/IMessageProcessor.cs @@ -7,12 +7,14 @@ namespace TouchPortalApi.Interfaces { 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 interface IMessageProcessor { event ActionEventHandler OnActionEvent; event ListChangeEventHandler OnListChangeEventHandler; event CloseEventHandler OnCloseEventHandler; event ConnectEventHandler OnConnectEventHandler; + event SettingEventHandler OnSettingEventHandler; Task Listen(); Task TryPairAsync(); diff --git a/TouchPortalApi/MessageProcessor.cs b/TouchPortalApi/MessageProcessor.cs index e23d755..e8db9ab 100644 --- a/TouchPortalApi/MessageProcessor.cs +++ b/TouchPortalApi/MessageProcessor.cs @@ -2,6 +2,7 @@ using Newtonsoft.Json; using System; using System.Buffers; +using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using TouchPortalApi.Configuration; @@ -28,6 +29,7 @@ public class MessageProcessor : IMessageProcessor { public event ListChangeEventHandler OnListChangeEventHandler; public event CloseEventHandler OnCloseEventHandler; public event ConnectEventHandler OnConnectEventHandler; + public event SettingEventHandler OnSettingEventHandler; #endregion @@ -91,7 +93,10 @@ 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(pairResponse.Settings); break; case "action": HandleActionEvent(JsonConvert.DeserializeObject(result)); @@ -102,6 +107,9 @@ private void ProcessLine(ReadOnlySequence line) { case "closeplugin": HandleCloseEvent(); break; + case "settings": + HandleSettingEvent(JsonConvert.DeserializeObject(result).Values); + break; default: Console.WriteLine($"No operation defined for: {responseModel.Type.ToLower().Trim()}"); break; @@ -124,6 +132,15 @@ private void HandlePairEvent(PairResponse response) { } } + /// + /// Handle connect event + /// + /// The TP Pair Response + private void HandleSettingEvent(List> settings) { + // Good pairing message returned + OnSettingEventHandler?.Invoke(settings); + } + /// /// Handle an action 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/TouchPortal/Responses/TPSettingChange.cs b/TouchPortalApi/Models/TouchPortal/Responses/TPSettingChange.cs new file mode 100644 index 0000000..c71e5ae --- /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 List Change + /// + /// + internal class TPSettingChange : TPShared { + /// + /// New values + /// + public List> Values { get; set; } + } +} From 1a0f7df71579f3c664d9c9d5b8b8bfe6bbb6cb8b Mon Sep 17 00:00:00 2001 From: jaybz Date: Sun, 25 Apr 2021 07:23:07 +0800 Subject: [PATCH 2/8] Add broadcast handlers Clean up setting handlers --- .../Interfaces/IMessageProcessor.cs | 2 ++ TouchPortalApi/MessageProcessor.cs | 26 ++++++++++++++----- .../TouchPortal/Responses/TPBroadcast.cs | 18 +++++++++++++ .../TouchPortal/Responses/TPSettingChange.cs | 2 +- 4 files changed, 40 insertions(+), 8 deletions(-) create mode 100644 TouchPortalApi/Models/TouchPortal/Responses/TPBroadcast.cs diff --git a/TouchPortalApi/Interfaces/IMessageProcessor.cs b/TouchPortalApi/Interfaces/IMessageProcessor.cs index 6c9b89a..55f30c5 100644 --- a/TouchPortalApi/Interfaces/IMessageProcessor.cs +++ b/TouchPortalApi/Interfaces/IMessageProcessor.cs @@ -8,6 +8,7 @@ namespace TouchPortalApi.Interfaces { public delegate void CloseEventHandler(); public delegate void ConnectEventHandler(); public delegate void SettingEventHandler(List> settings); + public delegate void BroadcastEventHandler(string eventType, string pageName); public interface IMessageProcessor { event ActionEventHandler OnActionEvent; @@ -15,6 +16,7 @@ public interface IMessageProcessor { event CloseEventHandler OnCloseEventHandler; event ConnectEventHandler OnConnectEventHandler; event SettingEventHandler OnSettingEventHandler; + event BroadcastEventHandler OnBroadcastEventHandler; Task Listen(); Task TryPairAsync(); diff --git a/TouchPortalApi/MessageProcessor.cs b/TouchPortalApi/MessageProcessor.cs index e8db9ab..75c4745 100644 --- a/TouchPortalApi/MessageProcessor.cs +++ b/TouchPortalApi/MessageProcessor.cs @@ -30,6 +30,7 @@ public class MessageProcessor : IMessageProcessor { public event CloseEventHandler OnCloseEventHandler; public event ConnectEventHandler OnConnectEventHandler; public event SettingEventHandler OnSettingEventHandler; + public event BroadcastEventHandler OnBroadcastEventHandler; #endregion @@ -95,8 +96,9 @@ private void ProcessLine(ReadOnlySequence line) { case "info": PairResponse pairResponse = JsonConvert.DeserializeObject(result); HandlePairEvent(pairResponse); - if(pairResponse.Settings != null) - HandleSettingEvent(pairResponse.Settings); + if(pairResponse.Settings != null) { + HandleSettingEvent(new TPSettingChange { Values = pairResponse.Settings }); + } break; case "action": HandleActionEvent(JsonConvert.DeserializeObject(result)); @@ -108,7 +110,10 @@ private void ProcessLine(ReadOnlySequence line) { HandleCloseEvent(); break; case "settings": - HandleSettingEvent(JsonConvert.DeserializeObject(result).Values); + HandleSettingEvent(JsonConvert.DeserializeObject(result)); + break; + case "broadcast": + HandleBroadcastEvent(JsonConvert.DeserializeObject(result)); break; default: Console.WriteLine($"No operation defined for: {responseModel.Type.ToLower().Trim()}"); @@ -133,12 +138,19 @@ private void HandlePairEvent(PairResponse response) { } /// - /// Handle connect event + /// Handle setting event /// /// The TP Pair Response - private void HandleSettingEvent(List> settings) { - // Good pairing message returned - OnSettingEventHandler?.Invoke(settings); + private void HandleSettingEvent(TPSettingChange setting) { + OnSettingEventHandler?.Invoke(setting.Values); + } + + /// + /// Handle broadcast event + /// + /// The TP Pair Response + private void HandleBroadcastEvent(TPBroadcast broadcast) { + OnBroadcastEventHandler?.Invoke(broadcast.Event, broadcast.PageName); } /// 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 index c71e5ae..fe8a054 100644 --- a/TouchPortalApi/Models/TouchPortal/Responses/TPSettingChange.cs +++ b/TouchPortalApi/Models/TouchPortal/Responses/TPSettingChange.cs @@ -2,7 +2,7 @@ namespace TouchPortalApi.Models.TouchPortal.Responses { /// - /// Class for the TP Response type of List Change + /// Class for the TP Response type of Setting Change /// /// internal class TPSettingChange : TPShared { From 3fe3fdd6b225077d8a672427e46cffcd2f85a845 Mon Sep 17 00:00:00 2001 From: jaybz Date: Sun, 25 Apr 2021 09:07:30 +0800 Subject: [PATCH 3/8] Add support for hold events (cherry picked from commit 52da9e4da472313e237d0a73b064e34f898e29c8) --- TouchPortalApi/Interfaces/IMessageProcessor.cs | 2 ++ TouchPortalApi/MessageProcessor.cs | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/TouchPortalApi/Interfaces/IMessageProcessor.cs b/TouchPortalApi/Interfaces/IMessageProcessor.cs index 55f30c5..9429214 100644 --- a/TouchPortalApi/Interfaces/IMessageProcessor.cs +++ b/TouchPortalApi/Interfaces/IMessageProcessor.cs @@ -4,6 +4,7 @@ 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(); @@ -12,6 +13,7 @@ namespace TouchPortalApi.Interfaces { public interface IMessageProcessor { event ActionEventHandler OnActionEvent; + event HoldActionEventHandler OnHoldActionEvent; event ListChangeEventHandler OnListChangeEventHandler; event CloseEventHandler OnCloseEventHandler; event ConnectEventHandler OnConnectEventHandler; diff --git a/TouchPortalApi/MessageProcessor.cs b/TouchPortalApi/MessageProcessor.cs index 75c4745..c4d8e36 100644 --- a/TouchPortalApi/MessageProcessor.cs +++ b/TouchPortalApi/MessageProcessor.cs @@ -26,6 +26,7 @@ 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; @@ -115,6 +116,12 @@ private void ProcessLine(ReadOnlySequence line) { 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; @@ -161,6 +168,14 @@ private void HandleActionEvent(TPAction action) { OnActionEvent?.Invoke(action.ActionId, action.Data); } + /// + /// Handle an on hold event + /// + /// The action being triggered + private void HandleHoldActionEvent(TPAction action, bool held) { + OnHoldActionEvent?.Invoke(action.ActionId, held, action.Data); + } + /// /// Handle a list change event /// From 8074643807fe985306a50eb55e2c080046622566 Mon Sep 17 00:00:00 2001 From: jaybz Date: Sun, 25 Apr 2021 09:45:32 +0800 Subject: [PATCH 4/8] Correct the XML documentation comments for API 3 additions --- TouchPortalApi/MessageProcessor.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/TouchPortalApi/MessageProcessor.cs b/TouchPortalApi/MessageProcessor.cs index c4d8e36..14fa05e 100644 --- a/TouchPortalApi/MessageProcessor.cs +++ b/TouchPortalApi/MessageProcessor.cs @@ -147,7 +147,7 @@ private void HandlePairEvent(PairResponse response) { /// /// Handle setting event /// - /// The TP Pair Response + /// The new settings private void HandleSettingEvent(TPSettingChange setting) { OnSettingEventHandler?.Invoke(setting.Values); } @@ -155,7 +155,7 @@ private void HandleSettingEvent(TPSettingChange setting) { /// /// Handle broadcast event /// - /// The TP Pair Response + /// The broadcast event private void HandleBroadcastEvent(TPBroadcast broadcast) { OnBroadcastEventHandler?.Invoke(broadcast.Event, broadcast.PageName); } @@ -172,6 +172,7 @@ private void HandleActionEvent(TPAction action) { /// 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); } From 77c126e694cdfa4200bf2c2ee3acac4ee15f7658 Mon Sep 17 00:00:00 2001 From: jaybz Date: Sun, 25 Apr 2021 08:29:00 +0800 Subject: [PATCH 5/8] Add exit handler which fires when Touch Portal exits with the plugin still running (cherry picked from commit 9c16aa79523afeec7fa6ed8d6c056651d42897e2) --- TouchPortalApi/Interfaces/IMessageProcessor.cs | 2 ++ TouchPortalApi/MessageProcessor.cs | 5 +++++ TouchPortalApi/TPClient.cs | 3 +++ 3 files changed, 10 insertions(+) diff --git a/TouchPortalApi/Interfaces/IMessageProcessor.cs b/TouchPortalApi/Interfaces/IMessageProcessor.cs index 9429214..aa3056b 100644 --- a/TouchPortalApi/Interfaces/IMessageProcessor.cs +++ b/TouchPortalApi/Interfaces/IMessageProcessor.cs @@ -10,6 +10,7 @@ namespace TouchPortalApi.Interfaces { 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; @@ -19,6 +20,7 @@ public interface IMessageProcessor { 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 14fa05e..d58da84 100644 --- a/TouchPortalApi/MessageProcessor.cs +++ b/TouchPortalApi/MessageProcessor.cs @@ -3,6 +3,7 @@ using System; using System.Buffers; using System.Collections.Generic; +using System.Net.Sockets; using System.Threading; using System.Threading.Tasks; using TouchPortalApi.Configuration; @@ -32,6 +33,7 @@ public class MessageProcessor : IMessageProcessor { public event ConnectEventHandler OnConnectEventHandler; public event SettingEventHandler OnSettingEventHandler; public event BroadcastEventHandler OnBroadcastEventHandler; + public event ExitHandler OnExitHandler; #endregion @@ -65,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); } diff --git a/TouchPortalApi/TPClient.cs b/TouchPortalApi/TPClient.cs index ed1e099..1333f2f 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; @@ -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(); } /// From c5c4057667d161ffc39b21c7b1dc14668ff6666b Mon Sep 17 00:00:00 2001 From: jaybz Date: Fri, 24 Jun 2022 13:23:15 +0800 Subject: [PATCH 6/8] Implement dynamic state grouping --- TouchPortalApi/Models/StateCreate.cs | 1 + TouchPortalApi/TouchPortalApi.csproj | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) 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/TouchPortalApi.csproj b/TouchPortalApi/TouchPortalApi.csproj index 7dbe7a0..f81e1d9 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 From 0734533468e59505a9db14c0dc6d5b736c54c9d9 Mon Sep 17 00:00:00 2001 From: jaybz Date: Thu, 15 Dec 2022 17:35:19 +0800 Subject: [PATCH 7/8] Add multiplatform build support --- TouchPortalApi/TouchPortalApi.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/TouchPortalApi/TouchPortalApi.csproj b/TouchPortalApi/TouchPortalApi.csproj index f81e1d9..f9bb12d 100644 --- a/TouchPortalApi/TouchPortalApi.csproj +++ b/TouchPortalApi/TouchPortalApi.csproj @@ -14,6 +14,7 @@ 2020 0.3.3.0 + AnyCPU From 8e1c2b6ee6023e028daf64531437fafd814d5cb5 Mon Sep 17 00:00:00 2001 From: jaybz Date: Sat, 2 Aug 2025 00:44:59 +0800 Subject: [PATCH 8/8] Switch client encoding from ASCII to UTF8 --- TouchPortalApi/TPClient.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TouchPortalApi/TPClient.cs b/TouchPortalApi/TPClient.cs index 1333f2f..604a688 100644 --- a/TouchPortalApi/TPClient.cs +++ b/TouchPortalApi/TPClient.cs @@ -63,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); }