diff --git a/Backend/Plugins/TwitchPlugin.cs b/Backend/Plugins/TwitchPlugin.cs index e0a2a4b8..f00adfd6 100644 --- a/Backend/Plugins/TwitchPlugin.cs +++ b/Backend/Plugins/TwitchPlugin.cs @@ -37,6 +37,7 @@ public TwitchPlugin(string id, IEventFactory eventFactory, IEventBus eventBus, I Client.SendMessage(TwitchChannel, e.Event.Message); } }; + EventHandler.OnTwitchCommandSendWhisper += (_, e) => Client?.SendWhisper(e.Event.To, e.Event.Message); TwitchUsername = twitchConfiguration.TwitchUsername; TwitchChannel = twitchConfiguration.TwitchChannel; @@ -104,7 +105,8 @@ private void Connect() Client.Initialize(credentials, TwitchChannel); Client.OnConnected += OnConnected; - Client.OnChatCommandReceived += OnChatCommandReceived; + Client.OnMessageReceived += OnMessageReceived; + Client.OnWhisperReceived += OnWhisperReceived; Client.OnDisconnected += OnDisconnect; Client.OnError += OnError; Client.OnIncorrectLogin += OnIncorrectLogin; @@ -141,15 +143,15 @@ private void OnDisconnect(object sender, OnDisconnectedEventArgs e) RequestReconnect = true; } - private void OnChatCommandReceived(object sender, OnChatCommandReceivedArgs e) + private void OnMessageReceived(object sender, OnMessageReceivedArgs e) { - var chatMessage = e.Command.ChatMessage; + var chatMessage = e.ChatMessage; if (chatMessage.IsMe) return; EventBus.PublishEvent( - EventFactory.CreateTwitchReceivedCommand + EventFactory.CreateTwitchReceivedMessage ( from: chatMessage.DisplayName, message: chatMessage.Message, @@ -160,6 +162,15 @@ private void OnChatCommandReceived(object sender, OnChatCommandReceivedArgs e) )); } + private void OnWhisperReceived(object sender, OnWhisperReceivedArgs e) + { + var message = e.WhisperMessage; + + EventBus.PublishEvent( + EventFactory.CreateTwitchReceivedWhisper(message.DisplayName, message.Message) + ); + } + private void OnConnected(object sender, OnConnectedArgs e) { EventBus.PublishEvent(EventFactory.CreateUICommandWriteToConsole($"Twitch connected as {TwitchUsername} to channel {TwitchChannel}")); diff --git a/Backend/Services/LuaServiceLib/TwitchMethodCollection.cs b/Backend/Services/LuaServiceLib/TwitchMethodCollection.cs index d7bdd3ff..4ef5c02c 100644 --- a/Backend/Services/LuaServiceLib/TwitchMethodCollection.cs +++ b/Backend/Services/LuaServiceLib/TwitchMethodCollection.cs @@ -29,7 +29,8 @@ public void Register(Lua lua) { lua["twitch"] = this; lua.DoString(@" -function send_twitch_message(a); twitch:send_channel_message(a); end +function send_twitch_message(msg); twitch:send_channel_message(msg); end +function send_twitch_whisper(to, msg); twitch:send_whisper_message(to, msg); end "); } @@ -38,6 +39,12 @@ public void send_channel_message(string message) { EventBus.PublishEvent(EventFactory.CreateTwitchCommandSendMessage(message)); } + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "This is expose in Lua, so we want to keep that naming style")] + public void send_whisper_message(string to, string message) + { + EventBus.PublishEvent(EventFactory.CreateTwitchCommandSendWhisper(to, message)); + } } } } diff --git a/CHANGELOG.md b/CHANGELOG.md index f8ba1b7a..f860bd5e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,11 @@ - InternalInitialized event removed. Refactored to avoid having it - Lua: Removed plugin_enable(), plugin_disable(). Register/Unregister them instead - UI: Stores/restores Window position and size - + - Event: Adds TwitchReceivedMessage event (captures all messages, not only commands) + - Event: Removes TwitchReceivedCommand event as this is already sent as a TwitchReceivedMessage + - Event: Adds TwitchReceivedWhisper and TwitchCommandSendWhisper event + - Lua: send_twitch_whisper() / twitch:send_whisper_message() + - ## [0.3.0](https://github.com/dennis/slipstream/releases/tag/v0.3.0) (2020-01-05) [Full Changelog](https://github.com/dennis/slipstream/compare/v0.2.0...v0.3.0) diff --git a/Shared/EventFactory.cs b/Shared/EventFactory.cs index 9019621c..5bf6f6d7 100644 --- a/Shared/EventFactory.cs +++ b/Shared/EventFactory.cs @@ -428,9 +428,9 @@ public TwitchDisconnected CreateTwitchDisconnected() return new TwitchDisconnected(); } - public TwitchReceivedCommand CreateTwitchReceivedCommand(string from, string message, bool moderator, bool subscriber, bool vip, bool broadcaster) + public TwitchReceivedMessage CreateTwitchReceivedMessage(string from, string message, bool moderator, bool subscriber, bool vip, bool broadcaster) { - return new TwitchReceivedCommand + return new TwitchReceivedMessage { From = from, Message = message, @@ -441,6 +441,24 @@ public TwitchReceivedCommand CreateTwitchReceivedCommand(string from, string mes }; } + public TwitchReceivedWhisper CreateTwitchReceivedWhisper(string from, string message) + { + return new TwitchReceivedWhisper + { + From = from, + Message = message + }; + } + + public TwitchCommandSendWhisper CreateTwitchCommandSendWhisper(string to, string message) + { + return new TwitchCommandSendWhisper + { + To = to, + Message = message + }; + } + public UICommandWriteToConsole CreateUICommandWriteToConsole(string message) { return new UICommandWriteToConsole diff --git a/Shared/EventHandler.cs b/Shared/EventHandler.cs index 2b3319c5..0cad3e88 100644 --- a/Shared/EventHandler.cs +++ b/Shared/EventHandler.cs @@ -151,11 +151,17 @@ public EventHandlerArgs(T e) public delegate void OnTwitchDisconnectedHandler(EventHandler source, EventHandlerArgs e); public event OnTwitchDisconnectedHandler? OnTwitchDisconnected; - public delegate void OnTwitchReceivedCommandHandler(EventHandler source, EventHandlerArgs e); - public event OnTwitchReceivedCommandHandler? OnTwitchReceivedCommand; - public delegate void OnTwitchCommandSendMessageHandler(EventHandler source, EventHandlerArgs e); public event OnTwitchCommandSendMessageHandler? OnTwitchCommandSendMessage; + + public delegate void OnTwitchCommandSendWhisperHandler(EventHandler source, EventHandlerArgs e); + public event OnTwitchCommandSendWhisperHandler? OnTwitchCommandSendWhisper; + + public delegate void OnTwitchReceivedMessageHandler(EventHandler source, EventHandlerArgs e); + public event OnTwitchReceivedMessageHandler? OnTwitchReceivedMessage; + + public delegate void OnTwitchReceivedWhisperHandler(EventHandler source, EventHandlerArgs e); + public event OnTwitchReceivedWhisperHandler? OnTwitchReceivedWhisper; #endregion public void HandleEvent(IEvent? ev) @@ -444,18 +450,32 @@ public void HandleEvent(IEvent? ev) OnTwitchDisconnected.Invoke(this, new EventHandlerArgs(tev)); break; - case Shared.Events.Twitch.TwitchReceivedCommand tev: - if (OnTwitchReceivedCommand == null) + case Shared.Events.Twitch.TwitchCommandSendMessage tev: + if (OnTwitchCommandSendMessage == null) OnDefault?.Invoke(this, new EventHandlerArgs(tev)); else - OnTwitchReceivedCommand.Invoke(this, new EventHandlerArgs(tev)); + OnTwitchCommandSendMessage.Invoke(this, new EventHandlerArgs(tev)); break; - case Shared.Events.Twitch.TwitchCommandSendMessage tev: - if (OnTwitchCommandSendMessage == null) + case Shared.Events.Twitch.TwitchCommandSendWhisper tev: + if (OnTwitchCommandSendWhisper == null) OnDefault?.Invoke(this, new EventHandlerArgs(tev)); else - OnTwitchCommandSendMessage.Invoke(this, new EventHandlerArgs(tev)); + OnTwitchCommandSendWhisper.Invoke(this, new EventHandlerArgs(tev)); + break; + + case Shared.Events.Twitch.TwitchReceivedMessage tev: + if (OnTwitchReceivedMessage == null) + OnDefault?.Invoke(this, new EventHandlerArgs(tev)); + else + OnTwitchReceivedMessage.Invoke(this, new EventHandlerArgs(tev)); + break; + + case Shared.Events.Twitch.TwitchReceivedWhisper tev: + if (OnTwitchReceivedWhisper == null) + OnDefault?.Invoke(this, new EventHandlerArgs(tev)); + else + OnTwitchReceivedWhisper.Invoke(this, new EventHandlerArgs(tev)); break; default: diff --git a/Shared/Events/Twitch/TwitchCommandSendWhisper.cs b/Shared/Events/Twitch/TwitchCommandSendWhisper.cs new file mode 100644 index 00000000..2a4726e4 --- /dev/null +++ b/Shared/Events/Twitch/TwitchCommandSendWhisper.cs @@ -0,0 +1,33 @@ +#nullable enable + +using System.Collections.Generic; + +namespace Slipstream.Shared.Events.Twitch +{ + public class TwitchCommandSendWhisper : IEvent + { + public string EventType => "TwitchCommandSendWhisper"; + public bool ExcludeFromTxrx => false; + public string To { get; set; } = string.Empty; + public string Message { get; set; } = string.Empty; + + public override bool Equals(object? obj) + { + return obj is TwitchCommandSendWhisper whisper && + EventType == whisper.EventType && + ExcludeFromTxrx == whisper.ExcludeFromTxrx && + To == whisper.To && + Message == whisper.Message; + } + + public override int GetHashCode() + { + int hashCode = 855176974; + hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(EventType); + hashCode = hashCode * -1521134295 + ExcludeFromTxrx.GetHashCode(); + hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(To); + hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(Message); + return hashCode; + } + } +} diff --git a/Shared/Events/Twitch/TwitchReceivedCommand.cs b/Shared/Events/Twitch/TwitchReceivedMessage.cs similarity index 69% rename from Shared/Events/Twitch/TwitchReceivedCommand.cs rename to Shared/Events/Twitch/TwitchReceivedMessage.cs index 8397d186..2fc4a0ed 100644 --- a/Shared/Events/Twitch/TwitchReceivedCommand.cs +++ b/Shared/Events/Twitch/TwitchReceivedMessage.cs @@ -4,9 +4,9 @@ namespace Slipstream.Shared.Events.Twitch { - public class TwitchReceivedCommand : IEvent + public class TwitchReceivedMessage : IEvent { - public string EventType => "TwitchReceivedCommand"; + public string EventType => "TwitchReceivedMessage"; public bool ExcludeFromTxrx => false; public string From { get; set; } = string.Empty; public string Message { get; set; } = string.Empty; @@ -17,15 +17,15 @@ public class TwitchReceivedCommand : IEvent public override bool Equals(object? obj) { - return obj is TwitchReceivedCommand command && - EventType == command.EventType && - ExcludeFromTxrx == command.ExcludeFromTxrx && - From == command.From && - Message == command.Message && - Moderator == command.Moderator && - Subscriber == command.Subscriber && - Vip == command.Vip && - Broadcaster == command.Broadcaster; + return obj is TwitchReceivedMessage message && + EventType == message.EventType && + ExcludeFromTxrx == message.ExcludeFromTxrx && + From == message.From && + Message == message.Message && + Moderator == message.Moderator && + Subscriber == message.Subscriber && + Vip == message.Vip && + Broadcaster == message.Broadcaster; } public override int GetHashCode() diff --git a/Shared/Events/Twitch/TwitchReceivedWhisper.cs b/Shared/Events/Twitch/TwitchReceivedWhisper.cs new file mode 100644 index 00000000..56f73e79 --- /dev/null +++ b/Shared/Events/Twitch/TwitchReceivedWhisper.cs @@ -0,0 +1,33 @@ +#nullable enable + +using System.Collections.Generic; + +namespace Slipstream.Shared.Events.Twitch +{ + public class TwitchReceivedWhisper : IEvent + { + public string EventType => "TwitchReceivedWhisper"; + public bool ExcludeFromTxrx => false; + public string From { get; set; } = string.Empty; + public string Message { get; set; } = string.Empty; + + public override bool Equals(object? obj) + { + return obj is TwitchReceivedWhisper whisper && + EventType == whisper.EventType && + ExcludeFromTxrx == whisper.ExcludeFromTxrx && + From == whisper.From && + Message == whisper.Message; + } + + public override int GetHashCode() + { + int hashCode = -370540573; + hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(EventType); + hashCode = hashCode * -1521134295 + ExcludeFromTxrx.GetHashCode(); + hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(From); + hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(Message); + return hashCode; + } + } +} diff --git a/Shared/IEventFactory.cs b/Shared/IEventFactory.cs index 0b0ddbb7..bb7d32f7 100644 --- a/Shared/IEventFactory.cs +++ b/Shared/IEventFactory.cs @@ -154,7 +154,9 @@ string fogLevel TwitchConnected CreateTwitchConnected(); IRacingDriverIncident CreateIRacingDriverIncident(int totalIncidents, int incidentDelta); TwitchDisconnected CreateTwitchDisconnected(); - TwitchReceivedCommand CreateTwitchReceivedCommand(string from, string message, bool moderator, bool subscriber, bool vip, bool broadcaster); + TwitchReceivedMessage CreateTwitchReceivedMessage(string from, string message, bool moderator, bool subscriber, bool vip, bool broadcaster); + TwitchReceivedWhisper CreateTwitchReceivedWhisper(string from, string message); + TwitchCommandSendWhisper CreateTwitchCommandSendWhisper(string to, string message); UICommandWriteToConsole CreateUICommandWriteToConsole(string message); UICommandCreateButton CreateUICommandCreateButton(string text); diff --git a/Slipstream.csproj b/Slipstream.csproj index a5a4b774..e1856337 100644 --- a/Slipstream.csproj +++ b/Slipstream.csproj @@ -181,6 +181,9 @@ + + + @@ -211,7 +214,6 @@ -