summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorscw <scw@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2004-05-15 20:30:41 +0800
committerscw <scw@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2004-05-15 20:30:41 +0800
commit567095c98731c804dab1c64cac7809aec1cc51d8 (patch)
tree6f117a5470d8467b12dc030a131c21071815a377
parenta8b87ec695abd673d76c148985b0f255d7083ae5 (diff)
downloadpttbbs-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.c2
-rw-r--r--mbbsd/io.c2
-rw-r--r--mbbsd/mbbsd.c4
-rw-r--r--mbbsd/menu.c3
-rw-r--r--mbbsd/screen.c6
-rw-r--r--mbbsd/stuff.c25
-rw-r--r--mbbsd/talk.c137
-rw-r--r--mbbsd/user.c5
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);
}
diff --git a/mbbsd/io.c b/mbbsd/io.c
index 9c50a248..6a10ffce 100644
--- a/mbbsd/io.c
+++ b/mbbsd/io.c
@@ -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