diff options
author | scw <scw@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2004-05-15 20:30:41 +0800 |
---|---|---|
committer | scw <scw@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2004-05-15 20:30:41 +0800 |
commit | 567095c98731c804dab1c64cac7809aec1cc51d8 (patch) | |
tree | 6f117a5470d8467b12dc030a131c21071815a377 | |
parent | a8b87ec695abd673d76c148985b0f255d7083ae5 (diff) | |
download | pttbbs-567095c98731c804dab1c64cac7809aec1cc51d8.tar pttbbs-567095c98731c804dab1c64cac7809aec1cc51d8.tar.gz pttbbs-567095c98731c804dab1c64cac7809aec1cc51d8.tar.bz2 pttbbs-567095c98731c804dab1c64cac7809aec1cc51d8.tar.lz pttbbs-567095c98731c804dab1c64cac7809aec1cc51d8.tar.xz pttbbs-567095c98731c804dab1c64cac7809aec1cc51d8.tar.zst pttbbs-567095c98731c804dab1c64cac7809aec1cc51d8.zip |
First throughing and replying done.
git-svn-id: http://opensvn.csie.org/pttbbs/branches/scw.angel@1987 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
-rw-r--r-- | mbbsd/friend.c | 2 | ||||
-rw-r--r-- | mbbsd/io.c | 2 | ||||
-rw-r--r-- | mbbsd/mbbsd.c | 4 | ||||
-rw-r--r-- | mbbsd/menu.c | 3 | ||||
-rw-r--r-- | mbbsd/screen.c | 6 | ||||
-rw-r--r-- | mbbsd/stuff.c | 25 | ||||
-rw-r--r-- | mbbsd/talk.c | 137 | ||||
-rw-r--r-- | mbbsd/user.c | 5 |
8 files changed, 137 insertions, 47 deletions
diff --git a/mbbsd/friend.c b/mbbsd/friend.c index eea78bdc..92977969 100644 --- a/mbbsd/friend.c +++ b/mbbsd/friend.c @@ -312,7 +312,7 @@ friend_water(char *message, int type) if ((tuid = searchuser(userid)) && tuid != usernum && (uentp = (userinfo_t *) search_ulist(tuid)) && isvisible_uid(tuid)) - my_write(uentp->pid, message, uentp->userid, 1, NULL); + my_write(uentp->pid, message, uentp->userid, WATERBALL_PREEDIT, NULL); } fclose(fp); } @@ -293,7 +293,7 @@ igetch() show_call_in(0, 0); watermode = 0; my_write(currutmp->msgs[0].pid, "水球丟過去 : ", - currutmp->msgs[0].userid, 0, NULL); + currutmp->msgs[0].userid, WATERBALL_GENERAL, NULL); i_newfd = my_newfd; /* 還原螢幕 */ diff --git a/mbbsd/mbbsd.c b/mbbsd/mbbsd.c index d881c2b2..14f010d6 100644 --- a/mbbsd/mbbsd.c +++ b/mbbsd/mbbsd.c @@ -794,6 +794,8 @@ setup_utmp(int mode) #endif if (enter_uflag & CLOAK_FLAG) uinfo.invisible = YEA; + if (cuser.uflag2 & BEING_ANGEL) + uinfo.being_angel = 1; getnewutmpent(&uinfo); SHM->UTMPneedsort = 1; if (!(cuser.numlogins % 20) && cuser.userlevel & PERM_BM) @@ -1010,7 +1012,7 @@ do_aloha(char *hello) userinfo_t *uentp; if ((uentp = (userinfo_t *) search_ulist_userid(userid)) && isvisible(uentp, currutmp)) { - my_write(uentp->pid, genbuf, uentp->userid, 2, NULL); + my_write(uentp->pid, genbuf, uentp->userid, WATERBALL_ALOHA, NULL); } } fclose(fp); diff --git a/mbbsd/menu.c b/mbbsd/menu.c index 4a4fcb8a..c621dac4 100644 --- a/mbbsd/menu.c +++ b/mbbsd/menu.c @@ -291,6 +291,9 @@ domenu(int cmdmode, char *cmdtitle, int cmd, commands_t cmdtable[]) while (++i <= total) if (cmdtable[i].desc[1] == cmd) break; + if (cmd == 'H' && i > total){ + /* TODO: Add menu help */ + } } if (i > total || !HAS_PERM(cmdtable[i].level)) diff --git a/mbbsd/screen.c b/mbbsd/screen.c index 43df3757..94a42d60 100644 --- a/mbbsd/screen.c +++ b/mbbsd/screen.c @@ -394,7 +394,7 @@ outc(unsigned char ch) } int -edit_outs(char *text) +edit_outs(const char *text) { register int column = 0; register char ch; @@ -405,7 +405,7 @@ edit_outs(char *text) } void -outs(char *str) +outs(const char *str) { while (*str) { outc(*str++); @@ -414,7 +414,7 @@ outs(char *str) /* Jaky */ void -out_lines(char *str, int line) +out_lines(const char *str, int line) { while (*str && line) { outc(*str); diff --git a/mbbsd/stuff.c b/mbbsd/stuff.c index e088b116..1debf67b 100644 --- a/mbbsd/stuff.c +++ b/mbbsd/stuff.c @@ -422,6 +422,29 @@ pressanykey() refresh(); } +void +pressanykey_or_callangel(){ + int ch; + + outmsg("\033[37;45;1m \033[33m(h)\033[37m 呼叫小天使 " + "● 請按 \033[33m(Space/Return)\033[37m 繼續 ●" + " \033[33m(^T)\033[37m 存暫存檔 \033[m"); + do { + ch = igetkey(); + + if (ch == Ctrl('T')) { + capture_screen(); + break; + }else if (ch == 'h' || ch == 'H'){ + CallAngel(); + break; + } + } while ((ch != ' ') && (ch != KEY_LEFT) && (ch != '\r') && (ch != '\n')); + move(b_lines, 0); + clrtoeol(); + refresh(); +} + int vmsg(const char *fmt,...) { @@ -606,7 +629,7 @@ show_help(char *helptext[]) else prints(" %s\n", str); } - pressanykey(); + pressanykey_or_callangel(); } #endif // _BBS_UTIL_C_ diff --git a/mbbsd/talk.c b/mbbsd/talk.c index 31846c54..a724cf03 100644 --- a/mbbsd/talk.c +++ b/mbbsd/talk.c @@ -556,7 +556,7 @@ my_write2(void) 80 - strlen(tw->userid) - 6, DOECHO)) break; - if (my_write(tw->pid, msg, tw->userid, 4, tw->uin)) + if (my_write(tw->pid, msg, tw->userid, WATERBALL_CONFIRM, tw->uin)) strncpy(tw->msg[5].last_call_in, t_last_write, sizeof(tw->msg[5].last_call_in)); break; @@ -575,12 +575,15 @@ my_write2(void) /* * 被呼叫的時機: - * 1. 丟群組水球 flag = 1 (pre-edit) - * 2. 回水球 flag = 0 - * 3. 上站aloha flag = 2 (pre-edit) - * 4. 廣播 flag = 3 if SYSOP, otherwise flag = 1 (pre-edit) - * 5. 丟水球 flag = 0 - * 6. my_write2 flag = 4 (pre-edit) but confirm + * 1. 丟群組水球 flag = WATERBALL_PREEDIT, 1 (pre-edit) + * 2. 回水球 flag = WATERBALL_GENERAL, 0 + * 3. 上站aloha flag = WATERBALL_ALOHA, 2 (pre-edit) + * 4. 廣播 flag = WATERBALL_SYSOP, 3 if SYSOP + * flag = WATERBALL_PREEDIT, 1 otherwise + * 5. 丟水球 flag = WATERBALL_GENGRAL, 0 + * 6. my_write2 flag = WATERBALL_CONFIRM, 4 (pre-edit but confirm) + * 7. (when defined PLAY_ANGEL) + * 呼叫小天使 flag = WATERBALL_ANGEL, 5 (隱藏 id) */ int my_write(pid_t pid, char *prompt, char *id, int flag, userinfo_t * puin) @@ -594,7 +597,10 @@ my_write(pid_t pid, char *prompt, char *id, int flag, userinfo_t * puin) uin = (puin != NULL) ? puin : (userinfo_t *) search_ulist_pid(pid); strlcpy(destid, id, sizeof(destid)); - if (!uin && !(flag == 0 && water_which->count > 0)) { + if (strcmp(id, "小主人") == 0) + flag = WATERBALL_ANSWER; + + if (!uin && !(flag == WATERBALL_GENERAL && water_which->count > 0)) { outmsg("\033[1;33;41m糟糕! 對方已落跑了(不在站上)! \033[37m~>_<~\033[m"); clrtoeol(); refresh(); @@ -607,7 +613,11 @@ my_write(pid_t pid, char *prompt, char *id, int flag, userinfo_t * puin) ptime = localtime(&now); - if (flag == 0) { + if (flag == WATERBALL_GENERAL +#ifdef PLAY_ANGEL + || flag == WATERBALL_ANGEL +#endif + ) { /* 一般水球 */ watermode = 0; if (!(len = getdata(0, 0, prompt, msg, 56, DOECHO))) { @@ -634,8 +644,13 @@ my_write(pid_t pid, char *prompt, char *id, int flag, userinfo_t * puin) } strip_ansi(msg, msg, STRIP_ALL); - if (uin && *uin->userid && (flag == 0 || flag == 4)) { - snprintf(buf, sizeof(buf), "丟給 %s : %s [Y/n]?", uin->userid, msg); + if (uin && *uin->userid && + (flag == WATERBALL_GENERAL || flag == WATERBALL_CONFIRM +#ifdef PLAY_ANGEL + || flag == WATERBALL_ANGEL +#endif + )) { + snprintf(buf, sizeof(buf), "丟給 %s : %s [Y/n]?", destid, msg); getdata(0, 0, buf, genbuf, 3, LCECHO); if (genbuf[0] == 'n') { outmsg("\033[1;33;42m算了! 放你一馬...\033[m"); @@ -649,7 +664,11 @@ my_write(pid_t pid, char *prompt, char *id, int flag, userinfo_t * puin) } } watermode = -1; - if (!uin || !*uin->userid || strcasecmp(destid, uin->userid)) { + if (!uin || !*uin->userid || (strcasecmp(destid, uin->userid) +#ifdef PLAY_ANGEL + && strcmp(destid, "小主人") +#endif + )) { outmsg("\033[1;33;41m糟糕! 對方已落跑了(不在站上)! \033[37m~>_<~\033[m"); clrtoeol(); refresh(); @@ -659,7 +678,7 @@ my_write(pid_t pid, char *prompt, char *id, int flag, userinfo_t * puin) return 0; } fri_stat = friend_stat(currutmp, uin); - if (flag != 2) { /* aloha 的水球不用存下來 */ + if (flag != WATERBALL_ALOHA) { /* aloha 的水球不用存下來 */ /* 存到自己的水球檔 */ if (!fp_writelog) { sethomefile(genbuf, cuser.userid, fn_writelog); @@ -667,17 +686,21 @@ my_write(pid_t pid, char *prompt, char *id, int flag, userinfo_t * puin) } if (fp_writelog) { fprintf(fp_writelog, "To %s: %s [%s]\n", - uin->userid, msg, Cdatelite(&now)); - snprintf(t_last_write, 66, "To %s: %s", uin->userid, msg); + destid, msg, Cdatelite(&now)); + snprintf(t_last_write, 66, "To %s: %s", destid, msg); } } - if (flag == 3 && uin->msgcount) { + if (flag == WATERBALL_SYSOP && uin->msgcount) { /* 不懂 */ uin->destuip = currutmp - &SHM->uinfo[0]; uin->sig = 2; if (uin->pid > 0) kill(uin->pid, SIGUSR1); - } else if (flag != 2 && + } else if (flag != WATERBALL_ALOHA && +#ifdef PLAY_ANGEL + flag != WATERBALL_ANGEL && + /* angel accept or not is checked outside */ +#endif !HAS_PERM(PERM_SYSOP) && (uin->pager == 3 || uin->pager == 2 || @@ -692,12 +715,18 @@ my_write(pid_t pid, char *prompt, char *id, int flag, userinfo_t * puin) uin->msgcount = write_pos + 1; uin->pager = 2; uin->msgs[write_pos].pid = currpid; - strlcpy(uin->msgs[write_pos].userid, cuser.userid, +#ifdef PLAY_ANGEL + if (flag == WATERBALL_ANGEL) + strlcpy(uin->msgs[write_pos].userid, "小主人", sizeof(uin->msgs[write_pos].userid)); + else +#endif + strlcpy(uin->msgs[write_pos].userid, cuser.userid, + sizeof(uin->msgs[write_pos].userid)); strlcpy(uin->msgs[write_pos].last_call_in, msg, sizeof(uin->msgs[write_pos].last_call_in)); uin->pager = pager0; - } else if (flag != 2) + } else if (flag != WATERBALL_ALOHA) outmsg("\033[1;33;41m糟糕! 對方不行了! (收到太多水球) \033[37m@_@\033[m"); if (uin->msgcount >= 1 && @@ -706,11 +735,12 @@ my_write(pid_t pid, char *prompt, char *id, int flag, userinfo_t * puin) #else (uin->pid <= 0 || kill(uin->pid, SIGUSR2) == -1) #endif - && flag != 2) + && flag != WATERBALL_ALOHA) outmsg("\033[1;33;41m糟糕! 沒打中! \033[37m~>_<~\033[m"); - else if (uin->msgcount == 1 && flag != 2) + else if (uin->msgcount == 1 && flag != WATERBALL_ALOHA) outmsg("\033[1;33;44m水球砸過去了! \033[37m*^o^*\033[m"); - else if (uin->msgcount > 1 && uin->msgcount < MAX_MSGS && flag != 2) + else if (uin->msgcount > 1 && uin->msgcount < MAX_MSGS && + flag != WATERBALL_ALOHA) outmsg("\033[1;33;44m再補上一粒! \033[37m*^o^*\033[m"); } @@ -1869,7 +1899,7 @@ call_in(userinfo_t * uentp, int fri_stat) if (iswritable_stat(uentp, fri_stat)) { char genbuf[60]; snprintf(genbuf, sizeof(genbuf), "Call-In %s :", uentp->userid); - my_write(uentp->pid, genbuf, uentp->userid, 0, NULL); + my_write(uentp->pid, genbuf, uentp->userid, WATERBALL_GENERAL, NULL); return 1; } return 0; @@ -2187,7 +2217,7 @@ userlist(void) uentp = SHM->sorted[SHM->currsorted][0][i]; if (uentp->pid && kill(uentp->pid, 0) != -1) my_write(uentp->pid, genbuf, - uentp->userid, 1, NULL); + uentp->userid, WATERBALL_PREEDIT, NULL); if (i % 100 == 0) sleep(1); } @@ -2207,8 +2237,8 @@ userlist(void) uentp->pager != 3 && (uentp->pager != 4 || frstate & HFM) && !(frstate & IRH)) { - my_write(uentp->pid, genbuf, - uentp->userid, 1, NULL); + my_write(uentp->pid, genbuf, uentp->userid, + WATERBALL_PREEDIT, NULL); } } } @@ -2725,6 +2755,7 @@ talkreply(void) * outs(uentry); linecnt = 0; clrtoeol(); move(++lineno, 0); } return 0; } */ +#ifdef PLAY_ANGEL /* 小天使小主人處理函式 */ int t_changeangel(){ @@ -2742,23 +2773,52 @@ t_changeangel(){ static int FindAngel(void){ + /* TODO: randomized choose an online angel, shouldn't be them self */ + //strlcpy(cuser.myangel, "scw", IDLEN + 1); + //return 1; return 0; } static void +NoAngelFound(const char* msg){ + move(b_lines, 0); + outs(msg); + if (currutmp->mode != EDITING) + outs(",請先在新手板上尋找答案或發問"); + refresh(); + sleep(1); + if (currutmp->mode != EDITING){ + char old_board[IDLEN + 1] = ""; + if (currboard) + strlcpy(old_board, currboard, IDLEN + 1); + + brc_initial_board("PttNewHand"); + Read(); + + if (old_board[0]) + brc_initial_board(old_board); + } + return; +} + +static void TalkToAngel(){ - if( cuser.myangel[0] == 0 ) - if( ! FindAngel() ){ - move(b_lines, 0); - outs("現在沒有小天使在線上,請先在新手板上尋找答案或發問"); - refresh(); - sleep(1); - if( currutmp->mode != EDITING ){ - brc_initial_board("PttNewHand"); - Read(); - } - return; - } + userinfo_t* uent; + char buf[128]; + if (cuser.myangel[0] == 0 && ! FindAngel()){ + NoAngelFound("現在沒有小天使在線上"); + return; + } + + uent = search_ulist_userid(cuser.myangel); + if (uent == 0 || !uent->being_angel){ + NoAngelFound("您的小天使現在不在線上"); + return; + } + + /* TODO: complete first name-hiden waterball */ + snprintf(buf, 128, "問小天使 %s:", cuser.myangel); + my_write(uent->pid, buf, cuser.myangel, WATERBALL_ANGEL, uent); return; } @@ -2776,3 +2836,4 @@ CallAngel(){ free(screen0); redoscr(); } +#endif diff --git a/mbbsd/user.c b/mbbsd/user.c index a4ca8e02..55cb1ceb 100644 --- a/mbbsd/user.c +++ b/mbbsd/user.c @@ -244,10 +244,9 @@ static void Customize(void) getdata(b_lines - 1, 0, "請按 [A-F] 切換設定,按 [Return] 結束:", ans, 3, DOECHO); }else -#else +#endif getdata(b_lines - 1, 0, "請按 [A-E] 切換設定,按 [Return] 結束:", ans, 3, DOECHO); -#endif switch( ans[0] ){ case 'A': @@ -286,11 +285,13 @@ static void Customize(void) case 'e': cuser.uflag2 ^= FAVNOHILIGHT; break; + #ifdef PLAY_ANGEL case 'F': case 'f': if( HAS_PERM(PERM_ANGEL) ){ cuser.uflag2 ^= BEING_ANGEL; + currutmp->being_angel ^= 1; break; } #endif |