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.
Diff: irc.cpp
- Revision:
- 0:b8fb2df56652
diff -r 000000000000 -r b8fb2df56652 irc.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/irc.cpp Sat Aug 02 12:09:10 2014 +0000
@@ -0,0 +1,169 @@
+#include "irc.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