]> jfr.im git - z_archive/kelsier.git/blobdiff - Bot.cs
moar updates
[z_archive/kelsier.git] / Bot.cs
diff --git a/Bot.cs b/Bot.cs
index 29f77e9fb3f1d2b7a3cf0a78dc46c074669e2462..12ea5031d74e16bb90fe329814712b73642b3d69 100644 (file)
--- a/Bot.cs
+++ b/Bot.cs
@@ -1,4 +1,25 @@
-using System;
+// Kelsier project - Bot state and parser code (Bot.cs)
+// Written by the Jobbig codeteam. <http://jobbig.eu/code/>
+// 
+// Copyright 2013 John Runyon.
+// 
+// This file is part of the Kelsier project.
+// 
+// Kelsier is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+// 
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU Affero General Public License for more details.
+// 
+// You should have received a copy of the GNU Affero General Public License
+// along with this program.  If not, see <http://www.gnu.org/licenses/>.
+//
+
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
@@ -55,6 +76,8 @@ class Bot {
             s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
             s.Bind(local);
             s.Connect(server, serverport);
+                       
+                       register();
 
             Stator rcvstate = new Stator();
             s.BeginReceive(rcvstate.buffer, 0, 1, SocketFlags.None, new AsyncCallback(dataIn), rcvstate);
@@ -67,33 +90,71 @@ class Bot {
             s.EndReceive(ar);
 
             if (rcvstate.buffer[0] == '\n') {
-                processData(rcvstate.buffersb.ToString());
+                               string linein = rcvstate.buffersb.ToString();
+                               processData(linein);
                 rcvstate = new Stator();
-            } else {
+            } else if (rcvstate.buffer[0] != '\r') {
                 rcvstate.buffersb.Append(Encoding.ASCII.GetString(rcvstate.buffer, 0, 1));
             }
             s.BeginReceive(rcvstate.buffer, 0, 1, SocketFlags.None, new AsyncCallback(dataIn), rcvstate);
         }
         private void send(string data, params object[] args) {
-            log.debug(">>> " + data);
+            log.info(">>> " + data);
             s.Send(Encoding.ASCII.GetBytes(data + "\n"));
         }
 
         private void processData(string data) {
-            log.debug("<<< " + data);
-
-            if (!online) { register(); return; }
-
-            short numeric;
-            if (data.StartsWith(":") && Int16.TryParse(data.Substring(data.IndexOf(' ')+1, 3), out numeric)) {
-                if (numeric == 1) {
-                    send("JOIN #mustis");
-                    send("PRIVMSG #mustis :lolol!");
-                }
-            } else if (data.Substring(0, 4) == "PING") {
-                send("PONG" + data.Substring(4));
-            }
+            log.info("<<< " + data);
+
+                       string[] parts;
+                       string source = null;
+                       if (data.StartsWith(":")) {
+                               parts = data.Split((char[])null, 2, StringSplitOptions.RemoveEmptyEntries);
+                               source = parts[0].Substring(1);
+                               data = parts[1];
+                       }
+                       
+                       parts = data.Split((char[])null, 2, StringSplitOptions.RemoveEmptyEntries);
+                       if (parts[0] == "PRIVMSG") {
+                               processMsg(source, parts[1]);
+                       } else if (parts[0] == "376") {
+                               send("JOIN #jobbig.kelsier");
+                       } else if (parts[0] == "PING") {
+                               send("PONG "+parts[1]);
+                       }
         }
+               // processMsg("DimeCadmium!dime@jobbig.eu", "#mustis :hi");
+               private void processMsg(string source, string data) {
+                       string[] dataparts = data.Split((char[])null, 2, StringSplitOptions.RemoveEmptyEntries);
+                       
+                       string nick = (source.Split(new char[] { '!' }))[0];
+                       string target = dataparts[0];
+                       string message = dataparts[1];
+                       if (message.StartsWith(":"))
+                               message = message.Substring(1);
+                       string[] msgparts = message.Split((char[])null, StringSplitOptions.RemoveEmptyEntries);
+                       
+                       // TODO check msgparts[0] first char for trigger
+                       string cmdstr = msgparts[0].Substring(1);
+                       string[] args;
+                       bool chanmsg;
+                       Channel chan;
+                       if (target.StartsWith("#")) {
+                               chanmsg = true;
+                               args = new string[msgparts.Length - 1];
+                               Array.Copy(msgparts, 1, args, 0, msgparts.Length - 1);
+                               chan = new Channel(target);
+                       } else {
+                               chanmsg = false;
+                               args = new string[msgparts.Length - 2];
+                               Array.Copy(msgparts, 2, args, 0, msgparts.Length - 2);
+                               chan = new Channel(msgparts[1]);
+                       }
+                       
+                       User user = new User(nick);
+                       
+                       Command cmd = new Command(cmdstr, args, user, chan, chanmsg);
+               }
 
         private void register() {
             send(String.Format("NICK {0}", nick));