回文章列表
作者cache.bbs@cpu.tfcis.org (Gphone實驗室) 看板: itoc
標題[功能] M3 RSS 訂閱器
時間動力核心 (2009/10/15 Thu 22:31:09)
這個 patch 是讓 Maple3.x 具有 RSS 的訂閱功能 :P


author:

albb0920.bbs  <AT> xdbbs.twbbs.org
hrs113355.bbs <AT> xdbbs.twbbs.org

refine & porting on M3-itoc:

cache.bbs     <AT> bbs.ee.ncku.edu.tw
renn999.bbs   <AT> bbs.ccns.ncku.edu.tw


首先您的 BBS 站台上需要安裝 PHP 以及 iconv 等相依套件

並將下面的檔案新增到對應的地方:
https://opensvn.csie.org/NCKUEEBBS/bbs/src/include/fnv_hash.h
https://opensvn.csie.org/NCKUEEBBS/bbs/src/maple/rss.c
https://opensvn.csie.org/NCKUEEBBS/bbs/src/util/run_rss.c

接下來請參考:
https://opensvn.csie.org/NCKUEEBBS/bbs/src/php_maplebbs3/RSS_README.txt

複製下面這個檔案到對應的地方, 把編出來的 .so 檔案放置到 PHP 的模組目錄底下
https://opensvn.csie.org/NCKUEEBBS/bbs/src/php_maplebbs3/maplebbs3.c



RSS 的 訂閱器您可以從下面兩個地方下載:
(請務必先閱讀 rss.php 中的資訊, 並自行修改設定)

(1) 叉滴小站 svn (此為原始版本)
http://xdbbs.twbbs.org/svn/maple-xdbbs/src/util/run_rss.c
http://xdbbs.twbbs.org/svn/maple-xdbbs/src/util/rss.php

(2) 風之谷 svn   (在公版上測過的版本, 多了 big5 補完)
https://opensvn.csie.org/NCKUEEBBS/bbs/src/util/run_rss.c
https://opensvn.csie.org/NCKUEEBBS/bbs/src/util/rss.php
https://opensvn.csie.org/NCKUEEBBS/bbs/src/util/uao
https://opensvn.csie.org/NCKUEEBBS/bbs/src/util/uao/big5.txt
https://opensvn.csie.org/NCKUEEBBS/bbs/src/util/uao/ucs2big5uao.php



其餘需要修改的部分如下:

config.h

+#define RSSreader      /* M3 RSS reader */

global.h

+/* ----------------------------------------------------- */
+/* RSS DEFINITION                                        */
+/* ----------------------------------------------------- */
+
+#define FN_RSSCONF    "rss.conf"         /* cache.090617: Maple-XDBBS */
+#define FN_RSS_FOLDER "etc/rss/"
+#define FN_RSS_LIST   "feed.list"        /* RSS feed list */
+#define INFO_MARK ANSI_COLOR(1;33) "★ "
+VAR char *fn_rssconf INI(FN_RSSCONF);

modes.h

 #define XZ_POST         (XO_ZONE + 12)  /* XZ_POST */
 #define XZ_GEM          (XO_ZONE + 13)  /* GEM */
+#define XZ_RSS          (XO_ZONE + 14)  /* RSS */

 #endif                          /* _MODES_H_ */

struct.h

+/* -------------------------------------------------- */
+/* Maple-XDBBS rss                                    */
+/* -------------------------------------------------- */
+
+#define RSS_OUTGO     0x0000001
+#define RSS_GETUPDATE 0x0000002
+#define RSS_USELABEL  0x0000004
+#define RSS_STOP      0x0000008
+
+typedef struct
+{
+    char    feedurl[128];     //128 bytes, source url
+    char    owner[IDLEN + 1]; // 13 bytes, someone who sets
+    char    pad1[3];      //  3 bytes, padding
+    char    prefix[16];      // 16 bytes, title prefix
+    char    note[76];         // 76 bytes, desciption or note
+    time_t  chrono;           //  4 bytes, chrono time
+    char    date[9];          //  9 bytes, setting date
+    char    pad2[3];          //  3 bytes, padding
+
+    usint   attr;             //  4 bytes, attribute
+} rssfeed_t;// 256 bytes
+
+/* 以下要與 rss.php 相容 */
+typedef struct
+{
+    char brdname[BNLEN + 1];  // 13 bytes, board name
+    char owner[IDLEN + 1];    // 13 bytes, someone who sets
+    char prefix[16];          // 16 bytes, title prefix
+    char white[72];           // 72 bytes, white list
+    char black[72];           // 72 bytes, black list
+    char pad[2];              //  2 bytes, padding
+    time_t chrono;            //  4 bytes, chrono time
+    time_t update;            //  4 bytes, the fetch time,
+                              //           only avaliable in the first item
+    usint attr;               //  4 bytes, attribute
+} rssbrdlist_t; // 200 bytes
+
+/* 用struct加速 */
+typedef struct
+{
+    char feedurl[128];      //128 bytes, source url
+    time_t chrono;      //  4 bytes, chrono time
+} rssfeedlist_t; // 132 bytes

#endif              /* _STRUCT_H_ */

theme.h

 #define COLOR6      "\033[37;44m"   /* more 檔頭的內容顏色 */
 #define COLOR7      "\033[1;34m"    /* 作者在線上的顏色 */
+#define ANSIRESET   "\033[m"        /* 終止顏色 */


...


 #define NECKER_INNBBS   "[←]離開 [^P]新增 [d]刪除 [E]編輯 [/]搜尋 [Enter]詳細\n"
             COLOR3 "  編號            內         容%*s                                               \033[m"
+
+#define NECKER_RSS     "[←]離開 [^P]新增 [d]刪除 [H]編輯網址 [T]編輯標籤 [m]移動 [→]查詢 [h]說明\n"  \
+            COLOR3 "  編號  日 期 標  籤          敘               述    %*s                         \033[m"


...


 #define FEETER_INNBBS   \
 COLOR1 " 轉信設定 " COLOR2 " (↑/↓)上下 (PgUp/PgDn)上下頁 (Home/End)首尾 (←)(q)離開           "
+
+#define FEETER_RSS      \
+COLOR1 " RSS器 " COLOR2 " (U)歸零更新時間 (s)更新列表 (E)編輯 (D)區段刪 (K)暫停 (o)設定過濾  "

lib/dao.p

+/* for RSS */
+#ifdef RSSreader
+#include "fnv_hash.h"
+#endif
+
 /* is_alnum.c */
 int is_alnum(int ch);

maple/Makefile

 SRC =   acct.c bbsd.c bmw.c board.c cache.c edit.c favor.c \
         gem.c mail.c menu.c more.c pal.c post.c talk.c ulist.c \
!        user.c visio.c window.c xover.c xpost.c rss.c

 OBJ =   acct.o bbsd.o bmw.o board.o cache.o edit.o favor.o \
         gem.o mail.o menu.o more.o pal.o post.o talk.o ulist.o \
!        user.o visio.o window.o xover.o xpost.o rss.o

xover.c

 extern KeyFunc pal_cb[];
 extern KeyFunc bmw_cb[];
 extern KeyFunc post_cb[];
+#ifdef RSSreader
+extern KeyFunc rss_cb[];
+#endif

 XZ xz[] =
 {


...


   {NULL, NULL, M_RMAIL, FEETER_MBOX},       /* XZ_MBOX */
   {NULL, post_cb, M_READA, FEETER_POST},    /* XZ_POST */
+#ifdef RSSreader
+  {NULL, NULL, M_GEM, FEETER_GEM},          /* XZ_GEM */
+  {NULL, rss_cb, M_XMODE, FEETER_RSS}       /* XZ_RSS */
+#else
   {NULL, NULL, M_GEM, FEETER_GEM}           /* XZ_GEM */
+#endif
 };


...


 /* ----------------------------------------------------- */
 /* interactive menu routines                 */
 /* ----------------------------------------------------- */

+/* RSS */
+#ifdef RSSreader
+static void rss_preview(XO *xo, int zone)
+{
+    rssfeed_t *feed;
+    rssbrdlist_t brdlist;
+    char fpath[512];
+
+    if (zone != XZ_RSS)
+return;
+
+    feed = (rssfeed_t *) xo_pool + (xo->pos - xo->top);
+
+    sprintf (fpath, FN_RSS_FOLDER "%s", escape_slash(feed->feedurl));
+    if (rec_get(fpath, &brdlist, sizeof(rssbrdlist_t), 0) < 0)
+       brdlist.update = 0;
+
+    move(b_lines - 4, 0);
+    outs(msg_seperator);
+    move(b_lines - 3, 0);
+    clrtoeol();
+    prints("\033[1;33m建立日期:\033[m %s ", Btime(&(feed->chrono)));
+    prints("(最近抓取 -> %s)"
+    , (brdlist.update <= 0 ? "尚未更新" : Btime(&(brdlist.update))));
+
+    move(b_lines - 2, 0);
+    clrtoeol();
+    prints("\033[1;33m屬性設定:\033[m [%s]站際存檔 [%s]發文類別 [%s]下載更新 [%s]停止抓取"
+    , feed->attr & RSS_OUTGO ? "○" : "╳"
+    , feed->attr & RSS_USELABEL ? "○" : "╳"
+    , feed->attr & RSS_GETUPDATE ? "○" : "╳"
+    , feed->attr & RSS_STOP ? "○" : "╳");
+    move(b_lines - 1, 0);
+    clrtoeol();
+    prints("%-*.*s", b_cols - 1, b_cols - 1, feed->feedurl);
+    outf(xz[zone - XO_ZONE].feeter);
+    move(b_lines, b_cols);
+}
+#endif

void
xover(cmd)


...


     if (xo->max > 0)        /* Thor: 若是無東西就不show了 */
     {
       num = 3 + pos - xo->top;
       move(num, 0);
       outc('>');
+#ifdef RSSreader
+      rss_preview(xo, zone);
+#endif
     }

     cmd = vkey();

so/manage.c

+/* ----------------------------------------------------- */
+/* 板主功能 : RSS訂閱功能                             */
+/* ----------------------------------------------------- */
+
+#ifdef RSSreader
+static int post_rss(XO *xo)
+{
+    XO *xt;
+    char fpath[256];
+
+    if (!(bbstate & STAT_BOARD) && !HAS_PERM(PERM_SYSOP))
+       return XO_NONE;
+
+    /* cache.091015: 請自行修改 :P */
+    pmsg("RSS訂閱\器測試中, 有任何問題請回報 SYSOP 板");
+
+    brd_fpath(fpath, currboard, fn_rssconf);
+    xz[XZ_RSS - XO_ZONE].xo = xt = xo_new(fpath);
+    strcpy(xt->dir, fpath);
+    xover(XZ_RSS);
+    free(xt);
+
+    return XO_INIT;
+}
+#endif


...


     "WMemo   編輯進板畫面",
     "Manager 增減副板主",
+#ifdef RSSreader
+    "ZRSS    RSS訂閱\器",
+#endif
 #  ifdef HAVE_SCORE
     "Score   設定可否評分",


...


    NULL
  };
 else
  char *menu = "◎ 板主選單 (B)主題 (W)進板 (M)副板"
+#  ifdef RSSreader
+    " (Z)RSS"
+#  endif
 #  ifdef HAVE_SCORE
     " (S)評分"


...


     vmsg(NULL);
     return XO_HEAD;
   }
+#ifdef RSSreader
+utmp_mode(M_XMODE);
+#endif
 #ifdef POPUP_ANSWER
   switch (pans(3, 20, "板主選單", menu))


...


   case 'm':
     return post_changeBM(xo);
+#ifdef RSSreader
+  case 'z':
+    return post_rss(xo);
+#endif
 #ifdef HAVE_SCORE
   case 's':

util/Makefile

EXE = account acl-sort bbsmail bquota brdmail camera counter expire \
      gem-index hdr-dump mailpost outgo poststat reaper redir setperm setusr \
!     showACCT showBRD showDIR showUSR topgem topsong topusr run_rss



最後設定 crontab

$sudo crontab -e

+#每小時抓 RSS一次
+15 * * * * src/util/run_rss > /dev/null 2>&1

接下來進入板主選單中設定 RSS 站台, 測試看看吧 :P


--
=[:摃��:﹎Origin ]|[  Ocpu.tfcis.org  ]|[�搟說:]=
=[:摃�╱�:Author ]|[      140.116.72.24       ]|[�:]=
文章選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻