回精華區
作者amaki.bbs@luna.twbbs.org (仙草小羊) 看板: plan
標題[功能]進階版主功能
時間月下夜想 (Fri, 18 Apr 2003 11:27:23 +0800 (CST)) Updated: 2005/05/19
  WD有進階板主功能,M3當然也可以有。

> config.h

#define HAVE_ADVANCE_BMPERM     /* amaki.030418: 進階板主功能 */

> post.c

  把itoc之前寫的post_prefix抄下來用。

  放在do_post前即可。

#ifdef HAVE_ADVANCE_BMPERM
static int
post_prefix(xo)
  XO *xo;
{
  char fpath[64], buf[80];
  FILE *fp;

  if (!(bbstate & STAT_BOARD))
    return XO_NONE;

  brd_fpath(fpath, currboard, "prefix");

  if (dashf(fpath))
  {
    switch (vans("1)刪除類別 2)設定新的類別?[Q] "))
    {
    case '1':
      if (vans(msg_sure_ny) == 'y')
        unlink(fpath);
      break;

    case '2':
      if (vget(b_lines, 0, "類別:", buf, 60, DOECHO) && (vans(msg_sure_ny) == 'y'))
      {
        if (fp = fopen(fpath, "w"))
        {
          fprintf(fp, "%s", buf);
          fclose(fp);
        }
      }
      break;
    }
  }
  else if (vget(b_lines, 0, "類別:", buf, 60, DOECHO) && vans(msg_sure_ny) == 'y')
  {
    if (fp = fopen(fpath, "w"))
    {
      fprintf(fp, "%s", buf);
      fclose(fp);
    }
  }

  return XO_FOOT;
}
#endif /* HAVE_ADVANCE_BMPERM */

  修改do_post

!#ifdef HAVE_ADVANCE_BMPERM /* 小心修改下面這一段,自己比對小心改 */
  if (title)
  {
    rcpt = NULL;
  }
  else          /* itoc.020113: 新文章選擇標題分類 */
                /* amaki.030418: 板主不設標題就直接post,不顯示預設標題 */
  {
#define NUM_PREFIX 6

    FILE *fp;
    char prefix[NUM_PREFIX][10];

    brd_fpath(fpath, currboard, "prefix");
    if (fp = fopen(fpath, "r"))
    {
      move(21, 0);
      outs("類別:");
      for (mode = 0; mode < NUM_PREFIX; mode++)
      {
        if (fscanf(fp, "%s", fpath) != 1)
          break;
        sprintf(prefix[mode], "%s", fpath);
        prints("%d.%s ", mode + 1, fpath);
      }

      fclose(fp);

      mode = vget(20, 0, "請選擇文章類別(按 Enter 跳過):", fpath, 3, DOECHO) - '1';
      if (mode >= 0 && mode < NUM_PREFIX)               /* 輸入數字選項 */
        rcpt = prefix[mode];
      else                                      /* 空白跳過 */
        rcpt = NULL;
    }


  在原來的post_brdtitle前面新增一支函式

#ifdef HAVE_ADVANCE_BMPERM /* amaki.030418: 抄一支新的吧,這樣才不會用#ifdef醜醜的 */
static int
post_brdtitle(xo)
  XO *xo;
{
  int bno, ch;
  BRD *oldbrd, newbrd;

  if (!(bbstate & STAT_BOARD))
    return XO_NONE;

  bno = brd_bno(currboard);
  oldbrd = bshm->bcache + bno;
  memcpy(&newbrd, oldbrd, sizeof(BRD));

  switch (vans("◎修改看板資料 1)修改板名/主題 2)看板屬性 3)文章標題?[Q] "))
  {
  case '1':
    vget(b_lines, 0, "看板名稱:", newbrd.title + BCLEN, BTLEN + 1 - BCLEN, GCARRY);
    vget(b_lines, 0, "看板主題:", newbrd.title, BCLEN, GCARRY);
    break;

  case '2':
    switch (vans("您想設定的看板類型? A)公開 B)秘密 C)好友?[Q] "))
    {
    case 'a':
      newbrd.readlevel = 0;
      newbrd.postlevel = PERM_POST;         /* 一般看板發表權限為 PERM_POST */
      break;

    case 'b':
      newbrd.readlevel = PERM_SYSOP;        /* 秘密看板 */
      newbrd.postlevel = 0;
      break;

    case 'c':
      newbrd.readlevel = PERM_BOARD;        /* 好友看板 */
      newbrd.postlevel = 0;
      break;
    }
    break;

  case '3':
    post_prefix(xo);
    break;
  }

  if (memcmp(&newbrd, oldbrd, sizeof(BRD)))
  {
    if (vans(msg_sure_ny) == 'y')
    {
      memcpy(oldbrd, &newbrd, sizeof(BRD));
      rec_put(FN_BRD, &newbrd, sizeof(BRD), bno, NULL);
      return XO_HEAD; /* itoc.011125: 要重繪中文板名 */
    }
  }

  return XO_FOOT;
}

#else

  最後在舊的post_brdtitle尾巴加一個#endif就OK。

> acct.c


  在brd_title前新增一支函式

#ifdef HAVE_ADVANCE_BMPERM
/* amaki.030418: 把原來的brd_title加進一堆#ifdef醜爆了,乾脆抄一支新的比較美觀:) */
void
brd_title(bno)
  int bno;
{
  BRD *bhdr, newbh;
  char *blist;
  int ch;

  bhdr = bshm->bcache + bno;
  memcpy(&newbh, bhdr, sizeof(BRD));

  blist = bhdr->BM;

  if (blist[0] > ' ' && is_bm(blist))
  {
    switch (vans("◎修改看板資料 1)修改板名 2)修改類別 3)看板屬性?[Q] "))
    {
    case '1':
      vget(1, 0, "看板名稱:", newbh.title + BCLEN , BTLEN + 1 - BCLEN, GCARRY);
      break;

    case '2':
      vget(1, 0, "看板主題:", newbh.title, BCLEN, GCARRY);
      break;

    case '3':
      switch (vans("您想設定的看板類型 A)公開 B)秘密 C)好友?[Q] "))
      {
      case 'a':
        newbh.readlevel = 0;
        newbh.postlevel = PERM_POST;         /* 一般看板發表權限為 PERM_POST */
        break;

      case 'b':
        newbh.readlevel = PERM_SYSOP;        /* 秘密看板 */
        newbh.postlevel = 0;
        break;

      case 'c':
        newbh.readlevel = PERM_BOARD;        /* 好友看板 */
        newbh.postlevel = 0;
        break;
      }
      break;
    }

    if (memcmp(&newbh, bhdr, sizeof(BRD)))
    {
      if (vans(msg_sure_ny) == 'y')
      {
        memcpy(bhdr, &newbh, sizeof(BRD));
        rec_put(FN_BRD, &newbh, sizeof(BRD), bno, NULL);
      }
    }
  }
}
#else

  最後在舊的brd_title尾巴加一個#endif就OK。

  修改brd_edit

void
brd_edit(bno)
  int bno;
{
  BRD *bhdr, newbh;
  char buf[80], data[3];

  vs_bar("看板設定");

  ......(略)

  case 'e':  /* 下面的部分請仔細比對修改 */

    move(9, 0);
    outs("直接按 [Return] 不修改該項設定");

    if (!m_setbrd(&newbh))
    {
      if (vans(msg_sure_ny) == 'y')
      {
        if (strcmp(bhdr->brdname, newbh.brdname))
        {
          char src[80], dst[80];
          /* Thor.980806: 特別注意如果 board不在同一partition裏的話會有問題 */
          sprintf(src, "gem/brd/%s", bhdr->brdname);
          sprintf(dst, "gem/brd/%s", newbh.brdname);
          rename(src, dst);
          rename(src + 4, dst + 4);
          vmsg("您更改了板名,請務必去Announce的Class分類裡加入新看板!");
        }
        if (memcmp(&newbh, bhdr, sizeof(newbh)))
        {
          memcpy(bhdr, &newbh, sizeof(BRD));
          rec_put(FN_BRD, &newbh, sizeof(BRD), bno, NULL);
        }
      }
    }
    vmsg("設定完畢");
    break;
  }
}


--
  覺得把看板主題讓板主改不喜歡的話,也可以從switch裡拿掉。

  最好還是不要讓板主有變更看板屬性的權限,給這樣的權限應該算是差不多極限了。
--
  花俏的功能真是浪費系統資源的罪惡根源-_-;;;
--
  Origin: luna.twbbs.org
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻