Hideto KIHARA / IrcBot

Fork of IrcBot by Nick Ryder

Revision:
1:cf586c9bbb52
Parent:
0:b8fb2df56652
Child:
2:e4c74eb20586
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IrcBot.cpp	Sat Aug 02 12:17:28 2014 +0000
@@ -0,0 +1,169 @@
+#include "IrcBot.h"
+
+IrcMessage::IrcMessage(char * f, char * t, char * m) {
+    sprintf(from, "%s", f);
+    sprintf(to, "%s", t);
+    sprintf(msg, "%s", m);    
+}
+
+IrcMessage::IrcMessage() {
+    from[0] = '\0';
+    to[0] = '\0';
+    msg[0] = '\0';
+}
+
+Irc::Irc(char * nick, char * net, int p, char * chan) :
+        pc(USBTX, USBRX), sock(), port(p), ident(false), connected(false),
+        setup(false), joined(false), parseindex(0)
+{
+    sprintf(nickname, "%s", nick);
+    sprintf(password, "%s", "");
+    sprintf(network, "%s", net);
+    sprintf(channel, "%s", chan);
+    pc.printf("Created Irc obj for %s.\n", nickname);
+}
+
+void Irc::identify(char * pass) {
+    ident = true;
+    sprintf(password, "%s", pass);    
+}
+
+void Irc::join(char * chan) {
+    char cmd[64];
+    sprintf(cmd, ":source JOIN :%s\r\n", chan);
+    send(cmd);
+}
+
+void Irc::connect() {
+    pc.printf("Connecting to %s:%d...\n", network, port);
+    sock.connect(network, port);
+    pc.printf("Done.\n");
+    connected = true;
+}
+
+void Irc::disconnect() {
+    if (connected) {
+        pc.printf("Disconnecting.\n");
+        sock.close();
+        connected = false;
+    }
+}
+
+void Irc::add(MessageHandler * handler) {
+    handlers.push_back(handler);
+}
+
+bool Irc::read() {
+    if (!connected) return 0;
+    int ret = sock.receive(readbuffer, sizeof(readbuffer) - 1);
+    bool parsed = false;
+    if (ret >= 0) {
+        readbuffer[ret] = '\0';
+        pc.printf("Received %d chars: ---%s--\n", ret, readbuffer);
+        for (int i = 0; i < ret; i++) {
+            parsebuffer[parseindex] = readbuffer[i];
+            parseindex++;
+            if (readbuffer[i] == '\n') {
+                parsebuffer[parseindex] = '\0';
+                parse();
+                parsed = true;
+                parseindex = 0;
+            }
+        }
+    }
+    return parsed;
+}
+
+void Irc::send(char * cmd) {
+    if (!connected) return;
+    int i = 0;
+    bool ok = true;
+    while (cmd[i] != '\0') {
+        i++;
+        if (i > 512) {
+            ok = false;
+            break;    
+        }  
+    }
+    if (!ok) return;
+    pc.printf("Sending: ---%s---\n", cmd);
+    sock.send_all(cmd, i);
+}
+
+void Irc::handle(IrcMessage msg) {
+    pc.printf("Handling message from %s, to %s: %s\n", msg.from, msg.to, msg.msg);    
+    for (int i = 0; i < handlers.size(); i++) {
+        IrcMessage out = handlers.at(i)->handle(msg);
+        if (out.to[0] != '\0') {
+            sprintf(out.from, "%s", nickname);
+            pc.printf("Need to send: ---%s--- from %s to %s.\n", out.msg, out.from, out.to);
+            char cmd[512];
+            sprintf(cmd, "PRIVMSG %s :%s\r\n", out.to, out.msg);
+            send(cmd);
+        }
+    }
+}
+
+void Irc::parse() {
+    pc.printf("Parsing: --%s--\n", parsebuffer);
+    if (setup && (!joined)) {
+        char cmd[256];
+        sprintf(cmd, ":source JOIN :%s\r\n", channel);
+        send(cmd);
+        joined = true;
+        return;   
+    }
+    if (!setup) {
+        char cmd[256];
+        sprintf(cmd, "NICK %s\r\nUSER %s 0 * :Lester\r\n", nickname, nickname);
+        send(cmd);
+        setup = true;
+        return;
+    }
+    char * c = NULL;
+    c = strstr(parsebuffer, "PING");
+    if (c != NULL) {
+        char cmd[] = "PONG\r\n";
+        send(cmd);    
+    }
+    c = strstr(parsebuffer, "PRIVMSG");
+    if (c != NULL) {
+        char f[32];
+        char t[32];
+        char m[256];
+        int i;
+        for (i = 1; i < 32; i++) {
+            if (parsebuffer[i] == '!') {
+                f[i - 1] = '\0';    
+                break;
+            }
+            f[i - 1] = parsebuffer[i];   
+        }
+        int nspace = 0;
+        bool inmsg = false;
+        int toindex = 0, msgindex = 0;
+        for (; i < sizeof(parsebuffer); i++) {
+            if (parsebuffer[i] == '\r') break;
+            if (parsebuffer[i] == '\n') break;
+            if (parsebuffer[i] == '\0') break;
+            if (parsebuffer[i] == ' ') {
+                nspace++;    
+            }
+            if ((nspace == 2) && (parsebuffer[i] != ' ')) {
+                t[toindex] = parsebuffer[i];
+                toindex++;
+            }
+            if (inmsg) {
+                m[msgindex] = parsebuffer[i];
+                msgindex++;    
+            }
+            if ((parsebuffer[i] == ':') && (!inmsg)) {
+                inmsg = true;
+            }
+        }
+        t[toindex] = '\0';
+        m[msgindex] = '\0';
+        IrcMessage msg(f, t, m);
+        handle(msg);
+    }
+}
\ No newline at end of file