summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pttbbs/common/bbs/cache.c39
-rw-r--r--pttbbs/include/cmbbs.h1
-rw-r--r--pttbbs/mbbsd/admin.c66
3 files changed, 75 insertions, 31 deletions
diff --git a/pttbbs/common/bbs/cache.c b/pttbbs/common/bbs/cache.c
index bfdef1a8..dd153303 100644
--- a/pttbbs/common/bbs/cache.c
+++ b/pttbbs/common/bbs/cache.c
@@ -635,25 +635,38 @@ getbnum(const char *bname)
return 0;
}
-void buildBMcache(int bid) /* bid starts from 1 */
+int
+parseBMlist(const char *input, int uids[MAX_BMs]) {
+ int i, uid;
+ char *ptr, *strtok_pos;
+ char s[(IDLEN + 1) * MAX_BMs];
+
+ strlcpy(s, input, sizeof(s));
+ // reset BM list
+ for (i = 0; i < MAX_BMs; i++)
+ uids[i] = -1;
+
+ for (i = 0 ; s[i] != 0 ; ++i)
+ if (!isalpha((int)s[i]) && !isdigit((int)s[i]))
+ s[i] = ' ';
+ for (ptr = strtok_r(s, " ", &strtok_pos), i = 0;
+ i < MAX_BMs && ptr != NULL;
+ ptr = strtok_r(NULL, " ", &strtok_pos))
+ if((uid = searchuser(ptr, NULL)) != 0)
+ uids[i++] = uid;
+ return i;
+}
+
+
+void
+buildBMcache(int bid) /* bid starts from 1 */
{
char s[IDLEN * 3 + 3], *ptr;
int i, uid;
char *strtok_pos;
assert(0<=bid-1 && bid-1<MAX_BOARD);
- strlcpy(s, getbcache(bid)->BM, sizeof(s));
- for( i = 0 ; s[i] != 0 ; ++i )
- if( !isalpha((int)s[i]) && !isdigit((int)s[i]) )
- s[i] = ' ';
-
- for( ptr = strtok_r(s, " ", &strtok_pos), i = 0 ;
- i < MAX_BMs && ptr != NULL ;
- ptr = strtok_r(NULL, " ", &strtok_pos), ++i )
- if( (uid = searchuser(ptr, NULL)) != 0 )
- SHM->BMcache[bid-1][i] = uid;
- for( ; i < MAX_BMs ; ++i )
- SHM->BMcache[bid-1][i] = -1;
+ parseBMlist(getbcache(bid)->BM, SHM->BMcache[bid - 1]);
}
/*
diff --git a/pttbbs/include/cmbbs.h b/pttbbs/include/cmbbs.h
index 4b5b4012..5e6b8cbf 100644
--- a/pttbbs/include/cmbbs.h
+++ b/pttbbs/include/cmbbs.h
@@ -83,6 +83,7 @@ void setbtotal(int bid);
void touchbpostnum(int bid, int delta);
int getbnum(const char *bname);
void buildBMcache(int);
+int parseBMlist(const char *input, int uids[MAX_BMs]);
void reload_fcache(void);
void reload_pttcache(void);
void resolve_garbage(void);
diff --git a/pttbbs/mbbsd/admin.c b/pttbbs/mbbsd/admin.c
index a7a39313..07ceb6b5 100644
--- a/pttbbs/mbbsd/admin.c
+++ b/pttbbs/mbbsd/admin.c
@@ -496,6 +496,7 @@ m_mod_board(char *bname)
boardheader_t bh, newbh;
int bid;
char genbuf[PATHLEN], ans[4];
+ int y;
bid = getbnum(bname);
if (!bid || !bname[0] || get_record(fn_board, &bh, sizeof(bh), bid) == -1) {
@@ -613,15 +614,16 @@ m_mod_board(char *bname)
vmsg("禁止更動連結看板,請直接修正原看板");
break;
}
- move(8, 0); clrtobot();
+ y = 8;
+ move(y++, 0); clrtobot();
outs("直接按 [Return] 不修改該項設定");
memcpy(&newbh, &bh, sizeof(bh));
- while (getdata(9, 0, "新看板名稱:", genbuf, IDLEN + 1, DOECHO)) {
+ while (getdata(y, 0, "新看板名稱:", genbuf, IDLEN + 1, DOECHO)) {
if (getbnum(genbuf)) {
- mvouts(10, 0, "錯誤: 此新看板名已存在\n");
+ mvouts(y + 1, 0, "錯誤: 此新看板名已存在\n");
} else if ( !is_valid_brdname(genbuf) ) {
- mvouts(10, 0, "錯誤: 無法使用此名稱。"
+ mvouts(y + 1, 0, "錯誤: 無法使用此名稱。"
"請使用英數字或 _-. 且開頭不得為數字。\n");
} else {
if (genbuf[0] != bh.brdname[0]) {
@@ -629,12 +631,12 @@ m_mod_board(char *bname)
// with different initial character.
const int free_rename = 1;
if (free_rename || HasUserPerm(PERM_SYSOP | PERM_BOARD)) {
- mvouts(10, 0, ANSI_COLOR(1;31)
+ mvouts(y + 1, 0, ANSI_COLOR(1;31)
"警告: 看板首字母不同,大看板改名會非常久,"
"千萬不可中途斷線否則看板會壞掉"
ANSI_RESET "\n");
} else {
- mvouts(10, 0,
+ mvouts(y + 1, 0,
"錯誤: 新舊名稱第一個字母若不同(大小寫有別)"
"要看板總管以上等級才可設定\n");
continue;
@@ -644,25 +646,29 @@ m_mod_board(char *bname)
break;
}
}
- outs("\n");
+ y++;
do {
- getdata_str(12, 0, "看板類別:", genbuf, 5, DOECHO, bh.title);
+ getdata_str(y, 0, "看板類別:", genbuf, 5, DOECHO, bh.title);
if (strlen(genbuf) == 4)
break;
} while (1);
+ y++;
strcpy(newbh.title, genbuf);
-
newbh.title[4] = ' ';
// 7 for category
- getdata_str(14, 0, "看板主題:", genbuf,
- BTLEN + 1 -7, DOECHO, bh.title + 7);
+ getdata_str(y++, 0, "看板主題:", genbuf, BTLEN + 1 -7,
+ DOECHO, bh.title + 7);
if (genbuf[0])
strlcpy(newbh.title + 7, genbuf, sizeof(newbh.title) - 7);
- if (getdata_str(15, 0, "新板主名單:", genbuf, IDLEN * 3 + 3, DOECHO,
- bh.BM)) {
+
+ do {
+ int uids[MAX_BMs], i;
+ if (!getdata_str(y, 0, "新板主名單:", genbuf, IDLEN * 3 + 3,
+ DOECHO, bh.BM) || strcmp(genbuf, bh.BM) == 0)
+ break;
// TODO 照理來說在這裡 normalize 一次比較好;可惜目前似乎有奇怪的
// 代管制度,會有人把 BM list 設定 [ ...... / some_uid],就會變成
// 一面徵求板主同時又有人(maybe小組長)有管理權限而且還不顯示出來。
@@ -670,12 +676,34 @@ m_mod_board(char *bname)
// 還有人以為這裡打句英文很帥氣結果造成該英文的ID意外獲得權限。
// 未來應該整個取消,完全 normalize。
trim(genbuf);
- strlcpy(newbh.BM, genbuf, sizeof(newbh.BM));
- }
+ parseBMlist(genbuf, uids);
+ mvouts(y + 2, 0, " 實際生效的板主ID: " ANSI_COLOR(1));
+ for (i = 0; i < MAX_BMs && uids[i] >= 0; i++) {
+ prints("%s ", getuserid(uids[i]));
+ }
+ outs(ANSI_RESET "\n");
+
+ // ref: does_board_have_public_bm
+ if (genbuf[0] <= ' ')
+ outs(ANSI_COLOR(1;31)
+ " *** 因為開頭是空白或中文, 看板內左上角或按i的"
+ "板主名單會顯示為徵求中或無 ***"
+ ANSI_RESET "\n");
+ if (getdata(y + 4, 0, "確定此板主名單正確?[y/N] ", ans,
+ sizeof(ans), LCECHO) &&
+ ans[0] == 'y') {
+ strlcpy(newbh.BM, genbuf, sizeof(newbh.BM));
+ move(y + 1, 0); clrtobot();
+ break;
+ }
+ move(y, 0); clrtobot();
+ } while (1);
+ y++;
+
#ifdef CHESSCOUNTRY
if (HasUserPerm(PERM_SYSOP)) {
snprintf(genbuf, sizeof(genbuf), "%d", bh.chesscountry);
- if (getdata_str(16, 0,
+ if (getdata_str(y++, 0,
"設定棋國 (0)無 (1)五子棋 (2)象棋 (3)圍棋 (4) 黑白棋",
ans, sizeof(ans), NUMECHO, genbuf)){
newbh.chesscountry = atoi(ans);
@@ -685,6 +713,7 @@ m_mod_board(char *bname)
}
}
#endif /* defined(CHESSCOUNTRY) */
+
if (HasUserPerm(PERM_SYSOP|PERM_BOARD)) {
move(1, 0);
clrtobot();
@@ -692,6 +721,7 @@ m_mod_board(char *bname)
move(1, 0);
clrtobot();
}
+
{
const char* brd_symbol;
if (newbh.brdattr & BRD_GROUPBOARD)
@@ -706,9 +736,9 @@ m_mod_board(char *bname)
}
if (HasUserPerm(PERM_SYSOP|PERM_BOARD) && !(newbh.brdattr & BRD_HIDE)) {
- getdata_str(14, 0, "設定讀寫權限(Y/N)?", ans, sizeof(ans), LCECHO, "N");
+ getdata(y++, 0, "設定讀寫權限(y/N)?", ans, sizeof(ans), LCECHO);
if (*ans == 'y') {
- getdata_str(15, 0, "限制 [R]閱\讀 (P)發表?", ans, sizeof(ans), LCECHO,
+ getdata_str(y++, 0, "限制 [R]閱\讀 (P)發表?", ans, sizeof(ans), LCECHO,
"R");
if (*ans == 'p')
newbh.brdattr |= BRD_POSTMASK;