#include <iksemel.h>
#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+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)
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;
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;
}
return 1;
}
+const char * jid = "cascardo@jabber-br.org";
+
static int
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"))
{