回文章列表
作者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
文章選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻