mirror of
https://github.com/Ikatono/TwitchIrcClient.git
synced 2025-10-29 04:56:12 -05:00
Added "origin" to MessageCallbacks, and added LastRoomstate to IrcConnection
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user