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


發佈了47 篇原創文章 · 獲贊 1 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章