Hideto KIHARA / IrcBot

Fork of IrcBot by Nick Ryder

Committer:
deton
Date:
Sat Sep 20 09:35:07 2014 +0000
Revision:
3:19b779ac2398
Parent:
2:e4c74eb20586
Send NICK and USER at connect().
; Add printfln().

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 {
deton 3:19b779ac2398 19 sock.set_blocking(false, 0);
NickRyder 0:b8fb2df56652 20 sprintf(nickname, "%s", nick);
NickRyder 0:b8fb2df56652 21 sprintf(password, "%s", "");
NickRyder 0:b8fb2df56652 22 sprintf(network, "%s", net);
deton 3:19b779ac2398 23 if (chan != NULL) {
deton 3:19b779ac2398 24 sprintf(channel, "%s", chan);
deton 3:19b779ac2398 25 } else {
deton 3:19b779ac2398 26 channel[0] = '\0';
deton 3:19b779ac2398 27 }
NickRyder 2:e4c74eb20586 28 pc.printf("Created IrcBot obj for %s.\n", nickname);
NickRyder 0:b8fb2df56652 29 }
NickRyder 0:b8fb2df56652 30
NickRyder 2:e4c74eb20586 31 void IrcBot::connect() {
NickRyder 0:b8fb2df56652 32 pc.printf("Connecting to %s:%d...\n", network, port);
deton 3:19b779ac2398 33 while (sock.connect(network, port) < 0) {
deton 3:19b779ac2398 34 pc.printf("Unable to connect to (%s) on port (%d)\n", network, port);
deton 3:19b779ac2398 35 wait(1);
deton 3:19b779ac2398 36 }
deton 3:19b779ac2398 37 connected = true;
deton 3:19b779ac2398 38
deton 3:19b779ac2398 39 char cmd[256];
deton 3:19b779ac2398 40 sprintf(cmd, "NICK %s\r\nUSER %s 0 * :%s\r\n", nickname, nickname, nickname);
deton 3:19b779ac2398 41 send(cmd);
deton 3:19b779ac2398 42 setup = true;
deton 3:19b779ac2398 43
deton 3:19b779ac2398 44 if (strlen(channel) > 0) {
deton 3:19b779ac2398 45 sprintf(cmd, ":source JOIN :%s\r\n", channel);
deton 3:19b779ac2398 46 send(cmd);
deton 3:19b779ac2398 47 }
deton 3:19b779ac2398 48 joined = true;
deton 3:19b779ac2398 49
NickRyder 0:b8fb2df56652 50 pc.printf("Done.\n");
NickRyder 0:b8fb2df56652 51 }
NickRyder 0:b8fb2df56652 52
NickRyder 2:e4c74eb20586 53 void IrcBot::disconnect() {
NickRyder 0:b8fb2df56652 54 if (connected) {
NickRyder 0:b8fb2df56652 55 pc.printf("Disconnecting.\n");
NickRyder 0:b8fb2df56652 56 sock.close();
NickRyder 0:b8fb2df56652 57 connected = false;
NickRyder 0:b8fb2df56652 58 }
NickRyder 0:b8fb2df56652 59 }
NickRyder 0:b8fb2df56652 60
NickRyder 2:e4c74eb20586 61 void IrcBot::add(MessageHandler * handler) {
NickRyder 0:b8fb2df56652 62 handlers.push_back(handler);
NickRyder 0:b8fb2df56652 63 }
NickRyder 0:b8fb2df56652 64
NickRyder 2:e4c74eb20586 65 bool IrcBot::read() {
deton 3:19b779ac2398 66 if (!connected || !sock.is_connected()) return 0;
NickRyder 0:b8fb2df56652 67 int ret = sock.receive(readbuffer, sizeof(readbuffer) - 1);
NickRyder 0:b8fb2df56652 68 bool parsed = false;
NickRyder 0:b8fb2df56652 69 if (ret >= 0) {
NickRyder 0:b8fb2df56652 70 readbuffer[ret] = '\0';
NickRyder 0:b8fb2df56652 71 pc.printf("Received %d chars: ---%s--\n", ret, readbuffer);
NickRyder 0:b8fb2df56652 72 for (int i = 0; i < ret; i++) {
NickRyder 0:b8fb2df56652 73 parsebuffer[parseindex] = readbuffer[i];
NickRyder 0:b8fb2df56652 74 parseindex++;
NickRyder 0:b8fb2df56652 75 if (readbuffer[i] == '\n') {
NickRyder 0:b8fb2df56652 76 parsebuffer[parseindex] = '\0';
NickRyder 0:b8fb2df56652 77 parse();
NickRyder 0:b8fb2df56652 78 parsed = true;
NickRyder 0:b8fb2df56652 79 parseindex = 0;
NickRyder 0:b8fb2df56652 80 }
NickRyder 0:b8fb2df56652 81 }
NickRyder 0:b8fb2df56652 82 }
NickRyder 0:b8fb2df56652 83 return parsed;
NickRyder 0:b8fb2df56652 84 }
NickRyder 0:b8fb2df56652 85
deton 3:19b779ac2398 86 void IrcBot::printfln(char * fmt, ...) {
deton 3:19b779ac2398 87 char cmd[512];
deton 3:19b779ac2398 88 va_list ap;
deton 3:19b779ac2398 89 va_start(ap, fmt);
deton 3:19b779ac2398 90 vsnprintf(cmd, 510, fmt, ap);
deton 3:19b779ac2398 91 strcat(cmd, "\r\n");
deton 3:19b779ac2398 92 va_end(ap);
deton 3:19b779ac2398 93 send(cmd);
deton 3:19b779ac2398 94 }
deton 3:19b779ac2398 95
NickRyder 2:e4c74eb20586 96 void IrcBot::send(char * cmd) {
NickRyder 0:b8fb2df56652 97 if (!connected) return;
NickRyder 0:b8fb2df56652 98 int i = 0;
NickRyder 0:b8fb2df56652 99 bool ok = true;
NickRyder 0:b8fb2df56652 100 while (cmd[i] != '\0') {
NickRyder 0:b8fb2df56652 101 i++;
NickRyder 0:b8fb2df56652 102 if (i > 512) {
NickRyder 0:b8fb2df56652 103 ok = false;
NickRyder 0:b8fb2df56652 104 break;
NickRyder 0:b8fb2df56652 105 }
NickRyder 0:b8fb2df56652 106 }
NickRyder 0:b8fb2df56652 107 if (!ok) return;
NickRyder 0:b8fb2df56652 108 pc.printf("Sending: ---%s---\n", cmd);
NickRyder 0:b8fb2df56652 109 sock.send_all(cmd, i);
NickRyder 0:b8fb2df56652 110 }
NickRyder 0:b8fb2df56652 111
NickRyder 2:e4c74eb20586 112 void IrcBot::handle(IrcMessage msg) {
NickRyder 0:b8fb2df56652 113 pc.printf("Handling message from %s, to %s: %s\n", msg.from, msg.to, msg.msg);
NickRyder 0:b8fb2df56652 114 for (int i = 0; i < handlers.size(); i++) {
NickRyder 0:b8fb2df56652 115 IrcMessage out = handlers.at(i)->handle(msg);
NickRyder 0:b8fb2df56652 116 if (out.to[0] != '\0') {
NickRyder 0:b8fb2df56652 117 sprintf(out.from, "%s", nickname);
NickRyder 0:b8fb2df56652 118 pc.printf("Need to send: ---%s--- from %s to %s.\n", out.msg, out.from, out.to);
NickRyder 0:b8fb2df56652 119 char cmd[512];
NickRyder 0:b8fb2df56652 120 sprintf(cmd, "PRIVMSG %s :%s\r\n", out.to, out.msg);
NickRyder 0:b8fb2df56652 121 send(cmd);
NickRyder 0:b8fb2df56652 122 }
NickRyder 0:b8fb2df56652 123 }
NickRyder 0:b8fb2df56652 124 }
NickRyder 0:b8fb2df56652 125
NickRyder 2:e4c74eb20586 126 void IrcBot::parse() {
NickRyder 0:b8fb2df56652 127 pc.printf("Parsing: --%s--\n", parsebuffer);
NickRyder 0:b8fb2df56652 128 char * c = NULL;
NickRyder 0:b8fb2df56652 129 c = strstr(parsebuffer, "PING");
NickRyder 0:b8fb2df56652 130 if (c != NULL) {
NickRyder 0:b8fb2df56652 131 char cmd[] = "PONG\r\n";
NickRyder 0:b8fb2df56652 132 send(cmd);
NickRyder 0:b8fb2df56652 133 }
NickRyder 0:b8fb2df56652 134 c = strstr(parsebuffer, "PRIVMSG");
NickRyder 0:b8fb2df56652 135 if (c != NULL) {
NickRyder 0:b8fb2df56652 136 char f[32];
NickRyder 0:b8fb2df56652 137 char t[32];
NickRyder 0:b8fb2df56652 138 char m[256];
NickRyder 0:b8fb2df56652 139 int i;
NickRyder 0:b8fb2df56652 140 for (i = 1; i < 32; i++) {
NickRyder 0:b8fb2df56652 141 if (parsebuffer[i] == '!') {
NickRyder 0:b8fb2df56652 142 f[i - 1] = '\0';
NickRyder 0:b8fb2df56652 143 break;
NickRyder 0:b8fb2df56652 144 }
NickRyder 0:b8fb2df56652 145 f[i - 1] = parsebuffer[i];
NickRyder 0:b8fb2df56652 146 }
NickRyder 0:b8fb2df56652 147 int nspace = 0;
NickRyder 0:b8fb2df56652 148 bool inmsg = false;
NickRyder 0:b8fb2df56652 149 int toindex = 0, msgindex = 0;
NickRyder 0:b8fb2df56652 150 for (; i < sizeof(parsebuffer); i++) {
NickRyder 0:b8fb2df56652 151 if (parsebuffer[i] == '\r') break;
NickRyder 0:b8fb2df56652 152 if (parsebuffer[i] == '\n') break;
NickRyder 0:b8fb2df56652 153 if (parsebuffer[i] == '\0') break;
NickRyder 0:b8fb2df56652 154 if (parsebuffer[i] == ' ') {
NickRyder 0:b8fb2df56652 155 nspace++;
NickRyder 0:b8fb2df56652 156 }
NickRyder 0:b8fb2df56652 157 if ((nspace == 2) && (parsebuffer[i] != ' ')) {
NickRyder 0:b8fb2df56652 158 t[toindex] = parsebuffer[i];
NickRyder 0:b8fb2df56652 159 toindex++;
NickRyder 0:b8fb2df56652 160 }
NickRyder 0:b8fb2df56652 161 if (inmsg) {
NickRyder 0:b8fb2df56652 162 m[msgindex] = parsebuffer[i];
NickRyder 0:b8fb2df56652 163 msgindex++;
NickRyder 0:b8fb2df56652 164 }
NickRyder 0:b8fb2df56652 165 if ((parsebuffer[i] == ':') && (!inmsg)) {
NickRyder 0:b8fb2df56652 166 inmsg = true;
NickRyder 0:b8fb2df56652 167 }
NickRyder 0:b8fb2df56652 168 }
NickRyder 0:b8fb2df56652 169 t[toindex] = '\0';
NickRyder 0:b8fb2df56652 170 m[msgindex] = '\0';
NickRyder 0:b8fb2df56652 171 IrcMessage msg(f, t, m);
NickRyder 0:b8fb2df56652 172 handle(msg);
NickRyder 0:b8fb2df56652 173 }
deton 3:19b779ac2398 174 }