/// <summary> /// Parse out command written in Input Box or sent from Plugin /// </summary> /// <param name="connection">Which Connection it is for</param> /// <param name="data">The Message to Parse</param> public void ParseOutGoingCommand(IRCConnection connection, string data) { int error = 0; try { data = data.Replace("", "\x0003"); data = data.Replace("", "\x0002"); data = data.Replace("", "\x001F"); data = data.Replace("", "\x001D"); data = data.Replace("", "\x0016"); data = data.Replace("", "\x000F"); data = data.Replace(@"\%C", "\x0003"); data = data.Replace(@"\%B", "\x0002"); data = data.Replace(@"\%U", "\x001F"); data = data.Replace(@"\%I", "\x001D"); data = data.Replace(@"\%R", "\x0016"); data = data.Replace(@"\%O", "\x000F"); PluginArgs args = new PluginArgs(connection); args.Command = data; //pass the channel or query/chat if either is active window if (CurrentWindow.WindowStyle == IceTabPage.WindowType.Channel) { args.Channel = CurrentWindow.TabCaption; args.Extra = IceTabPage.WindowType.Channel.ToString(); } else if (CurrentWindow.WindowStyle == IceTabPage.WindowType.Query) { args.Nick = CurrentWindow.TabCaption; args.Extra = IceTabPage.WindowType.Query.ToString(); } else if (CurrentWindow.WindowStyle == IceTabPage.WindowType.DCCChat) { args.Nick = CurrentWindow.TabCaption; args.Extra = IceTabPage.WindowType.DCCChat.ToString(); } else if (CurrentWindow.WindowStyle == IceTabPage.WindowType.Console) { args.Nick = "Console"; args.Extra = "Console"; } foreach (Plugin p in loadedPlugins) { IceChatPlugin ipc = p as IceChatPlugin; if (ipc != null) { if (((IceChatPlugin)ipc).plugin.Enabled == true) args = ((IceChatPlugin)ipc).plugin.InputText(args); } } data = args.Command; if (data.StartsWith("//")) { //parse out identifiers ParseOutGoingCommand(connection, ParseIdentifiers(connection, data, data)); return; } if (data.Length == 0) return; if (data.StartsWith("/")) { int indexOfSpace = data.IndexOf(" "); string command = ""; string temp = ""; if (indexOfSpace > 0) { command = data.Substring(0, indexOfSpace); data = data.Substring(command.Length + 1); } else { command = data; data = ""; } //check for aliases foreach (AliasItem a in iceChatAliases.listAliases) { if (a.AliasName == command) { if (a.Command.Length == 1) { data = ParseIdentifierValue(a.Command[0], data); ParseOutGoingCommand(connection, ParseIdentifiers(connection, data, data)); } else { //it is a multilined alias, run multiple commands string oldData = data; foreach (string c in a.Command) { //System.Diagnostics.Debug.WriteLine("a1:" + c + ":" + data + "::" + oldData); //data = ParseIdentifierValue(c, data); string data2 = ParseIdentifierValue(c, oldData); //System.Diagnostics.Debug.WriteLine("a2:" + data2); ParseOutGoingCommand(connection, ParseIdentifiers(connection, data2, oldData)); } } return; } } switch (command.ToLower()) { case "/makeexception": throw new Exception("Monody 9 Test Exception Error"); case "/setupdde": SetupIRCDDE(); break; case "/updater": RunUpdater(); break; case "/updateversion": UpdateInstallVersion(); break; case "/searchchannel": case "/searchchannels": if (data.Length > 0) { //searchChannels(data); } break; case "/searchnetwork": case "/searchnetworks": if (data.Length > 0) { //searchNetworks(data); } break; case "/connectionstatus": if (connection != null) { System.Diagnostics.Debug.WriteLine(connection.IsConnected); } break; case "/debug": if (data.Length == 0) debugWindowToolStripMenuItem.PerformClick(); else { string[] dt = data.Split(' '); if (dt[0].Equals("disable", StringComparison.OrdinalIgnoreCase)) { //disable this server from debug window/popup foreach (IRCConnection c in serverTree.ServerConnections.Values) { if (c.ServerSetting.ID.ToString() == dt[1]) { c.ShowDebug = false; } } } else if (dt[0].Equals("enable", StringComparison.OrdinalIgnoreCase)) { //disable this server from debug window/popup foreach (IRCConnection c in serverTree.ServerConnections.Values) { if (c.ServerSetting.ID.ToString() == dt[1]) { c.ShowDebug = true; } } } } break; case "/addlines": if (data.Length == 0) { for (int i = 0; i < 250; i++) { //pick a random color int randColor = new Random().Next(0, 71); string msg = "\x000304 " + i.ToString() + ":The quick brown \x0003" + randColor.ToString("00") + ",4fox jumps over the\x0003 www.icechat.net lazy dog and gets away with it at http://icechat.codeplex.com"; CurrentWindowMessage(connection, msg, "", true); } } else { int c = Convert.ToInt32(data); for (int i = 0; i < c; i++) { //pick a random color int randColor = new Random().Next(0, 71); string msg = "\x000304 " + i.ToString() + ":The quick brown \x0003" + randColor.ToString("00") + ",4fox jumps over the\x0003 www.icechat.net lazy dog and gets away with it at http://icechat.codeplex.com"; CurrentWindowMessage(connection, msg, "", true); } } break; case "/ipsum": string[] words = new[]{"lorem", "ipsum", "dolor", "sit", "amet", "consectetuer", "adipiscing", "elit", "sed", "diam", "nonummy", "nibh", "euismod", "tincidunt", "ut", "laoreet", "dolore", "magna", "aliquam", "erat"}; Random rn = new Random(); string rs = string.Empty; int maxWords = 25; for (int w = 0; w < maxWords; w++) { if (w > 0) { rs += " "; } rs += words[rn.Next(words.Length)]; } CurrentWindowMessage(connection, rs, "", true); break; case "/colormode": if (data.Length == 0) { if (CurrentWindowStyle == IceTabPage.WindowType.Channel) CurrentWindow.TextWindow.NoColorMode = !CurrentWindow.TextWindow.NoColorMode; } else { IceTabPage t = GetWindow(connection, data, IceTabPage.WindowType.Channel); if (t != null) t.TextWindow.NoColorMode = !t.TextWindow.NoColorMode; } break; case "/sounds": if (data.Length == 0) { if (CurrentWindowStyle == IceTabPage.WindowType.Channel) CurrentWindow.DisableSounds = !CurrentWindow.DisableSounds; } else { IceTabPage t = GetWindow(connection, data, IceTabPage.WindowType.Channel); if (t != null) t.DisableSounds = !t.DisableSounds; } break; case "/flashing": if (data.Length == 0) { if (CurrentWindowStyle == IceTabPage.WindowType.Channel) CurrentWindow.EventOverLoad = !CurrentWindow.EventOverLoad; } else { IceTabPage t = GetWindow(connection, data, IceTabPage.WindowType.Channel); if (t != null) t.EventOverLoad = !t.EventOverLoad; } break; case "/logging": if (data.Length == 0) { if (CurrentWindowStyle == IceTabPage.WindowType.Channel) { CurrentWindow.LoggingDisable = !CurrentWindow.LoggingDisable; CurrentWindow.TextWindow.DisableLogFile(); } } else { IceTabPage t = GetWindow(connection, data, IceTabPage.WindowType.Channel); if (t != null) { t.LoggingDisable = !t.LoggingDisable; t.TextWindow.DisableLogFile(); } } break; case "/dump": if (data.Length == 0) { if (CurrentWindowStyle == IceTabPage.WindowType.Channel) { CurrentWindow.TextWindow.SaveDumpFile(); } } break; case "/loaddump": if (data.Length == 0) { if (CurrentWindowStyle == IceTabPage.WindowType.Channel) { CurrentWindow.TextWindow.LoadDumpFile(CurrentWindow); CurrentWindow.TextWindow.Invalidate(); } } break; case "/background": case "/bg": //change background image for a window(s) if (data.Length > 0) { //bg windowtype imagefile //bg windowtype windowname imagefile //if imagefile is 'none', erase background image string window = data.Split(' ')[0]; string file = ""; if (data.IndexOf(' ') > -1) file = data.Substring(window.Length + 1); switch (window.ToLower()) { case "nicklist": if (file.Length == 0) { //ask for a file/picture file = GetBackgroundImage(); if (file.Length > 0) { this.nickList.BackGroundImage = file; //save the image file if (System.IO.Path.GetDirectoryName(file).ToLower().CompareTo(picturesFolder.ToLower()) == 0) iceChatOptions.NickListImage = System.IO.Path.GetFileName(file); else iceChatOptions.NickListImage = file; } return; } else if (file.ToLower() == "none" || file.ToLower() == "remove") { this.nickList.BackGroundImage = ""; iceChatOptions.NickListImage = ""; } else { //check if it is a full path or just a pic in the pictures folder if (File.Exists(picturesFolder + System.IO.Path.DirectorySeparatorChar + file)) { this.nickList.BackGroundImage = picturesFolder + System.IO.Path.DirectorySeparatorChar + file; iceChatOptions.NickListImage = file; } else if (File.Exists(file)) { this.nickList.BackGroundImage = file; iceChatOptions.NickListImage = file; } } break; case "serverlist": case "servertree": if (file.Length == 0) { //ask for a file/picture file = GetBackgroundImage(); if (file.Length > 0) { this.serverTree.BackGroundImage = file; //save the image file if (System.IO.Path.GetDirectoryName(file).ToLower().CompareTo(picturesFolder.ToLower()) == 0) iceChatOptions.ServerTreeImage = System.IO.Path.GetFileName(file); else iceChatOptions.ServerTreeImage = file; } return; } else if (file.ToLower() == "none" || file.ToLower() == "remove") { this.serverTree.BackGroundImage = ""; iceChatOptions.ServerTreeImage = ""; } else { //check if it is a full path or just a pic in the pictures folder if (File.Exists(picturesFolder + System.IO.Path.DirectorySeparatorChar + file)) { this.serverTree.BackGroundImage = picturesFolder + System.IO.Path.DirectorySeparatorChar + file; iceChatOptions.ServerTreeImage = file; } else if (File.Exists(file)) { this.serverTree.BackGroundImage = file; iceChatOptions.ServerTreeImage = file; } } break; case "console": //check if the file is a URL if (file.Length > 0) { if (File.Exists(picturesFolder + System.IO.Path.DirectorySeparatorChar + file)) mainChannelBar.GetTabPage("Console").CurrentConsoleWindow().BackGroundImage = picturesFolder + System.IO.Path.DirectorySeparatorChar + file; else { //check if this is a full path to the file if (File.Exists(file)) mainChannelBar.GetTabPage("Console").CurrentConsoleWindow().BackGroundImage = file; else mainChannelBar.GetTabPage("Console").CurrentConsoleWindow().BackGroundImage = ""; } } break; case "channel": //get the channel name if (file.IndexOf(' ') > -1) { string channel = file.Split(' ')[0]; //if channel == "all" do it for all file = file.Substring(channel.Length + 1); if (channel.ToLower() == "all") { foreach (IceTabPage t in mainChannelBar.TabPages) { if (t.WindowStyle == IceTabPage.WindowType.Channel) { if (File.Exists(picturesFolder + System.IO.Path.DirectorySeparatorChar + file)) t.TextWindow.BackGroundImage = (picturesFolder + System.IO.Path.DirectorySeparatorChar + file); else t.TextWindow.BackGroundImage = ""; } } } else { IceTabPage t = GetWindow(connection, channel, IceTabPage.WindowType.Channel); if (t != null) { if (File.Exists(picturesFolder + System.IO.Path.DirectorySeparatorChar + file)) t.TextWindow.BackGroundImage = (picturesFolder + System.IO.Path.DirectorySeparatorChar + file); else t.TextWindow.BackGroundImage = ""; } } } else { //only a channel name specified, no file, erase the image //if file == "all" clear em all if (file.ToLower() == "all") { foreach (IceTabPage t in mainChannelBar.TabPages) { if (t.WindowStyle == IceTabPage.WindowType.Channel) t.TextWindow.BackGroundImage = ""; } } else { IceTabPage t = GetWindow(connection, file, IceTabPage.WindowType.Channel); if (t != null) t.TextWindow.BackGroundImage = ""; } } break; case "query": break; case "window": if (file.IndexOf(' ') > -1) { string windowName = file.Split(' ')[0]; file = file.Substring(windowName.Length + 1); IceTabPage t = GetWindow(connection, windowName, IceTabPage.WindowType.Window); if (t != null) { if (File.Exists(picturesFolder + System.IO.Path.DirectorySeparatorChar + file)) t.TextWindow.BackGroundImage = (picturesFolder + System.IO.Path.DirectorySeparatorChar + file); else t.TextWindow.BackGroundImage = ""; } } else { IceTabPage t = GetWindow(connection, file, IceTabPage.WindowType.Window); if (t != null) t.TextWindow.BackGroundImage = ""; } break; } } break; case "/bgcolor": //change the background color for the current or selected window if (data.Length > 0) { int result; if (Int32.TryParse(data, out result)) if (result >= 0 && result < 72) if (CurrentWindowStyle == IceTabPage.WindowType.Console) mainChannelBar.GetTabPage("Console").CurrentConsoleWindow().IRCBackColor = result; else if (CurrentWindowStyle == IceTabPage.WindowType.Channel || CurrentWindowStyle == IceTabPage.WindowType.Query || CurrentWindowStyle == IceTabPage.WindowType.Window) CurrentWindow.TextWindow.IRCBackColor = result; } break; case "/unloadplugin": if (data.Length > 0) { //get the plugin name, and look for it in the menu items ToolStripMenuItem menuItem = null; foreach (ToolStripMenuItem t in pluginsToolStripMenuItem.DropDownItems) if (t.ToolTipText.ToLower() == data.ToLower()) menuItem = t; if (menuItem != null) { IPluginIceChat plugin = (IPluginIceChat)menuItem.Tag; plugin.Enabled = false; plugin.Unloaded = true; //remove any panels added to the main form Panel[] addedPanels = plugin.AddMainPanel(); if (addedPanels != null && addedPanels.Length > 0) { bool foundOther = false; foreach (Panel p in addedPanels) { //fix the bottom panel / splitter if (p != null) { if (p.Dock == DockStyle.Bottom) { //are there any other foreach (Control cp in this.Controls) { if (cp != p) { if (cp.GetType() == typeof(Panel)) if (cp.Dock == DockStyle.Bottom) foundOther = true; } } } } this.Controls.Remove(p); } if (!foundOther) { this.Invoke((MethodInvoker)delegate() { this.splitterBottom.Visible = false; }); } } plugin.OnCommand -= new OutGoingCommandHandler(Plugin_OnCommand); menuItem.Click -= new EventHandler(OnPluginMenuItemClick); pluginsToolStripMenuItem.DropDownItems.Remove(menuItem); for (int i = 0; i < iceChatPlugins.listPlugins.Count; i++) { if (((PluginItem)iceChatPlugins.listPlugins[i]).PluginFile.Equals(menuItem.ToolTipText)) { ((PluginItem)iceChatPlugins.listPlugins[i]).Enabled = false; ((PluginItem)iceChatPlugins.listPlugins[i]).Unloaded = true; SavePluginFiles(); } } WindowMessage(null, "Console", "\x000304Unloaded Plugin - " + plugin.Name, "", true); } } break; case "/statusplugin": if (data.Length > 0 && data.IndexOf(' ') > 0) { string[] values = data.Split(new char[] { ' ' }, 2); ToolStripMenuItem menuItem = null; foreach (ToolStripMenuItem t in pluginsToolStripMenuItem.DropDownItems) if (t.ToolTipText.ToLower() == values[1].ToLower()) menuItem = t; if (menuItem != null) { //match IPluginIceChat plugin = (IPluginIceChat)menuItem.Tag; plugin.Enabled = Convert.ToBoolean(values[0]); if (plugin.Enabled == true) { WindowMessage(null, "Console", "\x000304Enabled Plugin - " + plugin.Name + " v" + plugin.Version, "", true); //init the plugin System.Threading.Thread initPlugin = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(InitializePlugin)); initPlugin.Start(plugin); //remove the icon menuItem.Image = null; } else { WindowMessage(null, "Console", "\x000304Disabled Plugin - " + plugin.Name + " v" + plugin.Version, "", true); menuItem.Image = StaticMethods.LoadResourceImage("CloseButton.png"); } } } break; case "/loadplugin": if (data.Length > 0) { IPluginIceChat ipc = loadPlugin(pluginsFolder + System.IO.Path.DirectorySeparatorChar + data); if (ipc != null) { System.Threading.Thread initPlugin = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(InitializePlugin)); initPlugin.Start(ipc); } } break; case "/reload": if (data.Length > 0) { switch (data) { case "alias": case "aliases": CurrentWindowMessage(connection, "\x000304 Aliases file reloaded", "", true); LoadAliases(); break; case "popup": case "popups": CurrentWindowMessage(connection, "\x000304 Popups file reloaded", "", true); LoadPopups(); break; case "emoticon": case "emoticons": CurrentWindowMessage(connection, "\x000304 Emoticons file reloaded", "", true); LoadEmoticons(); break; case "sound": case "sounds": CurrentWindowMessage(connection, "\x000304 Sounds file reloaded", "", true); LoadSounds(); break; case "color": case "colors": CurrentWindowMessage(connection, "\x00034 Colors file reloaded", "", true); LoadColors(); toolStripMain.BackColor = IrcColor.colors[iceChatColors.ToolbarBackColor]; menuMainStrip.BackColor = IrcColor.colors[iceChatColors.MenubarBackColor]; statusStripMain.BackColor = IrcColor.colors[iceChatColors.StatusbarBackColor]; toolStripStatus.ForeColor = IrcColor.colors[iceChatColors.StatusbarForeColor]; inputPanel.SetInputBoxColors(); channelList.SetListColors(); buddyList.SetListColors(); serverTree.SetListColors(); nickList.SetListColors(); break; case "font": case "fonts": CurrentWindowMessage(connection, "\x00034 Fonts file reloaded", "", true); LoadFonts(); nickList.Font = new Font(iceChatFonts.FontSettings[3].FontName, iceChatFonts.FontSettings[3].FontSize); serverTree.Font = new Font(iceChatFonts.FontSettings[4].FontName, iceChatFonts.FontSettings[4].FontSize); menuMainStrip.Font = new Font(iceChatFonts.FontSettings[7].FontName, iceChatFonts.FontSettings[7].FontSize); break; } } break; case "/addtext": if (data.Length > 0) AddInputPanelText(data); break; case "/beep": System.Media.SystemSounds.Beep.Play(); break; case "/size": CurrentWindowMessage(connection, "\x00034Window Size is: " + this.Width + ":" + this.Height, "", true); break; case "/ame": //me command for all channels if (connection != null && data.Length > 0) { foreach (IceTabPage t in mainChannelBar.TabPages) { if (t.WindowStyle == IceTabPage.WindowType.Channel) { if (t.Connection == connection) { SendData(connection, "PRIVMSG " + t.TabCaption + " :ACTION " + data + ""); string msg = GetMessageFormat("Self Channel Action"); msg = msg.Replace("$nick", t.Connection.ServerSetting.CurrentNickName).Replace("$channel", t.TabCaption); msg = msg.Replace("$message", data); t.TextWindow.AppendText(msg, ""); t.TextWindow.ScrollToBottom(); t.LastMessageType = ServerMessageType.Action; } } } } break; case "/amsg": //send a message to all channels if (connection != null && data.Length > 0) { foreach (IceTabPage t in mainChannelBar.TabPages) { if (t.WindowStyle == IceTabPage.WindowType.Channel) { if (t.Connection == connection) { SendData(connection, "PRIVMSG " + t.TabCaption + " :" + data); string msg = GetMessageFormat("Self Channel Message"); msg = msg.Replace("$nick", t.Connection.ServerSetting.CurrentNickName).Replace("$channel", t.TabCaption); //assign $color to the nickname if (msg.Contains("$color")) { User u = CurrentWindow.GetNick(t.Connection.ServerSetting.CurrentNickName); //get the nick color if (u.nickColor == -1) { if (IceChatColors.RandomizeNickColors == true) { int randColor = new Random().Next(0, 71); if (randColor == IceChatColors.NickListBackColor) randColor = new Random().Next(0, 71); u.nickColor = randColor; } else { //get the correct nickname color for channel status for (int y = 0; y < u.Level.Length; y++) { if (u.Level[y]) { switch (connection.ServerSetting.StatusModes[0][y]) { case 'q': u.nickColor = IceChatColors.ChannelOwnerColor; break; case 'a': u.nickColor = IceChatColors.ChannelAdminColor; break; case 'o': u.nickColor = IceChatColors.ChannelOpColor; break; case 'h': u.nickColor = IceChatColors.ChannelHalfOpColor; break; case 'v': u.nickColor = IceChatColors.ChannelVoiceColor; break; default: u.nickColor = IceChatColors.ChannelRegularColor; break; } break; } } } if (u.nickColor == -1) u.nickColor = IceChatColors.ChannelRegularColor; } msg = msg.Replace("$color", "\x0003" + u.nickColor.ToString("00")); } msg = msg.Replace("$status", CurrentWindow.GetNick(t.Connection.ServerSetting.CurrentNickName).ToString().Replace(t.Connection.ServerSetting.CurrentNickName , "")); msg = msg.Replace("$message", data); t.TextWindow.AppendText(msg, ""); t.TextWindow.ScrollToBottom(); t.LastMessageType = ServerMessageType.Message; } } } } break; case "/anick": if (data.Length > 0) { foreach (IRCConnection c in serverTree.ServerConnections.Values) if (c.IsConnected) SendData(c, "NICK " + data); } break; case "/autojoin": if (connection != null) { if (data.Length == 0) { if (connection.ServerSetting.AutoJoinChannels != null) { foreach (string chan in connection.ServerSetting.AutoJoinChannels) { if (chan != null) { if (!chan.StartsWith(";")) SendData(connection, "JOIN " + chan); } } } } else { if (connection.ServerSetting.AutoJoinChannels == null) { //we have no autojoin channels, so just add it connection.ServerSetting.AutoJoinChannels = new string[1]; connection.ServerSetting.AutoJoinChannels[0] = data; CurrentWindowMessage(connection, "\x000307" + data + " is added to the Autojoin List", "", true); serverTree.SaveServers(serverTree.ServersCollection); } else { //check if it is in the list first bool Exists = false; bool Disabled = false; string[] oldAutoJoin = new string[connection.ServerSetting.AutoJoinChannels.Length]; int i = 0; foreach (string chan in connection.ServerSetting.AutoJoinChannels) { if (chan != null) { if (chan.ToLower() == data.ToLower()) { //already in the list Exists = true; Disabled = true; oldAutoJoin[i] = ";" + chan; CurrentWindowMessage(connection, "\x000307" + data + " is now disabled in the Autojoin List", "", true); } else if (chan.ToLower() == (";" + data.ToLower())) { //already in the list, but disabled //so lets enable it Disabled = true; oldAutoJoin[i] = chan.Substring(1); Exists = true; CurrentWindowMessage(connection, "\x000307" + data + " is enabled in the Autojoin List", "", true); } else oldAutoJoin[i] = chan; } i++; } if (!Exists) { //add a new item connection.ServerSetting.AutoJoinChannels = new string[connection.ServerSetting.AutoJoinChannels.Length + 1]; i = 0; foreach (string chan in oldAutoJoin) { connection.ServerSetting.AutoJoinChannels[i] = chan; i++; } connection.ServerSetting.AutoJoinChannels[i] = data; CurrentWindowMessage(connection, "\x000307" + data + " is added to the Autojoin List", "", true); serverTree.SaveServers(serverTree.ServersCollection); } else if (Disabled) { connection.ServerSetting.AutoJoinChannels = new string[connection.ServerSetting.AutoJoinChannels.Length]; i = 0; foreach (string chan in oldAutoJoin) { connection.ServerSetting.AutoJoinChannels[i] = chan; i++; } serverTree.SaveServers(serverTree.ServersCollection); } } } } break; case "/autoperform": if (connection != null) { if (connection.ServerSetting.AutoPerform != null) { foreach (string ap in connection.ServerSetting.AutoPerform) { string autoCommand = ap.Replace("\r", String.Empty); if (!autoCommand.StartsWith(";")) ParseOutGoingCommand(connection, autoCommand); } } } break; case "/autostart": if (connection != null) { connection.ServerSetting.AutoStart = !connection.ServerSetting.AutoStart; serverTree.SaveServers(serverTree.ServersCollection); } break; case "/aaway": foreach (IRCConnection c in serverTree.ServerConnections.Values) { if (c.IsConnected) ParseOutGoingCommand(c, "/away " + data); } break; case "/away": if (connection != null) { if (connection.ServerSetting.Away) { connection.ServerSetting.Away = false; if (connection.ServerSetting.AwayNickName.Length > 0) SendData(connection, "NICK " + connection.ServerSetting.DefaultNick); TimeSpan t = DateTime.Now.Subtract(connection.ServerSetting.AwayStart); string s = t.Seconds.ToString() + " secs"; if (t.Minutes > 0) s = t.Minutes.ToString() + " mins " + s; if (t.Hours > 0) s = t.Hours.ToString() + " hrs " + s; if (t.Days > 0) s = t.Days.ToString() + " days " + s; string msg = iceChatOptions.ReturnCommand; msg = msg.Replace("$awaytime", s); if (iceChatOptions.SendAwayCommands == true && !connection.ServerSetting.DisableAwayMessages) ParseOutGoingCommand(connection, msg); } else { connection.ServerSetting.Away = true; connection.ServerSetting.DefaultNick = connection.ServerSetting.CurrentNickName; connection.ServerSetting.AwayStart = System.DateTime.Now; if (connection.ServerSetting.AwayNickName.Length > 0) SendData(connection, "NICK " + connection.ServerSetting.AwayNickName); string msg = iceChatOptions.AwayCommand; msg = msg.Replace("$awayreason", data); if (iceChatOptions.SendAwayCommands == true && !connection.ServerSetting.DisableAwayMessages) ParseOutGoingCommand(connection, msg); } } break; case "/ban": // /ban #channel nick|address /mode #channel +b host if (connection != null && data.IndexOf(' ') > 0) { string channel = data.Split(' ')[0]; string host = data.Split(' ')[1]; ParseOutGoingCommand(connection, "/mode " + channel + " +b " + host); } break; case "/browser": if (data.Length > 0) { if (data.StartsWith("http")) System.Diagnostics.Process.Start(data); else System.Diagnostics.Process.Start("http://" + data); } break; case "/buddylist": case "/notify": //add a nickname to the buddy list if (connection != null && data.Length > 0 && data.IndexOf(" ") == -1) { //check if the nickname is already in the buddy list if (connection.ServerSetting.BuddyList != null) { foreach (BuddyListItem buddy in connection.ServerSetting.BuddyList) { if (!buddy.Nick.StartsWith(";")) if (buddy.Nick.ToLower() == data.ToLower()) return; else if (buddy.Nick.Substring(1).ToLower() == data.ToLower()) return; } } //add in the new buddy list item BuddyListItem b = new BuddyListItem(); b.Nick = data; BuddyListItem[] buddies = connection.ServerSetting.BuddyList; Array.Resize(ref buddies, buddies.Length + 1); buddies[buddies.Length - 1] = b; connection.ServerSetting.BuddyList = buddies; serverTree.SaveServers(serverTree.ServersCollection); connection.BuddyListCheck(); } break; case "/chaninfo": if (connection != null) { if (data.Length > 0) { IceTabPage t = GetWindow(connection, data, IceTabPage.WindowType.Channel); if (t != null) { FormChannelInfo fci = new FormChannelInfo(t); SendData(connection, "MODE " + t.TabCaption + " +b"); //check if mode (e) exists for Exception List if (connection.ServerSetting.ChannelModeParam.Contains("e")) SendData(connection, "MODE " + t.TabCaption + " +e"); SendData(connection, "TOPIC :" + t.TabCaption); fci.Show(this); } } else { //check if current window is channel if (CurrentWindowStyle == IceTabPage.WindowType.Channel) { FormChannelInfo fci = new FormChannelInfo(CurrentWindow); SendData(connection, "MODE " + CurrentWindow.TabCaption + " +b"); //check if mode (e) exists for Exception List if (connection.ServerSetting.ChannelModeParam.Contains("e")) SendData(connection, "MODE " + CurrentWindow.TabCaption + " +e"); SendData(connection, "TOPIC :" + CurrentWindow.TabCaption); fci.Show(this); } } } break; case "/pin": if (data.Length > 0) { IceTabPage t = GetWindow(connection, data, IceTabPage.WindowType.Channel); if (t != null) { t.PinnedTab = true; } else { IceTabPage c = GetWindow(null, data, IceTabPage.WindowType.Console); if (c != null) c.PinnedTab = true; else { //debug window? IceTabPage d = GetWindow(null, data, IceTabPage.WindowType.Debug); if (d != null) d.PinnedTab = true; else { IceTabPage w = GetWindow(null, data, IceTabPage.WindowType.Window); if (w != null) w.PinnedTab = true; else { IceTabPage q = GetWindow(connection, data, IceTabPage.WindowType.Query); if (q != null) q.PinnedTab = true; } } } } } break; case "/unpin": if (data.Length > 0) { IceTabPage t = GetWindow(connection, data, IceTabPage.WindowType.Channel); if (t != null) { t.PinnedTab = false; } else { IceTabPage c = GetWindow(null, data, IceTabPage.WindowType.Console); if (c != null) c.PinnedTab = false; else { //debug window? IceTabPage d = GetWindow(null, data, IceTabPage.WindowType.Debug); if (d != null) d.PinnedTab = false; else { IceTabPage w = GetWindow(null, data, IceTabPage.WindowType.Window); if (w != null) w.PinnedTab = false; else { IceTabPage q = GetWindow(connection, data, IceTabPage.WindowType.Query); if (q != null) q.PinnedTab = false; } } } } } break; case "/attach": if (data.Length == 0) { if (CurrentWindowStyle == IceTabPage.WindowType.Channel || CurrentWindowStyle == IceTabPage.WindowType.Query || CurrentWindowStyle == IceTabPage.WindowType.Window) { //are we in windowed mode or not? if (!mainTabControl.windowedMode) { //need to get the FormWindow FormWindow child =(FormWindow)CurrentWindow.Parent; child.MainMenu.Hide(); child.DisableActivate(); IceTabPage tab = child.DockedControl; tab.DockedForm = false; tab.Detached = false; mainTabControl.AddTabPage(tab); mainChannelBar.SelectTab(tab); //close the window child.Close(); } else { //we are already in windowed mode.. back to the parent FormWindow child = (FormWindow)CurrentWindow.Parent; child.MdiParent = this; child.MainMenu.Hide(); CurrentWindow.Detached = false; } } } break; case "/detach": if (data.Length == 0) { if (CurrentWindowStyle == IceTabPage.WindowType.Channel || CurrentWindowStyle == IceTabPage.WindowType.Query || CurrentWindowStyle == IceTabPage.WindowType.Window) { //are we in windowed mode or not? if (!mainTabControl.windowedMode) { IceTabPage tab = CurrentWindow; tab.Detached = true; tab.DockedForm = true; FormWindow fw = new FormWindow(tab); fw.Text = tab.TabCaption; if (tab.WindowStyle == IceTabPage.WindowType.Channel || tab.WindowStyle == IceTabPage.WindowType.Query) fw.Text += " {" + tab.Connection.ServerSetting.NetworkName + "}"; Point location = tab.WindowLocation; fw.Show(); if (location != null) { //set new window location fw.Location = location; } if (tab.WindowSize != null && tab.WindowSize.Height != 0) { fw.Size = tab.WindowSize; } } else { //we are already in windowed mode.. remove the parent FormWindow child = (FormWindow)CurrentWindow.Parent; child.MdiParent = null; CurrentWindow.Detached = true; } } } else { //detach a specific window } break; case "/loadorder": mainChannelBar.SortPageTabs(); mainChannelBar.Invalidate(); break; case "/saveorder": int curWindow = 1; //window # for (int i = 0; i < mainChannelBar.TabPages.Count; i++) { if (mainChannelBar.TabPages[i].WindowStyle == IceTabPage.WindowType.Channel) { curWindow++; mainChannelBar.TabPages[i].WindowIndex = curWindow; } } //save the channel settings SaveChannelSettings(); break; case "/switch": //switch to a specific channel / query on a server // /switch #channel serverID if (data.IndexOf(' ') > -1) { string channel = data.Split(' ')[0]; string server = data.Split(' ')[1]; int serverID; if (Int32.TryParse(server, out serverID)) { //switch to this window for (int i = 0; i < mainChannelBar.TabPages.Count; i++) { if (mainChannelBar.TabPages[i].WindowStyle == IceTabPage.WindowType.Channel || mainChannelBar.TabPages[i].WindowStyle == IceTabPage.WindowType.Query) { if (mainChannelBar.TabPages[i].Connection.ServerSetting.ID == serverID) { if (mainChannelBar.TabPages[i].TabCaption.ToLower() == channel.ToLower()) mainChannelBar.SelectTab(mainChannelBar.TabPages[i]); } } } } } break; case "/clear": if (data.Length == 0) { if (CurrentWindowStyle != IceTabPage.WindowType.Console) { CurrentWindow.TextWindow.ClearTextWindow(); } else { //find the current console tab window mainChannelBar.GetTabPage("Console").CurrentConsoleWindow().ClearTextWindow(); } } else { //find a match if (data == "Console") { mainChannelBar.GetTabPage("Console").CurrentConsoleWindow().ClearTextWindow(); return; } else if (data == "Debug") { IceTabPage db = GetWindow(null, "Debug", IceTabPage.WindowType.Debug); if (db != null) { db.TextWindow.ClearTextWindow(); } } else if (data.ToLower() == "all console") { //clear all the console windows and channel/queries foreach (ConsoleTab c in mainChannelBar.GetTabPage("Console").ConsoleTab.TabPages) ((TextWindow)c.Controls[0]).ClearTextWindow(); } IceTabPage t = GetWindow(connection, data, IceTabPage.WindowType.Channel); if (t != null) t.TextWindow.ClearTextWindow(); else { IceTabPage q = GetWindow(connection, data, IceTabPage.WindowType.Query); if (q != null) { q.TextWindow.ClearTextWindow(); return; } IceTabPage dcc = GetWindow(connection, data, IceTabPage.WindowType.DCCChat); if (dcc != null) { dcc.TextWindow.ClearTextWindow(); return; } IceTabPage win = GetWindow(null, data, IceTabPage.WindowType.Window); if (win != null) { win.TextWindow.ClearTextWindow(); return; } } } break; case "/clearall": //clear all the text windows for (int i = mainChannelBar.TabPages.Count - 1; i >= 0; i--) { if (mainChannelBar.TabPages[i].WindowStyle == IceTabPage.WindowType.Channel || mainChannelBar.TabPages[i].WindowStyle == IceTabPage.WindowType.Query) { mainChannelBar.TabPages[i].TextWindow.ClearTextWindow(); } else if (mainChannelBar.TabPages[i].WindowStyle == IceTabPage.WindowType.Console) { //clear all console windows foreach (ConsoleTab c in mainChannelBar.GetTabPage("Console").ConsoleTab.TabPages) { ((TextWindow)c.Controls[0]).ClearTextWindow(); } } } break; case "/closeall": for (int i = mainChannelBar.TabPages.Count - 1; i >= 0; i--) { if (mainChannelBar.TabPages[i].WindowStyle == IceTabPage.WindowType.Window) { RemoveWindow(connection, mainChannelBar.TabPages[i].TabCaption, IceTabPage.WindowType.Window); } } break; case "/close": if (connection != null && data.Length > 0) { //check if it is a channel list window if (data == "Channels") { IceTabPage c = GetWindow(connection, "", IceTabPage.WindowType.ChannelList); if (c != null) RemoveWindow(connection, "", IceTabPage.WindowType.ChannelList); return; } //check if it is a query window IceTabPage q = GetWindow(connection, data, IceTabPage.WindowType.Query); if (q != null) { RemoveWindow(connection, q.TabCaption, IceTabPage.WindowType.Query); return; } //check if it is a dcc chat window IceTabPage dcc = GetWindow(connection, data, IceTabPage.WindowType.DCCChat); if (dcc != null) { RemoveWindow(connection, dcc.TabCaption, IceTabPage.WindowType.DCCChat); return; } } else if (connection != null) { //check if current window is channel/query/dcc chat if (CurrentWindowStyle == IceTabPage.WindowType.Query) RemoveWindow(connection, CurrentWindow.TabCaption, CurrentWindow.WindowStyle); else if (CurrentWindowStyle == IceTabPage.WindowType.DCCChat) RemoveWindow(connection, CurrentWindow.TabCaption, CurrentWindow.WindowStyle); else if (CurrentWindowStyle == IceTabPage.WindowType.Channel) { SendData(connection, "PART " + CurrentWindow.TabCaption); RemoveWindow(connection, CurrentWindow.TabCaption, CurrentWindow.WindowStyle); } } else { //check if the current window is the debug window if (data.Length == 0) { if (CurrentWindowStyle == IceTabPage.WindowType.Window) RemoveWindow(null, CurrentWindow.TabCaption, CurrentWindow.WindowStyle); else if (CurrentWindowStyle == IceTabPage.WindowType.Debug) RemoveWindow(null, "Debug", IceTabPage.WindowType.Debug); } else if (data.ToLower() == "debug") { RemoveWindow(null, "Debug", IceTabPage.WindowType.Debug); } else { if (data.StartsWith("@")) RemoveWindow(null, data, IceTabPage.WindowType.Window); } } break; case "/closequery": if (connection != null) { for (int i = mainChannelBar.TabPages.Count - 1; i >= 0; i--) { if (mainChannelBar.TabPages[i].WindowStyle == IceTabPage.WindowType.Query) { if (mainChannelBar.TabPages[i].Connection == connection) { RemoveWindow(connection, mainChannelBar.TabPages[i].TabCaption, IceTabPage.WindowType.Query); } } } } break; case "/closeallquery": if (connection != null) { for (int i = mainChannelBar.TabPages.Count - 1; i >= 0; i--) { if (mainChannelBar.TabPages[i].WindowStyle == IceTabPage.WindowType.Query) { RemoveWindow(connection, mainChannelBar.TabPages[i].TabCaption, IceTabPage.WindowType.Query); } } } break; case "/ctcp": if (connection != null && data.IndexOf(' ') > 0) { //ctcp nick ctcptype string nick = data.Substring(0, data.IndexOf(' ')); //get the message string ctcp = data.Substring(data.IndexOf(' ') + 1); string msg = GetMessageFormat("Ctcp Send"); msg = msg.Replace("$nick", nick); ; msg = msg.Replace("$ctcp", ctcp.ToUpper()); CurrentWindowMessage(connection, msg, "", true); if (ctcp.ToUpper() == "PING") SendData(connection, "PRIVMSG " + nick + " :" + ctcp.ToUpper() + " " + System.Environment.TickCount.ToString() + ""); else SendData(connection, "PRIVMSG " + nick + " " + ctcp.ToUpper() + ""); } break; case "/dcc": if (connection != null && data.IndexOf(' ') > 0) { //get the type of dcc string dccType = data.Substring(0, data.IndexOf(' ')).ToUpper(); //get who it is being sent to string nick = data.Substring(data.IndexOf(' ') + 1); switch (dccType) { case "CHAT": //start a dcc chat if (nick.IndexOf(' ') == -1) //make sure no space in the nick name { //check if we already have a dcc chat open with this person if (!mainChannelBar.WindowExists(connection, nick, IceTabPage.WindowType.DCCChat)) { //create a new window AddWindow(connection, nick, IceTabPage.WindowType.DCCChat); IceTabPage t = GetWindow(connection, nick, IceTabPage.WindowType.DCCChat); if (t != null) { t.RequestDCCChat(); string msg = GetMessageFormat("DCC Chat Outgoing"); msg = msg.Replace("$nick", nick); t.TextWindow.AppendText(msg, ""); t.TextWindow.ScrollToBottom(); } } else { mainChannelBar.SelectTab(GetWindow(connection, nick, IceTabPage.WindowType.DCCChat)); serverTree.SelectTab(mainChannelBar.CurrentTab, false); //see if it is connected or not IceTabPage dcc = GetWindow(connection, nick, IceTabPage.WindowType.DCCChat); if (dcc != null) { if (!dcc.IsConnected) { dcc.RequestDCCChat(); string msg = GetMessageFormat("DCC Chat Outgoing"); msg = msg.Replace("$nick", nick); dcc.TextWindow.AppendText(msg, ""); dcc.TextWindow.ScrollToBottom(); } } } } break; case "SEND": //was a filename specified, if not try and select one string file; if (nick.IndexOf(' ') > 0) { file = nick.Substring(nick.IndexOf(' ') + 1); nick = nick.Substring(0,nick.IndexOf(' ')); //see if the file exists if (!File.Exists(file)) { //file does not exists, just quit //try from the dccsend folder if (File.Exists(iceChatOptions.DCCSendFolder + Path.DirectorySeparatorChar + file)) file=iceChatOptions.DCCSendFolder + Path.DirectorySeparatorChar + file; else return; } } else { //ask for a file name OpenFileDialog dialog = new OpenFileDialog(); dialog.InitialDirectory = iceChatOptions.DCCSendFolder; dialog.CheckFileExists = true; dialog.CheckPathExists = true; if (dialog.ShowDialog() == DialogResult.OK) { //returns the full path System.Diagnostics.Debug.WriteLine(dialog.FileName); file = dialog.FileName; } else return; } //more to it, maybe a file to send if (!mainChannelBar.WindowExists(null, "DCC Files", IceTabPage.WindowType.DCCFile)) AddWindow(null, "DCC Files", IceTabPage.WindowType.DCCFile); IceTabPage tt = GetWindow(null, "DCC Files", IceTabPage.WindowType.DCCFile); if (tt != null) ((IceTabPageDCCFile)tt).RequestDCCFile(connection, nick, file); break; } } break; case "/describe": //me command for a specific channel if (connection != null && data.IndexOf(' ') > 0) { //get the channel name string channel = data.Substring(0, data.IndexOf(' ')); //get the message string message = data.Substring(data.IndexOf(' ') + 1); //check for the channel IceTabPage t = GetWindow(connection, channel, IceTabPage.WindowType.Channel); if (t != null) { SendData(connection, "PRIVMSG " + t.TabCaption + " :ACTION " + message + ""); string msg = GetMessageFormat("Self Channel Action"); msg = msg.Replace("$nick", inputPanel.CurrentConnection.ServerSetting.CurrentNickName).Replace("$channel", t.TabCaption); msg = msg.Replace("$message", message); t.TextWindow.AppendText(msg, ""); t.TextWindow.ScrollToBottom(); t.LastMessageType = ServerMessageType.Action; } } break; case "/dns": if (data.Length > 0) { if (data.IndexOf(".") > 0) { //dns a host try { args.Extra = data; foreach (Plugin p in loadedPlugins) { IceChatPlugin ipc = p as IceChatPlugin; if (ipc != null) { if (ipc.plugin.Enabled == true) args = ipc.plugin.DNSResolve(args); } } if (args.Extra.Length > 0) { System.Net.IPAddress[] addresslist = System.Net.Dns.GetHostAddresses(data); ParseOutGoingCommand(connection, "/echo " + data + " resolved to " + addresslist.Length + " address(es)"); foreach (System.Net.IPAddress address in addresslist) ParseOutGoingCommand(connection, "/echo -> " + address.ToString()); } } catch (Exception) { ParseOutGoingCommand(connection, "/echo " + data + " does not resolve (unknown address)"); } } else { //dns a nickname (send a userhost) SendData(connection, "USERHOST " + data); } } break; case "/echo": if (data.Length > 0) { //check if we are on the current server or not, otherwise , echo to console if (CurrentWindow.Connection != connection) { //echo to the console string msg = GetMessageFormat("User Echo"); msg = msg.Replace("$message", "\x000F" + data); WindowMessage(connection, "Console", msg, "", true); } else { if (CurrentWindowStyle == IceTabPage.WindowType.Channel || CurrentWindowStyle == IceTabPage.WindowType.Query) { string msg = GetMessageFormat("User Echo"); msg = msg.Replace("$message", "\x000F" + data); CurrentWindow.TextWindow.AppendText(msg, ""); } else if (CurrentWindowStyle == IceTabPage.WindowType.Console) { string msg = GetMessageFormat("User Echo"); msg = msg.Replace("$message", "\x000F" + data); mainChannelBar.GetTabPage("Console").CurrentConsoleWindow().AppendText(msg, ""); } else if (CurrentWindowStyle == IceTabPage.WindowType.DCCChat) { string msg = GetMessageFormat("User Echo"); msg = msg.Replace("$message", "\x000F" + data); CurrentWindow.TextWindow.AppendText(msg, ""); } else if (CurrentWindowStyle == IceTabPage.WindowType.Window) { string msg = GetMessageFormat("User Echo"); msg = msg.Replace("$message", "\x000F" + data); CurrentWindow.TextWindow.AppendText(msg, ""); } } } break; case "/export": if (connection != null) { //export the channel list to a file if (CurrentWindowStyle == IceTabPage.WindowType.ChannelList) { System.Diagnostics.Debug.WriteLine("Total:"+ CurrentWindow.ChannelList.Items.Count); if (CurrentWindow.ChannelList.Items.Count > 0) { //ask for a file name SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "TXT Files (*.txt)|*.txt"; sfd.FilterIndex = 2; sfd.RestoreDirectory = true; if (sfd.ShowDialog() == DialogResult.OK) { //this is the full filename StreamWriter writer = new StreamWriter(sfd.OpenFile()); for (int i = 1; i < CurrentWindow.ChannelList.Items.Count; i++) { writer.WriteLine(CurrentWindow.ChannelList.Items[i].Text + " : " + CurrentWindow.ChannelList.Items[i].SubItems[1].Text + " : " + CurrentWindow.ChannelList.Items[i].SubItems[2].Text); } writer.Flush(); writer.Close(); writer.Dispose(); MessageBox.Show("Channel List Exported"); } } } } break; case "/flash": //used to flash a specific channel or query if (connection != null && data.Length > 0) { string window = data; bool flashWindow = true; if (data.IndexOf(" ") > 0) { window = data.Substring(0, data.IndexOf(' ')); string t = data.Substring(data.IndexOf(' ') + 1); if (t.ToLower() == "off") flashWindow = false; } //check if it is a channel window IceTabPage c = GetWindow(connection, window, IceTabPage.WindowType.Channel); if (c != null) { c.FlashTab = flashWindow; mainChannelBar.Invalidate(); serverTree.Invalidate(); } else { //check if it is a query IceTabPage q = GetWindow(connection, window, IceTabPage.WindowType.Query); if (q != null) { q.FlashTab = flashWindow; mainChannelBar.Invalidate(); serverTree.Invalidate(); } } } break; case "/flashtask": case "/flashtaskbar": FlashTaskBar(); break; case "/flashtray": //check if we are minimized if (this.notifyIcon.Visible == true) { this.flashTrayIconTimer.Enabled = true; this.flashTrayIconTimer.Start(); //show a message in a balloon if (data.Length > 0) { this.notifyIcon.BalloonTipTitle = "Monody 9"; this.notifyIcon.BalloonTipText = data; this.notifyIcon.ShowBalloonTip(1000); } } break; case "/sound": //change the sound of the current window //check if data is a channel if (connection != null && data.Length > 0) { if (data.IndexOf(' ') == -1) { IceTabPage t = GetWindow(connection, data, IceTabPage.WindowType.Channel); if (t != null) { t.DisableSounds = !t.DisableSounds; } } } break; case "/font": //change the font of the current window //check if data is a channel if (connection != null && data.Length > 0) { if (data.IndexOf(' ') == -1) { IceTabPage t = GetWindow(connection, data, IceTabPage.WindowType.Channel); if (t != null) { //bring up a font dialog FontDialog fd = new FontDialog(); //load the current font fd.Font = t.TextWindow.Font; fd.ShowEffects = false; fd.ShowColor = false; fd.FontMustExist = true; fd.AllowVectorFonts = false; fd.AllowVerticalFonts = false; try { if (fd.ShowDialog() != DialogResult.Cancel && fd.Font.Style == FontStyle.Regular) { t.TextWindow.Font = fd.Font; } else { if (fd.Font.Style != FontStyle.Regular) { MessageBox.Show("Monody only supports 'Regular' font styles", "Font Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } } catch (Exception) { MessageBox.Show("Monody only supports TrueType fonts", "Font Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } } } break; case "/forcequit": if (connection != null) { connection.AttemptReconnect = false; connection.ForceDisconnect(); } break; case "/google": if (data.Length > 0) System.Diagnostics.Process.Start("http://www.google.com/search?q=" + data); else System.Diagnostics.Process.Start("http://www.google.com"); break; case "/hop": case "/cycle": if (connection != null && data.Length == 0) { if (CurrentWindowStyle == IceTabPage.WindowType.Channel) { CurrentWindow.ChannelHop = true; string key = CurrentWindow.ChannelKey; temp = CurrentWindow.TabCaption; SendData(connection, "PART " + temp); if (key.Length > 0 && key != "*") ParseOutGoingCommand(connection, "/timer joinhop 1 1 /join " + temp + " " + key); else ParseOutGoingCommand(connection, "/timer joinhop 1 1 /join " + temp); } } else { IceTabPage t = GetWindow(connection, data, IceTabPage.WindowType.Channel); if (t != null) { t.ChannelHop = true; string key = CurrentWindow.ChannelKey; SendData(connection, "PART " + t.TabCaption); if (key.Length > 0 && key != "*") ParseOutGoingCommand(connection, "/timer joinhop 1 1 /join " + t.TabCaption + " " + key); else ParseOutGoingCommand(connection, "/timer joinhop 1 1 /join " + t.TabCaption); } } break; case "/icechat": if (connection != null) ParseOutGoingCommand(connection, "/me is using " + ProgramID + " " + VersionID + " - Build " + BuildNumber); else ParseOutGoingCommand(connection, "/echo you are using " + ProgramID + " " + VersionID + " - Build " + BuildNumber); break; case "/icepath": //To get current Folder and paste it into /me if (connection != null) ParseOutGoingCommand(connection, "/me Build Path = " + Directory.GetCurrentDirectory()); else ParseOutGoingCommand(connection, "/echo Build Path = " + Directory.GetCurrentDirectory()); break; case "/ignore": if (connection != null) { if (data.Length > 0) { //check if just a nick/host , no extra params if (data.IndexOf(" ") == -1) { if (data.ToLower() == "enable") { connection.ServerSetting.IgnoreListEnable = true; ParseOutGoingCommand(connection, "/echo ignore list enabled"); } else if (data.ToLower() == "disable") { connection.ServerSetting.IgnoreListEnable = false; ParseOutGoingCommand(connection, "/echo ignore list disabled"); } else { //check if already in ignore list or not for (int i = 0; i < connection.ServerSetting.IgnoreList.Length; i++) { string checkNick = connection.ServerSetting.IgnoreList[i]; if (connection.ServerSetting.IgnoreList[i].StartsWith(";")) checkNick = checkNick.Substring(1); if (checkNick.ToLower() == data.ToLower()) { if (connection.ServerSetting.IgnoreList[i].StartsWith(";")) { connection.ServerSetting.IgnoreList[i] = checkNick; ParseOutGoingCommand(connection, "/echo " + checkNick + " added to ignore list"); } else { connection.ServerSetting.IgnoreList[i] = ";" + checkNick; ParseOutGoingCommand(connection, "/echo " + checkNick + " remove from ignore list"); } serverTree.SaveServers(serverTree.ServersCollection); return; } } //no match found, add the new item to the IgnoreList string[] ignores = connection.ServerSetting.IgnoreList; Array.Resize(ref ignores, ignores.Length + 1); ignores[ignores.Length - 1] = data; connection.ServerSetting.IgnoreList = ignores; connection.ServerSetting.IgnoreListEnable = true; ParseOutGoingCommand(connection, "/echo " + data + " added to ignore list"); serverTree.SaveServers(serverTree.ServersCollection); } } } } break; case "/join": if (connection != null && data.Length > 0) { if (connection.ServerSetting.ChannelTypes != null && Array.IndexOf(connection.ServerSetting.ChannelTypes, data[0]) == -1) { data = connection.ServerSetting.ChannelTypes[0] + data; } if (data.IndexOf(' ') > -1) { string[] c = data.Split(new char[] { ' ' }, 2); if (connection.ServerSetting.ChannelJoins.ContainsKey(c[0])) connection.ServerSetting.ChannelJoins[c[0]] = c[1]; else connection.ServerSetting.ChannelJoins.Add(c[0], c[1]); } else { if (!connection.ServerSetting.ChannelJoins.ContainsKey(data)) connection.ServerSetting.ChannelJoins.Add(data, ""); else connection.ServerSetting.ChannelJoins[data] = ""; } SendData(connection, "JOIN " + data); } break; case "/kick": if (connection != null && data.Length > 0) { //kick #channel nick reason if (data.IndexOf(' ') > 0) { //get the channel temp = data.Substring(0, data.IndexOf(' ')); //check if temp is a channel or not if (Array.IndexOf(connection.ServerSetting.ChannelTypes, temp[0]) == -1) { //temp is not a channel, substitute with current channel //make sure we are in a channel if (CurrentWindow.WindowStyle == IceTabPage.WindowType.Channel) { temp = CurrentWindow.TabCaption; if (data.IndexOf(' ') > 0) { //there is a kick reason string msg = data.Substring(data.IndexOf(' ') + 1); data = data.Substring(0, data.IndexOf(' ')); SendData(connection, "KICK " + temp + " " + data + " :" + msg); } else { SendData(connection, "KICK " + temp + " " + data); } } } else { data = data.Substring(temp.Length + 1); if (data.IndexOf(' ') > 0) { //there is a kick reason string msg = data.Substring(data.IndexOf(' ') + 1); data = data.Substring(0, data.IndexOf(' ')); SendData(connection, "KICK " + temp + " " + data + " :" + msg); } else { SendData(connection, "KICK " + temp + " " + data); } } } } break; case "/me": //check if in channel, query, etc if (connection != null && data.Length > 0) { if (CurrentWindowStyle == IceTabPage.WindowType.Channel || CurrentWindowStyle == IceTabPage.WindowType.Query) { SendData(connection, "PRIVMSG " + CurrentWindow.TabCaption + " :ACTION " + data + ""); string msg = GetMessageFormat("Self Channel Action"); msg = msg.Replace("$nick", inputPanel.CurrentConnection.ServerSetting.CurrentNickName).Replace("$channel", CurrentWindow.TabCaption); msg = msg.Replace("$message", data); CurrentWindow.TextWindow.AppendText(msg, ""); CurrentWindow.TextWindow.ScrollToBottom(); CurrentWindow.LastMessageType = ServerMessageType.Action; } else if (CurrentWindowStyle == IceTabPage.WindowType.DCCChat) { IceTabPage c = GetWindow(connection, CurrentWindow.TabCaption, IceTabPage.WindowType.DCCChat); if (c != null) { c.SendDCCData("ACTION " + data + ""); string msg = GetMessageFormat("DCC Chat Action"); msg = msg.Replace("$nick", inputPanel.CurrentConnection.ServerSetting.CurrentNickName); msg = msg.Replace("$message", data); CurrentWindow.TextWindow.AppendText(msg, ""); CurrentWindow.TextWindow.ScrollToBottom(); CurrentWindow.LastMessageType = ServerMessageType.Action; } } } break; case "/umode": if (connection != null && data.Length > 0) SendData(connection, "MODE " + connection.ServerSetting.CurrentNickName + " " + data); break; case "/mode": if (connection != null && data.Length > 0) SendData(connection, "MODE " + data); break; case "/modex": if (connection != null) SendData(connection, "MODE " + connection.ServerSetting.CurrentNickName + " +x"); break; case "/motd": if (connection != null) { connection.ServerSetting.ForceMOTD = true; SendData(connection, "MOTD"); } break; case "/msg": case "/msgsec": if (connection != null && data.IndexOf(' ') > -1) { string nick = data.Substring(0, data.IndexOf(' ')); string msg2 = data.Substring(data.IndexOf(' ') + 1); if (nick.StartsWith("=")) { //send to a dcc chat window nick = nick.Substring(1); IceTabPage c = GetWindow(connection, nick, IceTabPage.WindowType.DCCChat); if (c != null) { c.SendDCCData(data); string msg = GetMessageFormat("Self DCC Chat Message"); if (command.ToLower() == "/msgsec") msg = msg.Replace("$nick", c.Connection.ServerSetting.CurrentNickName).Replace("$message", "*"); else msg = msg.Replace("$nick", c.Connection.ServerSetting.CurrentNickName).Replace("$message", data); c.TextWindow.AppendText(msg, ""); } } else { SendData(connection, "PRIVMSG " + nick + " :" + msg2); //get the color for the private message string msg = GetMessageFormat("Self Channel Message"); msg = msg.Replace("$nick", connection.ServerSetting.CurrentNickName).Replace("$channel", nick); //check if the nick has a query window open IceTabPage q = GetWindow(connection, nick, IceTabPage.WindowType.Query); if (q != null) { string nmsg = GetMessageFormat("Self Private Message"); if (command.ToLower() == "/msgsec") nmsg = nmsg.Replace("$nick", connection.ServerSetting.CurrentNickName).Replace("$message", "*"); else nmsg = nmsg.Replace("$nick", connection.ServerSetting.CurrentNickName).Replace("$message", msg2); q.TextWindow.AppendText(nmsg, ""); q.LastMessageType = ServerMessageType.Message; } else { IceTabPage t = GetWindow(connection, nick, IceTabPage.WindowType.Channel); if (t != null) { if (msg.Contains("$color")) { User u = t.GetNick(connection.ServerSetting.CurrentNickName); //get the nick color if (u.nickColor == -1) { if (IceChatColors.RandomizeNickColors == true) { int randColor = new Random().Next(0, 71); if (randColor == IceChatColors.NickListBackColor) randColor = new Random().Next(0, 71); u.nickColor = randColor; } else { //get the correct nickname color for channel status for (int y = 0; y < u.Level.Length; y++) { if (u.Level[y]) { switch (connection.ServerSetting.StatusModes[0][y]) { case 'q': u.nickColor = IceChatColors.ChannelOwnerColor; break; case 'a': u.nickColor = IceChatColors.ChannelAdminColor; break; case 'o': u.nickColor = IceChatColors.ChannelOpColor; break; case 'h': u.nickColor = IceChatColors.ChannelHalfOpColor; break; case 'v': u.nickColor = IceChatColors.ChannelVoiceColor; break; default: u.nickColor = IceChatColors.ChannelRegularColor; break; } break; } } } if (u.nickColor == -1) u.nickColor = IceChatColors.ChannelRegularColor; } msg = msg.Replace("$color", "\x0003" + u.nickColor.ToString("00")); } if (t.GetNick(connection.ServerSetting.CurrentNickName) != null) msg = msg.Replace("$status", t.GetNick(connection.ServerSetting.CurrentNickName).ToString().Replace(connection.ServerSetting.CurrentNickName, "")); if (command.ToLower() == "/msgsec") msg = msg.Replace("$message", "*"); else msg = msg.Replace("$message", msg2); t.TextWindow.AppendText(msg, ""); t.LastMessageType = ServerMessageType.Message; } else { //send to the current window if (msg.StartsWith("")) { //get the color string color = msg.Substring(0, 6); int result; if (Int32.TryParse(msg.Substring(6, 1), out result)) color += msg.Substring(6, 1); if (command.ToLower() == "/msgsec") msg = color + "*" + nick + "* *"; else msg = color + "*" + nick + "* " + data.Substring(data.IndexOf(' ') + 1); } CurrentWindowMessage(connection, msg, "", true); } } } } break; case "/names": if (connection != null && data.Length > 0) { SendData(connection, "NAMES " + data); } break; case "/nick": if (connection != null && data.Length > 0) { connection.SendData("NICK " + data); if (data.IndexOf(' ') == -1) { if (connection.ServerSetting.NickName.CompareTo(data) != 0) connection.ServerSetting.NickName = data; } else { //has a space string nick = data.Substring(0, data.IndexOf(' ')); if (connection.ServerSetting.NickName.CompareTo(nick) != 0) connection.ServerSetting.NickName = nick; } } break; case "/notice": if (connection != null && data.IndexOf(' ') > -1) { string nick = data.Substring(0, data.IndexOf(' ')); string msg = data.Substring(data.IndexOf(' ') + 1); SendData(connection, "NOTICE " + nick + " :" + msg); string nmsg = GetMessageFormat("Self Notice"); nmsg = nmsg.Replace("$nick", nick).Replace("$message", msg); CurrentWindowMessage(connection, nmsg, "", true); } break; case "/onotice": if (connection != null && data.IndexOf(' ') > -1) { string nick = data.Substring(0, data.IndexOf(' ')); string msg = data.Substring(data.IndexOf(' ') + 1); SendData(connection, "NOTICE @" + nick + " :" + msg); string nmsg = GetMessageFormat("Self Notice"); nmsg = nmsg.Replace("$nick", nick).Replace("$message", msg); CurrentWindowMessage(connection, nmsg, "", true); } break; case "/parse": //if (data.Length == 0) { /* string pattern2 = @"\[style.*\](.+?)\[/style\]"; Regex regex = new Regex(pattern2, RegexOptions.IgnoreCase); //[br][Style ff:Tahoma;bgco:blue;co:blue;b;]___.[/style][Style ff:Tahoma;bgco:blue;co:yellow;b;]The Script-Testing Room[/style][Style ff:Tahoma;bgco:blue;co:blue;b;].___[/style][br][Style co:gold;b;]C[Style co:red;b;]RI[Style-co:blue;b;]m[Style co:green;b;]-[Style co:blue;b;]m[Style co:red;b;]IR[Style co:gold;b;]C [Style co:black;]http://crim-mirc.com[br][Style ff:Tahoma;bgco:red;co:red;b;]___.[/style][Style ff:Tahoma;bgco:red;co:white;b;]The Script Testing-Room[/style] MatchCollection m = regex.Matches(@data); System.Diagnostics.Debug.WriteLine(m.Count); string s = Regex.Replace(data, @"\[[^]]+\]", ""); string p = regex.Replace(data, "$1"); System.Diagnostics.Debug.WriteLine(p); System.Diagnostics.Debug.WriteLine(s); */ //string message = @"0<04@Snerf> heya \test how are ya"; string message = "123 \test nick|name 123"; string nick = "\test"; nick = "nick|name"; // \t = tab // \d = digit // \b = boundary if (Regex.IsMatch(message, Regex.Escape(nick), RegexOptions.IgnoreCase)) { System.Diagnostics.Debug.WriteLine("match"); } else System.Diagnostics.Debug.WriteLine("no match"); } break; case "/part": if (connection != null && data.Length > 0) { //check if it is a query window IceTabPage q = GetWindow(connection, data, IceTabPage.WindowType.Query); if (q != null) { RemoveWindow(connection, q.TabCaption, IceTabPage.WindowType.Query); return; } else if (CurrentWindowStyle == IceTabPage.WindowType.Query) { RemoveWindow(connection, CurrentWindow.TabCaption, IceTabPage.WindowType.Query); return; } else if (CurrentWindowStyle == IceTabPage.WindowType.DCCChat) { RemoveWindow(connection, CurrentWindow.TabCaption, IceTabPage.WindowType.DCCChat); return; } else if (CurrentWindowStyle == IceTabPage.WindowType.Window) { RemoveWindow(null, CurrentWindow.TabCaption, IceTabPage.WindowType.Window); return; } //is there a part message if (data.IndexOf(' ') > -1) { //check if channel is a valid channel if (Array.IndexOf(connection.ServerSetting.ChannelTypes, data[0]) != -1) { SendData(connection, "PART " + data.Substring(0, data.IndexOf(' ')) + " :" + data.Substring(data.IndexOf(' ') + 1)); RemoveWindow(connection, data.Substring(0, data.IndexOf(' ')), IceTabPage.WindowType.Channel); } else { //not a valid channel, use the current window if (CurrentWindowStyle == IceTabPage.WindowType.Channel) { SendData(connection, "PART " + CurrentWindow.TabCaption + " :" + data); RemoveWindow(connection, CurrentWindow.TabCaption, IceTabPage.WindowType.Channel); } } } else { //see if data is a valid channel; if (Array.IndexOf(connection.ServerSetting.ChannelTypes, data[0]) != -1) { SendData(connection, "PART " + data); RemoveWindow(connection, data, IceTabPage.WindowType.Channel); } else { if (CurrentWindowStyle == IceTabPage.WindowType.Channel) { SendData(connection, "PART " + CurrentWindow.TabCaption + " :" + data); RemoveWindow(connection, CurrentWindow.TabCaption, IceTabPage.WindowType.Channel); } } } } else if (connection != null) { //check if current window is channel if (CurrentWindowStyle == IceTabPage.WindowType.Channel) { SendData(connection, "PART " + CurrentWindow.TabCaption); RemoveWindow(connection, CurrentWindow.TabCaption, IceTabPage.WindowType.Channel); } else if (CurrentWindowStyle == IceTabPage.WindowType.Query) { RemoveWindow(connection, CurrentWindow.TabCaption, IceTabPage.WindowType.Query); } else if (CurrentWindowStyle == IceTabPage.WindowType.Window) { RemoveWindow(null, CurrentWindow.TabCaption, IceTabPage.WindowType.Window); } } break; case "/partall": if (connection != null) { for (int i = mainChannelBar.TabPages.Count - 1; i >= 0; i--) { if (mainChannelBar.TabPages[i].WindowStyle == IceTabPage.WindowType.Channel) { if (mainChannelBar.TabPages[i].Connection == connection) { if (connection.IsConnected) SendData(connection, "PART " + mainChannelBar.TabPages[i].TabCaption); RemoveWindow(connection, mainChannelBar.TabPages[i].TabCaption, IceTabPage.WindowType.Channel); } } } } break; case "/spartall": for (int i = mainChannelBar.TabPages.Count - 1; i >= 0; i--) { if (mainChannelBar.TabPages[i].WindowStyle == IceTabPage.WindowType.Channel) { if (mainChannelBar.TabPages[i].Connection.IsConnected) SendData(mainChannelBar.TabPages[i].Connection, "PART " + mainChannelBar.TabPages[i].TabCaption); RemoveWindow(mainChannelBar.TabPages[i].Connection, mainChannelBar.TabPages[i].TabCaption, IceTabPage.WindowType.Channel); } } break; case "/ping": if (connection != null && data.Length > 0 && data.IndexOf(' ') == -1) { //ctcp nick ping string msg = GetMessageFormat("Ctcp Send"); msg = msg.Replace("$nick", data); ; msg = msg.Replace("$ctcp", "PING"); CurrentWindowMessage(connection, msg, "", true); SendData(connection, "PRIVMSG " + data + " :PING " + System.Environment.TickCount.ToString() + ""); } break; case "/cplay": //play a file in a specific channel /cplay #channel test.wav if (connection != null && data.Length > 4 && data.IndexOf(' ') > 0) { string chan = data.Substring(0, data.IndexOf(' ')); string soundFile = data.Substring(data.IndexOf(' ') + 1); //check if the channel is muted or not ChannelSetting cs = ChannelSettings.FindChannel(chan, connection.ServerSetting.NetworkName); if (cs != null) { if (cs.SoundsDisable) return; } ParseOutGoingCommand(connection, "/play " + soundFile); } break; case "/play": //play a WAV sound or MP3 if (data.Length > 4 && (data.ToLower().EndsWith(".wav") || data.ToLower().EndsWith(".mp3"))) { //check if the WAV file exists in the Sounds Folder //check if the entire path was passed for the sound file if (File.Exists(data)) { try { if (StaticMethods.IsRunningOnMono()) { player.SoundLocation = @data; player.Play(); } else { mp3Player.Open(data); mp3Player.Play(); } } catch { } } else if (File.Exists(soundsFolder + System.IO.Path.DirectorySeparatorChar + data)) { try { if (StaticMethods.IsRunningOnMono()) { player.SoundLocation = soundsFolder + System.IO.Path.DirectorySeparatorChar + data; player.Play(); } else { mp3Player.Open(soundsFolder + System.IO.Path.DirectorySeparatorChar + data); mp3Player.Play(); } } catch { } } } break; case "/query": if (connection != null && data.Length > 0) { string nick = ""; string msg = ""; if (data.IndexOf(" ") > 0) { //check if there is a message added nick = data.Substring(0, data.IndexOf(' ')); msg = data.Substring(data.IndexOf(' ') + 1); } else nick = data; if (!mainChannelBar.WindowExists(connection, nick, IceTabPage.WindowType.Query)) AddWindow(connection, nick, IceTabPage.WindowType.Query); mainChannelBar.SelectTab(GetWindow(connection, nick, IceTabPage.WindowType.Query)); serverTree.SelectTab(mainChannelBar.CurrentTab, false); if (msg.Length > 0) { SendData(connection, "PRIVMSG " + nick + " :" + msg); string nmsg = GetMessageFormat("Self Private Message"); nmsg = nmsg.Replace("$nick", inputPanel.CurrentConnection.ServerSetting.CurrentNickName).Replace("$message", msg); CurrentWindow.TextWindow.AppendText(nmsg, ""); CurrentWindow.LastMessageType = ServerMessageType.Message; } } break; case "/quit": if (connection != null) { connection.AttemptReconnect = false; if (data.Length > 0) SendData(connection, "QUIT :" + data); else SendData(connection, "QUIT :" + ParseIdentifiers(connection, connection.ServerSetting.QuitMessage, "")); } break; case "/aquit": case "/quitall": foreach (IRCConnection c in serverTree.ServerConnections.Values) { if (c.IsConnected) { c.AttemptReconnect = false; if (data.Length > 0) SendData(c, "QUIT :" + data); else SendData(c, "QUIT :" + ParseIdentifiers(connection, c.ServerSetting.QuitMessage, "")); } } break; case "/redrawtree": System.Diagnostics.Debug.WriteLine(mainChannelBar.CurrentTab.TabCaption); this.serverTree.Invalidate(); break; case "/run": if (data.Length > 0) { try { if (data.IndexOf("'") == -1) System.Diagnostics.Process.Start(data); else { string cmd = data.Substring(0, data.IndexOf("'")); string arg = data.Substring(data.IndexOf("'") + 1); System.Diagnostics.Process p = System.Diagnostics.Process.Start(cmd, arg); } } catch { } } break; case "/say": if (connection != null && data.Length > 0) { if (CurrentWindowStyle == IceTabPage.WindowType.Channel) { SendData(connection, "PRIVMSG " + CurrentWindow.TabCaption + " :" + data); string msg = GetMessageFormat("Self Channel Message"); string nick = inputPanel.CurrentConnection.ServerSetting.CurrentNickName; msg = msg.Replace("$nick", nick).Replace("$channel", CurrentWindow.TabCaption); //assign $color to the nickname if (msg.Contains("$color")) { User u = CurrentWindow.GetNick(nick); //get the nick color if (u.nickColor == -1) { if (IceChatColors.RandomizeNickColors == true) { int randColor = new Random().Next(0, 71); if (randColor == IceChatColors.NickListBackColor) randColor = new Random().Next(0, 71); u.nickColor = randColor; } else { //get the correct nickname color for channel status for (int y = 0; y < u.Level.Length; y++) { if (u.Level[y]) { switch (connection.ServerSetting.StatusModes[0][y]) { case 'q': u.nickColor = IceChatColors.ChannelOwnerColor; break; case 'a': u.nickColor = IceChatColors.ChannelAdminColor; break; case 'o': u.nickColor = IceChatColors.ChannelOpColor; break; case 'h': u.nickColor = IceChatColors.ChannelHalfOpColor; break; case 'v': u.nickColor = IceChatColors.ChannelVoiceColor; break; default: u.nickColor = IceChatColors.ChannelRegularColor; break; } break; } } } if (u.nickColor == -1) u.nickColor = IceChatColors.ChannelRegularColor; } msg = msg.Replace("$color", "\x0003" + u.nickColor.ToString("00")); } msg = msg.Replace("$status", CurrentWindow.GetNick(nick).ToString().Replace(nick, "")); msg = msg.Replace("$message", data); CurrentWindow.TextWindow.AppendText(msg, ""); CurrentWindow.LastMessageType = ServerMessageType.Message; } else if (CurrentWindowStyle == IceTabPage.WindowType.Query) { SendData(connection, "PRIVMSG " + CurrentWindow.TabCaption + " :" + data); string msg = GetMessageFormat("Self Private Message"); msg = msg.Replace("$nick", inputPanel.CurrentConnection.ServerSetting.CurrentNickName).Replace("$message", data); CurrentWindow.TextWindow.AppendText(msg, ""); CurrentWindow.LastMessageType = ServerMessageType.Message; } else if (CurrentWindowStyle == IceTabPage.WindowType.DCCChat) { CurrentWindow.SendDCCData(data); string msg = GetMessageFormat("Self DCC Chat Message"); msg = msg.Replace("$nick", inputPanel.CurrentConnection.ServerSetting.CurrentNickName).Replace("$message", data); CurrentWindow.TextWindow.AppendText(msg, ""); } else if (CurrentWindowStyle == IceTabPage.WindowType.Console) { WindowMessage(connection, "Console", data, "", true); } } break; case "/joinserv": //joinserv irc.server.name #channel if (data.Length > 0 && data.IndexOf(' ') > 0) { //check if default nick name has been set if (iceChatOptions.DefaultNick == null || iceChatOptions.DefaultNick.Length == 0) { CurrentWindowMessage(connection, "\x000304No Default Nick Name Assigned. Go to Server Settings and set one under the Default Server Settings section.", "", false); } else { ServerSetting s = new ServerSetting(); //get the server name //if there is a port name. extract it string server = data.Substring(0,data.IndexOf(' ')); string channel = data.Substring(data.IndexOf(' ')+1); if (server.Contains(":")) { s.ServerName = server.Substring(0, server.IndexOf(':')); s.ServerPort = server.Substring(server.IndexOf(':') + 1); if (s.ServerPort.IndexOf(' ') > 0) { s.ServerPort = s.ServerPort.Substring(0, s.ServerPort.IndexOf(' ')); } //check for + in front of port, SSL Connection if (s.ServerPort.StartsWith("+")) { s.ServerPort = s.ServerPort.Substring(1); s.UseSSL = true; } } else { s.ServerName = server; s.ServerPort = "6667"; } s.NickName = iceChatOptions.DefaultNick; s.AltNickName = iceChatOptions.DefaultNick + "_"; s.AwayNickName = iceChatOptions.DefaultNick + "[A]"; s.FullName = iceChatOptions.DefaultFullName; s.QuitMessage = iceChatOptions.DefaultQuitMessage; s.IdentName = iceChatOptions.DefaultIdent; s.IAL = new Hashtable(); s.AutoJoinChannels = new string[] { channel }; s.AutoJoinEnable = true; Random r = new Random(); s.ID = r.Next(50000, 99999); NewServerConnection(s); } } break; case "/scid": //scid <ServerNumber/NetworkName> /command [parameters] if (data.Length > 0 && data.IndexOf(' ') > -1) { string[] param = data.Split(new char[] {' '}, 2); int result; if (Int32.TryParse(param[0], out result)) { //result is the server id foreach (IRCConnection c in serverTree.ServerConnections.Values) { if (c.ServerSetting.ID == result) { ParseOutGoingCommand(c, param[1]); } } } else { //check for a network name match foreach (IRCConnection c in serverTree.ServerConnections.Values) { if (c.ServerSetting.NetworkName.Equals(param[0], StringComparison.OrdinalIgnoreCase)) { ParseOutGoingCommand(c, param[1]); } } } } break; case "/server": if (data.Length > 0) { //check if default nick name has been set if (iceChatOptions.DefaultNick == null || iceChatOptions.DefaultNick.Length == 0) { CurrentWindowMessage(connection, "\x000304No Default Nick Name Assigned. Go to Server Settings and set one under the Default Server Settings section.", "", false); } else if (data.StartsWith("id=")) { string serverID = data.Substring(3); foreach (ServerSetting s in serverTree.ServersCollection.listServers) { if (s.ID.ToString() == serverID) { NewServerConnection(s); break; } } } else { ServerSetting s = new ServerSetting(); s.NickName = ""; // get the server name // if there is a port name. extract it // server [-6e] <server:port> [port] [password] [-i nick anick email name] [-j #channel pass] if (data.Contains(" ")) { if (data.StartsWith("-")) { //parameters // [-46epoc] - poc not used string switches = data.Substring(0, data.IndexOf(' ')); data = data.Substring(switches.Length + 1); if (switches.IndexOf('e') > -1) { //enable ssl s.UseSSL = true; s.SSLAcceptInvalidCertificate = true; } //6 is ipv6 if (switches.IndexOf('6') > -1) { //enable ssl s.UseIPv6 = true; } } } //data is now w/o the starting switches if (data.Contains(" ")) { s.ServerName = data.Substring(0, data.IndexOf(' ')); string sp = data.Substring(data.IndexOf(' ') + 1); //server address [port] [password] if (sp.IndexOf(' ') > 0) { if (sp.StartsWith("-")) { // -j or -i or both string[] sections = sp.Split(new char[]{'-'},StringSplitOptions.RemoveEmptyEntries); foreach(string section in sections) { string switches = section.Substring(0, section.IndexOf(' ')); sp = section.Substring(switches.Length + 1); if (switches.IndexOf('j') > -1) { //auto join this channel //could have a channel pass s.AutoJoinChannels = new string[1]; s.AutoJoinChannels[0] = sp; s.AutoJoinEnable = true; } if (switches.IndexOf('i') > -1) { //use this nick s.NickName = sp; s.AltNickName = sp + "_"; s.AwayNickName = sp + "[A]"; } } } else { s.ServerPort = sp.Substring(0, sp.IndexOf(' ')); if (s.ServerPort.StartsWith("+")) { s.ServerPort = s.ServerPort.Substring(1); s.UseSSL = true; s.SSLAcceptInvalidCertificate = true; } s.Password = sp.Substring(sp.IndexOf(' ') + 1); } } else { //no space, check if value is a number or not int result; if (int.TryParse(sp, out result)) { s.ServerPort = sp; } else { //check for + in front of port, SSL Connection if (sp.StartsWith("+")) { s.ServerPort = sp.Substring(1); s.UseSSL = true; s.SSLAcceptInvalidCertificate = true; } else { s.ServerPort = "6667"; s.Password = sp; } } } } else { s.ServerName = data; s.ServerPort = "6667"; } //check if server name has : or :+ port if (s.ServerName.IndexOf(":") > -1) { string server = s.ServerName.Substring(0, s.ServerName.IndexOf(':')); s.ServerPort = s.ServerName.Substring(s.ServerName.IndexOf(':') + 1); s.ServerName = server; if (s.ServerPort.StartsWith("+")) { s.ServerPort = s.ServerPort.Substring(1); s.UseSSL = true; s.SSLAcceptInvalidCertificate = true; } } //nick could be set above if (s.NickName.Length == 0) { s.NickName = iceChatOptions.DefaultNick; s.AltNickName = iceChatOptions.DefaultNick + "_"; s.AwayNickName = iceChatOptions.DefaultNick + "[A]"; } s.FullName = iceChatOptions.DefaultFullName; s.QuitMessage = iceChatOptions.DefaultQuitMessage; s.IdentName = iceChatOptions.DefaultIdent; s.IAL = new Hashtable(); Random r = new Random(); s.ID = r.Next(50000, 99999); NewServerConnection(s); } } break; case "/set": // set an internal variable // set -uNg <%var> [value] // -u - unset in N amount of seconds // -g for global if (data.IndexOf(' ') > -1) { bool global = false; string name = ""; if (data.StartsWith("-")) { string switches = data.Substring(0, data.IndexOf(' ')); data = data.Substring(switches.Length + 1); if (switches.Contains("g")) global = true; if (switches.Contains("u")) { // set a timed variable //need to get the numeric value string delay = switches.Substring(switches.IndexOf('u')+1); if (delay.Length > 0) { int result = 0; int z = 1; bool number = false; //get the numeric value out of it while (z < delay.Length) { if (Int32.TryParse(delay.Substring(z, 1), out result)) { z++; number = true; } else break; } System.Diagnostics.Debug.WriteLine(switches + ":" + delay + ":" + delay.Substring(0, z) + ":" + z + ":" + number); if (connection != null && global == false) { name = data.Substring(0, data.IndexOf(' ')); //add the /timer command globally connection.CreateTimer("unset", 1, 1, "/unset " + name); } } } } //needs to have a space <%var value> if (data.IndexOf(' ') > -1) { name = data.Substring(0, data.IndexOf(' ')); object val = data.Substring(data.IndexOf(' ') + 1); if (connection != null && global == false) connection.ServerSetting.Variables.AddVariable(name, val); else { //add it as a global variable _variables.AddVariable(name, val); } } } break; case "/unset": //unset <%var> if (data.Length > 0) { if (connection != null) connection.ServerSetting.Variables.RemoveVariable(data); else { //remove it as a global variable _variables.RemoveVariable(data); } } break; case "/tab": if (data.Length > 0) { //activate a specific tab if (data.ToLower().Equals("buddylist")) ((TabControl)buddyListTab.Parent).SelectedTab = buddyListTab; else if (data.ToLower().Equals("serverlist") || data.ToLower().Equals("servertree")) ((TabControl)serverListTab.Parent).SelectedTab = serverListTab; else if (data.ToLower().Equals("nicklist")) ((TabControl)nickListTab.Parent).SelectedTab = nickListTab; else if (data.ToLower().Equals("channellist")) ((TabControl)channelListTab.Parent).SelectedTab = channelListTab; FocusInputBox(); } break; case "/timers": if (connection != null) { if (connection.IRCTimers.Count == 0) OnServerMessage(connection, "No Timers", ""); else { foreach (IrcTimer timer in connection.IRCTimers) OnServerMessage(connection, "[ID=" + timer.TimerID + "] [Interval=" + timer.TimerInterval + "] [Reps=" + timer.TimerRepetitions + "] [Count=" + timer.TimerCounter + "] [Command=" + timer.TimerCommand + "]", ""); } } else { if (this._globalTimers.Count == 0) ParseOutGoingCommand(null, "/echo No Global Timers"); else { foreach (IrcTimer timer in this._globalTimers) ParseOutGoingCommand(null, "/echo [Global ID=" + timer.TimerID + "] [Interval=" + timer.TimerInterval + "] [Reps=" + timer.TimerRepetitions + "] [Count=" + timer.TimerCounter + "] [Command=" + timer.TimerCommand + "]"); } } break; case "/timer": if (connection != null) { if (data.Length != 0) { string[] param = data.Split(new char[] { ' ' }, 4); if (param.Length == 2) { //check for /timer ID off if (param[1].ToLower() == "off") { connection.DestroyTimer(param[0]); break; } } else if (param.Length == 4) { // param[0] = TimerID // param[1] = Repetitions // param[2] = Interval // param[3+] = Command if (param[0].StartsWith("-g")) this.CreateTimer(param[0], Convert.ToInt32(param[1]), Convert.ToDouble(param[2]), param[3]); else connection.CreateTimer(param[0], Convert.ToInt32(param[1]), Convert.ToDouble(param[2]), param[3]); } else { string msg = GetMessageFormat("User Error"); msg = msg.Replace("$message", "/timer [ID] [REPS] [INTERVAL] [COMMAND]"); CurrentWindowMessage(connection, msg, "", true); } } else { string msg = GetMessageFormat("User Error"); msg = msg.Replace("$message", "/timer [ID] [REPS] [INTERVAL] [COMMAND]"); CurrentWindowMessage(connection, msg, "", true); } } else { //add it to a global timer if (data.Length != 0) { string[] param = data.Split(new char[] { ' ' }, 4); if (param.Length == 2) { //check for /timer ID off if (param[1].ToLower() == "off") { this.DestroyTimer(param[0]); break; } } else if (param.Length == 4) { this.CreateTimer(param[0], Convert.ToInt32(param[1]), Convert.ToDouble(param[2]), param[3]); } else { string msg = GetMessageFormat("User Error"); msg = msg.Replace("$message", "/timer [ID] [REPS] [INTERVAL] [COMMAND]"); CurrentWindowMessage(null, msg, "", true); } } else { string msg = GetMessageFormat("User Error"); msg = msg.Replace("$message", "/timer [ID] [REPS] [INTERVAL] [COMMAND]"); CurrentWindowMessage(null, msg, "", true); } } break; case "/topicbar": if (connection != null) { if (data.Length > 0) { if (data.IndexOf(' ') == -1) { if (CurrentWindow.WindowStyle == IceTabPage.WindowType.Channel) { //topicbar show //topicbar hide for current channel if (data.ToLower() == "show" || data.ToLower() == "on") CurrentWindow.ShowTopicBar = true; if (data.ToLower() == "hide" || data.ToLower() == "off") CurrentWindow.ShowTopicBar = false; ChannelSetting cs = ChannelSettings.FindChannel(CurrentWindow.TabCaption, connection.ServerSetting.NetworkName); if (cs != null) { cs.HideTopicBar = !CurrentWindow.ShowTopicBar; } else { ChannelSetting cs1 = new ChannelSetting(); cs1.HideTopicBar = !CurrentWindow.ShowTopicBar; cs1.ChannelName = CurrentWindow.TabCaption; cs1.NetworkName = connection.ServerSetting.NetworkName; ChannelSettings.AddChannel(cs1); } SaveChannelSettings(); } } else { //topicbar #channel show //string[] words = data.Split(' '); } } } break; case "/topic": if (connection != null) { if (data.Length == 0) { if (CurrentWindowStyle == IceTabPage.WindowType.Channel) SendData(connection, "TOPIC :" + CurrentWindow.TabCaption); } else { //check if a channel name was passed string word = ""; if (data.IndexOf(' ') > -1) word = data.Substring(0, data.IndexOf(' ')); else word = data; if (Array.IndexOf(connection.ServerSetting.ChannelTypes, word[0]) != -1) { IceTabPage t = GetWindow(connection, word, IceTabPage.WindowType.Channel); if (t != null) { if (data.IndexOf(' ') > -1) SendData(connection, "TOPIC " + t.TabCaption + " :" + data.Substring(data.IndexOf(' ') + 1)); else SendData(connection, "TOPIC :" + t.TabCaption); } } else { if (CurrentWindowStyle == IceTabPage.WindowType.Channel) SendData(connection, "TOPIC " + CurrentWindow.TabCaption + " :" + data); } } } break; case "/update": checkForUpdate(); break; case "/userinfo": if (connection != null && data.Length > 0) { FormUserInfo fui = new FormUserInfo(connection); //find the user fui.NickName(data); fui.Show(this); } break; case "/version": if (connection != null && data.Length > 0) { string msg = GetMessageFormat("Ctcp Send"); msg = msg.Replace("$nick", data); ; msg = msg.Replace("$ctcp", "VERSION"); CurrentWindowMessage(connection, msg, "", true); SendData(connection, "PRIVMSG " + data + " VERSION"); } else SendData(connection, "VERSION"); break; case "/who": if (connection != null && data.Length > 0) { SendData(connection, "WHO " + data); } break; case "/whois": if (connection != null && data.Length > 0) SendData(connection, "WHOIS " + data); break; case "/aline": //for adding lines to @windows if (data.Length > 0 && data.IndexOf(" ") > -1) { string window = data.Substring(0, data.IndexOf(' ')); string msg = data.Substring(data.IndexOf(' ') + 1); if (GetWindow(null, window, IceTabPage.WindowType.Window) == null) AddWindow(null, window, IceTabPage.WindowType.Window); IceTabPage t = GetWindow(null, window, IceTabPage.WindowType.Window); if (t != null) { t.TextWindow.AppendText(msg, ""); t.LastMessageType = ServerMessageType.Message; } } break; case "/window": if (data.Length > 0) { if (data.StartsWith("@") && data.IndexOf(" ") == -1) { if (GetWindow(null, data, IceTabPage.WindowType.Window) == null) AddWindow(null, data, IceTabPage.WindowType.Window); else { //switch to this window for (int i = 0; i < mainChannelBar.TabPages.Count; i++) { if (mainChannelBar.TabPages[i].WindowStyle == IceTabPage.WindowType.Window) { if (mainChannelBar.TabPages[i].TabCaption == data) { mainChannelBar.SelectTab(mainChannelBar.TabPages[i]); return; } } } } } } break; case "/quote": case "/raw": if (connection != null && connection.IsConnected) connection.SendData(data); break; default: //parse the outgoing data if (connection != null) SendData(connection, command.Substring(1) + " " + data); break; } } else { //sends a message to the channel error = 1; if (inputPanel.CurrentConnection != null && connection != null) { if(connection.IsConnected) { error = 2; //check if the current window is a Channel/Query, etc if (CurrentWindowStyle == IceTabPage.WindowType.Channel) { SendData(connection, "PRIVMSG " + CurrentWindow.TabCaption + " :" + data); //check if we got kicked out of the channel or not, and the window is still open if (CurrentWindow.IsFullyJoined) { error = 3; string msg = GetMessageFormat("Self Channel Message"); string nick = connection.ServerSetting.CurrentNickName; msg = msg.Replace("$nick", nick).Replace("$channel", CurrentWindow.TabCaption); error = 4; //assign $color to the nickname if (msg.Contains("$color")) { error = 5; User u = CurrentWindow.GetNick(nick); //get the nick color if (u != null && u.nickColor == -1) { error = 6; if (IceChatColors.RandomizeNickColors == true) { int randColor = new Random().Next(0, 71); if (randColor == IceChatColors.NickListBackColor) randColor = new Random().Next(0, 71); u.nickColor = randColor; error = 7; } else { //get the correct nickname color for channel status error = 8; for (int y = 0; y < u.Level.Length; y++) { if (u.Level[y]) { switch (connection.ServerSetting.StatusModes[0][y]) { case 'q': u.nickColor = IceChatColors.ChannelOwnerColor; break; case 'a': u.nickColor = IceChatColors.ChannelAdminColor; break; case 'o': u.nickColor = IceChatColors.ChannelOpColor; break; case 'h': u.nickColor = IceChatColors.ChannelHalfOpColor; break; case 'v': u.nickColor = IceChatColors.ChannelVoiceColor; break; default: u.nickColor = IceChatColors.ChannelRegularColor; break; } break; } } error = 9; } if (u.nickColor == -1) u.nickColor = IceChatColors.ChannelRegularColor; error = 10; msg = msg.Replace("$color", "\x0003" + u.nickColor.ToString("00")); } else msg = msg.Replace("$color", ""); error = 11; } error = 12; //this errors, losing a nickname for some reason!! if (CurrentWindow.GetNick(nick) != null) msg = msg.Replace("$status", CurrentWindow.GetNick(nick).ToString().Replace(nick, "")); else msg = msg.Replace("$status", ""); error = 13; msg = msg.Replace("$message", data); error = 14; CurrentWindow.TextWindow.AppendText(msg, ""); CurrentWindow.LastMessageType = ServerMessageType.Message; error = 15; } } else if (CurrentWindowStyle == IceTabPage.WindowType.Query) { SendData(connection, "PRIVMSG " + CurrentWindow.TabCaption + " :" + data); string msg = GetMessageFormat("Self Private Message"); msg = msg.Replace("$nick", connection.ServerSetting.CurrentNickName).Replace("$message", data); CurrentWindow.TextWindow.AppendText(msg, ""); CurrentWindow.LastMessageType = ServerMessageType.Message; } else if (CurrentWindowStyle == IceTabPage.WindowType.DCCChat) { CurrentWindow.SendDCCData(data); string msg = GetMessageFormat("Self DCC Chat Message"); msg = msg.Replace("$nick", connection.ServerSetting.CurrentNickName).Replace("$message", data); CurrentWindow.TextWindow.AppendText(msg, ""); } else if (CurrentWindowStyle == IceTabPage.WindowType.Console) { WindowMessage(connection, "Console", "\x000304" + data, "", true); } } else { WindowMessage(connection, "Console", "\x000304Error: Not Connected", "", true); WindowMessage(connection, "Console", "\x000304" + data, "", true); } } else { if (CurrentWindowStyle == IceTabPage.WindowType.Window) CurrentWindow.TextWindow.AppendText("\x000301" + data, ""); else WindowMessage(null, "Console","\x000304" + data, "", true); } } } catch (Exception e) { WriteErrorFile(connection, "ParseOutGoingCommand:" + CurrentWindowStyle.ToString() + ":" + error + ":" + data, e); } }