作者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 ]|[ ���O���� cpu.tfcis.org ]|[�搟說�﹎:]=
=[﹊:�摃�╱��:﹊Author ]|[ 140.116.72.24 ]|[���插�﹊:]=