telnet下(R)etrireBM版主卸任增加对已死亡id的处理

 

发信人: 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];
: ...................


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值