chatsharp/ChatSharp/Handlers/MessageHandlers.cs

247 lines
11 KiB
C#
Raw Normal View History

2015-07-07 19:16:52 +00:00
using ChatSharp.Events;
2013-04-09 21:19:48 +00:00
using System.Linq;
using System.Collections.Generic;
using System;
2013-04-09 21:19:48 +00:00
namespace ChatSharp.Handlers
{
internal static class MessageHandlers
{
public static void RegisterDefaultHandlers(IrcClient client)
2013-04-09 21:19:48 +00:00
{
2013-04-09 23:24:50 +00:00
// General
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);
client.SetHandler("QUIT", HandleQuit);
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
client.SetHandler("375", MOTDHandlers.HandleMOTDStart);
client.SetHandler("372", MOTDHandlers.HandleMOTD);
client.SetHandler("376", MOTDHandlers.HandleEndOfMOTD);
client.SetHandler("422", MOTDHandlers.HandleMOTDNotFound);
// Channel handlers
client.SetHandler("JOIN", ChannelHandlers.HandleJoin);
client.SetHandler("PART", ChannelHandlers.HandlePart);
client.SetHandler("332", ChannelHandlers.HandleGetTopic);
2015-04-06 22:10:06 +00:00
client.SetHandler("331", ChannelHandlers.HandleGetEmptyTopic);
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
client.SetHandler("311", UserHandlers.HandleWhoIsUser);
client.SetHandler("312", UserHandlers.HandleWhoIsServer);
client.SetHandler("313", UserHandlers.HandleWhoIsOperator);
2017-10-03 19:58:29 +00:00
client.SetHandler("315", UserHandlers.HandleWhoEnd);
client.SetHandler("317", UserHandlers.HandleWhoIsIdle);
client.SetHandler("318", UserHandlers.HandleWhoIsEnd);
client.SetHandler("319", UserHandlers.HandleWhoIsChannels);
client.SetHandler("330", UserHandlers.HandleWhoIsLoggedInAs);
2017-10-03 19:58:29 +00:00
client.SetHandler("354", UserHandlers.HandleWhox);
2017-10-13 15:56:25 +00:00
client.SetHandler("ACCOUNT", UserHandlers.HandleAccount);
2017-12-20 15:24:54 +00:00
client.SetHandler("CHGHOST", UserHandlers.HandleChangeHost);
// Listing handlers
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);
// Server handlers
2013-06-01 20:57:43 +00:00
client.SetHandler("004", ServerHandlers.HandleMyInfo);
client.SetHandler("005", ServerHandlers.HandleISupport);
// Error replies rfc1459 6.1
client.SetHandler("401", ErrorHandlers.HandleError);//ERR_NOSUCHNICK "<nickname> :No such nick/channel"
client.SetHandler("402", ErrorHandlers.HandleError);//ERR_NOSUCHSERVER "<server name> :No such server"
client.SetHandler("403", ErrorHandlers.HandleError);//ERR_NOSUCHCHANNEL "<channel name> :No such channel"
client.SetHandler("404", ErrorHandlers.HandleError);//ERR_CANNOTSENDTOCHAN "<channel name> :Cannot send to channel"
client.SetHandler("405", ErrorHandlers.HandleError);//ERR_TOOMANYCHANNELS "<channel name> :You have joined too many \ channels"
client.SetHandler("406", ErrorHandlers.HandleError);//ERR_WASNOSUCHNICK "<nickname> :There was no such nickname"
client.SetHandler("407", ErrorHandlers.HandleError);//ERR_TOOMANYTARGETS "<target> :Duplicate recipients. No message \
// Capability handlers
client.SetHandler("CAP", CapabilityHandlers.HandleCapability);
2013-04-09 21:19:48 +00:00
}
2015-01-11 02:17:08 +00:00
public static void HandleNick(IrcClient client, IrcMessage message)
{
var user = client.Users.Get(message.Prefix);
var oldNick = user.Nick;
user.Nick = message.Parameters[0];
2015-05-10 23:12:20 +00:00
client.OnNickChanged(new NickChangedEventArgs
{
User = user,
OldNick = oldNick,
2015-05-10 23:12:20 +00:00
NewNick = message.Parameters[0]
});
2015-01-11 02:17:08 +00:00
}
public static void HandleQuit(IrcClient client, IrcMessage message)
{
var user = new IrcUser(message.Prefix);
if (client.User.Nick != user.Nick)
{
client.Users.Remove(user);
client.OnUserQuit(new UserEventArgs(user));
}
}
2013-04-09 21:19:48 +00:00
public static void HandlePing(IrcClient client, IrcMessage message)
{
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(client, message, client.ServerInfo);
2013-04-09 23:31:06 +00:00
client.OnPrivateMessageRecieved(eventArgs);
if (eventArgs.PrivateMessage.IsChannelMessage)
client.OnChannelMessageRecieved(eventArgs);
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
if (!eventArgs.DoNotHandle && client.Settings.GenerateRandomNickIfRefused)
2013-04-09 23:24:50 +00:00
client.Nick(eventArgs.NewNick);
}
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
}
// Handle change
2013-09-26 01:35:10 +00:00
bool add = true;
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 + " " + message.Parameters[i++]));
2013-09-26 01:35:10 +00:00
}
else if (client.ServerInfo.SupportedChannelModes.ChannelLists.Contains(c))
{
client.OnModeChanged(new ModeChangeEventArgs(channel.Name, new IrcUser(message.Prefix),
(add ? "+" : "-") + c + " " + message.Parameters[i++]));
2013-09-26 01:35:10 +00:00
}
else if (client.ServerInfo.SupportedChannelModes.ChannelUserModes.Contains(c))
{
if (!channel.UsersByMode.ContainsKey(c))
{
channel.UsersByMode.Add(c,
new UserPoolView(channel.Users.Where(u =>
{
if (!u.ChannelModes.ContainsKey(channel))
u.ChannelModes.Add(channel, new List<char?>());
return u.ChannelModes[channel].Contains(c);
})));
}
2013-09-26 01:35:10 +00:00
var user = new IrcUser(message.Parameters[i]);
if (add)
{
if (!channel.UsersByMode[c].Contains(user.Nick))
if (!user.ChannelModes[channel].Contains(c))
user.ChannelModes[channel].Add(c);
2013-09-26 01:35:10 +00:00
}
else
{
if (channel.UsersByMode[c].Contains(user.Nick))
user.ChannelModes[channel] = null;
2013-09-26 01:35:10 +00:00
}
client.OnModeChanged(new ModeChangeEventArgs(channel.Name, new IrcUser(message.Prefix),
(add ? "+" : "-") + c + " " + message.Parameters[i++]));
2013-09-26 01:35:10 +00:00
}
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));
2013-09-26 01:35:10 +00:00
}
}
}
catch { }
if (message.Command == "324")
{
var operation = client.RequestManager.DequeueOperation("MODE " + channel.Name);
operation.Callback(operation);
}
}
else
{
// TODO: Handle user modes other than ourselves?
2013-04-13 19:43:00 +00:00
foreach (char c in mode)
{
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-09 21:19:48 +00:00
}
}