]> code.citadel.org Git - citadel.git/blobdiff - webcit/sitemap.c
sitemap now uses GetRoomListHash() which is what I should have used in the first...
[citadel.git] / webcit / sitemap.c
index 6af3b49be2e691271862ed55611ed2ea3610634b..4d154632df09fd4cd1478e654b90f8511a813fae 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * XML sitemap generator
  *
- * Copyright (c) 2010 by the citadel.org team
+ * Copyright (c) 2010-2011 by the citadel.org team
  *
  * This program is open source software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,9 +23,9 @@
 
 
 /*
- * XML sitemap generator -- go through the message list
+ * XML sitemap generator -- go through the message list for a BBS room
  */
-void sitemap_do_messages(void) {
+void sitemap_do_bbs(void) {
        wcsession *WCC = WC;
        int num_msgs = 0;
        int i;
@@ -52,10 +52,88 @@ void sitemap_do_messages(void) {
 }
 
 
+/*
+ * XML sitemap generator -- go through the message list for a Blog room
+ */
+void sitemap_do_blog(void) {
+       wcsession *WCC = WC;
+       int num_msgs = 0;
+       int i;
+       SharedMessageStatus Stat;
+       message_summary *Msg = NULL;
+
+       memset(&Stat, 0, sizeof Stat);
+       Stat.maxload = INT_MAX;
+       Stat.lowest_found = (-1);
+       Stat.highest_found = (-1);
+       num_msgs = load_msg_ptrs("MSGS ALL", &Stat, NULL);
+       if (num_msgs < 1) return;
+
+       for (i=0; i<num_msgs; ++i) {
+               Msg = GetMessagePtrAt(i, WCC->summ);
+               if (Msg != NULL) {
+                       struct bltr bltr = blogview_learn_thread_references(Msg->msgnum);
+                       /* Show only top level posts, not comments */
+                       if ((bltr.id != 0) && (bltr.refs == 0)) {
+                               WC->bptlid = bltr.id;
+                               wc_printf("<url><loc>%s", ChrPtr(site_prefix));
+                               tmplput_blog_permalink(NULL, NULL);
+                               wc_printf("</loc></url>\r\n");
+                       }
+               }
+       }
+}
+
+
+/*
+ * XML sitemap generator -- go through the message list for a wiki room
+ */
+void sitemap_do_wiki(void) {
+       wcsession *WCC = WC;
+       int num_msgs = 0;
+       int i;
+       SharedMessageStatus Stat;
+       message_summary *Msg = NULL;
+       char buf[256];
+
+       memset(&Stat, 0, sizeof Stat);
+       Stat.maxload = INT_MAX;
+       Stat.lowest_found = (-1);
+       Stat.highest_found = (-1);
+       num_msgs = load_msg_ptrs("MSGS ALL", &Stat, NULL);
+       if (num_msgs < 1) return;
+
+       for (i=0; i<num_msgs; ++i) {
+               Msg = GetMessagePtrAt(i, WCC->summ);
+               if (Msg != NULL) {
+
+                       serv_printf("MSG0 %ld|3", Msg->msgnum);
+                       serv_getln(buf, sizeof buf);
+                       if (buf[0] == '1') while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                               if (    (!strncasecmp(buf, "exti=", 5))
+                                       && (!bmstrcasestr(buf, "_HISTORY_"))
+                               ) {
+                                       wc_printf("<url><loc>%s/wiki", ChrPtr(site_prefix));
+                                       wc_printf("?go=");
+                                       urlescputs(ChrPtr(WC->CurRoom.name));
+                                       wc_printf("?page=%s", &buf[5]);
+                                       wc_printf("</loc></url>\r\n");
+                               }
+                       }
+               }
+       }
+}
+
+
 /*
  * Entry point for RSS feed generator
  */
 void sitemap(void) {
+       HashList *roomlist = NULL;
+       HashPos *it = NULL;
+       long HKlen = 0;
+       const char *HashKey = NULL;
+       folder *room = NULL;
 
        output_headers(0, 0, 0, 0, 1, 0);
        hprintf("Content-type: text/xml\r\n");
@@ -70,25 +148,33 @@ void sitemap(void) {
        wc_printf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
        wc_printf("<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\r\n");
 
-       HashList *roomlist = GetRoomListHashLKRA(NULL, NULL);
-       HashPos *it = GetNewHashPos(roomlist, 0);
-       long HKlen;
-       const char *HashKey;
-       folder *room;
+       roomlist = GetRoomListHash(NULL, NULL);
+       if (!roomlist) syslog(LOG_CRIT, "GetRoomListHash() FAILED!");
+       it = GetNewHashPos(roomlist, 0);
+       if (!it) syslog(LOG_CRIT, "GetNewHashPos() FAILED!");
 
        while (GetNextHashPos(roomlist, it, &HKlen, &HashKey, (void *)&room))
        {
-               /* Output the messages in this room only if it's a message board */
-               if (room->defview == VIEW_BBS)
-               {
-                       gotoroom(room->name);
-                       sitemap_do_messages();
+               gotoroom(room->name);
+
+               /* Output the messages in this room only if it's a room type we can make sense of */
+               switch(room->defview) {
+                       case VIEW_BBS:
+                               sitemap_do_bbs();
+                               break;
+                       case VIEW_WIKI:
+                               sitemap_do_wiki();
+                               break;
+                       case VIEW_BLOG:
+                               sitemap_do_blog();
+                               break;
+                       default:
+                               break;
                }
        }
 
        DeleteHashPos(&it);
-       /* DeleteHash(&roomlist); This will be freed when the session closes */
-
+       DeleteHash(&roomlist);
        wc_printf("</urlset>\r\n");
        wDumpContent(0);
 }