Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of IrcBot by
IrcBot.cpp@3:19b779ac2398, 2014-09-20 (annotated)
- 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?
User | Revision | Line number | New 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 | } |