private void HandleListChannels(string Sender, string[] Params) { MySqlCommand Cmd = new MySqlCommand("SELECT * FROM " + Config.SQLTablePrefix + "networks ORDER BY id", m_ParentServer.MyDBConn.Connection); MySqlDataReader DataReader = Cmd.ExecuteReader(); DataTable NetworkTable = new DataTable(); NetworkTable.Load(DataReader); DataReader.Close(); Cmd = new MySqlCommand("SELECT * FROM " + Config.SQLTablePrefix + "channels ORDER BY id", m_ParentServer.MyDBConn.Connection); DataReader = Cmd.ExecuteReader(); DataTable ChannelTable = new DataTable(); ChannelTable.Load(DataReader); DataReader.Close(); m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "List of Channels:")); foreach (DataRow CurNetwork in NetworkTable.Rows) { m_ParentServer.Send( IRCFunctions.PrivMsg( IRCFunctions.GetNickFromHostString(Sender), String.Format(" Network {0} - {1} ({2}:{3}) as {4}/{5} ({6})", CurNetwork["id"], CurNetwork["name"], CurNetwork["server"], CurNetwork["port"], CurNetwork["nickname"], CurNetwork["altnickname"], CurNetwork["realname"] ))); foreach (DataRow CurChannel in ChannelTable.Rows) { if (Convert.ToInt32(CurChannel["network"]) == Convert.ToInt32(CurNetwork["id"])) { m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), String.Format(" Channel {0} - {1}", CurChannel["id"], CurChannel["name"]))); } } } }
private void HandleAddChannel(string Sender, string[] Params) { // !add channel 1 #channel [Password] List <string> NewParamList = new List <string>(); string NewParams = Functions.CombineAfterIndex(Params, " ", 2); if (NewParams.Length > 4) // Shortest possible parameters. IE: "1 #A" // Parse through the parameters and populate NewParamList { NewParamList = Functions.Parameterize(NewParams); if (!((NewParamList.Count == 2) || (NewParamList.Count == 3))) { NewParamList = null; } if (NewParamList == null) { m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Invalid Command Syntax.")); } else { // Time to add the new network MySqlCommand Cmd = new MySqlCommand("SELECT * FROM `" + Config.SQLTablePrefix + "networks` WHERE id = @netid", m_ParentServer.MyDBConn.Connection); Cmd.Prepare(); Cmd.Parameters.AddWithValue("@netid", NewParamList[0]); int MatchingNetworkIDs = Convert.ToInt32(Cmd.ExecuteScalar()); if (MatchingNetworkIDs > 0) { Cmd = new MySqlCommand("INSERT INTO `" + Config.SQLTablePrefix + "channels` (`networkid`, `name`, `password`, `autorejoin`, `statsenabled`, `lastscanid`) VALUES (@netid, @channame, @password, @autorejoin, @statsenabled, @lastscanid)", m_ParentServer.MyDBConn.Connection); Cmd.Prepare(); Cmd.Parameters.AddWithValue("@netid", NewParamList[0]); Cmd.Parameters.AddWithValue("@channame", NewParamList[1]); if (NewParamList.Count == 3) { Cmd.Parameters.AddWithValue("@password", NewParamList[2]); } else { Cmd.Parameters.AddWithValue("@password", null); } Cmd.Parameters.AddWithValue("@autorejoin", 1); Cmd.Parameters.AddWithValue("@statsenabled", 1); Cmd.Parameters.AddWithValue("@lastscanid", 0); int ReturnVal = Cmd.ExecuteNonQuery(); if (ReturnVal == 1) { m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Successfully added channel: " + NewParamList[1])); m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), " Use \"!list channels\" to see more info.")); } else { m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Something went wrong. :(")); } } else { m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Invalid Network ID. Use \"!list networks\" to see a list of networks and their IDs.")); } } } }
public void Part(string Sender, string Message) { if (m_Users.Contains(IRCFunctions.GetNickFromHostString(Sender).ToLower())) { m_Users.Remove(IRCFunctions.GetNickFromHostString(Sender).ToLower()); } LastMessageText = "PART: " + Sender; LastMessageTime = DateTime.UtcNow; }
public void HandleNotice(string Sender, string[] Params) { if (IRCFunctions.GetNickFromHostString(Sender) == "NickServ") { // If it's NickServ and it looks like an identify request, then identify. if ((Array.IndexOf(Params, "nickname") > 0) && (Array.IndexOf(Params, "is") > 0) && ((Array.IndexOf(Params, "registered") > 0) || (Array.IndexOf(Params, "registered.") > 0))) { m_ParentServer.Send(IRCFunctions.PrivMsg("NickServ", "identify " + Config.NickPass)); } } }
private void HandleLogout(string Sender, string[] Params) { if (m_Administrators.Contains(Sender)) { m_Administrators.Remove(Sender); m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "You have been logged out.")); } else { m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "You are not logged in.")); } }
private void HandleAddNetwork(string Sender, string[] Params) { // !add network "Some Network Name" irc.somenetwork.net 6667 "Real Name" Nick1 Nick2 [Server Password] List <string> NewParamList = new List <string>(); string NewParams = Functions.CombineAfterIndex(Params, " ", 2); if (NewParams.Length > 11) // Shortest possible parameters. IE: "A B 1 C D E" // Parse through the parameters and populate NewParamList { NewParamList = Functions.Parameterize(NewParams); if (!((NewParamList.Count == 6) || (NewParamList.Count == 7))) { NewParamList = null; } if (NewParamList == null) { m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Invalid Command Syntax.")); } else { // Time to add the new network MySqlCommand Cmd = new MySqlCommand("INSERT INTO `" + Config.SQLTablePrefix + "networks` (`name`, `server`, `port`, `password`, `realname`, `nickname`, `altnickname`) VALUES (@netname, @server, @port, @password, @realname, @nickname, @altnickname)", m_ParentServer.MyDBConn.Connection); Cmd.Prepare(); Cmd.Parameters.AddWithValue("@netname", NewParamList[0]); Cmd.Parameters.AddWithValue("@server", NewParamList[1]); Cmd.Parameters.AddWithValue("@port", Convert.ToInt32(NewParamList[2])); if (NewParamList.Count == 7) { Cmd.Parameters.AddWithValue("@password", NewParamList[6]); } else { Cmd.Parameters.AddWithValue("@password", null); } Cmd.Parameters.AddWithValue("@realname", NewParamList[3]); Cmd.Parameters.AddWithValue("@nickname", NewParamList[4]); Cmd.Parameters.AddWithValue("@altnickname", NewParamList[5]); int ReturnVal = Cmd.ExecuteNonQuery(); if (ReturnVal == 1) { m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Successfully added network: " + NewParamList[0])); m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), " Use \"!list networks\" to see more info.")); } else { m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Something went wrong. :(")); } } } }
private void HandleListAdmins(string Sender, string[] Params) { if (m_Administrators.Count == 0) { m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "No current Administrators.")); } else { m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "List of Administrators:")); foreach (string CurAdmin in m_Administrators) { m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), " " + CurAdmin)); } } }
public void Join(string Sender) { if (IRCFunctions.GetNickFromHostString(Sender) == m_ParentServer.Nick) { JoinMe(); } if (!m_Users.Contains(IRCFunctions.GetNickFromHostString(Sender).ToLower())) { m_Users.Add(IRCFunctions.GetNickFromHostString(Sender).ToLower()); } else { AppLog.WriteLine(1, "ERROR", "User " + Sender + " tried to join channel. IRC let it happen, but they're already in my userlist. Why?"); } LastMessageText = "JOIN: " + Sender; LastMessageTime = DateTime.UtcNow; }
public void Nick(string Sender, string NewNick) { if (m_Users.Contains(IRCFunctions.GetNickFromHostString(Sender).ToLower())) { m_Users.Remove(IRCFunctions.GetNickFromHostString(Sender).ToLower()); if (!m_Users.Contains(NewNick.ToLower())) { m_Users.Add(NewNick.ToLower()); } else { AppLog.WriteLine(1, "ERROR", "User " + Sender + " tried to change nick to " + NewNick + ". IRC let it happen, but it's still in my userlist. Why?"); } } LastMessageText = "NICK: " + Sender + " => " + NewNick; LastMessageTime = DateTime.UtcNow; }
public void HandleChannels(string Sender, string[] Params) { foreach (Server CurServer in m_ParentServer.Servers) { m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Channels on " + CurServer.Hostname + ":")); foreach (KeyValuePair <string, Channel> CurChannel in CurServer.Channels) { if (CurChannel.Value.LastMessageTime == null) { m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), " " + CurChannel.Value.Name + " - Never")); } else { TimeSpan tempTS = DateTime.UtcNow.Subtract(CurChannel.Value.LastMessageTime); m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), " " + CurChannel.Value.Name + " - " + Functions.MillisecondsToHumanReadable(tempTS.TotalMilliseconds) + " ago: " + CurChannel.Value.LastMessageText)); } } } }
private void HandleLogin(string Sender, string[] Params) { if (Params[1] == Config.AdminPass) { if (m_Administrators.Contains(Sender)) { m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "You are already identified.")); } else { m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "You are now an Administrator.")); m_Administrators.Add(Sender); } } else { m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Invalid Password.")); } }
public void HandlePM(string Sender, string[] Params) { if (Params[0].ToLower() == "!login") { HandleLogin(Sender, Params); } else if (Params[0].ToLower() == "!logout") { HandleLogout(Sender, Params); } else if (Params[0].ToLower() == "!help") { HandleHelp(Sender, Params); } else { if (m_Administrators.Contains(Sender)) { switch (Params[0].ToLower()) { case "!list": if (Params.Length >= 2) { if (Params[1].ToLower() == "networks") { HandleListNetworks(Sender, Params); } else if (Params[1].ToLower() == "channels") { HandleListChannels(Sender, Params); } else if ((Params[1].ToLower() == "admins") || (Params[1].ToLower() == "administrators")) { HandleListAdmins(Sender, Params); } } break; case "!add": if (Params.Length >= 2) { if (Params[1].ToLower() == "network") { HandleAddNetwork(Sender, Params); } else if (Params[1].ToLower() == "channel") { HandleAddChannel(Sender, Params); } } break; case "!delete": if (Params.Length >= 2) { if (Params[1].ToLower() == "network") { HandleDeleteNetwork(Sender, Params); } else if (Params[1].ToLower() == "channel") { HandleDeleteChannel(Sender, Params); } } break; case "!rehash": // This may need to change in the future. Program.ConnectToServers(); break; case "!channels": HandleChannels(Sender, Params); break; } } else { m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "You are not an administrator.")); } } }
private void HandleHelp(string Sender, string[] Params) { if (Params.Length >= 2) { switch (Params[1].ToLower()) { case "add": if (Params.Length >= 3) { switch (Params[2].ToLower()) { case "channel": m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Add Channel Command: !add channel <Server ID> <Channel Name> [Channel Password]")); break; case "network": m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Add Network Command: !add network <Network Name> <IRC Server> <Server Port> <Real Name> <Nick> <Alternate Nick> [Server Password]")); break; } } else { m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Add Command: !add <channel|network>")); } break; case "delete": if (Params.Length >= 3) { switch (Params[2].ToLower()) { case "channel": m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Delete Channel Command: !delete channel <Channel ID> <Channel Name>")); break; case "network": m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Delete Network Command: !delete network <Network ID> <Network Name>")); break; } } else { m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Add Command: !delete <channel|network>")); } break; case "help": m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Help Command: !help")); break; case "list": if (Params.Length >= 3) { switch (Params[2].ToLower()) { case "admins": m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "List Admins Command: !list admins")); break; case "channels": m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "List Channels Command: !list channels")); break; case "networks": m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "List Networks Command: !list networks")); break; } } else { m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "List Command: !list <admins|channels|networks>")); } break; case "login": m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Login Command: !login <Password>")); break; case "logout": m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Logout Command: !logout")); break; case "rehash": m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Rehash Command: !rehash")); break; case "channels": m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Channels Command: !channels")); break; } } else { // All help commands m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Help Command: !help [add|delete|channels|help|login|logout|rehash]")); } }
public void Parse(DateTime Timestamp, uint TimeframeID, Sender Sender, string Command, string Parameters) { string[] ParamSplit = Parameters.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); switch (Command.ToUpper()) { case "353": // 353 - RPL_NAMREPLY - "<channel> :[[@|+]<nick> [[@|+]<nick> [...]]]" for (int i = 0; i < ParamSplit.Length; i++) { if (ParamSplit[i].Substring(0, 1) == "#") { // Skip to where we see the channel name. string Chan = ParamSplit[i].ToLower(); ParamSplit[i + 1] = ParamSplit[i + 1].Substring(1); string[] NameArr = new string[ParamSplit.Length - i - 1]; Array.Copy(ParamSplit, i + 1, NameArr, 0, ParamSplit.Length - i - 1); Channels[ParamSplit[i]].Names(NameArr); break; } } break; case "470": // Channel Forward // :adams.freenode.net 470 SomethingKewl #windows ##windows :Forwarding to another channel // Do we need to do anything here for stats? More code in IRCLogger.Server.Parse() case "JOIN": ParamSplit[0] = ParamSplit[0].ToLower(); if (ParamSplit[0].Contains(":")) { // Fix because some IRCds send "JOIN :#channel" instead of "JOIN #channel" ParamSplit[0] = ParamSplit[0].Substring(1).ToLower(); } Channels[ParamSplit[0]].Join(Timestamp, TimeframeID, Sender); break; case "PART": ParamSplit[0] = ParamSplit[0].ToLower(); if (ParamSplit.Length >= 2) { string PartMsg = Parameters.Substring(Parameters.IndexOf(":") + 1); if (PartMsg.Length == 0) { Channels[ParamSplit[0]].Part(Timestamp, TimeframeID, Sender, String.Empty); } else { if ((PartMsg.Substring(0, 1) == "\"") && (PartMsg.Substring(PartMsg.Length - 1, 1) == "\"")) { PartMsg = PartMsg.Substring(1, PartMsg.Length - 2); } } Channels[ParamSplit[0]].Part(Timestamp, TimeframeID, Sender, PartMsg); } else { Channels[ParamSplit[0]].Part(Timestamp, TimeframeID, Sender, String.Empty); } break; case "KICK": ParamSplit[0] = ParamSplit[0].ToLower(); Channels[ParamSplit[0]].Kick(Timestamp, TimeframeID, Sender, ParamSplit[1], Functions.CombineAfterIndex(ParamSplit, " ", 2).Substring(1)); break; case "INVITE": // TODO: Not sure how we want to handle this. break; case "NICK": if (IRCFunctions.GetNickFromHostString(Sender.SenderStr) == m_Nick) { m_Nick = Parameters.Substring(1); } foreach (KeyValuePair <string, Channel> CurKVP in Channels) { Channels[CurKVP.Key].Nick(Timestamp, TimeframeID, Sender, Parameters.Substring(1)); } break; case "QUIT": foreach (KeyValuePair <string, Channel> CurKVP in Channels) { Channels[CurKVP.Key].Quit(Timestamp, TimeframeID, Sender, Parameters.Substring(1)); } break; case "TOPIC": ParamSplit[0] = ParamSplit[0].ToLower(); string Topic = Parameters.Substring(Parameters.IndexOf(":") + 1); Channels[ParamSplit[0]].Topic(Timestamp, TimeframeID, Sender, Topic); break; case "MODE": ParamSplit[0] = ParamSplit[0].ToLower(); if (ParamSplit[0].Substring(0, 1) == "#") { // Is a channel mode Channels[ParamSplit[0]].Mode(Timestamp, TimeframeID, Sender, Functions.CombineAfterIndex(ParamSplit, " ", 1)); } else { // Is not going to a channel. Probably me? } break; case "PRIVMSG": ParamSplit[0] = ParamSplit[0].ToLower(); string MsgText = Parameters.Substring(Parameters.IndexOf(":") + 1); if (ParamSplit[0].Substring(0, 1) == "#") { // Is going to a channel if (MsgText.Substring(0, 1) == "\x1") { // If this is a special PRIVMSG, like an action or CTCP MsgText = MsgText.Substring(1, MsgText.Length - 2); string[] PrivMsgSplit = MsgText.Split(" ".ToCharArray(), 2); switch (PrivMsgSplit[0].ToUpper()) { case "ACTION": Channels[ParamSplit[0]].Action(Timestamp, TimeframeID, Sender, PrivMsgSplit[1]); break; // Maybe other stuff goes here like channel wide CTCPs? } } else { // If this is just a normal PRIVMSG. Channels[ParamSplit[0]].Message(Timestamp, TimeframeID, Sender, MsgText); } } else { // Is not going to a channel. Probably just me? if (MsgText.Substring(0, 1) == "\x1") { // If this is a special PRIVMSG, like an action or CTCP MsgText = MsgText.Substring(1, MsgText.Length - 2); string[] PrivMsgSplit = MsgText.Split(" ".ToCharArray(), 2); switch (PrivMsgSplit[0].ToUpper()) { case "ACTION": // Not sure what to do here... break; case "VERSION": //Send(IRCFunctions.CTCPVersionReply(IRCFunctions.GetNickFromHostString(Sender))); break; case "TIME": //Send(IRCFunctions.CTCPTimeReply(IRCFunctions.GetNickFromHostString(Sender))); break; case "PING": //Send(IRCFunctions.CTCPPingReply(IRCFunctions.GetNickFromHostString(Sender), PrivMsgSplit[1])); break; } } else { // Private Message directly to me. string[] MsgSplitPrv = MsgText.Split(" ".ToCharArray()); //BotCommands.HandlePM(Sender, MsgSplitPrv); } } break; case "NOTICE": // Needed for NickServ stuff string[] MsgSplitNtc = Parameters.Substring(Parameters.IndexOf(":") + 1).Split(" ".ToCharArray()); //BotCommands.HandleNotice(Sender, MsgSplitNtc); break; } }
public void Parse(string Sender, string Command, string Parameters) { //AppLog.WriteLine(5, "DEBUG", "\tSender: " + Sender); //AppLog.WriteLine(5, "DEBUG", "\tCommand: " + Command); //AppLog.WriteLine(5, "DEBUG", "\tParameters: " + Parameters); if (ConnectionWatchdog != null) { ConnectionWatchdog.Reset(); } string[] ParamSplit = Parameters.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); switch (Command.ToUpper()) { case "376": // RAW: 376 - RPL_ENDOFMOTD - ":End of /MOTD command" ConnectionWatchdog = new ConnectionWatchdog(this); JoinChannels(); break; case "353": // 353 - RPL_NAMREPLY - "<channel> :[[@|+]<nick> [[@|+]<nick> [...]]]" for (int i = 0; i < ParamSplit.Length; i++) { if (ParamSplit[i].Substring(0, 1) == "#") { // Skip to where we see the channel name. string Chan = ParamSplit[i]; ParamSplit[i + 1] = ParamSplit[i + 1].Substring(1); string[] NameArr = new string[ParamSplit.Length - i - 1]; Array.Copy(ParamSplit, i + 1, NameArr, 0, ParamSplit.Length - i - 1); Channels[ParamSplit[i]].Names(NameArr); break; } } break; case "433": //433 - ERR_NICKNAMEINUSE - "<nick> :Nickname is already in use" Send("NICK " + m_AltNick); m_Nick = m_AltNick; break; case "470": // Channel Forward // :adams.freenode.net 470 SomethingKewl #windows ##windows :Forwarding to another channel Channel OldChannel; if (Channels.ContainsKey(ParamSplit[1])) { OldChannel = Channels[ParamSplit[1]]; OldChannel.Name = ParamSplit[2]; // Should we really remove the old channel? Does it hurt? //m_Channels.Remove(ParamSplit[1]); Channels.Add(OldChannel.Name, OldChannel); // TODO: add code here to check for old channel and rename it. } else { // Conceivably this could happen if you were forcejoined to a channel which then got moved. OldChannel = new Channel(this); OldChannel.Name = ParamSplit[2]; OldChannel.StatsEnabled = true; throw new Exception("This should never happen. How is this happening? Case 470: Else"); } break; case "JOIN": if (ParamSplit[0].Contains(":")) { // Fix because some IRCds send "JOIN :#channel" instead of "JOIN #channel" ParamSplit[0] = ParamSplit[0].Substring(1); } Channels[ParamSplit[0]].Join(Sender); break; case "PART": if (ParamSplit.Length >= 2) { string PartMsg = Parameters.Substring(Parameters.IndexOf(":") + 1); if (PartMsg.Length == 0) { Channels[ParamSplit[0]].Part(Sender, String.Empty); } else { if ((PartMsg.Substring(0, 1) == "\"") && (PartMsg.Substring(PartMsg.Length - 1, 1) == "\"")) { PartMsg = PartMsg.Substring(1, PartMsg.Length - 2); } } Channels[ParamSplit[0]].Part(Sender, PartMsg); } else { Channels[ParamSplit[0]].Part(Sender, String.Empty); } break; case "KICK": Channels[ParamSplit[0]].Kick(Sender, ParamSplit[1], Functions.CombineAfterIndex(ParamSplit, " ", 2).Substring(1)); break; case "INVITE": // TODO: Not sure how we want to handle this. break; case "NICK": if (IRCFunctions.GetNickFromHostString(Sender) == m_Nick) { m_Nick = Parameters.Substring(1); } foreach (KeyValuePair <string, Channel> CurKVP in Channels) { Channels[CurKVP.Key].Nick(Sender, Parameters.Substring(1)); } BotCommands.CheckAdminChange(Sender, Parameters.Substring(1)); break; case "QUIT": foreach (KeyValuePair <string, Channel> CurKVP in Channels) { Channels[CurKVP.Key].Quit(Sender, Parameters.Substring(1)); } break; case "TOPIC": string Topic = Parameters.Substring(Parameters.IndexOf(":") + 1); Channels[ParamSplit[0]].Topic(Sender, Topic); break; case "MODE": if (ParamSplit[0].Substring(0, 1) == "#") { // Is a channel mode Channels[ParamSplit[0]].Mode(Sender, Functions.CombineAfterIndex(ParamSplit, " ", 1)); } else { // Is not going to a channel. Probably me? } break; case "PRIVMSG": string MsgText = Parameters.Substring(Parameters.IndexOf(":") + 1); if (ParamSplit[0].Substring(0, 1) == "#") { // Is going to a channel if (MsgText.Substring(0, 1) == "\x1") { // If this is a special PRIVMSG, like an action or CTCP MsgText = MsgText.Substring(1, MsgText.Length - 2); string[] PrivMsgSplit = MsgText.Split(" ".ToCharArray(), 2); switch (PrivMsgSplit[0].ToUpper()) { case "ACTION": Channels[ParamSplit[0]].Action(Sender, PrivMsgSplit[1]); break; // Maybe other stuff goes here like channel wide CTCPs? } } else { // If this is just a normal PRIVMSG. Channels[ParamSplit[0]].Message(Sender, MsgText); } } else { // Is not going to a channel. Probably just me? if (MsgText.Substring(0, 1) == "\x1") { // If this is a special PRIVMSG, like an action or CTCP MsgText = MsgText.Substring(1, MsgText.Length - 2); string[] PrivMsgSplit = MsgText.Split(" ".ToCharArray(), 2); switch (PrivMsgSplit[0].ToUpper()) { case "ACTION": // Not sure what to do here... break; case "VERSION": Send(IRCFunctions.CTCPVersionReply(IRCFunctions.GetNickFromHostString(Sender))); break; case "TIME": Send(IRCFunctions.CTCPTimeReply(IRCFunctions.GetNickFromHostString(Sender))); break; case "PING": Send(IRCFunctions.CTCPPingReply(IRCFunctions.GetNickFromHostString(Sender), PrivMsgSplit[1])); break; } } else { // Private Message directly to me. string[] MsgSplitPrv = MsgText.Split(" ".ToCharArray()); BotCommands.HandlePM(Sender, MsgSplitPrv); } } break; case "NOTICE": // Needed for NickServ stuff string[] MsgSplitNtc = Parameters.Substring(Parameters.IndexOf(":") + 1).Split(" ".ToCharArray()); BotCommands.HandleNotice(Sender, MsgSplitNtc); break; } }