From: Thadeu Lima de Souza Cascardo Date: Sun, 22 Mar 2009 21:13:53 +0000 (-0300) Subject: A little pubsub bot is just born. X-Git-Url: http://git.cascardo.info/?p=cascardo%2Fpubsub-bot.git;a=commitdiff_plain;h=f432286ed06e05c2faa287c3d528f9035fd2c326 A little pubsub bot is just born. --- diff --git a/status.c b/status.c index c93a6b5..cd77307 100644 --- a/status.c +++ b/status.c @@ -19,6 +19,139 @@ #include #include +#include +#include + +iks * +createiq (char *type, char *to, char *qnam, char *xmlns, iks **query) +{ + static int id = 0; + char sid[32];; + iks *iq; + snprintf (sid, 32, "ps%d", id++); + iq = iks_new ("iq"); + iks_insert_attrib (iq, "type", type); + iks_insert_attrib (iq, "to", to); + iks_insert_attrib (iq, "id", sid); + *query = iks_insert (iq, qnam); + iks_insert_attrib (*query, "xmlns", xmlns); + return iq; +} + +void +catnode (iksparser *parser, char *node) +{ + iks *iq; + iks *query; + iq = createiq ("get", "pubsub.jabber-br.org", "query", + "http://jabber.org/protocol/disco#info", &query); + if (node != NULL) + iks_insert_attrib (query, "node", node); + iks_send (parser, iq); + iks_delete (iq); +} + +void +listnode (iksparser *parser, char *node) +{ + iks *iq; + iks *query; + iq = createiq ("get", "pubsub.jabber-br.org", "query", + "http://jabber.org/protocol/disco#items", &query); + if (node != NULL) + iks_insert_attrib (query, "node", node); + iks_send (parser, iq); + iks_delete (iq); +} + +void +createnode (iksparser *parser, char *node) +{ + iks *iq; + iks *query; + iq = createiq ("set", "pubsub.jabber-br.org", "pubsub", + "http://jabber.org/protocol/pubsub", &query); + iks_insert_attrib (iks_insert (query, "create"), "node", node); + iks_send (parser, iq); + iks_delete (iq); +} + +void +getnode (iksparser *parser, char *node) +{ + iks *iq; + iks *query; + iq = createiq ("get", "pubsub.jabber-br.org", "pubsub", + "http://jabber.org/protocol/pubsub", &query); + iks_insert_attrib (iks_insert (query, "items"), "node", node); + iks_send (parser, iq); + iks_delete (iq); +} + +void +vcard (iksparser *parser) +{ + iks *iq; + iks *query; + iq = createiq ("get", "pubsub.jabber-br.org", "vCard", "vcard-temp", &query); + iks_send (parser, iq); + iks_delete (iq); +} + +iks * +createmood (char *line) +{ + iks *mood; + mood = iks_new ("mood"); + iks_insert_attrib (mood, "xmlns", "http://jabber.org/protocol/mood"); + iks_insert (mood, line); + return mood; +} + +void +pushmood (iksparser *parser, char *node, char *line) +{ + iks *iq; + iks *query; + iks *publish; + iks *item; + iks *mood; + iq = createiq ("set", "pubsub.jabber-br.org", "pubsub", + "http://jabber.org/protocol/pubsub", &query); + publish = iks_insert (query, "publish"); + iks_insert_attrib (publish, "node", node); + item = iks_insert (publish, "item"); + mood = createmood (line); + iks_insert_node (item, mood); + iks_send (parser, iq); + iks_delete (iq); +} + +void +process_mood (iksparser *parser, char *cmdline) +{ + char *cmd; + char *orig_cmdline; + orig_cmdline = cmdline = strdup (cmdline); + cmd = strsep (&cmdline, " "); + if (!strcmp (cmd, "ls")) + listnode (parser, cmdline); + else if (!strcmp (cmd, "cat")) + catnode (parser, cmdline); + else if (!strcmp (cmd, "vcard")) + vcard (parser); + else if (!strcmp (cmd, "create")) + createnode (parser, cmdline); + else if (!strcmp (cmd, "get")) + getnode (parser, cmdline); + else if (!strcmp (cmd, "push")) + { + char *node; + node = strsep (&cmdline, " "); + pushmood (parser, node, cmdline); + } + free (orig_cmdline); +} int xmpp_session_hook (iksparser *parser, iks *node) @@ -38,7 +171,7 @@ int xmpp_initial_presence_hook (iksparser *parser, iks *node) { iks *pres; - pres = iks_make_pres (IKS_SHOW_AVAILABLE, "Microblogging here!\n"); + pres = iks_make_pres (IKS_SHOW_AVAILABLE, "Microblogging here!"); iks_send (parser, pres); iks_delete (pres); return 0; @@ -57,6 +190,10 @@ xmpp_id_hook (iksparser *parser, iks *node, char *id) xmpp_initial_presence_hook (parser, node); return 0; } + else if (!iks_strncmp (id, "ps", 2)) + { + printf ("%s\n", iks_string (iks_stack (node), node)); + } return 1; } @@ -160,6 +297,8 @@ xmpp_other_hook (iksparser *parser, iks *node, char *ns) return 1; } +const char * jid = "cascardo@jabber-br.org"; + static int hook (void *data, int type, iks *node) { @@ -175,12 +314,25 @@ hook (void *data, int type, iks *node) iqns = iks_find_attrib (iks_child (node), "xmlns"); if (!iks_strcmp (name, "message")) { - printf ("Got milk?\n"); + char *from; + from = iks_find_attrib (node, "from"); + if (!iks_strncmp (from, jid, iks_strlen (jid))) + { + char *body = iks_find_cdata (node, "body"); + if (body != NULL) + process_mood (parser, body); + } + else + { + printf ("%s is not authorized\n", from); + } return IKS_OK; } else if (!iks_strcmp (name, "presence")) { - printf ("I sense a disturbance in the force!\n"); + char *from; + from = iks_find_attrib (node, "from"); + printf ("I sense a disturbance in the force: %s!\n", from); } else if (!iks_strcmp (name, "iq")) {