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
- Committer:
- NickRyder
- Date:
- 2014-08-02
- Revision:
- 1:cf586c9bbb52
- Parent:
- irc.cpp@ 0:b8fb2df56652
- Child:
- 2:e4c74eb20586
File content as of revision 1:cf586c9bbb52:
#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); } }