作者itoc.bbs@processor.tfcis.org (:MM:) 看板: plan
標題[功能] 動態設定使用者的看版權限
時間XEON (Sat, 07 Jun 2003 10:24:00 +0800 (CST)) Updated: 2004/12/06
※ 引述《amaki (淡墨)》之銘言:
> 板主一設定好名單,便立刻對名單中所有id進行動態的閱讀權限變更,我是不是該在
> UCACHE或是UTMP加新的欄位?
此篇修改可與看板壞人合併使用
※ 一、首先刪除原本的 brd_bits 宣告
: board.c
- char brd_bits[MAXBOARD];
#ifndef ENHANCED_VISIT
time_t brd_visit[MAXBOARD]; /* 最近瀏覽時間 */
#endif
: cache.c favor.c gem.c post.c visio.c vote.c
- extern char brd_bits[];
※ 二、把 brd_bits 放進 UTMP
: struct.h:struct UTMP
int pal_max; /* 有幾個好友 */
int pal_spool[PAL_MAX]; /* 所有好友的 userno */
+ short brd_bits[MAXBOARD]; /* 看板閱讀權限 */
: board.c cache.c favor.c gem.c post.c visio.c vote.c
所有 brd_bits 取代成 cutmp->brd_bits
※ 三、新增個 STATUS_BRD_BIT、BRD_D_BIT
: ufo.h
+ #define STATUS_BRD_BIT BFLAG(7) /* 被變更過看板權限 */
你不一定用7,只要小於32的數字且跟其他旗標沒有重複即可。
: modes.h
#define BRD_Z_BIT 0x80 /* .BRH zap 掉了 */
+ #define BRD_D_BIT 0x100 /* dirty */
※ 四、新增 改所有線上使用者 brd_bits 的函式
: maple.p
+ void utmp_brdset(int bno);
: board.c 新增函式 utmp_brdset() 於 Ben_Perm() 後面
void
utmp_brdset(bno)
int bno;
{
UTMP *uentp, *uceil;
uentp = ushm->uslot;
uceil = (void *) uentp + ushm->offset;
do
{
uentp->status |= STATUS_BRD_BIT; /* 告訴對方要重新判斷 brd_bits */
uentp->brd_bits[bno] |= BRD_D_BIT; /* 要重新判斷的是 bno 這個板 */
} while (++uentp <= uceil);
}
※ 五、當板主變動看板好友時,就要變動所有線上使用者的 brd_bits
: manage.c:XoBM()
free(xt);
+ utmp_brdset(currbno);
return XO_INIT;
※ 六、當站長/板主變動看板權限時,就要變動所有線上使用者的 brd_bits
: manage.c:post_brdlevel()
if ((vans(msg_sure_ny) == 'y') && memcmp(&newbrd, oldbrd, sizeof(BRD)))
{
memcpy(oldbrd, &newbrd, sizeof(BRD));
rec_put(FN_BRD, &newbrd, sizeof(BRD), currbno, NULL);
+ utmp_brdset(currbno);
}
: acct.c:m_newbrd() 及 newbrd.c:nbrd_newbrd()
brh_save();
board_main(); /* reload brd_bits[] */
+ utmp_brdset(bno);
: acct.c:brd_edit()
memcpy(bhdr, &newbh, sizeof(BRD));
rec_put(FN_BRD, &newbh, sizeof(BRD), bno, NULL);
+ utmp_brdset(bno);
※ 七、當我發現我自己的 status 有 STATUS_BRD_BIT 時,我應該要重新載入看板
: 改 board.c:class_head()
static int
class_head(xo)
XO *xo;
{
+ if (cutmp->status & STATUS_BRD_BIT)
+ {
+ int n, max;
+ char bit_temp;
+
+ n = 0;
+ max = bshm->number;
+ do
+ {
+ bit_temp = cutmp->brd_bits[n];
+ if (bit_temp & BRD_D_BIT) /* 只更新有 dirty 的,原本的 V,H,Z 要保留 */
+ cutmp->brd_bits[n] = Ben_Perm(n, cuser.userlevel) |
+ (bit_temp & (BRD_V_BIT | BRD_H_BIT | BRD_Z_BIT));
+ } while (++n < max);
+
+ cutmp->status ^= STATUS_BRD_BIT;
+ class_load(xo);
+ }
vs_head("看板列表", str_site);
return class_neck(xo);
}
※ 八、原本可見的看板可能突然變成不可見,所以呼叫 XoPost() 的地方要改
: menu.c:menu()
if (currbno >= 0)
{
utmp_mode(M_BOARD);
- XoPost(currbno);
+ if (XoPost(currbno) < 0) /* 傳回-1 代表 無閱讀權限 */
{
xover(XZ_POST);
#ifndef ENHANCED_VISIT
time(&brd_visit[currbno]);
#endif
}
}
: xover.c:every_Z()
case 'b':
if (xz[XZ_POST - XO_ZONE].xo) /* 若已選定看板,進入看板,否則到看板列表 */
{
- XoPost(currbno);
+ if (XoPost(currbno) < 0)
+ break;
cmd = XZ_POST;
break;
}
--
改 struct UTMP 要清 shm,重開 bbsd
--
╭─ Origin ─╗ ���O���� processor.tfcis.org ~ κλμ ─┤
├ Author ╡ itoc.Dorm-GD2.NCTU.edu.tw 精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻