The IrcBot class can connect to a channel on an IRC network. Users on the same network can send messages to the bot that are parsed by message handlers. The included handlers read digital/analog inputs and write digital outputs or echo messages back to the command sender/channel. Users can write their own message handlers inheriting from the MessageHandler class to perform different actions.

Committer:
NickRyder
Date:
Sat Aug 02 12:57:57 2014 +0000
Revision:
2:e4c74eb20586
Parent:
1:cf586c9bbb52
Added documentation.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
NickRyder 1:cf586c9bbb52 1 #include "IrcBot.h"
NickRyder 0:b8fb2df56652 2
NickRyder 0:b8fb2df56652 3 IrcMessage::IrcMessage(char * f, char * t, char * m) {
NickRyder 0:b8fb2df56652 4 sprintf(from, "%s", f);
NickRyder 0:b8fb2df56652 5 sprintf(to, "%s", t);
NickRyder 0:b8fb2df56652 6 sprintf(msg, "%s", m);
NickRyder 0:b8fb2df56652 7 }
NickRyder 0:b8fb2df56652 8
NickRyder 0:b8fb2df56652 9 IrcMessage::IrcMessage() {
NickRyder 0:b8fb2df56652 10 from[0] = '\0';
NickRyder 0:b8fb2df56652 11 to[0] = '\0';
NickRyder 0:b8fb2df56652 12 msg[0] = '\0';
NickRyder 0:b8fb2df56652 13 }
NickRyder 0:b8fb2df56652 14
NickRyder 2:e4c74eb20586 15 IrcBot::IrcBot(char * nick, char * net, int p, char * chan) :
NickRyder 0:b8fb2df56652 16 pc(USBTX, USBRX), sock(), port(p), ident(false), connected(false),
NickRyder 0:b8fb2df56652 17 setup(false), joined(false), parseindex(0)
NickRyder 0:b8fb2df56652 18 {
NickRyder 0:b8fb2df56652 19 sprintf(nickname, "%s", nick);
NickRyder 0:b8fb2df56652 20 sprintf(password, "%s", "");
NickRyder 0:b8fb2df56652 21 sprintf(network, "%s", net);
NickRyder 0:b8fb2df56652 22 sprintf(channel, "%s", chan);
NickRyder 2:e4c74eb20586 23 pc.printf("Created IrcBot obj for %s.\n", nickname);
NickRyder 0:b8fb2df56652 24 }
NickRyder 0:b8fb2df56652 25
NickRyder 2:e4c74eb20586 26 void IrcBot::connect() {
NickRyder 0:b8fb2df56652 27 pc.printf("Connecting to %s:%d...\n", network, port);
NickRyder 0:b8fb2df56652 28 sock.connect(network, port);
NickRyder 0:b8fb2df56652 29 pc.printf("Done.\n");
NickRyder 0:b8fb2df56652 30 connected = true;
NickRyder 0:b8fb2df56652 31 }
NickRyder 0:b8fb2df56652 32
NickRyder 2:e4c74eb20586 33 void IrcBot::disconnect() {
NickRyder 0:b8fb2df56652 34 if (connected) {
NickRyder 0:b8fb2df56652 35 pc.printf("Disconnecting.\n");
NickRyder 0:b8fb2df56652 36 sock.close();
NickRyder 0:b8fb2df56652 37 connected = false;
NickRyder 0:b8fb2df56652 38 }
NickRyder 0:b8fb2df56652 39 }
NickRyder 0:b8fb2df56652 40
NickRyder 2:e4c74eb20586 41 void IrcBot::add(MessageHandler * handler) {
NickRyder 0:b8fb2df56652 42 handlers.push_back(handler);
NickRyder 0:b8fb2df56652 43 }
NickRyder 0:b8fb2df56652 44
NickRyder 2:e4c74eb20586 45 bool IrcBot::read() {
NickRyder 0:b8fb2df56652 46 if (!connected) return 0;
NickRyder 0:b8fb2df56652 47 int ret = sock.receive(readbuffer, sizeof(readbuffer) - 1);
NickRyder 0:b8fb2df56652 48 bool parsed = false;
NickRyder 0:b8fb2df56652 49 if (ret >= 0) {
NickRyder 0:b8fb2df56652 50 readbuffer[ret] = '\0';
NickRyder 0:b8fb2df56652 51 pc.printf("Received %d chars: ---%s--\n", ret, readbuffer);
NickRyder 0:b8fb2df56652 52 for (int i = 0; i < ret; i++) {
NickRyder 0:b8fb2df56652 53 parsebuffer[parseindex] = readbuffer[i];
NickRyder 0:b8fb2df56652 54 parseindex++;
NickRyder 0:b8fb2df56652 55 if (readbuffer[i] == '\n') {
NickRyder 0:b8fb2df56652 56 parsebuffer[parseindex] = '\0';
NickRyder 0:b8fb2df56652 57 parse();
NickRyder 0:b8fb2df56652 58 parsed = true;
NickRyder 0:b8fb2df56652 59 parseindex = 0;
NickRyder 0:b8fb2df56652 60 }
NickRyder 0:b8fb2df56652 61 }
NickRyder 0:b8fb2df56652 62 }
NickRyder 0:b8fb2df56652 63 return parsed;
NickRyder 0:b8fb2df56652 64 }
NickRyder 0:b8fb2df56652 65
NickRyder 2:e4c74eb20586 66 void IrcBot::send(char * cmd) {
NickRyder 0:b8fb2df56652 67 if (!connected) return;
NickRyder 0:b8fb2df56652 68 int i = 0;
NickRyder 0:b8fb2df56652 69 bool ok = true;
NickRyder 0:b8fb2df56652 70 while (cmd[i] != '\0') {
NickRyder 0:b8fb2df56652 71 i++;
NickRyder 0:b8fb2df56652 72 if (i > 512) {
NickRyder 0:b8fb2df56652 73 ok = false;
NickRyder 0:b8fb2df56652 74 break;
NickRyder 0:b8fb2df56652 75 }
NickRyder 0:b8fb2df56652 76 }
NickRyder 0:b8fb2df56652 77 if (!ok) return;
NickRyder 0:b8fb2df56652 78 pc.printf("Sending: ---%s---\n", cmd);
NickRyder 0:b8fb2df56652 79 sock.send_all(cmd, i);
NickRyder 0:b8fb2df56652 80 }
NickRyder 0:b8fb2df56652 81
NickRyder 2:e4c74eb20586 82 void IrcBot::handle(IrcMessage msg) {
NickRyder 0:b8fb2df56652 83 pc.printf("Handling message from %s, to %s: %s\n", msg.from, msg.to, msg.msg);
NickRyder 0:b8fb2df56652 84 for (int i = 0; i < handlers.size(); i++) {
NickRyder 0:b8fb2df56652 85 IrcMessage out = handlers.at(i)->handle(msg);
NickRyder 0:b8fb2df56652 86 if (out.to[0] != '\0') {
NickRyder 0:b8fb2df56652 87 sprintf(out.from, "%s", nickname);
NickRyder 0:b8fb2df56652 88 pc.printf("Need to send: ---%s--- from %s to %s.\n", out.msg, out.from, out.to);
NickRyder 0:b8fb2df56652 89 char cmd[512];
NickRyder 0:b8fb2df56652 90 sprintf(cmd, "PRIVMSG %s :%s\r\n", out.to, out.msg);
NickRyder 0:b8fb2df56652 91 send(cmd);
NickRyder 0:b8fb2df56652 92 }
NickRyder 0:b8fb2df56652 93 }
NickRyder 0:b8fb2df56652 94 }
NickRyder 0:b8fb2df56652 95
NickRyder 2:e4c74eb20586 96 void IrcBot::parse() {
NickRyder 0:b8fb2df56652 97 pc.printf("Parsing: --%s--\n", parsebuffer);
NickRyder 0:b8fb2df56652 98 if (setup && (!joined)) {
NickRyder 0:b8fb2df56652 99 char cmd[256];
NickRyder 0:b8fb2df56652 100 sprintf(cmd, ":source JOIN :%s\r\n", channel);
NickRyder 0:b8fb2df56652 101 send(cmd);
NickRyder 0:b8fb2df56652 102 joined = true;
NickRyder 0:b8fb2df56652 103 return;
NickRyder 0:b8fb2df56652 104 }
NickRyder 0:b8fb2df56652 105 if (!setup) {
NickRyder 0:b8fb2df56652 106 char cmd[256];
NickRyder 0:b8fb2df56652 107 sprintf(cmd, "NICK %s\r\nUSER %s 0 * :Lester\r\n", nickname, nickname);
NickRyder 0:b8fb2df56652 108 send(cmd);
NickRyder 0:b8fb2df56652 109 setup = true;
NickRyder 0:b8fb2df56652 110 return;
NickRyder 0:b8fb2df56652 111 }
NickRyder 0:b8fb2df56652 112 char * c = NULL;
NickRyder 0:b8fb2df56652 113 c = strstr(parsebuffer, "PING");
NickRyder 0:b8fb2df56652 114 if (c != NULL) {
NickRyder 0:b8fb2df56652 115 char cmd[] = "PONG\r\n";
NickRyder 0:b8fb2df56652 116 send(cmd);
NickRyder 0:b8fb2df56652 117 }
NickRyder 0:b8fb2df56652 118 c = strstr(parsebuffer, "PRIVMSG");
NickRyder 0:b8fb2df56652 119 if (c != NULL) {
NickRyder 0:b8fb2df56652 120 char f[32];
NickRyder 0:b8fb2df56652 121 char t[32];
NickRyder 0:b8fb2df56652 122 char m[256];
NickRyder 0:b8fb2df56652 123 int i;
NickRyder 0:b8fb2df56652 124 for (i = 1; i < 32; i++) {
NickRyder 0:b8fb2df56652 125 if (parsebuffer[i] == '!') {
NickRyder 0:b8fb2df56652 126 f[i - 1] = '\0';
NickRyder 0:b8fb2df56652 127 break;
NickRyder 0:b8fb2df56652 128 }
NickRyder 0:b8fb2df56652 129 f[i - 1] = parsebuffer[i];
NickRyder 0:b8fb2df56652 130 }
NickRyder 0:b8fb2df56652 131 int nspace = 0;
NickRyder 0:b8fb2df56652 132 bool inmsg = false;
NickRyder 0:b8fb2df56652 133 int toindex = 0, msgindex = 0;
NickRyder 0:b8fb2df56652 134 for (; i < sizeof(parsebuffer); i++) {
NickRyder 0:b8fb2df56652 135 if (parsebuffer[i] == '\r') break;
NickRyder 0:b8fb2df56652 136 if (parsebuffer[i] == '\n') break;
NickRyder 0:b8fb2df56652 137 if (parsebuffer[i] == '\0') break;
NickRyder 0:b8fb2df56652 138 if (parsebuffer[i] == ' ') {
NickRyder 0:b8fb2df56652 139 nspace++;
NickRyder 0:b8fb2df56652 140 }
NickRyder 0:b8fb2df56652 141 if ((nspace == 2) && (parsebuffer[i] != ' ')) {
NickRyder 0:b8fb2df56652 142 t[toindex] = parsebuffer[i];
NickRyder 0:b8fb2df56652 143 toindex++;
NickRyder 0:b8fb2df56652 144 }
NickRyder 0:b8fb2df56652 145 if (inmsg) {
NickRyder 0:b8fb2df56652 146 m[msgindex] = parsebuffer[i];
NickRyder 0:b8fb2df56652 147 msgindex++;
NickRyder 0:b8fb2df56652 148 }
NickRyder 0:b8fb2df56652 149 if ((parsebuffer[i] == ':') && (!inmsg)) {
NickRyder 0:b8fb2df56652 150 inmsg = true;
NickRyder 0:b8fb2df56652 151 }
NickRyder 0:b8fb2df56652 152 }
NickRyder 0:b8fb2df56652 153 t[toindex] = '\0';
NickRyder 0:b8fb2df56652 154 m[msgindex] = '\0';
NickRyder 0:b8fb2df56652 155 IrcMessage msg(f, t, m);
NickRyder 0:b8fb2df56652 156 handle(msg);
NickRyder 0:b8fb2df56652 157 }
NickRyder 0:b8fb2df56652 158 }