private void userCommand(string command, string commandParam, string nick, string location) { #region All Level Commands if (command == "!SPLASH") { Thread.Sleep(1000); // throttle it so it won't commit a flood if tons of people use it. sendToChannel("Kon Splash!", location); Console.WriteLine(">> " + channel + " : Kon Splash!"); } // Haiku!. if (command == "!HAIKU") { if (LB) { String inputMessage = ""; if (commandParam != "") { string[] messageLine = commandParam.Split(new char[] { ' ' }); int msgLength = messageLine.Length - 1; for (int i = 1; i <= msgLength; i++) { inputMessage = inputMessage + messageLine[i] + " "; } } inputMessage = inputMessage.Trim(); string haiku = LBbrain.generateHaiku(inputMessage); sendToChannel(haiku, location); } else { sendToChannel("4LB Brain not active and the Haiku cannot be generated", location); } } if (command == "!BRAININFO") { sendToChannel("My brain contains " + myAI.getBrainLength() + " lines.", location); } if (command == "!LBINFO") { if (LB) { sendToChannel("My LB brain contains " + myLB.getBrainLength() + " lines.", location); } else { sendToChannel("4LB Brain must be turned on in order to use this command.", location); } } if (command == "!KONINFO") { sendToChannel(version, location); } #endregion #region User Level Commands if (command == "!RELOADAIML") { if ((isUser(nick)) || (isAdmin(nick))) { if (AIML) { sendToChannel("4Reloading AIML..please wait before using any commands..", location); Console.WriteLine(">> RELOADING AI"); AIMLbrain.unloadAIMLbrain(); myAIML = null; myAIML = new AIMLbrain(); // Let's put the thread to sleep while it's reloading. Thread.Sleep(1300); sendToChannel("2AI Reloaded!", location); } else { sendToChannel("4The AIML brain is not currently in use.", location); } } else { sendToChannel("4You do not have access to this command.", location); } } if (command == "!TOGGLEAIML") { if ((isUser(nick)) || (isAdmin(nick))) { if (AIML) { AIML = false; AIMLbrain.unloadAIMLbrain(); myAIML = null; sendToChannel("4No longer using AIML for replies...", location); } else { AIML = true; LB = false; sendToChannel("4Loading AIML files..please wait before using any commands..", location); myAIML = new AIMLbrain(); sendToChannel("4Now using AIML in addition to my brain for replies...", location); myLB = null; } } else { sendToChannel("4You do not have access to this command.", location); } } if (command == "!TOGGLELB") { if ((isUser(nick)) || (isAdmin(nick))) { if (LB) { LB = false; sendToChannel("4No longer using the LB Brain for replies...", location); myLB = null; } else { LB = true; AIML = false; sendToChannel("4Now using the LB Brain in addition to my brain for replies...", location); myAIML = null; myLB = new LBbrain(); } } else { sendToChannel("4You do not have access to this command.", location); } } if (command == "!CHANNELUSERS") { if ((isUser(nick)) || (isAdmin(nick))) { sendToChannel(channelUsers, location); } else { sendToChannel("4You do not have access to this command.", location); } } //Private UTTER.. will send a random channel user a message if (command == "!PUTTER") { if ((isUser(nick)) || (isAdmin(nick))) { converse(location, "a", randomChannelUser()); } else { sendToChannel("4You do not have access to this command.", location); } } // Regular UTTER.. will send a random message to the location the command was used if (command == "!UTTER") { if ((isUser(nick)) || (isAdmin(nick))) { converse(location, "thisisanutteryoushouldnthaveanylinesthatmatchthisstufflol", nick); } else { sendToChannel("4You do not have access to this command.", location); } } // Total nonsense... won't try to generate coherent sentences. if (command == "!TOTALNONSENSE") { if ((isUser(nick)) || (isAdmin(nick))) { string nonsense = LBbrain.totalNonsense(); sendToChannel(nonsense, location); } else { sendToChannel("4You do not have access to this command.", location); } } if (command == "!JOIN") { if ((isUser(nick)) || (isAdmin(nick))) { join(commandParam); } else { sendToChannel("4You do not have access to this command.", location); } } if (command == "!PART") { if ((isUser(nick)) || (isAdmin(nick))) { // Get the channel and leave part(commandParam); } else { sendToChannel("4You do not have access to this command.", location); } } if (command == "!TOGGLETOPIC") { if ((isUser(nick)) || (isAdmin(nick))) { if (topics) { topics = false; sendToChannel("4I will no longer try to locate the topic in what you say to me.", location); } else { topics = true; sendToChannel("4I will now try to locate the topic in what you say to me.", location); } } else { sendToChannel("4You do not have access to this command.", location); } } if (command == "!TOGGLECOPYANSWER") { if ((isUser(nick)) || (isAdmin(nick))) { if (useAnswerLine == false) { useAnswerLine = true; sendToChannel("4I will reply with answers I find.", location); } else { useAnswerLine = false; sendToChannel("4I will now stop replying with direct answers I find.", location); } } else { sendToChannel("4You do not have access to this command.", location); } } if (command == "!TOGGLEDOUBLESENTENCES") { if ((isUser(nick)) || (isAdmin(nick))) { if (doubleSentences) { doubleSentences = false; sendToChannel("4I will no longer try to combine two sentences.", location); } else { doubleSentences = true; sendToChannel("4I will now try to combine two sentences together.", location); } } else { sendToChannel("4You do not have access to this command.", location); } } if (command == "!TOGGLEANSWERSEARCH") { if ((isUser(nick)) || (isAdmin(nick))) { if (answerSearch) { answerSearch = false; sendToChannel("4I will no longer try to find appropriate answers.", location); } else { answerSearch = true; sendToChannel("4I will now try to find approprate answers.", location); } } else { sendToChannel("4You do not have access to this command.", location); } } if (command == "!RANDOMTALK") { if ((isUser(nick)) || (isAdmin(nick))) { if ((commandParam != "") && (commandParam != " ")) { int randomTalkP; try { randomTalkP = System.Convert.ToInt32(commandParam); } catch (Exception e) { sendToChannel("4!randomTalk # where # is 1 to 100", location); randomTalkP = randomTalk; Console.WriteLine("Error: " + e.ToString()); } randomTalk = randomTalkP; sendToChannel("3RandomTalk now set to: " + randomTalk + "%", location); Console.WriteLine("** Random Talk changed to: " + randomTalk + "%"); } else { sendToChannel("3RandomTalk is currently set to: " + randomTalk + "%", location); Thread.Sleep(100); sendToChannel("3To change the percent use: !randomTalk # where # is 0 to 100", location); } } else { sendToChannel("4You do not have access to this command.", location); } } if (command == "!DINFO") { // For now, the nicks allowed to use this will be hardcoded if ((isUser(nick)) || (isAdmin(nick))) { sendToChannel("Reconnects: " + reconnectAttempts + "/" + retryAttempts + " :: PING control is currently: " + canPing + " :: Ping Attempt #: " + pongAttempt, location); } else { sendToChannel("4You do not have access to this command.", location); } } // Returns the latest Twitter status update, if applicable. if (command == "!TWITTER") { if ((isUser(nick)) || (isAdmin(nick))) { if (twitterClientOn) { try { if (twitterMessage != "") { sendToChannel("Current tweet:2 " + twitterMessage, location); } else { sendToChannel("4Twitter is either disabled or there are no messages to display.", location); } } catch (Exception e) { sendToChannel("4Twitter Client is not enabled or error encountered.", location); Console.WriteLine(e.ToString()); } } else { sendToChannel("Twitter Client is not enabled or error encountered.", location); } } else { sendToChannel("4You do not have access to this command.", location); } } #endregion #region Admin Level Commands if (command == "!QUIT") { // For now, the nicks allowed to use this will be hardcoded if (isAdmin(nick)) { writer.WriteLine("QUIT " + ":" + version); writer.Flush(); Console.WriteLine("Kon can now be closed"); Thread.Sleep(500); quit_program(); } else { sendToChannel("4You do not have access to this command.", location); } } if (command == "!ADDUSER") { // For now, the nicks allowed to use this will be hardcoded if (isAdmin(nick)) { if ((commandParam == " ") || (commandParam == "")) { sendToChannel("4A name must be attached to this command. !addUser (name)", location); } else { addUser(commandParam); sendToChannel(commandParam + " added to the list of users", location); } } else { sendToChannel("4You do not have access to this command.", location); } } if (command == "!REMUSER") { // For now, the nicks allowed to use this will be hardcoded if (isAdmin(nick)) { if ((commandParam == " ") || (commandParam == "")) { sendToChannel("4A name must be attached to this command. !addUser (name)", location); } else { remUser(commandParam); sendToChannel(commandParam + " removed from the list of users", location); } } else { sendToChannel("4You do not have access to this command.", location); } } if (command == "!RECONNECT") { // For now, the nicks allowed to use this will be hardcoded if (isAdmin(nick)) { writer.WriteLine("QUIT :Reconnecting"); writer.Flush(); Thread.Sleep(100); setConnectionState(false); } else { sendToChannel("4You do not have access to this command.", location); } } if (command == "!RAW") { if (isAdmin(nick)) { string[] IncomingMessage; IncomingMessage = commandParam.Split(new char[] { ' ' }); int messageStartingPoint = 1; if (IncomingMessage.Length < 1) { sendToChannel("4Error with command.", location); } messageStartingPoint = 1; // Determine what the message is. int commandLength = IncomingMessage.Length - 1; string message = ""; for (; messageStartingPoint <= commandLength; messageStartingPoint++) { message = message + IncomingMessage[messageStartingPoint] + " "; } writer.WriteLine(message); writer.Flush(); } else { sendToChannel("4You do not have access to this command.", location); } } if (command == "!MSG") { if (isAdmin(nick)) { string[] IncomingMessage; IncomingMessage = commandParam.Split(new char[] { ' ' }); string whereToSendMessage = ""; int messageStartingPoint = 1; if (IncomingMessage.Length >= 2) { whereToSendMessage = IncomingMessage[1].ToString(); } else { sendToChannel("4Error with command.", location); } messageStartingPoint = 2; // Determine what the message is. int commandLength = IncomingMessage.Length - 1; string message = ""; for (; messageStartingPoint <= commandLength; messageStartingPoint++) { message = message + IncomingMessage[messageStartingPoint] + " "; } if (whereToSendMessage != "") { sendToChannel(message, whereToSendMessage); } } else { sendToChannel("4You do not have access to this command.", location); } } /* * I was going to try to get an MSN client to work with Kon, but it isn't working right. Disabled for now. * if (command == "!MSN") * { * if (isAdmin(nick)) * { * * string[] IncomingMessage; * IncomingMessage = commandParam.Split(new char[] { ' ' }); * * if (IncomingMessage.Length >= 2) * { * string msnUserName = IncomingMessage[1]; * string msnPassWord = IncomingMessage[2]; * * // start a new MSN client * msnClient = new msn(msnUserName, msnPassWord); * } * * else * sendToChannel("4Error in command.", location); * * } * else * sendToCha * nnel("4You do not have access to this command.", location); * }*/ #endregion }
private void connect() { // Tell people we're going to connect Console.WriteLine("Connecting to " + ircServer + ":" + ircPort + " ...\n"); try { // Try to make a connection to the server ircClient = new TcpClient(ircServer, ircPort); stream = ircClient.GetStream(); reader = new StreamReader(stream); writer = new StreamWriter(stream); readerStreamClosed = false; // We're connected, so let's set our bool to true. setConnectionState(true); // Let the ping control know we can ping now. setCanPing(true); // Set the current ping attempt to 0. Really useful for when the bot has to reconnect for any reason. pongAttempt = 0; // Start up our incoming data listener IncomingData(); // Authorize who we are. authorize(); // Let's turn on the AI stuff. myAI = new AI(); if (AIML == true) { myAIML = new AIMLbrain(); } if (LB == true) { myLB = new LBbrain(); } Thread.Sleep(1500); // Auto join the channel, if there is one if (channel != "") { Thread.Sleep(500); join(channel); } } catch (Exception e) { // Show the exception DisplayData("ERROR: " + e.ToString()); setConnectionState(false); } Thread.Sleep(1000); // Let's turn on the twitter client, if it needs to be turned on. if (useTwitter) { twitterClientOn = true; Thread.Sleep(500); sendInitialTwitterMessage(); } }
private void converse(string location, string conversation, string channelNick) { if (!location.StartsWith("#")) { location = channelNick; } // Time to get the list of channel users. writer.WriteLine("NAMES " + channel); writer.Flush(); Thread.Sleep(10); try { // Replace some punctuation with spaces to prevent it from going nuts conversation = conversation.Replace(",", ""); // Set the reply string that will be the reply from the bot String reply = ""; // Throttle it a little bit in case there's too many people talking to it at once. Thread.Sleep(500); #region AIMLbrain // If AIML is enabled we'll use the AIML files to find a reply for the user. if (AIML) { // Let's get the reply from the AIML structure reply = AIMLbrain.getReply(reply, conversation, channelNick); } #endregion #region LBbrain if (LB) { reply = myLB.pullFromBrain(conversation, topics, useAnswerLine); if ((doubleSentences) && (reply.Length < 5)) { Thread.Sleep(10); string reply2 = myLB.pullFromBrain(reply, true, useAnswerLine); string tempReply1 = reply.Remove(reply.Length - 1); string tempReply2 = reply2.Remove(reply2.Length - 1); if (tempReply1.ToUpper() != tempReply2.ToUpper()) { reply = reply + " " + reply2; } } // Is the last character a comma, semi-colon or colon? If so, let's remove it. string lastReplyCharacter = reply.Substring(reply.Length - 1, 1); if (((lastReplyCharacter == ",") || (lastReplyCharacter == ";") || (lastReplyCharacter == ":"))) { reply = reply.Remove(reply.Length - 1, 1); } // Let's clean up the reply a little bit. if ((reply.StartsWith(" ACTION")) || (reply.StartsWith("ACTION"))) { reply = reply.Replace("ACTION", ""); reply = reply.Replace("", ""); reply = reply.Trim(); reply = "ACTION " + reply + ""; } else { reply = reply.Replace(" ACTION", " *"); reply = reply.Replace("ACTION", "*"); } reply = reply.Trim(); } #endregion // This is a last ditch effort to try and respond to the user. If the other methods have failed, // this will reach into kon's most basic brain and pull out a reply. if (reply == "") { reply = myAI.pullFromBrain(); } // Let's split the reply up and try to replace the UNNAMED_USER with an actual channel user. string[] words = reply.Split(' '); int wordCount = words.Length - 1; for (int i = 0; i <= wordCount; i++) { if (words[i].ToString() == "UNNAMED_USER:"******":"; } else { words[i] = words[i].Replace("UNNAMED_USER", randomChannelUser()); } } // now to rebuild the reply reply = ""; for (int i = 0; i < words.Length; i++) { reply += words[i] + " "; } reply = reply.Trim(); // Make sure the reply isn't too long so it doesn't crash the bot. int replyLength = reply.Length; if (replyLength >= 440) { reply = reply.Substring(0, 440); } else { reply = reply.Substring(0, replyLength); } // Let's try to correct some grammar reply = grammarCheck(reply); // Display the response and log it. sendToChannel(reply, location); Console.WriteLine(">> " + location + " : " + reply); } catch (Exception e) { // Show the exception Console.WriteLine(e.ToString() + CRLF); // Sleep, before we try again Thread.Sleep(1000); } }