Added locking to Irc Callback lists

This commit is contained in:
Cameron
2024-03-31 19:09:12 -05:00
parent 1bf8afc68b
commit 4806e50736

View File

@@ -162,8 +162,17 @@ namespace TwitchIrcClient.IRC
message += command.ToCommand() + " "; message += command.ToCommand() + " ";
if (parameters is not null && parameters.Any()) if (parameters is not null && parameters.Any())
{ {
message += string.Join(' ', parameters.SkipLast(1)); //if ((command == IrcMessageType.NICK || command == IrcMessageType.PASS)
message += " :" + parameters.Last(); // && parameters.Count() == 1)
if (false)
{
message += " " + parameters.Single();
}
else
{
message += string.Join(' ', parameters.SkipLast(1));
message += " :" + parameters.Last();
}
} }
SendLine(message); SendLine(message);
} }
@@ -185,13 +194,13 @@ namespace TwitchIrcClient.IRC
{ {
user ??= $"justinfan{Random.Shared.NextInt64(10000):D4}"; user ??= $"justinfan{Random.Shared.NextInt64(10000):D4}";
pass ??= "pass"; pass ??= "pass";
SendLine($"NICK {user}"); SendMessage(IrcMessageType.PASS, parameters: [pass]);
SendLine($"PASS {pass}"); SendMessage(IrcMessageType.NICK, parameters: [user]);
} }
public void JoinChannel(string channel) public void JoinChannel(string channel)
{ {
channel = channel.TrimStart('#'); channel = channel.TrimStart('#');
SendLine($"JOIN #{channel}"); SendMessage(IrcMessageType.JOIN, ["#" + channel]);
} }
private async void ListenForInput() private async void ListenForInput()
{ {
@@ -308,30 +317,36 @@ namespace TwitchIrcClient.IRC
public void AddCallback(MessageCallbackItem callbackItem) public void AddCallback(MessageCallbackItem callbackItem)
{ {
ObjectDisposedException.ThrowIf(disposedValue, this); ObjectDisposedException.ThrowIf(disposedValue, this);
UserCallbacks.Add(callbackItem); lock (UserCallbacks)
UserCallbacks.Add(callbackItem);
} }
public bool RemoveCallback(MessageCallbackItem callbackItem) public bool RemoveCallback(MessageCallbackItem callbackItem)
{ {
ObjectDisposedException.ThrowIf(disposedValue, this); ObjectDisposedException.ThrowIf(disposedValue, this);
return UserCallbacks.Remove(callbackItem); lock (UserCallbacks)
return UserCallbacks.Remove(callbackItem);
} }
protected void AddSystemCallback(MessageCallbackItem callbackItem) protected void AddSystemCallback(MessageCallbackItem callbackItem)
{ {
ObjectDisposedException.ThrowIf(disposedValue, this); ObjectDisposedException.ThrowIf(disposedValue, this);
SystemCallbacks.Add(callbackItem); lock (SystemCallbacks)
SystemCallbacks.Add(callbackItem);
} }
protected bool RemoveSystemCallback(MessageCallbackItem callbackItem) protected bool RemoveSystemCallback(MessageCallbackItem callbackItem)
{ {
ObjectDisposedException.ThrowIf(disposedValue, this); ObjectDisposedException.ThrowIf(disposedValue, this);
return SystemCallbacks.Remove(callbackItem); lock (SystemCallbacks)
return SystemCallbacks.Remove(callbackItem);
} }
private void RunCallbacks(ReceivedMessage message) private void RunCallbacks(ReceivedMessage message)
{ {
ArgumentNullException.ThrowIfNull(message, nameof(message)); ArgumentNullException.ThrowIfNull(message, nameof(message));
if (disposedValue) if (disposedValue)
return; return;
SystemCallbacks.ForEach(c => c.TryCall(this, message)); lock (SystemCallbacks)
UserCallbacks.ForEach(c => c.TryCall(this, message)); SystemCallbacks.ForEach(c => c.TryCall(this, message));
lock (UserCallbacks)
UserCallbacks.ForEach(c => c.TryCall(this, message));
} }
#region Dispose #region Dispose
@@ -346,6 +361,7 @@ namespace TwitchIrcClient.IRC
TokenSource.Dispose(); TokenSource.Dispose();
Client?.Dispose(); Client?.Dispose();
_HeartbeatTimer?.Dispose(); _HeartbeatTimer?.Dispose();
_Stream?.Dispose();
} }
disposedValue = true; disposedValue = true;
} }