Added "origin" to MessageCallbacks, and added LastRoomstate to IrcConnection

This commit is contained in:
Cameron
2024-03-20 05:08:37 -05:00
parent a1e5d9f533
commit 7e089e1705
2 changed files with 26 additions and 13 deletions

View File

@@ -11,7 +11,7 @@ namespace TwitchLogger.IRC
//{ //{
// public ReceivedMessage Message = message; // public ReceivedMessage Message = message;
//} //}
public delegate void MessageCallback(ReceivedMessage message); public delegate void MessageCallback(IrcConnection origin, ReceivedMessage message);
/// <summary> /// <summary>
/// Callback to be run for received messages of specific types. /// Callback to be run for received messages of specific types.
/// </summary> /// </summary>
@@ -21,11 +21,11 @@ namespace TwitchLogger.IRC
MessageCallback Callback, MessageCallback Callback,
IReadOnlyList<IrcMessageType>? CallbackTypes) IReadOnlyList<IrcMessageType>? CallbackTypes)
{ {
public bool TryCall(ReceivedMessage message) public bool TryCall(IrcConnection origin, ReceivedMessage message)
{ {
if (CallbackTypes?.Contains(message.MessageType) ?? true) if (CallbackTypes?.Contains(message.MessageType) ?? true)
{ {
Callback(message); Callback(origin, message);
return true; return true;
} }
return false; return false;

View File

@@ -12,6 +12,7 @@ using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Timers; using System.Timers;
using TwitchIrcClient.IRC.Messages;
using TwitchLogger.IRC.Messages; using TwitchLogger.IRC.Messages;
namespace TwitchLogger.IRC namespace TwitchLogger.IRC
@@ -27,6 +28,15 @@ namespace TwitchLogger.IRC
public bool Connected { get; } = false; public bool Connected { get; } = false;
public bool TrackUsers { get; } public bool TrackUsers { get; }
public bool UsesSsl { 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 //this seems to be the only concurrentcollection that allows
//removing specific items //removing specific items
protected ConcurrentDictionary<string, byte> UserCollection = new(); protected ConcurrentDictionary<string, byte> UserCollection = new();
@@ -61,35 +71,38 @@ namespace TwitchLogger.IRC
Token = TokenSource.Token; Token = TokenSource.Token;
if (TrackUsers) if (TrackUsers)
{ {
AddSystemCallback(new MessageCallbackItem(m => AddSystemCallback(new MessageCallbackItem((o, m) =>
{ {
if (m is NamReply nr) if (m is NamReply nr)
foreach (var u in nr.Users) foreach (var u in nr.Users)
UserCollection.TryAdd(u, 0); o.UserCollection.TryAdd(u, 0);
else else
throw new ArgumentException(null, nameof(m)); throw new ArgumentException(null, nameof(m));
}, [IrcMessageType.RPL_NAMREPLY])); }, [IrcMessageType.RPL_NAMREPLY]));
AddSystemCallback(new MessageCallbackItem(m => AddSystemCallback(new MessageCallbackItem((o, m) =>
{ {
if (m is Join j) if (m is Join j)
{ {
UserCollection.TryAdd(j.Username, 0); o.UserCollection.TryAdd(j.Username, 0);
UserJoin(j); o.UserJoin(j);
} }
else else
throw new ArgumentException(null, nameof(m)); throw new ArgumentException(null, nameof(m));
}, [IrcMessageType.JOIN])); }, [IrcMessageType.JOIN]));
AddSystemCallback(new MessageCallbackItem(m => AddSystemCallback(new MessageCallbackItem((o, m) =>
{ {
if (m is Part j) if (m is Part j)
{ {
UserCollection.TryRemove(j.Username, out _); o.UserCollection.TryRemove(j.Username, out _);
UserLeave(j); o.UserLeave(j);
} }
else else
throw new ArgumentException(null, nameof(m)); throw new ArgumentException(null, nameof(m));
}, [IrcMessageType.PART])); }, [IrcMessageType.PART]));
} }
AddSystemCallback(new MessageCallbackItem(
(o, m) => { o._LastRoomstate = new Roomstate(m); },
[IrcMessageType.ROOMSTATE]));
} }
public async Task<bool> ConnectAsync() public async Task<bool> ConnectAsync()
@@ -277,8 +290,8 @@ namespace TwitchLogger.IRC
ArgumentNullException.ThrowIfNull(message, nameof(message)); ArgumentNullException.ThrowIfNull(message, nameof(message));
if (disposedValue) if (disposedValue)
return; return;
SystemCallbacks.ForEach(c => c.TryCall(message)); SystemCallbacks.ForEach(c => c.TryCall(this, message));
UserCallbacks.ForEach(c => c.TryCall(message)); UserCallbacks.ForEach(c => c.TryCall(this, message));
} }
#region Dispose #region Dispose