2015-03-15 20:38:55 +00:00
|
|
|
|
using ChatSharp.Events;
|
2013-04-09 21:19:48 +00:00
|
|
|
|
using System.Linq;
|
|
|
|
|
|
|
|
|
|
namespace ChatSharp.Handlers
|
|
|
|
|
{
|
|
|
|
|
internal static class MessageHandlers
|
|
|
|
|
{
|
2013-04-17 16:11:38 +00:00
|
|
|
|
public static void RegisterDefaultHandlers(IrcClient client)
|
2013-04-09 21:19:48 +00:00
|
|
|
|
{
|
2013-04-09 23:24:50 +00:00
|
|
|
|
// General
|
2013-04-17 16:11:38 +00:00
|
|
|
|
client.SetHandler("PING", HandlePing);
|
|
|
|
|
client.SetHandler("NOTICE", HandleNotice);
|
|
|
|
|
client.SetHandler("PRIVMSG", HandlePrivmsg);
|
|
|
|
|
client.SetHandler("MODE", HandleMode);
|
2013-06-01 20:57:43 +00:00
|
|
|
|
//client.SetHandler("324", HandleMode);
|
2015-01-11 02:17:08 +00:00
|
|
|
|
client.SetHandler("NICK", HandleNick);
|
2015-03-12 04:29:04 +00:00
|
|
|
|
client.SetHandler("QUIT", HandleQuit);
|
2013-04-17 16:11:38 +00:00
|
|
|
|
client.SetHandler("431", HandleErronousNick);
|
|
|
|
|
client.SetHandler("432", HandleErronousNick);
|
|
|
|
|
client.SetHandler("433", HandleErronousNick);
|
|
|
|
|
client.SetHandler("436", HandleErronousNick);
|
2013-04-09 23:24:50 +00:00
|
|
|
|
|
|
|
|
|
// MOTD Handlers
|
2013-04-17 16:11:38 +00:00
|
|
|
|
client.SetHandler("375", MOTDHandlers.HandleMOTDStart);
|
|
|
|
|
client.SetHandler("372", MOTDHandlers.HandleMOTD);
|
|
|
|
|
client.SetHandler("376", MOTDHandlers.HandleEndOfMOTD);
|
2013-04-10 05:25:17 +00:00
|
|
|
|
|
|
|
|
|
// Channel handlers
|
2013-04-17 16:11:38 +00:00
|
|
|
|
client.SetHandler("JOIN", ChannelHandlers.HandleJoin);
|
|
|
|
|
client.SetHandler("PART", ChannelHandlers.HandlePart);
|
|
|
|
|
client.SetHandler("353", ChannelHandlers.HandleUserListPart);
|
|
|
|
|
client.SetHandler("366", ChannelHandlers.HandleUserListEnd);
|
2013-09-26 01:35:10 +00:00
|
|
|
|
client.SetHandler("KICK", ChannelHandlers.HandleKick);
|
2013-04-10 05:53:54 +00:00
|
|
|
|
|
|
|
|
|
// User handlers
|
2013-04-17 16:11:38 +00:00
|
|
|
|
client.SetHandler("311", UserHandlers.HandleWhoIsUser);
|
|
|
|
|
client.SetHandler("312", UserHandlers.HandleWhoIsServer);
|
|
|
|
|
client.SetHandler("313", UserHandlers.HandleWhoIsOperator);
|
|
|
|
|
client.SetHandler("317", UserHandlers.HandleWhoIsIdle);
|
|
|
|
|
client.SetHandler("318", UserHandlers.HandleWhoIsEnd);
|
|
|
|
|
client.SetHandler("319", UserHandlers.HandleWhoIsChannels);
|
2015-02-19 21:31:51 +00:00
|
|
|
|
client.SetHandler("330", UserHandlers.HandleWhoIsLoggedInAs);
|
2013-04-11 01:52:41 +00:00
|
|
|
|
|
|
|
|
|
// Listing handlers
|
2013-04-17 16:11:38 +00:00
|
|
|
|
client.SetHandler("367", ListingHandlers.HandleBanListPart);
|
|
|
|
|
client.SetHandler("368", ListingHandlers.HandleBanListEnd);
|
|
|
|
|
client.SetHandler("348", ListingHandlers.HandleExceptionListPart);
|
|
|
|
|
client.SetHandler("349", ListingHandlers.HandleExceptionListEnd);
|
|
|
|
|
client.SetHandler("346", ListingHandlers.HandleInviteListPart);
|
|
|
|
|
client.SetHandler("347", ListingHandlers.HandleInviteListEnd);
|
|
|
|
|
client.SetHandler("728", ListingHandlers.HandleQuietListPart);
|
|
|
|
|
client.SetHandler("729", ListingHandlers.HandleQuietListEnd);
|
2013-05-20 03:31:36 +00:00
|
|
|
|
|
|
|
|
|
// Server handlers
|
2013-06-01 20:57:43 +00:00
|
|
|
|
client.SetHandler("004", ServerHandlers.HandleMyInfo);
|
2013-05-20 03:31:36 +00:00
|
|
|
|
client.SetHandler("005", ServerHandlers.HandleISupport);
|
2013-04-09 21:19:48 +00:00
|
|
|
|
}
|
|
|
|
|
|
2015-01-11 02:17:08 +00:00
|
|
|
|
public static void HandleNick(IrcClient client, IrcMessage message)
|
|
|
|
|
{
|
2015-03-08 22:12:43 +00:00
|
|
|
|
if (client.User.Nick == new IrcUser(message.Prefix).Nick)
|
|
|
|
|
{
|
|
|
|
|
client.User.Nick = message.Parameters[0];
|
|
|
|
|
}
|
2015-01-11 02:17:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
2015-03-12 04:29:04 +00:00
|
|
|
|
public static void HandleQuit(IrcClient client, IrcMessage message)
|
|
|
|
|
{
|
|
|
|
|
var user = new IrcUser(message.Prefix);
|
|
|
|
|
if (client.User.Nick != user.Nick)
|
|
|
|
|
{
|
|
|
|
|
var channels = client
|
|
|
|
|
.Channels
|
|
|
|
|
.Where(c => c.Users.Any(u => u.Nick.Equals(user.Nick)));
|
|
|
|
|
var users = channels
|
|
|
|
|
.SelectMany(c=> c.UsersByMode)
|
|
|
|
|
.Where(m => m.Value.Contains(user.Nick))
|
|
|
|
|
.Select(c => c.Value);
|
|
|
|
|
|
|
|
|
|
foreach (var userCollection in users)
|
|
|
|
|
{
|
|
|
|
|
userCollection.Remove(user.Nick);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach (var channel in channels)
|
|
|
|
|
{
|
|
|
|
|
channel.Users.Remove(user.Nick);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2013-04-09 21:19:48 +00:00
|
|
|
|
public static void HandlePing(IrcClient client, IrcMessage message)
|
|
|
|
|
{
|
2013-07-10 08:08:09 +00:00
|
|
|
|
client.ServerNameFromPing = message.Parameters[0];
|
2013-04-13 19:43:00 +00:00
|
|
|
|
client.SendRawMessage("PONG :{0}", message.Parameters[0]);
|
2013-04-09 21:19:48 +00:00
|
|
|
|
}
|
2013-04-09 23:24:50 +00:00
|
|
|
|
|
|
|
|
|
public static void HandleNotice(IrcClient client, IrcMessage message)
|
|
|
|
|
{
|
|
|
|
|
client.OnNoticeRecieved(new IrcNoticeEventArgs(message));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void HandlePrivmsg(IrcClient client, IrcMessage message)
|
|
|
|
|
{
|
|
|
|
|
var eventArgs = new PrivateMessageEventArgs(message);
|
2013-04-09 23:31:06 +00:00
|
|
|
|
client.OnPrivateMessageRecieved(eventArgs);
|
|
|
|
|
if (eventArgs.PrivateMessage.IsChannelMessage)
|
2015-01-11 01:44:51 +00:00
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
// Populate this user's hostname and user from the message
|
|
|
|
|
// TODO: Merge all users from all channels into one list and keep references to which channels they're in
|
|
|
|
|
var channel = client.Channels[eventArgs.PrivateMessage.Source];
|
|
|
|
|
var u = channel.Users[eventArgs.PrivateMessage.User.Nick];
|
|
|
|
|
u.Hostname = eventArgs.PrivateMessage.User.Hostname;
|
|
|
|
|
u.User = eventArgs.PrivateMessage.User.User;
|
|
|
|
|
}
|
|
|
|
|
catch { /* silently ignored */ }
|
2013-04-09 23:31:06 +00:00
|
|
|
|
client.OnChannelMessageRecieved(eventArgs);
|
2015-01-11 01:44:51 +00:00
|
|
|
|
}
|
2013-04-09 23:31:06 +00:00
|
|
|
|
else
|
|
|
|
|
client.OnUserMessageRecieved(eventArgs);
|
2013-04-09 23:24:50 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void HandleErronousNick(IrcClient client, IrcMessage message)
|
|
|
|
|
{
|
|
|
|
|
var eventArgs = new ErronousNickEventArgs(client.User.Nick);
|
|
|
|
|
if (message.Command == "433") // Nick in use
|
|
|
|
|
client.OnNickInUse(eventArgs);
|
|
|
|
|
// else ... TODO
|
2014-01-17 03:15:42 +00:00
|
|
|
|
if (!eventArgs.DoNotHandle && client.Settings.GenerateRandomNickIfRefused)
|
2013-04-09 23:24:50 +00:00
|
|
|
|
client.Nick(eventArgs.NewNick);
|
|
|
|
|
}
|
2013-04-10 05:25:17 +00:00
|
|
|
|
|
|
|
|
|
public static void HandleMode(IrcClient client, IrcMessage message)
|
|
|
|
|
{
|
2013-04-13 19:43:00 +00:00
|
|
|
|
string target, mode = null;
|
|
|
|
|
int i = 2;
|
2013-04-10 17:26:20 +00:00
|
|
|
|
if (message.Command == "MODE")
|
|
|
|
|
{
|
|
|
|
|
target = message.Parameters[0];
|
2013-04-13 19:43:00 +00:00
|
|
|
|
mode = message.Parameters[1];
|
2013-04-10 17:26:20 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
target = message.Parameters[1];
|
2013-04-13 19:43:00 +00:00
|
|
|
|
mode = message.Parameters[2];
|
|
|
|
|
i++;
|
2013-04-10 17:26:20 +00:00
|
|
|
|
}
|
2013-04-10 05:25:17 +00:00
|
|
|
|
// Handle change
|
2013-09-26 01:35:10 +00:00
|
|
|
|
bool add = true;
|
2013-04-10 05:25:17 +00:00
|
|
|
|
if (target.StartsWith("#"))
|
|
|
|
|
{
|
|
|
|
|
var channel = client.Channels[target];
|
2013-09-26 01:35:10 +00:00
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
foreach (char c in mode)
|
|
|
|
|
{
|
|
|
|
|
if (c == '+')
|
|
|
|
|
{
|
|
|
|
|
add = true;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if (c == '-')
|
|
|
|
|
{
|
|
|
|
|
add = false;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if (channel.Mode == null)
|
|
|
|
|
channel.Mode = string.Empty;
|
|
|
|
|
// TODO: Support the ones here that aren't done properly
|
|
|
|
|
if (client.ServerInfo.SupportedChannelModes.ParameterizedSettings.Contains(c))
|
|
|
|
|
{
|
|
|
|
|
client.OnModeChanged(new ModeChangeEventArgs(channel.Name, new IrcUser(message.Prefix),
|
|
|
|
|
(add ? "+" : "-") + c.ToString() + " " + message.Parameters[i++]));
|
|
|
|
|
}
|
|
|
|
|
else if (client.ServerInfo.SupportedChannelModes.ChannelLists.Contains(c))
|
|
|
|
|
{
|
|
|
|
|
client.OnModeChanged(new ModeChangeEventArgs(channel.Name, new IrcUser(message.Prefix),
|
|
|
|
|
(add ? "+" : "-") + c.ToString() + " " + message.Parameters[i++]));
|
|
|
|
|
}
|
|
|
|
|
else if (client.ServerInfo.SupportedChannelModes.ChannelUserModes.Contains(c))
|
|
|
|
|
{
|
|
|
|
|
if (!channel.UsersByMode.ContainsKey(c)) channel.UsersByMode.Add(c, new UserCollection());
|
|
|
|
|
var user = new IrcUser(message.Parameters[i]);
|
|
|
|
|
if (add)
|
|
|
|
|
{
|
|
|
|
|
if (!channel.UsersByMode[c].Contains(user.Nick))
|
|
|
|
|
channel.UsersByMode[c].Add(user);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (channel.UsersByMode[c].Contains(user.Nick))
|
|
|
|
|
channel.UsersByMode[c].Remove(user);
|
|
|
|
|
}
|
|
|
|
|
client.OnModeChanged(new ModeChangeEventArgs(channel.Name, new IrcUser(message.Prefix),
|
|
|
|
|
(add ? "+" : "-") + c.ToString() + " " + message.Parameters[i++]));
|
|
|
|
|
}
|
|
|
|
|
if (client.ServerInfo.SupportedChannelModes.Settings.Contains(c))
|
|
|
|
|
{
|
|
|
|
|
if (add)
|
|
|
|
|
{
|
|
|
|
|
if (!channel.Mode.Contains(c))
|
|
|
|
|
channel.Mode += c.ToString();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
channel.Mode = channel.Mode.Replace(c.ToString(), string.Empty);
|
|
|
|
|
client.OnModeChanged(new ModeChangeEventArgs(channel.Name, new IrcUser(message.Prefix),
|
|
|
|
|
(add ? "+" : "-") + c.ToString()));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch { }
|
2013-04-10 17:46:05 +00:00
|
|
|
|
if (message.Command == "324")
|
|
|
|
|
{
|
2013-04-17 16:16:55 +00:00
|
|
|
|
var operation = client.RequestManager.DequeueOperation("MODE " + channel.Name);
|
2013-04-10 17:46:05 +00:00
|
|
|
|
operation.Callback(operation);
|
|
|
|
|
}
|
2013-04-10 05:25:17 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// TODO: Handle user modes other than ourselves?
|
2013-04-13 19:43:00 +00:00
|
|
|
|
foreach (char c in mode)
|
2013-04-10 05:25:17 +00:00
|
|
|
|
{
|
2013-04-10 16:27:27 +00:00
|
|
|
|
if (add)
|
|
|
|
|
{
|
|
|
|
|
if (!client.User.Mode.Contains(c))
|
|
|
|
|
client.User.Mode += c;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
client.User.Mode = client.User.Mode.Replace(c.ToString(), string.Empty);
|
2013-04-10 05:25:17 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2013-04-09 21:19:48 +00:00
|
|
|
|
}
|
|
|
|
|
}
|