回精華區
作者itoc.bbs@xeon.tfcis.org (看了題目就知道該放棄) 看板: plan
標題[功能] 使用者自己開板
時間動力核心 (Fri, 15 Aug 2003 01:24:54 +0800 (CST)) Updated: 2005/05/19
  如果站真的是小到允許隨便玩的話...:p

  那麼就可以讓使用者自己開板了

  這裡限制了開板的條件,你可以隨便改或是拿掉
  1) 用 @xxxx.edu.tw 認證的使用者
  2) 上站次數超過 100 次
  3) 發表文章超過 100 篇

: admutil.c 最後加入這幾個函式

static int              /* 1:是本校的 email */
is_school_email()
{
  char *host;
  char foo[80];

  if (HAS_PERM(PERM_VALID))  /* 避免用別的信箱認證再改成學校信箱但沒認證 */
  {
    str_lower(foo, cuser.email);

    host = (char *) strchr(foo, '@');
    *host++ = '\0';

    if (acl_has("run/personal_board", foo, host) > 0) /* 此信箱已經開過板 */
      return 0;

    if (!strcmp(host, "xxxx.edu.tw"))        // 各校的 email 自定 
      return 1;
  }

  return 0;
}


static int
hdr_cmp(a, b)
  HDR *a;
  HDR *b;
{
  /* 先比對分類,再比對板名 */
  int k = strncmp(a->title + BNLEN + 1, b->title + BNLEN + 1, BCLEN);
  return k ? k : str_cmp(a->xname, b->xname);
}


int
a_personal_board()
{
  BRD newboard;
  int bno;
  char fpath[64], brdname[BNLEN + 1];
  HDR hdr;
  ACCT acct;
  FILE *fp;
  char *fname = "gem/@/@Personal";      // 分類自定 

#if 1   // 這一段是條件的檢查,可以隨便改或是拿掉 
  if (!is_school_email())
  {
    vmsg("這功\能僅限本校同學使用");
    return XEASY;
  }

  if (cuser.numlogins < 100)
  {
    vmsg("您上站次數那麼少,不能擁有個人板");
    return XEASY;
  }

  if (cuser.numposts < 100)
  {
    vmsg("您發表文章那麼少,不能擁有個人板");
    return XEASY;
  }
#endif

  // 這裡是想讓個人板有什麼板名,下面二行只能選一行 
  sprintf(brdname, "P_%.10s", cuser.userid);  /* 板名為 P_userid */
  strcpy(brdname, cuser.userid);              /* 板名即為 userid */

  if (brd_bno(brdname) >= 0)
  {
    vmsg("您已經有板了!");
    return XEASY;
  }

  if (vans("要申請個人板(Y/N)?[N] ") != 'y')
    return XEASY;

  memset(&newboard, 0, sizeof(newboard));

  newboard.battr = BRD_NOTRAN;
  newboard.postlevel = PERM_POST;
  strcpy(newboard.brdname, brdname);
  strcpy(newboard.class, "個人");
  strcpy(newboard.title, "板名在看板裡按 B 自己改");
  strcpy(newboard.BM, cuser.userid);

  /* 加板主權限 */
  cuser.userlevel |= PERM_BM;
  if (acct_load(&acct, cuser.userid) >= 0)
    acct_setperm(&acct, PERM_BM, 0);

  time(&newboard.bstamp);
  if ((bno = brd_bno("")) >= 0)
  {
    rec_put(FN_BRD, &newboard, sizeof(newboard), bno, NULL);
  }
  /* Thor.981102: 防止超過shm看板個數 */
  else if (bshm->number >= MAXBOARD)
  {
    vmsg("超過系統所能容納看板個數,請調整系統參數");
    return XEASY;
  }
  else if (rec_add(FN_BRD, &newboard, sizeof(newboard)) < 0)
  {
    vmsg("無法建立新板");
    return XEASY;
  }

  sprintf(fpath, "gem/brd/%s", brdname);
  mak_dirs(fpath);
  mak_dirs(fpath + 4);

  brd2gem(&newboard, &hdr);
  rec_add(fname, &hdr, sizeof(HDR));
  rec_sync(fname, sizeof(HDR), hdr_cmp, NULL);

  bshm_reload();                /* force reload of bcache */

  system("bin/account -nokeeplog");
  brh_save();
  board_main();                 /* reload brd_bits[] */

#if 1
  /* 記錄已經開個板的 E-mail */
  if (fp = fopen("run/personal_board", "a"))
  {
    fprintf(fp, "%s\n", cuser.email);
    fclose(fp);
  }
#endif

  vmsg("新板成立,請在看板裡按 B 做進階設定");
  return 0;
}

: menu.c 適當的選單加入

  "bin/admutil.so:a_personal_board", PERM_VALID, - M_XMODE,
  "Board      【 開個人板 】",

--
  不僅開板免連署,現在連等待都免了!

--
=[:摃�◣�:Origin ]|[     O�processor.tfcis.org    ]|[�搟說:]=
=[:摃�╱�:Author ]|[     itoc.Dorm11.NCTU.edu.tw         ]|[�:]=
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻