發信人: chutium (秋天|阿新是誰?), 信區: BBSDev
標 題: [合集] telnet下 (R)etireBM 版主卸任 增加對已死亡id的處理
發信站: 鄭大綠城 BBS (Fri Dec 17 15:23:14 2004), 本站(bbs.zzu.edu.cn)
telnet下 (R)etireBM 版主卸任 增加對已死亡id的處理
http://bbs.zzu.edu.cn/ZZU/bbstcon?board=BBSDev&th=1103266394
───────────────────────────────────────
作者 chutium 時間 Fri Dec 17 14:53:14 2004
───────────────────────────────────────
最近bbs經常被停。。。所以常時間沒上站導致死亡的id越來越多,其中也有不少是版主,
而已死亡了的id不能直接通過管理菜單裏的 (R)etireBM 版主卸任 修改相應版面的版主名
單,使得一個id明明死了還掛在一個版塊的版主位置上。。。
看了看代碼發現ytht原來有這部分代碼,不過寫的比較離奇,明明是死亡的id還要判斷是否
存在。。。而且那個函數也並沒有被調用。自己改了改,在 (R)etireBM 版主卸任功能裏做
了一個選擇,方便站務處理死亡id擔任版主的撤消問題。
下一步的目標是在檢查七天未上線的版主時對生命力<=1的版主自動卸任,不過還要有時間
琢磨琢磨~~~
另外可以把每天死亡的id做個統計,這個應該好實現。
maintain.c
int do_retireBM() 函數中判斷是否“無效的使用者帳號”中增加一個選擇
if (askyn("是否在版主列表中清除已死亡ID的版主職務?", YEA, NA) == YEA)
return retireBM(genbuf, NULL);
else
return 0;
然後。。。是比較bt的一個函數
這個是原來ytht代碼裏的撤除已死亡id版主職務的函數
int
retireBM(uid, bname)
char *uid;
char *bname;
{
char tmp[STRLEN];
char content[1024], title[STRLEN];
int i, oldbm, id, pos, bmpos = -1, bm = 0;
struct boardheader fh;
if (!(id = getuser(uid)))
return -1;
pos =
new_search_record(BOARDS, &fh, sizeof (fh), (void *) cmpbnames,
bname);
if (!pos)
return -2;
oldbm = getbmnum(lookupuser->userid);
for (i = 0; i < BMNUM; i++) {
if (!strcasecmp(fh.bm[i], lookupuser->userid)) {
bmpos = i;
if (i < 4)
bm = 1;
else
bm = 0;
}
}
if (bmpos == -1)
return -3;
anno_title(title, &fh);
fh.bm[bmpos][0] = 0; //先清理掉, 免的有問題
fh.hiretime[bmpos] = 0;
for (i = bmpos; i < (bm ? 4 : BMNUM); i++) {
if (i == bm ? 3 : BMNUM - 1) { //最後一個BM
fh.bm[i][0] = 0;
fh.hiretime[i] = 0;
} else {
strcpy(fh.bm[i], fh.bm[i + 1]);
fh.hiretime[i] = fh.hiretime[i + 1];
}
}
if (bm) {
anno_title(tmp, &fh);
get_grp(fh.filename);
edit_grp(fh.filename, lookgrp, title, tmp);
}
substitute_record(BOARDS, &fh, sizeof (fh), pos);
reload_boards();
sprintf(genbuf, "取消 %s 的 %s 討論區版主職務", lookupuser->userid,
fh.filename);
securityreport(genbuf, genbuf);
if (!(oldbm - 1)) {
char secu[STRLEN];
struct userec tmpu;
if (!(lookupuser->userlevel & PERM_OBOARDS)
&& !(lookupuser->userlevel & PERM_SYSOP)) {
memcpy(&tmpu, lookupuser, sizeof (tmpu));
tmpu.userlevel &= ~PERM_BOARDS;
substitute_record(PASSFILE, &tmpu,
sizeof (struct userec), id);
sprintf(secu, "版主卸職, 取消 %s 的版主權限",
lookupuser->userid);
securityreport(secu, secu);
}
}
sprintf(title, "[公告]撤除 %s 版%s %s ", bname,
bm ? "版主" : "版副", lookupuser->userid);
strcpy(currboard, bname);
sprintf(content, "/n/t/t/t【撤職公告】/n/n"
"/t系統撤職:/n"
"/t由於ID死亡,撤除 %s 版%s %s 的%s職務。/n",
bname, bm ? "版主" : "版副", lookupuser->userid,
bm ? "版主" : "版副");
deliverreport(title, content);
if (normal_board(currboard)) {
strcpy(currboard, "Board");
deliverreport(title, content);
}
return 0;
}
我做的修改
1755,1757c1727,1729
< retireBM(char *uid, char *abname)
< //char *uid;
< //char *bname;
---
> retireBM(uid, bname)
> char *uid;
> char *bname;
1760,1761d1731
< char userid[IDLEN];
< char bbname[STRLEN];
1763c1733
< int i, /*oldbm, id, */pos, bmpos = -1, bm = 0;
---
> int i, oldbm, id, pos, bmpos = -1, bm = 0;
1765,1805c1735
< modify_user_mode(ADMIN);
< if (!check_systempasswd())
< return -1;
<
< clear();
< stand_title("版主清除/n");
< clrtoeol();
< if (uid)
< strsncpy(userid, uid, sizeof (userid));
< // else {
< move(1, 0);
< clrtoeol();
< getdata(1, 0, "輸入欲清除的版主帳號: ", userid, IDLEN + 1, DOECHO, NA);
< // usercomplete("輸入欲離任的使用者帳號: ", genbuf);
< // }
< if (userid[0] == '/0') {
< clear();
< return 0;
< }
< // prints("/n%s/n",userid);
< // getuser(genbuf);
< // if (!(id = getuser(uid)))
< // return -1;
< if (abname)
< strsncpy(bbname, abname, sizeof (bbname));
< else {
< // make_blist_full();
< // namecomplete("輸入將取消該使用者版主權限的討論區名稱: ", bbname)
;
< move(2, 0);
< clrtoeol();
< getdata(2, 0, "輸入將清除該使用者版主職務的討論區名稱: ",
bbname, STRLEN + 1, DOECHO, YEA);
< // move(5, 0);
< // prints("討論區名稱");
< // prints("/n%s/n",bbname);
< }
< // prints("/n%s/n",bbname);
< if (*bbname == '/0') {
< move(5, 0);
< prints("錯誤的討論區名稱");
< pressreturn();
< clear();
---
> if (!(id = getuser(uid)))
1807,1808d1736
< }
< // prints("/n%s/n",bbname);
1811,1816c1739,1740
< bbname);
< if (!pos) {
< move(5, 0);
< prints("錯誤的討論區名稱");
< pressreturn();
< clear();
---
> bname);
> if (!pos)
1818,1819c1742
< }
< // oldbm = getbmnum(lookupuser->userid);
---
> oldbm = getbmnum(lookupuser->userid);
1821c1744
< if (!strcasecmp(fh.bm[i], userid)) {
---
> if (!strcasecmp(fh.bm[i], lookupuser->userid)) {
1829,1834c1752
< if (bmpos == -1) {
< move(5, 0);
< prints(" 版主名單中沒有%s,如有錯誤,請通知系統維護。",
< userid);
< pressanykey();
< clear();
---
> if (bmpos == -1)
1836,1844d1753
< }
< prints("/n你將清除 %s 的 %s 版%s職務./n",
< userid, bbname, bm ? "版主" : "版副");
< if (askyn("你確定要清除嗎?", NA, NA) == NA) {
< prints("/n請確認後重新清除已死亡ID的版主職務");
< pressanykey();
< clear();
< return -1;
< }
1864,1865c1773,1774
< sprintf(genbuf, "清除 %s 的 %s 討論區%s職務", userid,
< fh.filename, bm ? "版主" : "版副");
---
> sprintf(genbuf, "取消 %s 的 %s 討論區版主職務", lookupuser->userid,
> fh.filename);
1867c1776
< /* if (!(oldbm - 1)) {
---
> if (!(oldbm - 1)) {
1880,1883c1789,1792
< }*/
< sprintf(title, "[公告]清除 %s 版%s %s ", bbname,
< bm ? "版主" : "版副", userid);
< strcpy(currboard, bbname);
---
> }
> sprintf(title, "[公告]撤除 %s 版%s %s ", bname,
> bm ? "版主" : "版副", lookupuser->userid);
> strcpy(currboard, bname);
1886,1887c1795,1796
< "/t由於ID已死亡,清除 %s 版%s %s 的%s職務。/n",
< bbname, bm ? "版主" : "版副", userid,
---
> "/t由於ID死亡,撤除 %s 版%s %s 的%s職務。/n",
> bname, bm ? "版主" : "版副", lookupuser->userid,
1894,1895d1802
< prints("/n執行完畢!");
< pressanykey();
比較亂。。。一會貼一份完整的清除已死亡ID的函數吧。。。
───────────────────────────────────────
作者 chutium 時間 Fri Dec 17 15:07:14 2004
───────────────────────────────────────
完整的清除死亡id版主職務的函數。。。
有一些我調試用的東西給去掉了,想看的話可以看上面那個帖子了“我做的修改”部分//注
釋掉的那些行。
int
retireBM(char *uid, char *abname)
{
char tmp[STRLEN];
char userid[IDLEN];
char bbname[STRLEN];
char content[1024], title[STRLEN];
int i, /*oldbm, id, */pos, bmpos = -1, bm = 0;
struct boardheader fh;
modify_user_mode(ADMIN);
if (!check_systempasswd())
return -1;
clear();
stand_title("版主清除/n");
clrtoeol();
if (uid)
strsncpy(userid, uid, sizeof (userid));
move(1, 0);
clrtoeol();
getdata(1, 0, "輸入欲清除的版主帳號: ", userid, IDLEN + 1, DOECHO, NA);
if (userid[0] == '/0') {
clear();
return 0;
}
if (abname)
strsncpy(bbname, abname, sizeof (bbname));
else {
move(2, 0);
clrtoeol();
getdata(2, 0, "輸入將清除該使用者版主職務的討論區名稱: ",
bbname, STRLEN + 1, DOECHO, YEA);
}
if (*bbname == '/0') {
move(5, 0);
prints("錯誤的討論區名稱");
pressreturn();
clear();
return -1;
}
pos =
new_search_record(BOARDS, &fh, sizeof (fh), (void *) cmpbnames,
bbname);
if (!pos) {
move(5, 0);
prints("錯誤的討論區名稱");
pressreturn();
clear();
return -2;
}
for (i = 0; i < BMNUM; i++) {
if (!strcasecmp(fh.bm[i], userid)) {
bmpos = i;
if (i < 4)
bm = 1;
else
bm = 0;
}
}
if (bmpos == -1) {
move(5, 0);
prints(" 版主名單中沒有%s,如有錯誤,請通知系統維護。",
userid);
pressanykey();
clear();
return -3;
}
prints("/n你將清除 %s 的 %s 版%s職務./n",
userid, bbname, bm ? "版主" : "版副");
if (askyn("你確定要清除嗎?", NA, NA) == NA) {
prints("/n請確認後重新清除已死亡ID的版主職務");
pressanykey();
clear();
return -1;
}
anno_title(title, &fh);
fh.bm[bmpos][0] = 0; //先清理掉, 免的有問題
fh.hiretime[bmpos] = 0;
for (i = bmpos; i < (bm ? 4 : BMNUM); i++) {
if (i == bm ? 3 : BMNUM - 1) { //最後一個BM
fh.bm[i][0] = 0;
fh.hiretime[i] = 0;
} else {
strcpy(fh.bm[i], fh.bm[i + 1]);
fh.hiretime[i] = fh.hiretime[i + 1];
}
}
if (bm) {
anno_title(tmp, &fh);
get_grp(fh.filename);
edit_grp(fh.filename, lookgrp, title, tmp);
}
substitute_record(BOARDS, &fh, sizeof (fh), pos);
reload_boards();
sprintf(genbuf, "清除 %s 的 %s 討論區%s職務", userid,
fh.filename, bm ? "版主" : "版副");
securityreport(genbuf, genbuf);
sprintf(title, "[公告]清除 %s 版%s %s ", bbname,
bm ? "版主" : "版副", userid);
strcpy(currboard, bbname);
sprintf(content, "/n/t/t/t【撤職公告】/n/n"
"/t系統撤職:/n"
"/t由於ID已死亡,清除 %s 版%s %s 的%s職務。/n",
bbname, bm ? "版主" : "版副", userid,
bm ? "版主" : "版副");
deliverreport(title, content);
if (normal_board(currboard)) {
strcpy(currboard, "Board");
deliverreport(title, content);
}
prints("/n執行完畢!");
pressanykey();
return 0;
}
另外這個函數,int retire_allBM() 莫非是撤消所有版主?。。。似乎也沒有調用。。。
不過這個功能實在是太bt了,確實沒什麼大必要。
【 在 chutium (秋天|阿新是誰?) 的大作中提到: 】
: 最近bbs經常被停。。。所以常時間沒上站導致死亡的id越來越多,其中也有不少是版主
,而已死亡了的id不能直接通過管理菜單裏的 (R)etireBM 版主卸任 修改相應版面的版主
名單,使得一個id明明死了還掛在一個版塊的版主位置上。。。
: 看了看代碼發現ytht原來有這部分代碼,不過寫的比較離奇,明明是死亡的id還要判斷是
否存在。。。而且那個函數也並沒有被調用。自己改了改,在 (R)etireBM 版主卸任功能裏
做了一個選擇,方便站務處理死亡id擔任版主的撤消問題。
: 下一步的目標是在檢查七天未上線的版主時對生命力<=1的版主自動卸任,不過還要有時
間琢磨琢磨~~~
: 另外可以把每天死亡的id做個統計,這個應該好實現。
: maintain.c
: int do_retireBM() 函數中判斷是否“無效的使用者帳號”中增加一個選擇
: if (askyn("是否在版主列表中清除已死亡ID的版主職務?", YEA, NA) == YEA)
: return retireBM(genbuf, NULL);
: ...................
───────────────────────────────────────
作者 chutium 時間 Fri Dec 17 15:13:14 2004
───────────────────────────────────────
看了一下smth的 set_BM() 函數,任免版主在同一個函數了做的。。。恩,不錯。不過
smth的代碼咋看着覺得那麼亂呢。。。
【 在 chutium (秋天|阿新是誰?) 的大作中提到: 】
: 完整的清除死亡id版主職務的函數。。。
: 有一些我調試用的東西給去掉了,想看的話可以看上面那個帖子了“我做的修改”部分
//註釋掉的那些行。
: int
: retireBM(char *uid, char *abname)
: {
: char tmp[STRLEN];
: char userid[IDLEN];
: char bbname[STRLEN];
: ...................