作者hpo14.bbs@ntust.org (這是一首簡單的小情歌) 看板: itoc
標題[功能] post.c 文章鎖定
時間資工清流站 (2007/05/23 Wed 02:32:54)
不好意思,之前雖然 po 過了,但想說還是一次 PO 上完整的好了
不想好幾篇都是小修正,還請各站長見諒嘿。
功能說明
提供板主或是站長將文章鎖定,類似 ptt 那種的鎖文設定。
若已上鎖,除了板主與有看板總管權限的人以外無法刪除、評分及編輯(含改標題)。
注意:小弟認為,鎖定文應為公開且重要文章。
故,已加密無法鎖定,已鎖定無法加密。
───────────────────────────────────────
> include/config.h
#define HAVE_REFUSEMARK /* itoc.010602: 提供看板文章加密 */
+#define HAVE_LOCKEDMARK /* hpo14.20070513: 提供看板文章鎖定 */
───────────────────────────────────────
> include/modes.h
#define EDIT_RESTRICT 0x0020 /* 加密存檔 */
+#define EDIT_LOCKED 0x0040 /* 鎖定存檔 */
───────────────────────────────────────
> maple/post.c: post_attr() 新增在 #ifdef HAVE_REFUSEMARK 之後
#ifdef HAVE_REFUSEMARK
#endif
+#ifdef HAVE_LOCKEDMARK
+ if (mode & POST_LOCKED)
+ attr |= '!';
+ else
+#endif
───────────────────────────────────────
> maple/post.c: 以下程式整隻新增於 post_lable() 之前
#ifdef HAVE_LOCKEDMARK
static int
post_locked(xo) /* hpo14.20070513: 文章鎖定 */
XO *xo; /* 除 STAT_BOARD 權限外無法刪除/編輯 */
{
if (bbstate & STAT_BOARD)
{
HDR *hdr;
int pos, cur, xmode;
pos = xo->pos;
cur = pos - xo->top;
hdr = (HDR *) xo_pool + cur;
xmode = hdr->xmode;
#ifdef HAVE_LABELMARK
if (xmode & POST_DELETE) /* 待砍文章不能鎖定 */
return XO_NONE;
#endif
#ifdef HAVE_REFUSEMARK
if (xmode & POST_RESTRICT) /* 加密文章不能鎖定 */
return XO_NONE; /* 若要加密文可鎖定,這段就不要加 */
#endif
if (vans(xmode & POST_LOCKED ? "解除文章鎖定 [y/N]? [N] " : "鎖定此篇文章
[y/N]? [N] ") != 'y')
return XO_FOOT;
if (xmode & POST_LOCKED)
{
hdr->xmode &= ~POST_LOCKED;
}
else
{
/* 鎖定的文章,通常很重要,所以加 POST_MARKED */
hdr->xmode ^= (POST_LOCKED | POST_MARKED);
}
#ifdef HAVE_POST_BOTTOM /* hpo14.070523:第一種置底的鎖定同步 */
if (hdr->xmode & POST_BOTTOM2)
hdr->xmode ^= POST_BOTTOM; /* 避免正本變成謄本 */
#endif
currchrono = hdr->chrono;
rec_put(xo->dir, hdr, sizeof(HDR), xo->key == XZ_XPOST ? hdr->xid : pos,
cmpchrono);
#ifdef HAVE_POST_BOTTOM /* hpo14.070523:第一種置底的鎖定同步 */
if (hdr->xmode & POST_BOTTOM) /* 同步置底的謄本 */
{
char fpath[64];
brd_fpath(fpath, currboard, FN_BOTTOM);
hdr->xmode ^= POST_BOTTOM;
rec_put(fpath, hdr, sizeof(HDR), 0, cmpchrono);
return XO_LOAD;
}
#endif
move(3 + cur, 7);
outc(post_attr(hdr));
}
return XO_LOAD;
}
#endif
───────────────────────────────────────
> maple/post.c: post_refuse()
hdr = (HDR *) xo_pool + cur;
+#ifdef HAVE_LOCKEDMARK
+ if (xmode & POST_LOCKED) /* 鎖定文章不能加密 */
+ return XO_NONE; /* 若要已鎖定文可加密,這段就不要加 */
+#endif
───────────────────────────────────────
> maple/post.c: post_score()
hdr = (HDR *) xo_pool + cur;
#ifdef HAVE_REFUSEMARK
……
#endif
+#ifdef HAVE_LOCKEDMARK
+ if((hdr->xmode & POST_LOCKED) && !(bbstate & STAT_BM)) /* 鎖定文章不能評分 */
+ return XO_NONE;
+#endif
───────────────────────────────────────
> maple/post.c; post_edit()
hdr_fpath(fpath, xo->dir, hdr);
+#ifdef HAVE_LOCKEDMARK
+ if(!(bbstate & STAT_BOARD))
+ {
+ vmsg("文章已鎖定,僅供瀏覽"); /* 敘述自訂 */
+ return XO_NONE;
+ }
+#endif
───────────────────────────────────────
> maple/post.c; post_item()
#ifdef HAVE_SCORE
/* 若置底文被鎖定,則在★後面顯示 !,反之顯示 ' ' */
/* hpo14 : 置底文的顯示方式自行修改 */
if (hdr->xmode & POST_BOTTOM2) /* 謄本才需要標「重要」 */
! prints(" \033[1;32m%5s\033[m%c%c", "★", tag_char(hdr->chrono), hdr->xmode
& POST_LOCKED ? '!' : ' ');
else
……
#else
……
if (hdr->xmode & POST_BOTTOM2)
! prints(" \033[1;32m%5s\033[m%c%c", "★", tag_char(hdr->chrono), hdr->xmode
& POST_LOCKED ? '!' : ' ');
else
prints("%6d%c%c", num, tag_char(hdr->chrono), post_attr(hdr));
#endif
───────────────────────────────────────
> maple/post.c: do_post()
#ifdef HAVE_REFUSEMARK
#endif
+#ifdef HAVE_LOCKEDMARK
+ if (curredit & EDIT_LOCKED)
+ if (bbstate & STAT_BOARD)
+ mode |= (POST_LOCKED | POST_MARKED);
+ else
+ vmsg("僅有板主可使用鎖定存檔"); /* 敘述自訂 */
+#endif
hdr.xmode = mode;
───────────────────────────────────────
> maple/edit.c: ve_file() /* 在發文選項增加直接發表為鎖定文章 */
/* 並限制板主才可使用,其他人顯示訊息 */
#ifdef POPUP_ANSWER
char **menu;
# ifdef HAVE_REFUSEMARK
# endif
#else
# ifdef HAVE_REFUSEMARK
# endif
#endif
以上 [#ifdef, #endif] 段落 直接以下列替換,有斷行請自行接起
#ifdef POPUP_ANSWER
char **menu;
# ifdef HAVE_REFUSEMARK
char *menu1[] = {"EE", "Abort 放棄", "Title 改標題", "Edit 繼續編輯
", "Read 讀取暫存檔", "Write 寫入暫存檔", "Delete 刪除暫存檔", NULL};
char *menu2[] = {"SE", "Save 存檔", "Abort 放棄", "Title 改標題",
"Edit 繼續編輯", "Read 讀取暫存檔", "Write 寫入暫存檔", "Delete 刪
除暫存檔", NULL};
# ifdef HAVE_LOCKEDMARK
char *menu3[] = {"SE", "Save 存檔", "Local 存為站內檔", "!Locked 鎖定
存檔", "XRefuse 加密存檔", "Abort 放棄", "Title 改標題", "Edit 繼續編
輯", "Read 讀取暫存檔", "Write 寫入暫存檔", "Delete 刪除暫存檔", NULL};
char *menu4[] = {"LE", "Local 存為站內檔", "Save 存檔", "!Locked 鎖定
存檔", "XRefuse 加密存檔", "Abort 放棄", "Title 改標題", "Edit 繼續編
輯", "Read 讀取暫存檔", "Write 寫入暫存檔", "Delete 刪除暫存檔", NULL};
# else
char *menu3[] = {"SE", "Save 存檔", "Local 存為站內檔", "XRefuse 加密
存檔", "Abort 放棄", "Title 改標題", "Edit 繼續編輯", "Read 讀取暫
存檔", "Write 寫入暫存檔", "Delete 刪除暫存檔", NULL};
char *menu4[] = {"LE", "Local 存為站內檔", "Save 存檔", "XRefuse 加密
存檔", "Abort 放棄", "Title 改標題", "Edit 繼續編輯", "Read 讀取暫
存檔", "Write 寫入暫存檔", "Delete 刪除暫存檔", NULL};
# endif
# endif
#else
# ifdef HAVE_REFUSEMARK
char *msg1 = "[E]繼續 (A)放棄 (R/W/D)讀寫刪暫存檔?";
char *msg2 = "[S]存檔 (A)放棄 (T)改標題 (E)繼續 (R/W/D)讀寫刪暫存檔?";
# ifdef HAVE_LOCKEDMARK
char *msg3 = "[S]存檔 (L)站內" bmcheck ? " (!)鎖定 " : " " "(X)加密 (A)放棄
(T)改標題 (E)繼續 (R/W/D)讀寫刪暫存檔?";
char *msg4 = "[L]站內 (S)存檔" bmcheck ? " (!)鎖定 " : " " "(X)加密 (A)放棄
(T)改標題 (E)繼續 (R/W/D)讀寫刪暫存檔?";
# else
char *msg3 = "[S]存檔 (L)站內 (X)加密 (A)放棄 (T)改標題 (E)繼續 (R/W/D)讀寫刪
暫存檔?";
char *msg4 = "[L]站內 (S)存檔 (X)加密 (A)放棄 (T)改標題 (E)繼續 (R/W/D)讀寫刪
暫存檔?";
# endif
# else
char *msg1 = "[E]繼續 (A)放棄 (R/W/D)讀寫刪暫存檔?";
char *msg2 = "[S]存檔 (A)放棄 (T)改標題 (E)繼續 (R/W/D)讀寫刪暫存檔?";
# ifdef HAVE_LOCKEDMARK
char *msg3 = "[S]存檔 (L)站內 (!)鎖定 (A)放棄 (T)改標題 (E)繼續 (R/W/D)讀寫刪
暫存檔?";
char *msg4 = "[L]站內 (S)存檔 (!)鎖定 (A)放棄 (T)改標題 (E)繼續 (R/W/D)讀寫刪
暫存檔?";
# else
char *msg3 = "[S]存檔 (L)站內 (A)放棄 (T)改標題 (E)繼續 (R/W/D)讀寫刪暫存檔?
";
char *msg4 = "[L]站內 (S)存檔 (A)放棄 (T)改標題 (E)繼續 (R/W/D)讀寫刪暫存檔?
";
# endif
# endif
#endif
--------------------
#ifdef HAVE_REFUSEMARK
case 'x':
if (ve_op < 0) /* itoc.010301: 不能儲存 */
return VE_FOOTER;
curredit |= EDIT_RESTRICT;
curredit &= ~EDIT_OUTGO; /* 加密必是 local save */
break;
#endif
+#ifdef HAVE_LOCKEDMARK
+ case '!':
+ if (ve_op < 0) /* itoc.010301: 不能儲存 */
+ return VE_FOOTER;
+ curredit |= EDIT_LOCKED;
+ curredit &= ~EDIT_OUTGO; /* 加密必是 local save */
+ break;
+#endif
───────────────────────────────────────
> maple/post.c; KeyFunc post_cb[]
#ifdef HAVE_LABELMARK
#endif
+#ifdef HAVE_LOCKEDMARK
+ 'l', post_locked, /* hpo14.20070513: 文章鎖定標記! */
+#endif
───────────────────────────────────────
> maple/post.c; KeyFunc xpost_cb[]
#ifdef HAVE_LABELMARK
#endif
#ifdef HAVE_LOCKEDMARK
'l', post_locked, /* hpo14.20070513: 文章鎖定標記! */
#endif
───────────────────────────────────────
打完,收工 :)
--
>> 台灣科技大學 資工清流站 # ntust.org #
>> Author: 61-59-78-243.adsl.static.seed.net.tw