diff options
-rw-r--r-- | mbbsd/bbs.c | 200 | ||||
-rw-r--r-- | mbbsd/board.c | 197 |
2 files changed, 199 insertions, 198 deletions
diff --git a/mbbsd/bbs.c b/mbbsd/bbs.c index 5443770b..0744ad7c 100644 --- a/mbbsd/bbs.c +++ b/mbbsd/bbs.c @@ -1259,57 +1259,6 @@ b_call_in(int ent, const fileheader_t * fhdr, const char *direct) static int -b_posttype(int ent, const fileheader_t * fhdr, const char *direct) -{ - boardheader_t *bp; - int i, aborted; - char filepath[PATHLEN], genbuf[60], title[5], posttype_f, posttype[33]=""; - - if(!(currmode & MODE_BOARD)) return DONOTHING; - - assert(0<=currbid-1 && currbid-1<MAX_BOARD); - bp = getbcache(currbid); - - move(2,0); - clrtobot(); - posttype_f = bp->posttype_f; - for( i = 0 ; i < 8 ; ++i ){ - move(2,0); - outs("文章種類: "); - strlcpy(genbuf, bp->posttype + i * 4, 5); - sprintf(title, "%d.", i + 1); - if( !getdata_buf(2, 11, title, genbuf, 5, DOECHO) ) - break; - sprintf(posttype + i * 4, "%-4.4s", genbuf); - if( posttype_f & (1<<i) ){ - if( getdata(2, 20, "設定範本格式?(Y/n)", genbuf, 3, LCECHO) && - genbuf[0]=='n' ){ - posttype_f &= ~(1<<i); - continue; - } - } - else if ( !getdata(2, 20, "設定範本格式?(y/N)", genbuf, 3, LCECHO) || - genbuf[0] != 'y' ) - continue; - - setbnfile(filepath, bp->brdname, "postsample", i); - aborted = vedit(filepath, NA, NULL); - if (aborted == -1) { - clear(); - posttype_f &= ~(1<<i); - continue; - } - posttype_f |= (1<<i); - } - bp->posttype_f = posttype_f; - strlcpy(bp->posttype, posttype, sizeof(bp->posttype)); /* 這邊應該要防race condition */ - - assert(0<=currbid-1 && currbid-1<MAX_BOARD); - substitute_record(fn_board, bp, sizeof(boardheader_t), currbid); - return FULLUPDATE; -} - -static int do_reply(/*const*/ fileheader_t * fhdr) { boardheader_t *bp; @@ -3314,60 +3263,6 @@ b_notes_edit(void) } static int -b_water_edit(void) -{ - if (currmode & MODE_BOARD) { - friend_edit(BOARD_WATER); - return FULLUPDATE; - } - return 0; -} - -static int -visable_list_edit(void) -{ - if (currmode & MODE_BOARD) { - friend_edit(BOARD_VISABLE); - assert(0<=currbid-1 && currbid-1<MAX_BOARD); - hbflreload(currbid); - return FULLUPDATE; - } - return 0; -} - -static int -b_post_note(void) -{ - char buf[200], yn[3]; - if (currmode & MODE_BOARD) { - setbfile(buf, currboard, FN_POST_NOTE); - if (more(buf, NA) == -1) - more("etc/" FN_POST_NOTE, NA); - getdata(b_lines - 2, 0, "是否要用自訂post注意事項?", - yn, sizeof(yn), LCECHO); - if (yn[0] == 'y') - vedit(buf, NA, NULL); - else - unlink(buf); - - - setbfile(buf, currboard, FN_POST_BID); - if (more(buf, NA) == -1) - more("etc/" FN_POST_BID, NA); - getdata(b_lines - 2, 0, "是否要用自訂競標文章注意事項?", - yn, sizeof(yn), LCECHO); - if (yn[0] == 'y') - vedit(buf, NA, NULL); - else - unlink(buf); - - return FULLUPDATE; - } - return 0; -} - - -static int can_vote_edit(void) { if (currmode & MODE_BOARD) { @@ -3573,74 +3468,6 @@ b_help(void) return FULLUPDATE; } - -/* ----------------------------------------------------- */ -/* 板主設定隱形/ 解隱形 */ -/* ----------------------------------------------------- */ -char board_hidden_status; -#ifdef BMCHS -static int -change_hidden(void) -{ - boardheader_t *bp; - if (!((currmode & MODE_BOARD) || HasUserPerm(PERM_SYSOP))) - return DONOTHING; - - bp = getbcache(currbid); - if (((bp->brdattr & BRD_HIDE) && (bp->brdattr & BRD_POSTMASK))) { - if (getans("目前看板隱形中, 要解除嗎(y/N)?") != 'y') - return FULLUPDATE; - bp->brdattr &= ~BRD_HIDE; - bp->brdattr &= ~BRD_POSTMASK; - outs("君心今傳眾人,無處不聞弦歌。\n"); - board_hidden_status = 0; - hbflreload(currbid); - } else { - if (getans("要設定看板為隱形嗎(y/N)?") != 'y') - return FULLUPDATE; - bp->brdattr |= BRD_HIDE; - bp->brdattr |= BRD_POSTMASK; - outs("君心今已掩抑,惟盼善自珍重。\n"); - board_hidden_status = 1; - } - assert(0<=currbid-1 && currbid-1<MAX_BOARD); - substitute_record(fn_board, bp, sizeof(boardheader_t), currbid); - log_usies("SetBoard", bp->brdname); - pressanykey(); - return FULLUPDATE; -} - -static int -change_counting(void) -{ - - boardheader_t *bp; - if (!((currmode & MODE_BOARD) || HasUserPerm(PERM_SYSOP))) - return DONOTHING; - - bp = getbcache(currbid); - if (!(bp->brdattr & BRD_HIDE && bp->brdattr & BRD_POSTMASK)) - return FULLUPDATE; - - if (bp->brdattr & BRD_BMCOUNT) { - if (getans("目前板列入十大排行, 要取消列入十大排行嘛(Y/N)?[N]") != 'y') - return FULLUPDATE; - bp->brdattr &= ~BRD_BMCOUNT; - outs("你再灌水也不會有十大的呀。\n"); - } else { - if (getans("目前看板不列入十大排行, 要列入十大嘛(Y/N)?[N]") != 'y') - return FULLUPDATE; - bp->brdattr |= BRD_BMCOUNT; - outs("快灌水衝十大第一吧。\n"); - } - assert(0<=currbid-1 && currbid-1<MAX_BOARD); - substitute_record(fn_board, bp, sizeof(boardheader_t), currbid); - pressanykey(); - return FULLUPDATE; -} - -#endif - #ifdef USE_COOLDOWN int check_cooldown(boardheader_t *bp) @@ -3710,6 +3537,13 @@ change_cooldown(void) } #endif +static int +b_moved_to_config() +{ + vmsg("這個功\能已移入看板設定 (大寫 I) 去了!"); + return FULLUPDATE; +} + /* ----------------------------------------------------- */ /* 看板功能表 */ /* ----------------------------------------------------- */ @@ -3732,11 +3566,7 @@ const onekey_t read_comms[] = { { 0, NULL }, // Ctrl('K') { 0, NULL }, // Ctrl('L') { 0, NULL }, // Ctrl('M') -#ifdef BMCHS - { 0, change_counting }, // Ctrl('N') -#else - { 0, NULL }, // Ctrl('N') -#endif + { 0, b_moved_to_config }, // Ctrl('N') { 0, do_post_openbid }, // Ctrl('O') { 0, do_post }, // Ctrl('P') { 0, NULL }, // Ctrl('Q') @@ -3765,22 +3595,18 @@ const onekey_t read_comms[] = { { 1, edit_post }, // 'E' { 0, NULL }, // 'F' { 0, NULL }, // 'G' -#ifdef BMCHS - { 0, change_hidden }, // 'H' -#else - { 0, NULL }, // 'H' -#endif + { 0, b_moved_to_config }, // 'H' { 0, b_config }, // 'I' #ifdef USE_COOLDOWN { 0, change_cooldown }, // 'J' #else { 0, NULL }, // 'J' #endif - { 0, b_water_edit }, // 'K' + { 0, b_moved_to_config }, // 'K' { 1, solve_post }, // 'L' { 0, b_vote_maintain }, // 'M' { 0, NULL }, // 'N' - { 0, b_post_note }, // 'O' + { 0, b_moved_to_config }, // 'O' { 0, NULL }, // 'P' { 1, view_postmoney }, // 'Q' { 0, b_results }, // 'R' @@ -3805,7 +3631,7 @@ const onekey_t read_comms[] = { #endif { 1, good_post }, // 'g' { 0, b_help }, // 'h' - { 0, b_posttype }, // 'i' + { 0, b_moved_to_config }, // 'i' { 0, NULL }, // 'j' { 0, NULL }, // 'k' { 0, NULL }, // 'l' @@ -3822,7 +3648,7 @@ const onekey_t read_comms[] = { #else { 0, NULL }, // 'u' #endif - { 0, visable_list_edit }, // 'v' + { 0, b_moved_to_config }, // 'v' { 1, b_call_in }, // 'w' { 1, cross_post }, // 'x' { 1, reply_post }, // 'y' diff --git a/mbbsd/board.c b/mbbsd/board.c index a15ab96a..09a4f2a5 100644 --- a/mbbsd/board.c +++ b/mbbsd/board.c @@ -177,6 +177,113 @@ HasBoardPerm(boardheader_t *bptr) return 1; } +// board configuration utilities +static int +b_visible_edit(void) +{ + if (currmode & MODE_BOARD) { + friend_edit(BOARD_VISABLE); + assert(0<=currbid-1 && currbid-1<MAX_BOARD); + hbflreload(currbid); + return FULLUPDATE; + } + return 0; +} + +static int +b_water_edit(void) +{ + if (currmode & MODE_BOARD) { + friend_edit(BOARD_WATER); + return FULLUPDATE; + } + return 0; +} + +static int +b_post_note(void) +{ + char buf[200], yn[3]; + if (currmode & MODE_BOARD) { + setbfile(buf, currboard, FN_POST_NOTE); + if (more(buf, NA) == -1) + more("etc/" FN_POST_NOTE, NA); + getdata(b_lines - 2, 0, "是否要用自訂發文注意事項? [y/N]", + yn, sizeof(yn), LCECHO); + if (yn[0] == 'y') + vedit(buf, NA, NULL); + else + unlink(buf); + + setbfile(buf, currboard, FN_POST_BID); + if (more(buf, NA) == -1) + more("etc/" FN_POST_BID, NA); + getdata(b_lines - 2, 0, "是否要用自訂競標文章注意事項? [y/N]", + yn, sizeof(yn), LCECHO); + if (yn[0] == 'y') + vedit(buf, NA, NULL); + else + unlink(buf); + + return FULLUPDATE; + } + return 0; +} + +static int +b_posttype() +{ + boardheader_t *bp; + int i, aborted; + char filepath[PATHLEN], genbuf[60], title[5], posttype_f, posttype[33]=""; + + if(!(currmode & MODE_BOARD)) return DONOTHING; + + assert(0<=currbid-1 && currbid-1<MAX_BOARD); + bp = getbcache(currbid); + + move(2,0); + clrtobot(); + posttype_f = bp->posttype_f; + for( i = 0 ; i < 8 ; ++i ){ + move(2,0); + outs("文章種類: "); + strlcpy(genbuf, bp->posttype + i * 4, 5); + sprintf(title, "%d.", i + 1); + if( !getdata_buf(2, 11, title, genbuf, 5, DOECHO) ) + break; + sprintf(posttype + i * 4, "%-4.4s", genbuf); + if( posttype_f & (1<<i) ){ + if( getdata(2, 20, "設定範本格式?(Y/n)", genbuf, 3, LCECHO) && + genbuf[0]=='n' ){ + posttype_f &= ~(1<<i); + continue; + } + } + else if ( !getdata(2, 20, "設定範本格式?(y/N)", genbuf, 3, LCECHO) || + genbuf[0] != 'y' ) + continue; + + setbnfile(filepath, bp->brdname, "postsample", i); + aborted = vedit(filepath, NA, NULL); + if (aborted == -1) { + clear(); + posttype_f &= ~(1<<i); + continue; + } + posttype_f |= (1<<i); + } + bp->posttype_f = posttype_f; + strlcpy(bp->posttype, posttype, sizeof(bp->posttype)); /* 這邊應該要防race condition */ + + assert(0<=currbid-1 && currbid-1<MAX_BOARD); + substitute_record(fn_board, bp, sizeof(boardheader_t), currbid); + return FULLUPDATE; +} + +char board_hidden_status; + +// integrated board config int b_config(void) { @@ -185,7 +292,7 @@ b_config(void) bp = getbcache(currbid); int i = 0, attr = 0, ipostres; -#define LNBOARDINFO (15) +#define LNBOARDINFO (18) #define LNPOSTRES (10) #define COLPOSTRES (50) @@ -198,18 +305,17 @@ b_config(void) grayout_lines(0, ytitle-1, 0); - move(ytitle-1, 0); clrtobot(); - // outs(MSG_SEPERATOR); // deprecated by grayout - move(ytitle, 0); - outs(ANSI_COLOR(7) " " ); outs(bp->brdname); outs(" 看板設定"); - i = t_columns - strlen(bp->brdname) - strlen(" 看板設定") - 2; - for (; i>0; i--) - outc(' '); - outs(ANSI_RESET); - - // TODO report board level for posting while(!finished) { + move(ytitle-1, 0); clrtobot(); + // outs(MSG_SEPERATOR); // deprecated by grayout + move(ytitle, 0); + outs(ANSI_COLOR(7) " " ); outs(bp->brdname); outs(" 看板設定"); + i = t_columns - strlen(bp->brdname) - strlen(" 看板設定") - 2; + for (; i>0; i--) + outc(' '); + outs(ANSI_RESET); + move(ytitle +2, 0); clrtobot(); @@ -223,6 +329,12 @@ b_config(void) (bp->brdattr & BRD_HIDE) ? ANSI_COLOR(1)"隱形":"公開"); + prints( " " ANSI_COLOR(1;36) "g" ANSI_RESET + " - 隱板時 %s 進入十大排行榜" ANSI_RESET "\n", + (bp->brdattr & BRD_BMCOUNT) ? + ANSI_COLOR(1)"可以" ANSI_RESET: + "不可"); + prints( " " ANSI_COLOR(1;36) "r" ANSI_RESET " - %s " ANSI_RESET "推薦文章\n", (bp->brdattr & BRD_NORECOMMEND) ? @@ -293,6 +405,13 @@ b_config(void) (bp->brdattr & BRD_RESTRICTEDPOST) ? ANSI_COLOR(1)"只有板友才可發文" : "無特別設定" ); + prints("\n " ANSI_COLOR(1;32) "名單編輯與其它:" ANSI_RESET " " + ANSI_COLOR(1;36) "v" ANSI_RESET ")可見名單 " + ANSI_COLOR(1;36) "w" ANSI_RESET ")水桶名單 " + ANSI_COLOR(1;36) "n" ANSI_RESET ")發文注意事項 " + ANSI_COLOR(1;36) "c" ANSI_RESET ")文章類別 " + "\n"); + ipostres = b_lines - LNPOSTRES; move_ansi(ipostres++, COLPOSTRES-2); prints("發文限制"); @@ -384,10 +503,25 @@ b_config(void) { bp->brdattr &= ~BRD_HIDE; bp->brdattr &= ~BRD_POSTMASK; + board_hidden_status = 0; + hbflreload(currbid); } else { bp->brdattr |= BRD_HIDE; bp->brdattr |= BRD_POSTMASK; + board_hidden_status = 1; + } + touched = 1; + break; + + case 'g': +#ifndef BMCHS + if (!HasUserPerm(PERM_SYSOP)) + { + vmsg("此項設定需要站長權限"); + break; } +#endif + bp->brdattr ^= BRD_BMCOUNT; touched = 1; break; @@ -445,6 +579,46 @@ b_config(void) touched = 1; break; + case 'v': + if (currmode & MODE_BOARD) + { + b_visible_edit(); + clear(); + } else { + vmsg("此項設定需要板主權限"); + } + break; + + case 'w': + if (currmode & MODE_BOARD) + { + b_water_edit(); + clear(); + } else { + vmsg("此項設定需要板主權限"); + } + break; + + case 'n': + if (currmode & MODE_BOARD) + { + b_post_note(); + clear(); + } else { + vmsg("此項設定需要板主權限"); + } + break; + + case 'c': + if (currmode & MODE_BOARD) + { + b_posttype(); + clear(); + } else { + vmsg("此項設定需要板主權限"); + } + break; + case 'y': if (!(HasUserPerm(PERM_SYSOP) || (HasUserPerm(PERM_SYSSUPERSUBOP) && GROUPOP()) ) ) { vmsg("此項設定需要群組長或站長權限"); @@ -463,6 +637,7 @@ b_config(void) { assert(0<=currbid-1 && currbid-1<MAX_BOARD); substitute_record(fn_board, bp, sizeof(boardheader_t), currbid); + log_usies("SetBoard", bp->brdname); vmsg("已儲存新設定"); } else |