Merge pull request #92 from RockyTV/caps

Add support for userhost-in-names cap
This commit is contained in:
Drew DeVault 2017-12-20 14:40:53 -05:00 committed by GitHub
commit a1329cf81d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 54 additions and 17 deletions

View File

@ -64,27 +64,64 @@ namespace ChatSharp.Handlers
public static void HandleUserListPart(IrcClient client, IrcMessage message) public static void HandleUserListPart(IrcClient client, IrcMessage message)
{ {
var channel = client.Channels[message.Parameters[2]]; if (client.Capabilities.IsEnabled("userhost-in-names"))
var users = message.Parameters[3].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var rawNick in users)
{ {
if (string.IsNullOrWhiteSpace(rawNick)) var channel = client.Channels[message.Parameters[2]];
continue; var users = message.Parameters[3].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var hostmask in users)
{
if (string.IsNullOrWhiteSpace(hostmask))
continue;
var nick = rawNick; // Parse hostmask
var modes = client.ServerInfo.GetModesForNick(nick); var nick = hostmask.Substring(0, hostmask.IndexOf("!"));
var ident = hostmask.Substring(nick.Length + 1, hostmask.LastIndexOf("@") - (nick.Length + 1));
var hostname = hostmask.Substring(hostmask.LastIndexOf("@") + 1);
if (modes.Count > 0) // Get user modes
nick = rawNick.Remove(0, modes.Count); var modes = client.ServerInfo.GetModesForNick(nick);
if (modes.Count > 0)
nick = nick.Remove(0, modes.Count);
var user = client.Users.GetOrAdd(nick); var user = client.Users.GetOrAdd(nick);
if (user.Hostname != hostname && user.User != ident)
{
user.Hostname = hostname;
user.User = ident;
}
if (!user.Channels.Contains(channel)) if (!user.Channels.Contains(channel))
user.Channels.Add(channel); user.Channels.Add(channel);
if (!user.ChannelModes.ContainsKey(channel)) if (!user.ChannelModes.ContainsKey(channel))
user.ChannelModes.Add(channel, modes); user.ChannelModes.Add(channel, modes);
else else
user.ChannelModes[channel] = modes; user.ChannelModes[channel] = modes;
}
}
else
{
var channel = client.Channels[message.Parameters[2]];
var users = message.Parameters[3].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var rawNick in users)
{
if (string.IsNullOrWhiteSpace(rawNick))
continue;
var nick = rawNick;
var modes = client.ServerInfo.GetModesForNick(nick);
if (modes.Count > 0)
nick = rawNick.Remove(0, modes.Count);
var user = client.Users.GetOrAdd(nick);
if (!user.Channels.Contains(channel))
user.Channels.Add(channel);
if (!user.ChannelModes.ContainsKey(channel))
user.ChannelModes.Add(channel, modes);
else
user.ChannelModes[channel] = modes;
}
} }
} }

View File

@ -169,7 +169,7 @@ namespace ChatSharp
// List of supported capabilities // List of supported capabilities
Capabilities.AddRange(new string[] { Capabilities.AddRange(new string[] {
"server-time", "multi-prefix", "cap-notify", "znc.in/server-time", "znc.in/server-time-iso", "server-time", "multi-prefix", "cap-notify", "znc.in/server-time", "znc.in/server-time-iso",
"account-notify", "chghost" "account-notify", "chghost", "userhost-in-names"
}); });
IsNegotiatingCapabilities = false; IsNegotiatingCapabilities = false;