.net 5.0 and apply formatting

This commit is contained in:
Ben Harris 2021-09-17 16:24:13 -04:00
parent f085b631a1
commit 3049122294
33 changed files with 161 additions and 300 deletions

View File

@ -1,5 +1,5 @@
using System.Linq; using System.Collections.Generic;
using System.Collections.Generic; using System.Linq;
namespace ChatSharp namespace ChatSharp
{ {

View File

@ -1,51 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <TargetFrameworks>net5.0</TargetFrameworks>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{4033AFFA-BEA3-4BDF-84EA-59A23360FD36}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>ChatSharp</RootNamespace>
<AssemblyName>ChatSharp</AssemblyName>
<FileAlignment>512</FileAlignment>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<TargetFrameworks>netstandard2.0;net4</TargetFrameworks>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Debug\ChatSharp.xml</DocumentationFile>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Folder Include="Properties\" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild"></Target><Target Name="AfterBuild"></Target>
-->
</Project> </Project>

View File

@ -19,7 +19,7 @@ namespace ChatSharp.Events
/// The original topic. /// The original topic.
/// </summary> /// </summary>
public string OldTopic { get; set; } public string OldTopic { get; set; }
internal ChannelTopicEventArgs(IrcChannel channel, string oldTopic, string topic) internal ChannelTopicEventArgs(IrcChannel channel, string oldTopic, string topic)
{ {
Channel = channel; Channel = channel;

View File

@ -1,5 +1,4 @@
using System; using System;
using System.Net.Sockets;
namespace ChatSharp.Events namespace ChatSharp.Events
{ {

View File

@ -1,5 +1,4 @@
using System; using System;
using System.Net.Sockets;
namespace ChatSharp.Events namespace ChatSharp.Events
{ {

View File

@ -30,7 +30,7 @@ namespace ChatSharp
/// <summary> /// <summary>
/// The reason provided for the kick (may be null). /// The reason provided for the kick (may be null).
/// </summary> /// </summary>
public string Reason { get; set; } public string Reason { get; set; }
} }
} }

View File

@ -17,7 +17,7 @@ namespace ChatSharp.Handlers
case "LS": case "LS":
client.IsNegotiatingCapabilities = true; client.IsNegotiatingCapabilities = true;
// Parse server capabilities // Parse server capabilities
var serverCapsString = (message.Parameters[2] == "*" ? message.Parameters[3] : message.Parameters[2]); var serverCapsString = message.Parameters[2] == "*" ? message.Parameters[3] : message.Parameters[2];
serverCaps.AddRange(serverCapsString.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)); serverCaps.AddRange(serverCapsString.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries));
// CAP 3.2 multiline support. Send CAP requests on the last CAP LS line. // CAP 3.2 multiline support. Send CAP requests on the last CAP LS line.
@ -77,7 +77,7 @@ namespace ChatSharp.Handlers
break; break;
case "LIST": case "LIST":
var activeCapsString = (message.Parameters[2] == "*" ? message.Parameters[3] : message.Parameters[2]); var activeCapsString = message.Parameters[2] == "*" ? message.Parameters[3] : message.Parameters[2];
var activeCaps = activeCapsString.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); var activeCaps = activeCapsString.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
// Check which cap we have that isn't active but the server lists // Check which cap we have that isn't active but the server lists
@ -104,7 +104,8 @@ namespace ChatSharp.Handlers
// Disable each recently server-disabled capability // Disable each recently server-disabled capability
disabledCaps.ForEach( disabledCaps.ForEach(
cap => { cap =>
{
if (client.Capabilities.Contains(cap) && client.Capabilities[cap].IsEnabled) if (client.Capabilities.Contains(cap) && client.Capabilities[cap].IsEnabled)
client.Capabilities.Disable(cap); client.Capabilities.Disable(cap);
} }

View File

@ -75,8 +75,8 @@ namespace ChatSharp.Handlers
// Parse hostmask // Parse hostmask
var nick = hostmask.Substring(0, hostmask.IndexOf("!")); var nick = hostmask.Substring(0, hostmask.IndexOf("!"));
var ident = hostmask.Substring(nick.Length + 1, hostmask.LastIndexOf("@") - (nick.Length + 1)); var ident = hostmask[(nick.Length + 1)..hostmask.LastIndexOf("@")];
var hostname = hostmask.Substring(hostmask.LastIndexOf("@") + 1); var hostname = hostmask[(hostmask.LastIndexOf("@") + 1)..];
// Get user modes // Get user modes
var modes = client.ServerInfo.GetModesForNick(nick); var modes = client.ServerInfo.GetModesForNick(nick);

View File

@ -1,6 +1,3 @@
using ChatSharp.Events;
using System.Linq;
namespace ChatSharp.Handlers namespace ChatSharp.Handlers
{ {
/// <summary> /// <summary>

View File

@ -4,8 +4,8 @@ namespace ChatSharp.Handlers
{ {
public static void HandleBanListPart(IrcClient client, IrcMessage message) public static void HandleBanListPart(IrcClient client, IrcMessage message)
{ {
var parameterString = message.RawMessage.Substring(message.RawMessage.IndexOf(' ')); var parameterString = message.RawMessage[message.RawMessage.IndexOf(' ')..];
var parameters = parameterString.Substring(parameterString.IndexOf(' ')).Split(' '); var parameters = parameterString[parameterString.IndexOf(' ')..].Split(' ');
var request = client.RequestManager.PeekOperation("GETMODE b " + parameters[1]); var request = client.RequestManager.PeekOperation("GETMODE b " + parameters[1]);
var list = (MaskCollection)request.State; var list = (MaskCollection)request.State;
list.Add(new Mask(parameters[2], client.Users.GetOrAdd(parameters[3]), list.Add(new Mask(parameters[2], client.Users.GetOrAdd(parameters[3]),
@ -15,14 +15,13 @@ namespace ChatSharp.Handlers
public static void HandleBanListEnd(IrcClient client, IrcMessage message) public static void HandleBanListEnd(IrcClient client, IrcMessage message)
{ {
var request = client.RequestManager.DequeueOperation("GETMODE b " + message.Parameters[1]); var request = client.RequestManager.DequeueOperation("GETMODE b " + message.Parameters[1]);
if (request.Callback != null) request.Callback?.Invoke(request);
request.Callback(request);
} }
public static void HandleExceptionListPart(IrcClient client, IrcMessage message) public static void HandleExceptionListPart(IrcClient client, IrcMessage message)
{ {
var parameterString = message.RawMessage.Substring(message.RawMessage.IndexOf(' ') + 1); var parameterString = message.RawMessage[(message.RawMessage.IndexOf(' ') + 1)..];
var parameters = parameterString.Substring(parameterString.IndexOf(' ') + 1).Split(' '); var parameters = parameterString[(parameterString.IndexOf(' ') + 1)..].Split(' ');
var request = client.RequestManager.PeekOperation("GETMODE e " + parameters[1]); var request = client.RequestManager.PeekOperation("GETMODE e " + parameters[1]);
var list = (MaskCollection)request.State; var list = (MaskCollection)request.State;
list.Add(new Mask(parameters[2], client.Users.GetOrAdd(parameters[3]), list.Add(new Mask(parameters[2], client.Users.GetOrAdd(parameters[3]),
@ -32,14 +31,13 @@ namespace ChatSharp.Handlers
public static void HandleExceptionListEnd(IrcClient client, IrcMessage message) public static void HandleExceptionListEnd(IrcClient client, IrcMessage message)
{ {
var request = client.RequestManager.DequeueOperation("GETMODE e " + message.Parameters[1]); var request = client.RequestManager.DequeueOperation("GETMODE e " + message.Parameters[1]);
if (request.Callback != null) request.Callback?.Invoke(request);
request.Callback(request);
} }
public static void HandleInviteListPart(IrcClient client, IrcMessage message) public static void HandleInviteListPart(IrcClient client, IrcMessage message)
{ {
var parameterString = message.RawMessage.Substring(message.RawMessage.IndexOf(' ') + 1); var parameterString = message.RawMessage[(message.RawMessage.IndexOf(' ') + 1)..];
var parameters = parameterString.Substring(parameterString.IndexOf(' ') + 1).Split(' '); var parameters = parameterString[(parameterString.IndexOf(' ') + 1)..].Split(' ');
var request = client.RequestManager.PeekOperation("GETMODE I " + parameters[1]); var request = client.RequestManager.PeekOperation("GETMODE I " + parameters[1]);
var list = (MaskCollection)request.State; var list = (MaskCollection)request.State;
list.Add(new Mask(parameters[2], client.Users.GetOrAdd(parameters[3]), list.Add(new Mask(parameters[2], client.Users.GetOrAdd(parameters[3]),
@ -49,14 +47,13 @@ namespace ChatSharp.Handlers
public static void HandleInviteListEnd(IrcClient client, IrcMessage message) public static void HandleInviteListEnd(IrcClient client, IrcMessage message)
{ {
var request = client.RequestManager.DequeueOperation("GETMODE I " + message.Parameters[1]); var request = client.RequestManager.DequeueOperation("GETMODE I " + message.Parameters[1]);
if (request.Callback != null) request.Callback?.Invoke(request);
request.Callback(request);
} }
public static void HandleQuietListPart(IrcClient client, IrcMessage message) public static void HandleQuietListPart(IrcClient client, IrcMessage message)
{ {
var parameterString = message.RawMessage.Substring(message.RawMessage.IndexOf(' ') + 1); var parameterString = message.RawMessage[(message.RawMessage.IndexOf(' ') + 1)..];
var parameters = parameterString.Substring(parameterString.IndexOf(' ') + 1).Split(' '); var parameters = parameterString[(parameterString.IndexOf(' ') + 1)..].Split(' ');
var request = client.RequestManager.PeekOperation("GETMODE q " + parameters[1]); var request = client.RequestManager.PeekOperation("GETMODE q " + parameters[1]);
var list = (MaskCollection)request.State; var list = (MaskCollection)request.State;
list.Add(new Mask(parameters[2], client.Users.GetOrAdd(parameters[3]), list.Add(new Mask(parameters[2], client.Users.GetOrAdd(parameters[3]),
@ -66,8 +63,7 @@ namespace ChatSharp.Handlers
public static void HandleQuietListEnd(IrcClient client, IrcMessage message) public static void HandleQuietListEnd(IrcClient client, IrcMessage message)
{ {
var request = client.RequestManager.DequeueOperation("GETMODE q " + message.Parameters[1]); var request = client.RequestManager.DequeueOperation("GETMODE q " + message.Parameters[1]);
if (request.Callback != null) request.Callback?.Invoke(request);
request.Callback(request);
} }
} }
} }

View File

@ -16,7 +16,7 @@ namespace ChatSharp.Handlers
{ {
if (message.Parameters.Length != 2) if (message.Parameters.Length != 2)
throw new IrcProtocolException("372 MOTD message is incorrectly formatted."); throw new IrcProtocolException("372 MOTD message is incorrectly formatted.");
var part = message.Parameters[1].Substring(2); var part = message.Parameters[1][2..];
MOTD += part + Environment.NewLine; MOTD += part + Environment.NewLine;
client.OnMOTDPartReceived(new ServerMOTDEventArgs(part)); client.OnMOTDPartReceived(new ServerMOTDEventArgs(part));
} }
@ -27,19 +27,18 @@ namespace ChatSharp.Handlers
client.OnConnectionComplete(new EventArgs()); client.OnConnectionComplete(new EventArgs());
// Verify our identity // Verify our identity
VerifyOurIdentity(client); VerifyOurIdentity(client);
} }
public static void HandleMOTDNotFound(IrcClient client, IrcMessage message) public static void HandleMOTDNotFound(IrcClient client, IrcMessage message)
{ {
client.OnMOTDReceived(new ServerMOTDEventArgs(MOTD)); client.OnMOTDReceived(new ServerMOTDEventArgs(MOTD));
client.OnConnectionComplete(new EventArgs()); client.OnConnectionComplete(new EventArgs());
VerifyOurIdentity(client); VerifyOurIdentity(client);
} }
private static void VerifyOurIdentity(IrcClient client) private static void VerifyOurIdentity(IrcClient client)
{ {
if (client.Settings.WhoIsOnConnect) if (client.Settings.WhoIsOnConnect)
{ {
client.WhoIs(client.User.Nick, whois => client.WhoIs(client.User.Nick, whois =>

View File

@ -1,7 +1,6 @@
using ChatSharp.Events; using ChatSharp.Events;
using System.Linq;
using System.Collections.Generic; using System.Collections.Generic;
using System; using System.Linq;
namespace ChatSharp.Handlers namespace ChatSharp.Handlers
{ {
@ -181,12 +180,12 @@ namespace ChatSharp.Handlers
// TODO: Support the ones here that aren't done properly // TODO: Support the ones here that aren't done properly
if (client.ServerInfo.SupportedChannelModes.ParameterizedSettings.Contains(c)) if (client.ServerInfo.SupportedChannelModes.ParameterizedSettings.Contains(c))
{ {
client.OnModeChanged(new ModeChangeEventArgs(channel.Name, new IrcUser(message.Prefix), client.OnModeChanged(new ModeChangeEventArgs(channel.Name, new IrcUser(message.Prefix),
(add ? "+" : "-") + c + " " + message.Parameters[i++])); (add ? "+" : "-") + c + " " + message.Parameters[i++]));
} }
else if (client.ServerInfo.SupportedChannelModes.ChannelLists.Contains(c)) else if (client.ServerInfo.SupportedChannelModes.ChannelLists.Contains(c))
{ {
client.OnModeChanged(new ModeChangeEventArgs(channel.Name, new IrcUser(message.Prefix), client.OnModeChanged(new ModeChangeEventArgs(channel.Name, new IrcUser(message.Prefix),
(add ? "+" : "-") + c + " " + message.Parameters[i++])); (add ? "+" : "-") + c + " " + message.Parameters[i++]));
} }
else if (client.ServerInfo.SupportedChannelModes.ChannelUserModes.Contains(c)) else if (client.ServerInfo.SupportedChannelModes.ChannelUserModes.Contains(c))
@ -213,7 +212,7 @@ namespace ChatSharp.Handlers
if (channel.UsersByMode[c].Contains(user.Nick)) if (channel.UsersByMode[c].Contains(user.Nick))
user.ChannelModes[channel] = null; user.ChannelModes[channel] = null;
} }
client.OnModeChanged(new ModeChangeEventArgs(channel.Name, new IrcUser(message.Prefix), client.OnModeChanged(new ModeChangeEventArgs(channel.Name, new IrcUser(message.Prefix),
(add ? "+" : "-") + c + " " + message.Parameters[i++])); (add ? "+" : "-") + c + " " + message.Parameters[i++]));
} }
if (client.ServerInfo.SupportedChannelModes.Settings.Contains(c)) if (client.ServerInfo.SupportedChannelModes.Settings.Contains(c))
@ -225,7 +224,7 @@ namespace ChatSharp.Handlers
} }
else else
channel.Mode = channel.Mode.Replace(c.ToString(), string.Empty); channel.Mode = channel.Mode.Replace(c.ToString(), string.Empty);
client.OnModeChanged(new ModeChangeEventArgs(channel.Name, new IrcUser(message.Prefix), client.OnModeChanged(new ModeChangeEventArgs(channel.Name, new IrcUser(message.Prefix),
(add ? "+" : "-") + c)); (add ? "+" : "-") + c));
} }
} }

View File

@ -1,7 +1,6 @@
using System; using System;
using System.Collections.Generic;
using System.Text;
using System.Linq; using System.Linq;
using System.Text;
namespace ChatSharp.Handlers namespace ChatSharp.Handlers
{ {
@ -14,7 +13,7 @@ namespace ChatSharp.Handlers
if (message.Parameters[0] == "+") if (message.Parameters[0] == "+")
{ {
// Based off irc-framework implementation // Based off irc-framework implementation
var plainString = string.Format("{0}\0{0}\0{1}", client.User.Nick, client.User.Password); var plainString = $"{client.User.Nick}\0{client.User.Nick}\0{client.User.Password}";
var b64Bytes = Encoding.UTF8.GetBytes(Convert.ToBase64String(Encoding.UTF8.GetBytes(plainString))); var b64Bytes = Encoding.UTF8.GetBytes(Convert.ToBase64String(Encoding.UTF8.GetBytes(plainString)));
while (b64Bytes.Length >= 400) while (b64Bytes.Length >= 400)

View File

@ -1,5 +1,4 @@
using ChatSharp.Events; using ChatSharp.Events;
using System.Linq;
namespace ChatSharp.Handlers namespace ChatSharp.Handlers
{ {
@ -20,7 +19,7 @@ namespace ChatSharp.Handlers
else else
{ {
key = item.Remove(item.IndexOf('=')); key = item.Remove(item.IndexOf('='));
value = item.Substring(item.IndexOf('=') + 1); value = item[(item.IndexOf('=') + 1)..];
} }
// TODO: Consider doing this differently // TODO: Consider doing this differently
// TODO: Allow users to specify other things to handle // TODO: Allow users to specify other things to handle
@ -29,9 +28,9 @@ namespace ChatSharp.Handlers
switch (key.ToUpper()) switch (key.ToUpper())
{ {
case "PREFIX": case "PREFIX":
var modes = value.Substring(1, value.IndexOf(')') - 1); var modes = value[1..value.IndexOf(')')];
var prefixes = value.Substring(value.IndexOf(')') + 1); var prefixes = value[(value.IndexOf(')') + 1)..];
client.ServerInfo.Prefixes = new[] {modes, prefixes}; client.ServerInfo.Prefixes = new[] { modes, prefixes };
break; break;
case "CHANTYPES": case "CHANTYPES":
client.ServerInfo.ChannelTypes = value.ToCharArray(); client.ServerInfo.ChannelTypes = value.ToCharArray();
@ -58,7 +57,7 @@ namespace ChatSharp.Handlers
for (int i = 0; i < limits.Length; i++) for (int i = 0; i < limits.Length; i++)
{ {
var limitedModes = limits[i].Remove(limits[i].IndexOf(':')); var limitedModes = limits[i].Remove(limits[i].IndexOf(':'));
var limit = int.Parse(limits[i].Substring(limits[i].IndexOf(':') + 1)); var limit = int.Parse(limits[i][(limits[i].IndexOf(':') + 1)..]);
foreach (var mode in limitedModes) foreach (var mode in limitedModes)
client.ServerInfo.ModeListLimits[i] = new ServerInfo.ModeListLimit(mode, limit); client.ServerInfo.ModeListLimits[i] = new ServerInfo.ModeListLimit(mode, limit);
} }

View File

@ -1,6 +1,6 @@
using System; using System;
using System.Linq;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
namespace ChatSharp.Handlers namespace ChatSharp.Handlers
{ {
@ -57,7 +57,7 @@ namespace ChatSharp.Handlers
var channels = message.Parameters[2].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); var channels = message.Parameters[2].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < channels.Length; i++) for (int i = 0; i < channels.Length; i++)
if (!channels[i].StartsWith("#")) if (!channels[i].StartsWith("#"))
channels[i] = channels[i].Substring(1); channels[i] = channels[i][1..];
whois.Channels = whois.Channels.Concat(channels).ToArray(); whois.Channels = whois.Channels.Concat(channels).ToArray();
} }
@ -67,8 +67,7 @@ namespace ChatSharp.Handlers
var whois = (WhoIs)request.State; var whois = (WhoIs)request.State;
if (!client.Users.Contains(whois.User.Nick)) if (!client.Users.Contains(whois.User.Nick))
client.Users.Add(whois.User); client.Users.Add(whois.User);
if (request.Callback != null) request.Callback?.Invoke(request);
request.Callback(request);
client.OnWhoIsReceived(new Events.WhoIsReceivedEventArgs(whois)); client.OnWhoIsReceived(new Events.WhoIsReceivedEventArgs(whois));
} }
@ -80,15 +79,18 @@ namespace ChatSharp.Handlers
if (query.Key != string.Empty && query.Value != null) if (query.Key != string.Empty && query.Value != null)
{ {
var whoList = (List<ExtendedWho>)client.RequestManager.PeekOperation(query.Key).State; var whoList = (List<ExtendedWho>)client.RequestManager.PeekOperation(query.Key).State;
var who = new ExtendedWho(); var who = new ExtendedWho
{
who.Channel = message.Parameters[1]; Channel = message.Parameters[1],
who.User.User = message.Parameters[2]; User = new IrcUser
who.IP = message.Parameters[3]; {
who.Server = message.Parameters[4]; User = message.Parameters[2],
who.User.Nick = message.Parameters[5]; Nick = message.Parameters[5]
who.Flags = message.Parameters[6]; },
IP = message.Parameters[3],
Server = message.Parameters[4],
Flags = message.Parameters[6]
};
var supposedRealName = message.Parameters[7]; var supposedRealName = message.Parameters[7];
@ -96,7 +98,7 @@ namespace ChatSharp.Handlers
var hops = supposedRealName.Substring(0, supposedRealName.IndexOf(" ")); var hops = supposedRealName.Substring(0, supposedRealName.IndexOf(" "));
who.Hops = int.Parse(hops); who.Hops = int.Parse(hops);
var realName = supposedRealName.Substring(supposedRealName.IndexOf(" ") + 1); var realName = supposedRealName[(supposedRealName.IndexOf(" ") + 1)..];
who.User.RealName = realName; who.User.RealName = realName;
whoList.Add(who); whoList.Add(who);

View File

@ -1,7 +1,4 @@
using System.Collections.Generic; namespace ChatSharp
using System.Linq;
namespace ChatSharp
{ {
/// <summary> /// <summary>
/// A IRC capability. /// A IRC capability.

View File

@ -14,7 +14,7 @@ namespace ChatSharp
/// <summary> /// <summary>
/// The channel topic. Will send a TOPIC command if set. /// The channel topic. Will send a TOPIC command if set.
/// </summary> /// </summary>
public string Topic public string Topic
{ {
get get
{ {
@ -123,8 +123,8 @@ namespace ChatSharp
/// <returns></returns> /// <returns></returns>
public override bool Equals(object obj) public override bool Equals(object obj)
{ {
if (obj is IrcChannel) if (obj is IrcChannel channel)
return Equals((IrcChannel)obj); return Equals(channel);
return false; return false;
} }

View File

@ -22,7 +22,7 @@ namespace ChatSharp
{ {
const string illegalCharacters = "\r\n\0"; const string illegalCharacters = "\r\n\0";
if (destinations == null || !destinations.Any()) throw new InvalidOperationException("Message must have at least one target."); if (destinations == null || !destinations.Any()) throw new InvalidOperationException("Message must have at least one target.");
if (illegalCharacters.Any(message.Contains)) throw new ArgumentException("Illegal characters are present in message.", "message"); if (illegalCharacters.Any(message.Contains)) throw new ArgumentException("Illegal characters are present in message.", nameof(message));
string to = string.Join(",", destinations); string to = string.Join(",", destinations);
SendRawMessage("PRIVMSG {0} :{1}{2}", to, PrivmsgPrefix, message); SendRawMessage("PRIVMSG {0} :{1}{2}", to, PrivmsgPrefix, message);
} }
@ -34,7 +34,7 @@ namespace ChatSharp
{ {
const string illegalCharacters = "\r\n\0"; const string illegalCharacters = "\r\n\0";
if (destinations == null || !destinations.Any()) throw new InvalidOperationException("Message must have at least one target."); if (destinations == null || !destinations.Any()) throw new InvalidOperationException("Message must have at least one target.");
if (illegalCharacters.Any(message.Contains)) throw new ArgumentException("Illegal characters are present in message.", "message"); if (illegalCharacters.Any(message.Contains)) throw new ArgumentException("Illegal characters are present in message.", nameof(message));
string to = string.Join(",", destinations); string to = string.Join(",", destinations);
SendRawMessage("PRIVMSG {0} :\x0001ACTION {1}{2}\x0001", to, PrivmsgPrefix, message); SendRawMessage("PRIVMSG {0} :\x0001ACTION {1}{2}\x0001", to, PrivmsgPrefix, message);
} }
@ -46,7 +46,7 @@ namespace ChatSharp
{ {
const string illegalCharacters = "\r\n\0"; const string illegalCharacters = "\r\n\0";
if (destinations == null || !destinations.Any()) throw new InvalidOperationException("Message must have at least one target."); if (destinations == null || !destinations.Any()) throw new InvalidOperationException("Message must have at least one target.");
if (illegalCharacters.Any(message.Contains)) throw new ArgumentException("Illegal characters are present in message.", "message"); if (illegalCharacters.Any(message.Contains)) throw new ArgumentException("Illegal characters are present in message.", nameof(message));
string to = string.Join(",", destinations); string to = string.Join(",", destinations);
SendRawMessage("NOTICE {0} :{1}{2}", to, PrivmsgPrefix, message); SendRawMessage("NOTICE {0} :{1}{2}", to, PrivmsgPrefix, message);
} }
@ -161,8 +161,7 @@ namespace ChatSharp
var whois = new WhoIs(); var whois = new WhoIs();
RequestManager.QueueOperation("WHOIS " + nick, new RequestOperation(whois, ro => RequestManager.QueueOperation("WHOIS " + nick, new RequestOperation(whois, ro =>
{ {
if (callback != null) callback?.Invoke((WhoIs)ro.State);
callback((WhoIs)ro.State);
})); }));
SendRawMessage("WHOIS {0}", nick); SendRawMessage("WHOIS {0}", nick);
} }
@ -224,8 +223,7 @@ namespace ChatSharp
RequestManager.QueueOperation("MODE " + channel, new RequestOperation(channel, ro => RequestManager.QueueOperation("MODE " + channel, new RequestOperation(channel, ro =>
{ {
var c = Channels[(string)ro.State]; var c = Channels[(string)ro.State];
if (callback != null) callback?.Invoke(c);
callback(c);
})); }));
SendRawMessage("MODE {0}", channel); SendRawMessage("MODE {0}", channel);
} }
@ -247,8 +245,7 @@ namespace ChatSharp
RequestManager.QueueOperation("GETMODE " + mode + " " + channel, new RequestOperation(new MaskCollection(), ro => RequestManager.QueueOperation("GETMODE " + mode + " " + channel, new RequestOperation(new MaskCollection(), ro =>
{ {
var c = (MaskCollection)ro.State; var c = (MaskCollection)ro.State;
if (callback != null) callback?.Invoke(c);
callback(c);
})); }));
SendRawMessage("MODE {0} {1}", channel, mode); SendRawMessage("MODE {0} {1}", channel, mode);
} }

View File

@ -152,11 +152,8 @@ namespace ChatSharp
/// <param name="useSSL">Connect with SSL if true.</param> /// <param name="useSSL">Connect with SSL if true.</param>
public IrcClient(string serverAddress, IrcUser user, bool useSSL = false) public IrcClient(string serverAddress, IrcUser user, bool useSSL = false)
{ {
if (serverAddress == null) throw new ArgumentNullException("serverAddress"); User = user ?? throw new ArgumentNullException(nameof(user));
if (user == null) throw new ArgumentNullException("user"); ServerAddress = serverAddress ?? throw new ArgumentNullException(nameof(serverAddress));
User = user;
ServerAddress = serverAddress;
Encoding = Encoding.UTF8; Encoding = Encoding.UTF8;
Settings = new ClientSettings(); Settings = new ClientSettings();
Handlers = new Dictionary<string, MessageHandler>(); Handlers = new Dictionary<string, MessageHandler>();
@ -167,8 +164,8 @@ namespace ChatSharp
ServerInfo = new ServerInfo(); ServerInfo = new ServerInfo();
PrivmsgPrefix = ""; PrivmsgPrefix = "";
Channels = User.Channels = new ChannelCollection(this); Channels = User.Channels = new ChannelCollection(this);
Users = new UserPool(); // Add self to user pool
Users.Add(User); // Add self to user pool Users = new UserPool { User };
Capabilities = new CapabilityPool(); Capabilities = new CapabilityPool();
// List of supported capabilities // List of supported capabilities
@ -193,7 +190,7 @@ namespace ChatSharp
ReadBuffer = new byte[ReadBufferLength]; ReadBuffer = new byte[ReadBufferLength];
ReadBufferIndex = 0; ReadBufferIndex = 0;
PingTimer = new Timer(30000); PingTimer = new Timer(30000);
PingTimer.Elapsed += (sender, e) => PingTimer.Elapsed += (sender, e) =>
{ {
if (!string.IsNullOrEmpty(ServerNameFromPing)) if (!string.IsNullOrEmpty(ServerNameFromPing))
SendRawMessage("PING :{0}", ServerNameFromPing); SendRawMessage("PING :{0}", ServerNameFromPing);
@ -202,9 +199,9 @@ namespace ChatSharp
checkQueue.Elapsed += (sender, e) => checkQueue.Elapsed += (sender, e) =>
{ {
string nextMessage; string nextMessage;
if (WriteQueue.Count > 0) if (!WriteQueue.IsEmpty)
{ {
while (!WriteQueue.TryDequeue(out nextMessage)); while (!WriteQueue.TryDequeue(out nextMessage)) ;
SendRawMessage(nextMessage); SendRawMessage(nextMessage);
} }
}; };
@ -289,8 +286,7 @@ namespace ChatSharp
} }
catch (IOException e) catch (IOException e)
{ {
var socketException = e.InnerException as SocketException; if (e.InnerException is SocketException socketException)
if (socketException != null)
OnNetworkError(new SocketErrorEventArgs(socketException.SocketErrorCode)); OnNetworkError(new SocketErrorEventArgs(socketException.SocketErrorCode));
else else
throw; throw;
@ -375,8 +371,7 @@ namespace ChatSharp
} }
catch (IOException e) catch (IOException e)
{ {
var socketException = e.InnerException as SocketException; if (e.InnerException is SocketException socketException)
if (socketException != null)
OnNetworkError(new SocketErrorEventArgs(socketException.SocketErrorCode)); OnNetworkError(new SocketErrorEventArgs(socketException.SocketErrorCode));
else else
throw; throw;
@ -390,9 +385,9 @@ namespace ChatSharp
OnRawMessageSent(new RawMessageEventArgs((string)result.AsyncState, true)); OnRawMessageSent(new RawMessageEventArgs((string)result.AsyncState, true));
string nextMessage; string nextMessage;
if (WriteQueue.Count > 0) if (!WriteQueue.IsEmpty)
{ {
while (!WriteQueue.TryDequeue(out nextMessage)); while (!WriteQueue.TryDequeue(out nextMessage)) ;
SendRawMessage(nextMessage); SendRawMessage(nextMessage);
} }
} }
@ -403,7 +398,7 @@ namespace ChatSharp
public event EventHandler<Events.ErrorReplyEventArgs> ErrorReply; public event EventHandler<Events.ErrorReplyEventArgs> ErrorReply;
internal void OnErrorReply(Events.ErrorReplyEventArgs e) internal void OnErrorReply(Events.ErrorReplyEventArgs e)
{ {
if (ErrorReply != null) ErrorReply(this, e); ErrorReply?.Invoke(this, e);
} }
/// <summary> /// <summary>
/// Raised for errors. /// Raised for errors.
@ -411,7 +406,7 @@ namespace ChatSharp
public event EventHandler<Events.ErrorEventArgs> Error; public event EventHandler<Events.ErrorEventArgs> Error;
internal void OnError(Events.ErrorEventArgs e) internal void OnError(Events.ErrorEventArgs e)
{ {
if (Error != null) Error(this, e); Error?.Invoke(this, e);
} }
/// <summary> /// <summary>
/// Raised for socket errors. ChatSharp does not automatically reconnect. /// Raised for socket errors. ChatSharp does not automatically reconnect.
@ -419,7 +414,7 @@ namespace ChatSharp
public event EventHandler<SocketErrorEventArgs> NetworkError; public event EventHandler<SocketErrorEventArgs> NetworkError;
internal void OnNetworkError(SocketErrorEventArgs e) internal void OnNetworkError(SocketErrorEventArgs e)
{ {
if (NetworkError != null) NetworkError(this, e); NetworkError?.Invoke(this, e);
} }
/// <summary> /// <summary>
/// Occurs when a raw message is sent. /// Occurs when a raw message is sent.
@ -427,7 +422,7 @@ namespace ChatSharp
public event EventHandler<RawMessageEventArgs> RawMessageSent; public event EventHandler<RawMessageEventArgs> RawMessageSent;
internal void OnRawMessageSent(RawMessageEventArgs e) internal void OnRawMessageSent(RawMessageEventArgs e)
{ {
if (RawMessageSent != null) RawMessageSent(this, e); RawMessageSent?.Invoke(this, e);
} }
/// <summary> /// <summary>
/// Occurs when a raw message received. /// Occurs when a raw message received.
@ -435,7 +430,7 @@ namespace ChatSharp
public event EventHandler<RawMessageEventArgs> RawMessageReceived; public event EventHandler<RawMessageEventArgs> RawMessageReceived;
internal void OnRawMessageReceived(RawMessageEventArgs e) internal void OnRawMessageReceived(RawMessageEventArgs e)
{ {
if (RawMessageReceived != null) RawMessageReceived(this, e); RawMessageReceived?.Invoke(this, e);
} }
/// <summary> /// <summary>
/// Occurs when a notice received. /// Occurs when a notice received.
@ -443,7 +438,7 @@ namespace ChatSharp
public event EventHandler<IrcNoticeEventArgs> NoticeReceived; public event EventHandler<IrcNoticeEventArgs> NoticeReceived;
internal void OnNoticeReceived(IrcNoticeEventArgs e) internal void OnNoticeReceived(IrcNoticeEventArgs e)
{ {
if (NoticeReceived != null) NoticeReceived(this, e); NoticeReceived?.Invoke(this, e);
} }
/// <summary> /// <summary>
/// Occurs when the server has sent us part of the MOTD. /// Occurs when the server has sent us part of the MOTD.
@ -451,7 +446,7 @@ namespace ChatSharp
public event EventHandler<ServerMOTDEventArgs> MOTDPartReceived; public event EventHandler<ServerMOTDEventArgs> MOTDPartReceived;
internal void OnMOTDPartReceived(ServerMOTDEventArgs e) internal void OnMOTDPartReceived(ServerMOTDEventArgs e)
{ {
if (MOTDPartReceived != null) MOTDPartReceived(this, e); MOTDPartReceived?.Invoke(this, e);
} }
/// <summary> /// <summary>
/// Occurs when the entire server MOTD has been received. /// Occurs when the entire server MOTD has been received.
@ -459,7 +454,7 @@ namespace ChatSharp
public event EventHandler<ServerMOTDEventArgs> MOTDReceived; public event EventHandler<ServerMOTDEventArgs> MOTDReceived;
internal void OnMOTDReceived(ServerMOTDEventArgs e) internal void OnMOTDReceived(ServerMOTDEventArgs e)
{ {
if (MOTDReceived != null) MOTDReceived(this, e); MOTDReceived?.Invoke(this, e);
} }
/// <summary> /// <summary>
/// Occurs when a private message received. This can be a channel OR a user message. /// Occurs when a private message received. This can be a channel OR a user message.
@ -467,7 +462,7 @@ namespace ChatSharp
public event EventHandler<PrivateMessageEventArgs> PrivateMessageReceived; public event EventHandler<PrivateMessageEventArgs> PrivateMessageReceived;
internal void OnPrivateMessageReceived(PrivateMessageEventArgs e) internal void OnPrivateMessageReceived(PrivateMessageEventArgs e)
{ {
if (PrivateMessageReceived != null) PrivateMessageReceived(this, e); PrivateMessageReceived?.Invoke(this, e);
} }
/// <summary> /// <summary>
/// Occurs when a message is received in an IRC channel. /// Occurs when a message is received in an IRC channel.
@ -475,7 +470,7 @@ namespace ChatSharp
public event EventHandler<PrivateMessageEventArgs> ChannelMessageReceived; public event EventHandler<PrivateMessageEventArgs> ChannelMessageReceived;
internal void OnChannelMessageReceived(PrivateMessageEventArgs e) internal void OnChannelMessageReceived(PrivateMessageEventArgs e)
{ {
if (ChannelMessageReceived != null) ChannelMessageReceived(this, e); ChannelMessageReceived?.Invoke(this, e);
} }
/// <summary> /// <summary>
/// Occurs when a message is received from a user. /// Occurs when a message is received from a user.
@ -483,7 +478,7 @@ namespace ChatSharp
public event EventHandler<PrivateMessageEventArgs> UserMessageReceived; public event EventHandler<PrivateMessageEventArgs> UserMessageReceived;
internal void OnUserMessageReceived(PrivateMessageEventArgs e) internal void OnUserMessageReceived(PrivateMessageEventArgs e)
{ {
if (UserMessageReceived != null) UserMessageReceived(this, e); UserMessageReceived?.Invoke(this, e);
} }
/// <summary> /// <summary>
/// Raised if the nick you've chosen is in use. By default, ChatSharp will pick a /// Raised if the nick you've chosen is in use. By default, ChatSharp will pick a
@ -492,7 +487,7 @@ namespace ChatSharp
public event EventHandler<ErronousNickEventArgs> NickInUse; public event EventHandler<ErronousNickEventArgs> NickInUse;
internal void OnNickInUse(ErronousNickEventArgs e) internal void OnNickInUse(ErronousNickEventArgs e)
{ {
if (NickInUse != null) NickInUse(this, e); NickInUse?.Invoke(this, e);
} }
/// <summary> /// <summary>
/// Occurs when a user or channel mode is changed. /// Occurs when a user or channel mode is changed.
@ -500,7 +495,7 @@ namespace ChatSharp
public event EventHandler<ModeChangeEventArgs> ModeChanged; public event EventHandler<ModeChangeEventArgs> ModeChanged;
internal void OnModeChanged(ModeChangeEventArgs e) internal void OnModeChanged(ModeChangeEventArgs e)
{ {
if (ModeChanged != null) ModeChanged(this, e); ModeChanged?.Invoke(this, e);
} }
/// <summary> /// <summary>
/// Occurs when a user joins a channel. /// Occurs when a user joins a channel.
@ -508,7 +503,7 @@ namespace ChatSharp
public event EventHandler<ChannelUserEventArgs> UserJoinedChannel; public event EventHandler<ChannelUserEventArgs> UserJoinedChannel;
internal void OnUserJoinedChannel(ChannelUserEventArgs e) internal void OnUserJoinedChannel(ChannelUserEventArgs e)
{ {
if (UserJoinedChannel != null) UserJoinedChannel(this, e); UserJoinedChannel?.Invoke(this, e);
} }
/// <summary> /// <summary>
/// Occurs when a user parts a channel. /// Occurs when a user parts a channel.
@ -516,7 +511,7 @@ namespace ChatSharp
public event EventHandler<ChannelUserEventArgs> UserPartedChannel; public event EventHandler<ChannelUserEventArgs> UserPartedChannel;
internal void OnUserPartedChannel(ChannelUserEventArgs e) internal void OnUserPartedChannel(ChannelUserEventArgs e)
{ {
if (UserPartedChannel != null) UserPartedChannel(this, e); UserPartedChannel?.Invoke(this, e);
} }
/// <summary> /// <summary>
/// Occurs when we have received the list of users present in a channel. /// Occurs when we have received the list of users present in a channel.
@ -524,7 +519,7 @@ namespace ChatSharp
public event EventHandler<ChannelEventArgs> ChannelListReceived; public event EventHandler<ChannelEventArgs> ChannelListReceived;
internal void OnChannelListReceived(ChannelEventArgs e) internal void OnChannelListReceived(ChannelEventArgs e)
{ {
if (ChannelListReceived != null) ChannelListReceived(this, e); ChannelListReceived?.Invoke(this, e);
} }
/// <summary> /// <summary>
/// Occurs when we have received the topic of a channel. /// Occurs when we have received the topic of a channel.
@ -532,7 +527,7 @@ namespace ChatSharp
public event EventHandler<ChannelTopicEventArgs> ChannelTopicReceived; public event EventHandler<ChannelTopicEventArgs> ChannelTopicReceived;
internal void OnChannelTopicReceived(ChannelTopicEventArgs e) internal void OnChannelTopicReceived(ChannelTopicEventArgs e)
{ {
if (ChannelTopicReceived != null) ChannelTopicReceived(this, e); ChannelTopicReceived?.Invoke(this, e);
} }
/// <summary> /// <summary>
/// Occurs when the IRC connection is established and it is safe to begin interacting with the server. /// Occurs when the IRC connection is established and it is safe to begin interacting with the server.
@ -540,7 +535,7 @@ namespace ChatSharp
public event EventHandler<EventArgs> ConnectionComplete; public event EventHandler<EventArgs> ConnectionComplete;
internal void OnConnectionComplete(EventArgs e) internal void OnConnectionComplete(EventArgs e)
{ {
if (ConnectionComplete != null) ConnectionComplete(this, e); ConnectionComplete?.Invoke(this, e);
} }
/// <summary> /// <summary>
/// Occurs when we receive server info (such as max nick length). /// Occurs when we receive server info (such as max nick length).
@ -548,7 +543,7 @@ namespace ChatSharp
public event EventHandler<SupportsEventArgs> ServerInfoReceived; public event EventHandler<SupportsEventArgs> ServerInfoReceived;
internal void OnServerInfoReceived(SupportsEventArgs e) internal void OnServerInfoReceived(SupportsEventArgs e)
{ {
if (ServerInfoReceived != null) ServerInfoReceived(this, e); ServerInfoReceived?.Invoke(this, e);
} }
/// <summary> /// <summary>
/// Occurs when a user is kicked. /// Occurs when a user is kicked.
@ -556,7 +551,7 @@ namespace ChatSharp
public event EventHandler<KickEventArgs> UserKicked; public event EventHandler<KickEventArgs> UserKicked;
internal void OnUserKicked(KickEventArgs e) internal void OnUserKicked(KickEventArgs e)
{ {
if (UserKicked != null) UserKicked(this, e); UserKicked?.Invoke(this, e);
} }
/// <summary> /// <summary>
/// Occurs when a WHOIS response is received. /// Occurs when a WHOIS response is received.
@ -564,7 +559,7 @@ namespace ChatSharp
public event EventHandler<WhoIsReceivedEventArgs> WhoIsReceived; public event EventHandler<WhoIsReceivedEventArgs> WhoIsReceived;
internal void OnWhoIsReceived(WhoIsReceivedEventArgs e) internal void OnWhoIsReceived(WhoIsReceivedEventArgs e)
{ {
if (WhoIsReceived != null) WhoIsReceived(this, e); WhoIsReceived?.Invoke(this, e);
} }
/// <summary> /// <summary>
/// Occurs when a user has changed their nick. /// Occurs when a user has changed their nick.
@ -572,7 +567,7 @@ namespace ChatSharp
public event EventHandler<NickChangedEventArgs> NickChanged; public event EventHandler<NickChangedEventArgs> NickChanged;
internal void OnNickChanged(NickChangedEventArgs e) internal void OnNickChanged(NickChangedEventArgs e)
{ {
if (NickChanged != null) NickChanged(this, e); NickChanged?.Invoke(this, e);
} }
/// <summary> /// <summary>
/// Occurs when a user has quit. /// Occurs when a user has quit.
@ -580,7 +575,7 @@ namespace ChatSharp
public event EventHandler<UserEventArgs> UserQuit; public event EventHandler<UserEventArgs> UserQuit;
internal void OnUserQuit(UserEventArgs e) internal void OnUserQuit(UserEventArgs e)
{ {
if (UserQuit != null) UserQuit(this, e); UserQuit?.Invoke(this, e);
} }
/// <summary> /// <summary>
/// Occurs when a WHO (WHOX protocol) is received. /// Occurs when a WHO (WHOX protocol) is received.

View File

@ -40,12 +40,12 @@ namespace ChatSharp
public IrcMessage(string rawMessage) public IrcMessage(string rawMessage)
{ {
RawMessage = rawMessage; RawMessage = rawMessage;
Tags = new KeyValuePair<string, string>[] { }; Tags = System.Array.Empty<KeyValuePair<string, string>>();
if (rawMessage.StartsWith("@")) if (rawMessage.StartsWith("@"))
{ {
var rawTags = rawMessage.Substring(1, rawMessage.IndexOf(' ') - 1); var rawTags = rawMessage[1..rawMessage.IndexOf(' ')];
rawMessage = rawMessage.Substring(rawMessage.IndexOf(' ') + 1); rawMessage = rawMessage[(rawMessage.IndexOf(' ') + 1)..];
// Parse tags as key value pairs // Parse tags as key value pairs
var tags = new List<KeyValuePair<string, string>>(); var tags = new List<KeyValuePair<string, string>>();
@ -53,12 +53,12 @@ namespace ChatSharp
{ {
var replacedTag = rawTag.Replace(@"\:", ";"); var replacedTag = rawTag.Replace(@"\:", ";");
// The spec declares `@a=` as a tag with an empty value, while `@b;` as a tag with a null value // The spec declares `@a=` as a tag with an empty value, while `@b;` as a tag with a null value
KeyValuePair<string, string> tag = new KeyValuePair<string, string>(replacedTag, null); KeyValuePair<string, string> tag = new(replacedTag, null);
if (replacedTag.Contains("=")) if (replacedTag.Contains("="))
{ {
string key = replacedTag.Substring(0, replacedTag.IndexOf("=")); string key = replacedTag.Substring(0, replacedTag.IndexOf("="));
string value = replacedTag.Substring(replacedTag.IndexOf("=") + 1); string value = replacedTag[(replacedTag.IndexOf("=") + 1)..];
tag = new KeyValuePair<string, string>(key, value); tag = new KeyValuePair<string, string>(key, value);
} }
@ -70,21 +70,21 @@ namespace ChatSharp
if (rawMessage.StartsWith(":")) if (rawMessage.StartsWith(":"))
{ {
Prefix = rawMessage.Substring(1, rawMessage.IndexOf(' ') - 1); Prefix = rawMessage[1..rawMessage.IndexOf(' ')];
rawMessage = rawMessage.Substring(rawMessage.IndexOf(' ') + 1); rawMessage = rawMessage[(rawMessage.IndexOf(' ') + 1)..];
} }
if (rawMessage.Contains(' ')) if (rawMessage.Contains(' '))
{ {
Command = rawMessage.Remove(rawMessage.IndexOf(' ')); Command = rawMessage.Remove(rawMessage.IndexOf(' '));
rawMessage = rawMessage.Substring(rawMessage.IndexOf(' ') + 1); rawMessage = rawMessage[(rawMessage.IndexOf(' ') + 1)..];
// Parse parameters // Parse parameters
var parameters = new List<string>(); var parameters = new List<string>();
while (!string.IsNullOrEmpty(rawMessage)) while (!string.IsNullOrEmpty(rawMessage))
{ {
if (rawMessage.StartsWith(":")) if (rawMessage.StartsWith(":"))
{ {
parameters.Add(rawMessage.Substring(1)); parameters.Add(rawMessage[1..]);
break; break;
} }
if (!rawMessage.Contains(' ')) if (!rawMessage.Contains(' '))
@ -94,7 +94,7 @@ namespace ChatSharp
break; break;
} }
parameters.Add(rawMessage.Remove(rawMessage.IndexOf(' '))); parameters.Add(rawMessage.Remove(rawMessage.IndexOf(' ')));
rawMessage = rawMessage.Substring(rawMessage.IndexOf(' ') + 1); rawMessage = rawMessage[(rawMessage.IndexOf(' ') + 1)..];
} }
Parameters = parameters.ToArray(); Parameters = parameters.ToArray();
} }
@ -102,7 +102,7 @@ namespace ChatSharp
{ {
// Violates RFC 1459, but we'll parse it anyway // Violates RFC 1459, but we'll parse it anyway
Command = rawMessage; Command = rawMessage;
Parameters = new string[0]; Parameters = System.Array.Empty<string>();
} }
// Parse server-time message tag. // Parse server-time message tag.

View File

@ -13,7 +13,7 @@ namespace ChatSharp
internal IrcProtocolException(string message) : base(message) internal IrcProtocolException(string message) : base(message)
{ {
} }
} }
} }

View File

@ -1,5 +1,4 @@
using System; using System;
using System.Linq;
using System.Collections.Generic; using System.Collections.Generic;
namespace ChatSharp namespace ChatSharp
@ -179,8 +178,8 @@ namespace ChatSharp
/// </summary> /// </summary>
public override bool Equals(object obj) public override bool Equals(object obj)
{ {
if (obj is IrcUser) if (obj is IrcUser user)
return Equals((IrcUser)obj); return Equals(user);
return false; return false;
} }

View File

@ -1,5 +1,4 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
namespace ChatSharp namespace ChatSharp
{ {
@ -22,7 +21,7 @@ namespace ChatSharp
/// </summary> /// </summary>
public char? GetModeForPrefix(char prefix) public char? GetModeForPrefix(char prefix)
{ {
if (Prefixes[1].IndexOf(prefix) == -1) if (!Prefixes[1].Contains(prefix))
return null; return null;
return Prefixes[0][Prefixes[1].IndexOf(prefix)]; return Prefixes[0][Prefixes[1].IndexOf(prefix)];
} }
@ -35,14 +34,14 @@ namespace ChatSharp
public List<char?> GetModesForNick(string nick) public List<char?> GetModesForNick(string nick)
{ {
var supportedPrefixes = Prefixes[1]; var supportedPrefixes = Prefixes[1];
List<char?> modeList = new List<char?>(); List<char?> modeList = new();
List<char> nickPrefixes = new List<char>(); List<char> nickPrefixes = new();
foreach (char prefix in supportedPrefixes) foreach (char prefix in supportedPrefixes)
{ {
if (nick.Contains(prefix)) if (nick.Contains(prefix))
{ {
nick.Remove(nick.IndexOf(prefix)); _ = nick.Remove(nick.IndexOf(prefix));
if (!nickPrefixes.Contains(prefix)) if (!nickPrefixes.Contains(prefix))
{ {
nickPrefixes.Add(prefix); nickPrefixes.Add(prefix);

View File

@ -16,7 +16,7 @@ namespace ChatSharp
/// A unix epoch representation of the timestamp. /// A unix epoch representation of the timestamp.
/// </summary> /// </summary>
public double UnixTimestamp { get; internal set; } public double UnixTimestamp { get; internal set; }
/// <summary> /// <summary>
/// Initializes and parses the timestamp received from the server. /// Initializes and parses the timestamp received from the server.
/// </summary> /// </summary>
@ -41,7 +41,7 @@ namespace ChatSharp
throw new ArgumentException("The timestamp string was provided in an invalid format.", date); throw new ArgumentException("The timestamp string was provided in an invalid format.", date);
UnixTimestamp = parsedTimestamp; UnixTimestamp = parsedTimestamp;
Date = (new DateTime(1970, 1, 1, 0, 0, 0).AddSeconds(UnixTimestamp)); Date = new DateTime(1970, 1, 1, 0, 0, 0).AddSeconds(UnixTimestamp);
} }
} }
@ -58,8 +58,8 @@ namespace ChatSharp
/// </summary> /// </summary>
public override bool Equals(object obj) public override bool Equals(object obj)
{ {
if (obj is Timestamp) if (obj is Timestamp timestamp)
return Equals((Timestamp)obj); return Equals(timestamp);
return false; return false;
} }

View File

@ -1,5 +1,4 @@
using System; using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq; using System.Linq;
namespace ChatSharp namespace ChatSharp

View File

@ -1,5 +1,4 @@
using System; using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq; using System.Linq;
namespace ChatSharp namespace ChatSharp

View File

@ -10,7 +10,7 @@ namespace ChatSharp
{ {
User = new IrcUser(); User = new IrcUser();
SecondsIdle = -1; SecondsIdle = -1;
Channels = new string[0]; Channels = System.Array.Empty<string>();
} }
/// <summary> /// <summary>

View File

@ -1,6 +1,4 @@
using System; using System;
using System.Collections.Generic;
using System.Net;
namespace ChatSharp namespace ChatSharp
{ {
/// <summary> /// <summary>

View File

@ -1,74 +1,17 @@
<?xml version="1.0" encoding="utf-8"?> <Project Sdk="Microsoft.NET.Sdk">
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\MSTest.TestAdapter.1.1.11\build\net45\MSTest.TestAdapter.props" Condition="Exists('..\packages\MSTest.TestAdapter.1.1.11\build\net45\MSTest.TestAdapter.props')" />
<PropertyGroup> <PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <TargetFramework>net5.0</TargetFramework>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<ProjectGuid>{24D593EC-CA81-41DC-9FE7-A434DDDE229D}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>ChatSharp.Tests</RootNamespace>
<AssemblyName>ChatSharp.Tests</AssemblyName>
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">15.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
<ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages</ReferencePath>
<IsCodedUITest>False</IsCodedUITest>
<TestProjectType>UnitTest</TestProjectType>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Microsoft.VisualStudio.TestPlatform.TestFramework, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> <ProjectReference Include="..\ChatSharp\ChatSharp.csproj" />
<HintPath>..\packages\MSTest.TestFramework.1.1.11\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.dll</HintPath>
</Reference>
<Reference Include="Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\MSTest.TestFramework.1.1.11\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="IrcMessageTests.cs" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.*" />
<Compile Include="IrcUserTests.cs" /> <PackageReference Include="MSTest.TestAdapter" Version="2.2.7" />
<Compile Include="Properties\AssemblyInfo.cs" /> <PackageReference Include="Microsoft.DotNet.UpgradeAssistant.Extensions.Default.Analyzers" Version="0.3.246501">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="MSTest.TestFramework" Version="2.2.7" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ChatSharp\ChatSharp.csproj">
<Project>{4033affa-bea3-4bdf-84ea-59a23360fd36}</Project>
<Name>ChatSharp</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\MSTest.TestAdapter.1.1.11\build\net45\MSTest.TestAdapter.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MSTest.TestAdapter.1.1.11\build\net45\MSTest.TestAdapter.props'))" />
<Error Condition="!Exists('..\packages\MSTest.TestAdapter.1.1.11\build\net45\MSTest.TestAdapter.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MSTest.TestAdapter.1.1.11\build\net45\MSTest.TestAdapter.targets'))" />
</Target>
<Import Project="..\packages\MSTest.TestAdapter.1.1.11\build\net45\MSTest.TestAdapter.targets" Condition="Exists('..\packages\MSTest.TestAdapter.1.1.11\build\net45\MSTest.TestAdapter.targets')" />
</Project> </Project>

View File

@ -1,6 +1,5 @@
using System; using Microsoft.VisualStudio.TestTools.UnitTesting;
using ChatSharp; using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Collections.Generic; using System.Collections.Generic;
namespace ChatSharp.Tests namespace ChatSharp.Tests
@ -13,7 +12,7 @@ namespace ChatSharp.Tests
{ {
try try
{ {
IrcMessage fromMessage = new IrcMessage(@":user!~ident@host PRIVMSG target :Lorem ipsum dolor sit amet"); IrcMessage fromMessage = new(@":user!~ident@host PRIVMSG target :Lorem ipsum dolor sit amet");
} }
catch (Exception e) catch (Exception e)
{ {
@ -24,21 +23,21 @@ namespace ChatSharp.Tests
[TestMethod] [TestMethod]
public void NewValidMessage_Command() public void NewValidMessage_Command()
{ {
IrcMessage fromMessage = new IrcMessage(@":user!~ident@host PRIVMSG target :Lorem ipsum dolor sit amet"); IrcMessage fromMessage = new(@":user!~ident@host PRIVMSG target :Lorem ipsum dolor sit amet");
Assert.AreEqual(fromMessage.Command, "PRIVMSG"); Assert.AreEqual(fromMessage.Command, "PRIVMSG");
} }
[TestMethod] [TestMethod]
public void NewValidMessage_Prefix() public void NewValidMessage_Prefix()
{ {
IrcMessage fromMessage = new IrcMessage(@":user!~ident@host PRIVMSG target :Lorem ipsum dolor sit amet"); IrcMessage fromMessage = new(@":user!~ident@host PRIVMSG target :Lorem ipsum dolor sit amet");
Assert.AreEqual(fromMessage.Prefix, "user!~ident@host"); Assert.AreEqual(fromMessage.Prefix, "user!~ident@host");
} }
[TestMethod] [TestMethod]
public void NewValidMessage_Params() public void NewValidMessage_Params()
{ {
IrcMessage fromMessage = new IrcMessage(@":user!~ident@host PRIVMSG target :Lorem ipsum dolor sit amet"); IrcMessage fromMessage = new(@":user!~ident@host PRIVMSG target :Lorem ipsum dolor sit amet");
string[] compareParams = new string[] { "target", "Lorem ipsum dolor sit amet" }; string[] compareParams = new string[] { "target", "Lorem ipsum dolor sit amet" };
CollectionAssert.AreEqual(fromMessage.Parameters, compareParams); CollectionAssert.AreEqual(fromMessage.Parameters, compareParams);
} }
@ -46,7 +45,7 @@ namespace ChatSharp.Tests
[TestMethod] [TestMethod]
public void NewValidMessage_Tags() public void NewValidMessage_Tags()
{ {
IrcMessage fromMessage = new IrcMessage("@a=123;b=456;c=789 :user!~ident@host PRIVMSG target :Lorem ipsum dolor sit amet"); IrcMessage fromMessage = new("@a=123;b=456;c=789 :user!~ident@host PRIVMSG target :Lorem ipsum dolor sit amet");
KeyValuePair<string, string>[] compareTags = new KeyValuePair<string, string>[] KeyValuePair<string, string>[] compareTags = new KeyValuePair<string, string>[]
{ {
new KeyValuePair<string, string>("a", "123"), new KeyValuePair<string, string>("a", "123"),
@ -59,11 +58,11 @@ namespace ChatSharp.Tests
[TestMethod] [TestMethod]
public void NewValidMessage_Tags02() public void NewValidMessage_Tags02()
{ {
IrcMessage fromMessage = new IrcMessage("@aaa=bbb;ccc;example.com/ddd=eee :nick!ident@host.com PRIVMSG me :Hello"); IrcMessage fromMessage = new("@aaa=bbb;ccc;example.com/ddd=eee :nick!ident@host.com PRIVMSG me :Hello");
KeyValuePair<string, string>[] compareTags = new KeyValuePair<string, string>[] KeyValuePair<string, string>[] compareTags = new KeyValuePair<string, string>[]
{ {
new KeyValuePair<string, string>("aaa", "bbb"), new KeyValuePair<string, string>("aaa", "bbb"),
new KeyValuePair<string, string>("ccc", ""), new KeyValuePair<string, string>("ccc", null),
new KeyValuePair<string, string>("example.com/ddd", "eee"), new KeyValuePair<string, string>("example.com/ddd", "eee"),
}; };
CollectionAssert.AreEqual(fromMessage.Tags, compareTags); CollectionAssert.AreEqual(fromMessage.Tags, compareTags);
@ -72,7 +71,7 @@ namespace ChatSharp.Tests
[TestMethod] [TestMethod]
public void NewValidMessage_TagsWithSemicolon() public void NewValidMessage_TagsWithSemicolon()
{ {
IrcMessage fromMessage = new IrcMessage(@"@a=123\:456;b=456\:789;c=789\:123 :user!~ident@host PRIVMSG target :Lorem ipsum dolor sit amet"); IrcMessage fromMessage = new(@"@a=123\:456;b=456\:789;c=789\:123 :user!~ident@host PRIVMSG target :Lorem ipsum dolor sit amet");
KeyValuePair<string, string>[] compareTags = new KeyValuePair<string, string>[] KeyValuePair<string, string>[] compareTags = new KeyValuePair<string, string>[]
{ {
new KeyValuePair<string, string>("a", "123;456"), new KeyValuePair<string, string>("a", "123;456"),
@ -85,7 +84,7 @@ namespace ChatSharp.Tests
[TestMethod] [TestMethod]
public void NewValidMessage_TagsNoValue() public void NewValidMessage_TagsNoValue()
{ {
IrcMessage fromMessage = new IrcMessage("@a=;b :nick!ident@host.com PRIVMSG me :Hello"); IrcMessage fromMessage = new("@a=;b :nick!ident@host.com PRIVMSG me :Hello");
KeyValuePair<string, string>[] compareTags = new KeyValuePair<string, string>[] KeyValuePair<string, string>[] compareTags = new KeyValuePair<string, string>[]
{ {
new KeyValuePair<string, string>("a", ""), new KeyValuePair<string, string>("a", ""),

View File

@ -1,6 +1,4 @@
using System; using Microsoft.VisualStudio.TestTools.UnitTesting;
using ChatSharp;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace ChatSharp.Tests namespace ChatSharp.Tests
{ {
@ -10,8 +8,8 @@ namespace ChatSharp.Tests
[TestMethod] [TestMethod]
public void GetUserModes_NotNull_FiveModes() public void GetUserModes_NotNull_FiveModes()
{ {
IrcUser user = new IrcUser("~&@%+aji", "user"); IrcUser user = new("~&@%+aji", "user");
IrcClient client = new IrcClient("irc.address", user); IrcClient client = new("irc.address", user);
var userModes = client.ServerInfo.GetModesForNick(user.Nick); var userModes = client.ServerInfo.GetModesForNick(user.Nick);
@ -21,8 +19,8 @@ namespace ChatSharp.Tests
[TestMethod] [TestMethod]
public void GetUserModes_NotNull_FourModes() public void GetUserModes_NotNull_FourModes()
{ {
IrcUser user = new IrcUser("&@%+aji", "user"); IrcUser user = new("&@%+aji", "user");
IrcClient client = new IrcClient("irc.address", user); IrcClient client = new("irc.address", user);
var userModes = client.ServerInfo.GetModesForNick(user.Nick); var userModes = client.ServerInfo.GetModesForNick(user.Nick);
@ -32,8 +30,8 @@ namespace ChatSharp.Tests
[TestMethod] [TestMethod]
public void GetUserModes_NotNull_ThreeModes() public void GetUserModes_NotNull_ThreeModes()
{ {
IrcUser user = new IrcUser("@%+aji", "user"); IrcUser user = new("@%+aji", "user");
IrcClient client = new IrcClient("irc.address", user); IrcClient client = new("irc.address", user);
var userModes = client.ServerInfo.GetModesForNick(user.Nick); var userModes = client.ServerInfo.GetModesForNick(user.Nick);
@ -43,8 +41,8 @@ namespace ChatSharp.Tests
[TestMethod] [TestMethod]
public void GetUserModes_NotNull_TwoModes() public void GetUserModes_NotNull_TwoModes()
{ {
IrcUser user = new IrcUser("%+aji", "user"); IrcUser user = new("%+aji", "user");
IrcClient client = new IrcClient("irc.address", user); IrcClient client = new("irc.address", user);
var userModes = client.ServerInfo.GetModesForNick(user.Nick); var userModes = client.ServerInfo.GetModesForNick(user.Nick);
@ -54,8 +52,8 @@ namespace ChatSharp.Tests
[TestMethod] [TestMethod]
public void GetUserModes_NotNull_OneMode() public void GetUserModes_NotNull_OneMode()
{ {
IrcUser user = new IrcUser("+aji", "user"); IrcUser user = new("+aji", "user");
IrcClient client = new IrcClient("irc.address", user); IrcClient client = new("irc.address", user);
var userModes = client.ServerInfo.GetModesForNick(user.Nick); var userModes = client.ServerInfo.GetModesForNick(user.Nick);
@ -65,8 +63,8 @@ namespace ChatSharp.Tests
[TestMethod] [TestMethod]
public void GetUserModes_IsNull() public void GetUserModes_IsNull()
{ {
IrcUser user = new IrcUser("aji", "user"); IrcUser user = new("aji", "user");
IrcClient client = new IrcClient("irc.address", user); IrcClient client = new("irc.address", user);
var userModes = client.ServerInfo.GetModesForNick(user.Nick); var userModes = client.ServerInfo.GetModesForNick(user.Nick);

View File

@ -1,5 +1,4 @@
using System.Reflection; using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
[assembly: AssemblyTitle("ChatSharpTests")] [assembly: AssemblyTitle("ChatSharpTests")]

View File

@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="MSTest.TestAdapter" version="1.1.11" targetFramework="net452" />
<package id="MSTest.TestFramework" version="1.1.11" targetFramework="net452" />
</packages>