diff --git a/TwitchIrcClient/IRC/Callbacks.cs b/TwitchIrcClient/IRC/Callbacks.cs
index 21b7528..5d57212 100644
--- a/TwitchIrcClient/IRC/Callbacks.cs
+++ b/TwitchIrcClient/IRC/Callbacks.cs
@@ -11,7 +11,7 @@ namespace TwitchLogger.IRC
//{
// public ReceivedMessage Message = message;
//}
- public delegate void MessageCallback(ReceivedMessage message);
+ public delegate void MessageCallback(IrcConnection origin, ReceivedMessage message);
///
/// Callback to be run for received messages of specific types.
///
@@ -21,11 +21,11 @@ namespace TwitchLogger.IRC
MessageCallback Callback,
IReadOnlyList? CallbackTypes)
{
- public bool TryCall(ReceivedMessage message)
+ public bool TryCall(IrcConnection origin, ReceivedMessage message)
{
if (CallbackTypes?.Contains(message.MessageType) ?? true)
{
- Callback(message);
+ Callback(origin, message);
return true;
}
return false;
diff --git a/TwitchIrcClient/IRC/IrcConnection.cs b/TwitchIrcClient/IRC/IrcConnection.cs
index e0d15cc..df77657 100644
--- a/TwitchIrcClient/IRC/IrcConnection.cs
+++ b/TwitchIrcClient/IRC/IrcConnection.cs
@@ -12,6 +12,7 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
+using TwitchIrcClient.IRC.Messages;
using TwitchLogger.IRC.Messages;
namespace TwitchLogger.IRC
@@ -27,6 +28,15 @@ namespace TwitchLogger.IRC
public bool Connected { get; } = false;
public bool TrackUsers { get; }
public bool UsesSsl { get; }
+ private Roomstate? _LastRoomstate;
+ public Roomstate? LastRoomstate
+ { get
+ {
+ if (_LastRoomstate == null)
+ return null;
+ return new Roomstate(_LastRoomstate);
+ }
+ }
//this seems to be the only concurrentcollection that allows
//removing specific items
protected ConcurrentDictionary UserCollection = new();
@@ -61,35 +71,38 @@ namespace TwitchLogger.IRC
Token = TokenSource.Token;
if (TrackUsers)
{
- AddSystemCallback(new MessageCallbackItem(m =>
+ AddSystemCallback(new MessageCallbackItem((o, m) =>
{
if (m is NamReply nr)
foreach (var u in nr.Users)
- UserCollection.TryAdd(u, 0);
+ o.UserCollection.TryAdd(u, 0);
else
throw new ArgumentException(null, nameof(m));
}, [IrcMessageType.RPL_NAMREPLY]));
- AddSystemCallback(new MessageCallbackItem(m =>
+ AddSystemCallback(new MessageCallbackItem((o, m) =>
{
if (m is Join j)
{
- UserCollection.TryAdd(j.Username, 0);
- UserJoin(j);
+ o.UserCollection.TryAdd(j.Username, 0);
+ o.UserJoin(j);
}
else
throw new ArgumentException(null, nameof(m));
}, [IrcMessageType.JOIN]));
- AddSystemCallback(new MessageCallbackItem(m =>
+ AddSystemCallback(new MessageCallbackItem((o, m) =>
{
if (m is Part j)
{
- UserCollection.TryRemove(j.Username, out _);
- UserLeave(j);
+ o.UserCollection.TryRemove(j.Username, out _);
+ o.UserLeave(j);
}
else
throw new ArgumentException(null, nameof(m));
}, [IrcMessageType.PART]));
}
+ AddSystemCallback(new MessageCallbackItem(
+ (o, m) => { o._LastRoomstate = new Roomstate(m); },
+ [IrcMessageType.ROOMSTATE]));
}
public async Task ConnectAsync()
@@ -277,8 +290,8 @@ namespace TwitchLogger.IRC
ArgumentNullException.ThrowIfNull(message, nameof(message));
if (disposedValue)
return;
- SystemCallbacks.ForEach(c => c.TryCall(message));
- UserCallbacks.ForEach(c => c.TryCall(message));
+ SystemCallbacks.ForEach(c => c.TryCall(this, message));
+ UserCallbacks.ForEach(c => c.TryCall(this, message));
}
#region Dispose