Skip to content

Commit 344be58

Browse files
committed
Add support for channel.chat.notification
1 parent 3a46616 commit 344be58

File tree

3 files changed

+59
-17
lines changed

3 files changed

+59
-17
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
using TwitchLib.EventSub.Core.SubscriptionTypes.Channel;
2+
using TwitchLib.EventSub.Websockets.Core.Models;
3+
namespace TwitchLib.EventSub.Websockets.Core.EventArgs.Channel
4+
{
5+
public class ChannelChatNotificationArgs : TwitchLibEventSubEventArgs<EventSubNotification<ChannelChatNotification>>
6+
{
7+
}
8+
}

TwitchLib.EventSub.Websockets/EventSubWebsocketClient.cs

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,10 @@ public class EventSubWebsocketClient
8181
/// </summary>
8282
public event AsyncEventHandler<ChannelChatMessageDeleteArgs> ChannelChatMessageDelete;
8383
/// <summary>
84+
/// Event that triggers on "channel.chat.notification" notifications
85+
/// </summary>
86+
public event AsyncEventHandler<ChannelChatNotificationArgs> ChannelChatNotification;
87+
/// <summary>
8488
/// Event that triggers on "channel.cheer" notifications
8589
/// </summary>
8690
public event AsyncEventHandler<ChannelCheerArgs> ChannelCheer;
@@ -339,7 +343,7 @@ public class EventSubWebsocketClient
339343
/// <param name="serviceProvider">DI Container to resolve other dependencies dynamically</param>
340344
/// <param name="websocketClient">Underlying Websocket client to connect to connect to EventSub Websocket service</param>
341345
/// <exception cref="ArgumentNullException">Throws ArgumentNullException if a dependency is null</exception>
342-
public EventSubWebsocketClient(ILogger<EventSubWebsocketClient> logger, IEnumerable<INotificationHandler> handlers, IServiceProvider serviceProvider, WebsocketClient websocketClient)
346+
public EventSubWebsocketClient ( ILogger<EventSubWebsocketClient> logger, IEnumerable<INotificationHandler> handlers, IServiceProvider serviceProvider, WebsocketClient websocketClient )
343347
{
344348
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
345349
_serviceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider));
@@ -358,7 +362,7 @@ public EventSubWebsocketClient(ILogger<EventSubWebsocketClient> logger, IEnumera
358362
/// Instantiates an EventSubWebsocketClient used to subscribe to EventSub notifications via Websockets.
359363
/// </summary>
360364
/// <param name="loggerFactory">LoggerFactory used to construct Loggers for the EventSubWebsocketClient and underlying classes</param>
361-
public EventSubWebsocketClient(ILoggerFactory loggerFactory = null)
365+
public EventSubWebsocketClient ( ILoggerFactory loggerFactory = null )
362366
{
363367
_loggerFactory = loggerFactory;
364368

@@ -390,7 +394,7 @@ public EventSubWebsocketClient(ILoggerFactory loggerFactory = null)
390394
/// </summary>
391395
/// <param name="url">Optional url param to be able to connect to reconnect urls provided by Twitch or test servers</param>
392396
/// <returns>true: Connection successful false: Connection failed</returns>
393-
public async Task<bool> ConnectAsync(Uri url = null)
397+
public async Task<bool> ConnectAsync ( Uri url = null )
394398
{
395399
url = url ?? new Uri(WEBSOCKET_URL);
396400
_lastReceived = DateTimeOffset.MinValue;
@@ -413,7 +417,7 @@ public async Task<bool> ConnectAsync(Uri url = null)
413417
/// Disconnect from Twitch EventSub Websockets
414418
/// </summary>
415419
/// <returns>true: Disconnect successful false: Disconnect failed</returns>
416-
public async Task<bool> DisconnectAsync()
420+
public async Task<bool> DisconnectAsync ()
417421
{
418422
_cts?.Cancel();
419423
return await _websocketClient.DisconnectAsync();
@@ -423,7 +427,7 @@ public async Task<bool> DisconnectAsync()
423427
/// Reconnect to Twitch EventSub Websockets with a Twitch given Url
424428
/// </summary>
425429
/// <returns>true: Reconnect successful false: Reconnect failed</returns>
426-
public Task<bool> ReconnectAsync()
430+
public Task<bool> ReconnectAsync ()
427431
{
428432
return ReconnectAsync(new Uri(WEBSOCKET_URL));
429433
}
@@ -433,7 +437,7 @@ public Task<bool> ReconnectAsync()
433437
/// </summary>
434438
/// <param name="url">New Websocket Url to connect to, to preserve current session and topics</param>
435439
/// <returns>true: Reconnect successful false: Reconnect failed</returns>
436-
private async Task<bool> ReconnectAsync(Uri url)
440+
private async Task<bool> ReconnectAsync ( Uri url )
437441
{
438442
url = url ?? new Uri(WEBSOCKET_URL);
439443

@@ -505,7 +509,7 @@ private async Task<bool> ReconnectAsync(Uri url)
505509
/// Setup handlers for all supported subscription types
506510
/// </summary>
507511
/// <param name="handlers">Enumerable of handlers that are responsible for acting on a specified subscription type</param>
508-
private void PrepareHandlers(IEnumerable<INotificationHandler> handlers)
512+
private void PrepareHandlers ( IEnumerable<INotificationHandler> handlers )
509513
{
510514
_handlers = _handlers ?? new Dictionary<string, Action<EventSubWebsocketClient, string, JsonSerializerOptions>>();
511515

@@ -525,7 +529,7 @@ private void PrepareHandlers(IEnumerable<INotificationHandler> handlers)
525529
/// <para>E.g. a Twitch specified 10 seconds minimum frequency would result in 12 seconds used by the client to honor network latencies and so on.</para>
526530
/// </summary>
527531
/// <returns>a Task that represents the background operation</returns>
528-
private async Task ConnectionCheckAsync()
532+
private async Task ConnectionCheckAsync ()
529533
{
530534
while (_cts != null && _websocketClient.IsConnected && !_cts.IsCancellationRequested)
531535
{
@@ -547,7 +551,7 @@ private async Task ConnectionCheckAsync()
547551
/// </summary>
548552
/// <param name="sender">Sender of the event. In this case <see cref="WebsocketClient"/></param>
549553
/// <param name="e">EventArgs send with the event. <see cref="DataReceivedArgs"/></param>
550-
private async Task OnDataReceived(object sender, DataReceivedArgs e)
554+
private async Task OnDataReceived ( object sender, DataReceivedArgs e )
551555
{
552556
_lastReceived = DateTimeOffset.Now;
553557

@@ -592,7 +596,7 @@ private async Task OnDataReceived(object sender, DataReceivedArgs e)
592596
/// </summary>
593597
/// <param name="sender">Sender of the event. In this case <see cref="WebsocketClient"/></param>
594598
/// <param name="e">EventArgs send with the event. <see cref="ErrorOccuredArgs"/></param>
595-
private async Task OnErrorOccurred(object sender, ErrorOccuredArgs e)
599+
private async Task OnErrorOccurred ( object sender, ErrorOccuredArgs e )
596600
{
597601
await ErrorOccurred.InvokeAsync(this, e);
598602
}
@@ -601,7 +605,7 @@ private async Task OnErrorOccurred(object sender, ErrorOccuredArgs e)
601605
/// Handles 'session_reconnect' notifications
602606
/// </summary>
603607
/// <param name="message">notification message received from Twitch EventSub</param>
604-
private void HandleReconnect(string message)
608+
private void HandleReconnect ( string message )
605609
{
606610
_logger?.LogReconnectRequested(SessionId);
607611
var data = JsonSerializer.Deserialize<EventSubWebsocketSessionInfoMessage>(message, _jsonSerializerOptions);
@@ -616,7 +620,7 @@ private void HandleReconnect(string message)
616620
/// Handles 'session_welcome' notifications
617621
/// </summary>
618622
/// <param name="message">notification message received from Twitch EventSub</param>
619-
private async ValueTask HandleWelcome(string message)
623+
private async ValueTask HandleWelcome ( string message )
620624
{
621625
var data = JsonSerializer.Deserialize<EventSubWebsocketSessionInfoMessage>(message, _jsonSerializerOptions);
622626

@@ -640,7 +644,7 @@ private async ValueTask HandleWelcome(string message)
640644
/// Handles 'session_disconnect' notifications
641645
/// </summary>
642646
/// <param name="message">notification message received from Twitch EventSub</param>
643-
private async Task HandleDisconnect(string message)
647+
private async Task HandleDisconnect ( string message )
644648
{
645649
var data = JsonSerializer.Deserialize<EventSubWebsocketSessionInfoMessage>(message);
646650

@@ -654,7 +658,7 @@ private async Task HandleDisconnect(string message)
654658
/// Handles 'session_keepalive' notifications
655659
/// </summary>
656660
/// <param name="message">notification message received from Twitch EventSub</param>
657-
private void HandleKeepAlive(string message)
661+
private void HandleKeepAlive ( string message )
658662
{
659663
_logger?.LogMessage(message);
660664
}
@@ -664,7 +668,7 @@ private void HandleKeepAlive(string message)
664668
/// </summary>
665669
/// <param name="message">notification message received from Twitch EventSub</param>
666670
/// <param name="subscriptionType">subscription type received from Twitch EventSub</param>
667-
private void HandleNotification(string message, string subscriptionType)
671+
private void HandleNotification ( string message, string subscriptionType )
668672
{
669673
if (_handlers != null && _handlers.TryGetValue(subscriptionType, out var handler))
670674
handler(this, message, _jsonSerializerOptions);
@@ -676,7 +680,7 @@ private void HandleNotification(string message, string subscriptionType)
676680
/// Handles 'revocation' notifications
677681
/// </summary>
678682
/// <param name="message">notification message received from Twitch EventSub</param>
679-
private void HandleRevocation(string message)
683+
private void HandleRevocation ( string message )
680684
{
681685
if (_handlers != null && _handlers.TryGetValue("revocation", out var handler))
682686
handler(this, message, _jsonSerializerOptions);
@@ -689,7 +693,7 @@ private void HandleRevocation(string message)
689693
/// </summary>
690694
/// <param name="eventName">name of the event to raise</param>
691695
/// <param name="args">args to pass with the event</param>
692-
internal async void RaiseEvent(string eventName, object args = null)
696+
internal async void RaiseEvent ( string eventName, object args = null )
693697
{
694698
var fInfo = GetType().GetField(eventName, BindingFlags.Instance | BindingFlags.NonPublic);
695699

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using System;
2+
using System.Text.Json;
3+
using TwitchLib.EventSub.Core.SubscriptionTypes.Channel;
4+
using TwitchLib.EventSub.Websockets.Core.EventArgs;
5+
using TwitchLib.EventSub.Websockets.Core.EventArgs.Channel;
6+
using TwitchLib.EventSub.Websockets.Core.Handler;
7+
using TwitchLib.EventSub.Websockets.Core.Models;
8+
9+
namespace TwitchLib.EventSub.Websockets.Handler.Channel.Chat
10+
{
11+
public class ChatNotificationHandler : INotificationHandler
12+
{
13+
public string SubscriptionType => "channel.chat.notification";
14+
15+
public void Handle ( EventSubWebsocketClient client, string jsonString, JsonSerializerOptions serializerOptions )
16+
{
17+
try
18+
{
19+
var data = JsonSerializer.Deserialize<EventSubNotification<ChannelChatNotification>>(jsonString.AsSpan(), serializerOptions);
20+
if (data is null)
21+
throw new InvalidOperationException("Parsed JSON cannot be null!");
22+
client.RaiseEvent("ChannelChatNotification", new ChannelChatNotificationArgs { Notification = data });
23+
}
24+
catch (Exception ex)
25+
{
26+
client.RaiseEvent("ErrorOccurred", new ErrorOccuredArgs { Exception = ex, Message = $"Error encountered while trying to handle {SubscriptionType} notification! Raw Json: {jsonString}" });
27+
}
28+
}
29+
}
30+
}

0 commit comments

Comments
 (0)