A little pubsub bot is just born.
authorThadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
Sun, 22 Mar 2009 21:13:53 +0000 (18:13 -0300)
committerThadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
Sun, 22 Mar 2009 21:13:53 +0000 (18:13 -0300)
status.c

index c93a6b5..cd77307 100644 (file)
--- a/status.c
+++ b/status.c
 
 #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)
@@ -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"))
     {