发信人: 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];
: ...................
--
修改:chutium FROM 222.22.10.*
FROM 222.22.10.*