diff --git a/src/sbbs3/getnode.cpp b/src/sbbs3/getnode.cpp index 6da20be1db19b2f095888c5169e3f44701d4da38..b64c0d6746741c149f4a833d1f23ea6623a24f57 100644 --- a/src/sbbs3/getnode.cpp +++ b/src/sbbs3/getnode.cpp @@ -115,7 +115,7 @@ int sbbs_t::getnodedat(uint number, node_t *node, bool lockit) /* Assumes that getnodedat(node_num,&thisnode,0) was called right before it */ /* is called. */ /****************************************************************************/ -void sbbs_t::nodesync() +void sbbs_t::nodesync(bool clearline) { char str[256],today[32]; int atr=curatr; @@ -162,9 +162,9 @@ void sbbs_t::nodesync() } if(!(sys_status&SS_MOFF)) { if(thisnode.misc&NODE_MSGW) - getsmsg(useron.number); /* getsmsg clears MSGW flag */ + getsmsg(useron.number, clearline); /* getsmsg clears MSGW flag */ if(thisnode.misc&NODE_NMSG) - getnmsg(); /* getnmsg clears NMSG flag */ + getnmsg(clearline); /* getnmsg clears NMSG flag */ } } @@ -208,7 +208,7 @@ void sbbs_t::nodesync() /****************************************************************************/ /* Prints short messages waiting for this node, if any... */ /****************************************************************************/ -int sbbs_t::getnmsg() +int sbbs_t::getnmsg(bool clearline) { char str[MAX_PATH+1], *buf; int file; @@ -248,7 +248,9 @@ int sbbs_t::getnmsg() close(file); buf[length]=0; - if(cols) + if(clearline) + this->clearline(); + else if(cols) CRLF; putmsg(buf,P_NOATCODES); free(buf); @@ -308,9 +310,9 @@ int sbbs_t::getnodeext(uint number, char *ext) /****************************************************************************/ /* Prints short messages waiting for 'usernumber', if any... */ -/* then deletes them. */ +/* then truncates the file. */ /****************************************************************************/ -int sbbs_t::getsmsg(int usernumber) +int sbbs_t::getsmsg(int usernumber, bool clearline) { char str[MAX_PATH+1], *buf; int file; @@ -353,8 +355,11 @@ int sbbs_t::getsmsg(int usernumber) close(file); buf[length]=0; getnodedat(cfg.node_num,&thisnode,0); - if(cols) - CRLF; + if(clearline) + this->clearline(); + else + if(cols) + CRLF; strip_invalid_attr(buf); putmsg(buf,P_NOATCODES); free(buf); diff --git a/src/sbbs3/js_bbs.cpp b/src/sbbs3/js_bbs.cpp index beff9aab0dc6558f8912764bcf393f214afce7b6..0b6a63cef43f63c6f1ce26d18a32cae00bc54394 100644 --- a/src/sbbs3/js_bbs.cpp +++ b/src/sbbs3/js_bbs.cpp @@ -1202,17 +1202,22 @@ js_hangup(JSContext *cx, uintN argc, jsval *arglist) static JSBool js_nodesync(JSContext *cx, uintN argc, jsval *arglist) { + jsval* argv=JS_ARGV(cx, arglist); sbbs_t* sbbs; jsrefcount rc; + JSBool clearline = false; JS_SET_RVAL(cx, arglist, JSVAL_VOID); if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL) return(JS_FALSE); + if(argc > 0 && JSVAL_IS_BOOLEAN(argv[0])) + clearline = JSVAL_TO_BOOLEAN(argv[0]); + rc=JS_SUSPENDREQUEST(cx); sbbs->getnodedat(sbbs->cfg.node_num,&sbbs->thisnode,0); - sbbs->nodesync(); + sbbs->nodesync(clearline ? true : false); JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); @@ -2974,16 +2979,21 @@ js_private_chat(JSContext *cx, uintN argc, jsval *arglist) static JSBool js_get_node_message(JSContext *cx, uintN argc, jsval *arglist) { + jsval* argv=JS_ARGV(cx, arglist); sbbs_t* sbbs; jsrefcount rc; + JSBool clearline = false; JS_SET_RVAL(cx, arglist, JSVAL_VOID); if((sbbs=js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist)))==NULL) return(JS_FALSE); + if(argc > 0 && JSVAL_IS_BOOLEAN(argv[0])) + clearline = JSVAL_TO_BOOLEAN(argv[0]); + rc=JS_SUSPENDREQUEST(cx); - sbbs->getnmsg(); + sbbs->getnmsg(clearline ? true : false); JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); @@ -3063,10 +3073,10 @@ js_put_node_message(JSContext *cx, uintN argc, jsval *arglist) return JS_FALSE; /* Send the message(s) */ - BOOL result = TRUE; + BOOL success = TRUE; rc=JS_SUSPENDREQUEST(cx); if(nodenum < 0 ) { /* ALL */ - for(int i=1; i<=sbbs->cfg.sys_nodes; i++) { + for(int i=1; i<=sbbs->cfg.sys_nodes && success; i++) { if(i==sbbs->cfg.node_num) continue; sbbs->getnodedat(i, &node, false); @@ -3074,21 +3084,23 @@ js_put_node_message(JSContext *cx, uintN argc, jsval *arglist) || (sbbs->useron.level >= SYSOP_LEVEL && node.status==NODE_QUIET)) && (sbbs->useron.level >= SYSOP_LEVEL || !(node.misc&NODE_POFF))) if(putnmsg(&sbbs->cfg, i, msg) != 0) - result = FALSE; + success = FALSE; + } + if(success) { + sbbs->logline("C", "sent message to all nodes"); + sbbs->logline(nulstr, msg); } - sbbs->logline("C", "sent message to all nodes"); - sbbs->logline(nulstr, msg); } else { - result = putnmsg(&sbbs->cfg, nodenum, msg) == 0; - if(!(node.misc&NODE_ANON)) + success = putnmsg(&sbbs->cfg, nodenum, msg) == 0; + if(success && !(node.misc&NODE_ANON)) sbbs->bprintf(sbbs->text[MsgSentToUser],"Message" ,username(&sbbs->cfg,usernumber,tmp), usernumber); - SAFEPRINTF2(str, "sent message to %s on node %d:" - ,username(&sbbs->cfg, usernumber, tmp), nodenum); + SAFEPRINTF3(str, "%s message to %s on node %d:" + ,success ? "sent" : "FAILED to send", username(&sbbs->cfg, usernumber, tmp), nodenum); sbbs->logline("C",str); sbbs->logline(nulstr, msg); } - JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(result)); + JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(success)); JS_RESUMEREQUEST(cx, rc); free(msg); @@ -3102,6 +3114,7 @@ js_get_telegram(JSContext *cx, uintN argc, jsval *arglist) sbbs_t* sbbs; int32 usernumber; jsrefcount rc; + JSBool clearline = false; JS_SET_RVAL(cx, arglist, JSVAL_VOID); @@ -3113,9 +3126,11 @@ js_get_telegram(JSContext *cx, uintN argc, jsval *arglist) if(!JS_ValueToInt32(cx,argv[0],&usernumber)) return JS_FALSE; } + if(argc > 1 && JSVAL_IS_BOOLEAN(argv[1])) + clearline = JSVAL_TO_BOOLEAN(argv[1]); rc=JS_SUSPENDREQUEST(cx); - sbbs->getsmsg(usernumber); + sbbs->getsmsg(usernumber, clearline ? true : false); JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); @@ -3182,8 +3197,8 @@ js_put_telegram(JSContext *cx, uintN argc, jsval *arglist) int i=0; while(sbbs->online && i<5) { char line[256]; - sbbs->bprintf("%4s",nulstr); - if(!sbbs->getstr(line, 70, K_WRAP|K_MSG)) + sbbs->bputs("\1n: \1h"); + if(!sbbs->getstr(line, 70, i < 4 ? (K_WRAP|K_MSG) : (K_MSG))) break; sprintf(str,"%4s%s\r\n",nulstr,line); SAFECAT(buf, str); @@ -3206,15 +3221,17 @@ js_put_telegram(JSContext *cx, uintN argc, jsval *arglist) return(JS_FALSE); rc=JS_SUSPENDREQUEST(cx); - JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(putsmsg(&sbbs->cfg,usernumber,msg)==0)); + bool success = putsmsg(&sbbs->cfg,usernumber,msg)==0; + JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(success)); free(msg); - SAFEPRINTF2(str,"sent telegram to %s #%u" - ,username(&sbbs->cfg,usernumber,tmp), usernumber); + SAFEPRINTF3(str,"%s telegram to %s #%u" + ,success ? "sent" : "FAILED to send", username(&sbbs->cfg,usernumber,tmp), usernumber); sbbs->logline("C",str); if(logbuf[0]) sbbs->logline(nulstr,logbuf); - sbbs->bprintf(sbbs->text[MsgSentToUser], "Telegram", username(&sbbs->cfg,usernumber,tmp), usernumber); + if(success) + sbbs->bprintf(sbbs->text[MsgSentToUser], "Telegram", username(&sbbs->cfg,usernumber,tmp), usernumber); JS_RESUMEREQUEST(cx, rc); @@ -3896,9 +3913,10 @@ static jsSyncMethodSpec js_bbs_functions[] = { ,JSDOCSTR("hangup (disconnect) immediately") ,310 }, - {"node_sync", js_nodesync, 0, JSTYPE_ALIAS }, - {"nodesync", js_nodesync, 0, JSTYPE_VOID, JSDOCSTR("") - ,JSDOCSTR("synchronize with node database, checks for messages, interruption, etc. (AKA node_sync)") + {"node_sync", js_nodesync, 1, JSTYPE_ALIAS }, + {"nodesync", js_nodesync, 1, JSTYPE_VOID, JSDOCSTR("[clearline=<i>false</i>]") + ,JSDOCSTR("synchronize with node database, checks for messages, interruption, etc. (AKA node_sync), " + "clears the current console line if there's a message to print when <i>clearline</i> is <i>true</i>.") ,310 }, {"auto_msg", js_automsg, 0, JSTYPE_VOID, JSDOCSTR("") @@ -4159,7 +4177,7 @@ static jsSyncMethodSpec js_bbs_functions[] = { ,JSDOCSTR("enter private inter-node chat, or local sysop chat (if <i>local</i>=<i>true</i>)") ,310 }, - {"get_node_message",js_get_node_message,0, JSTYPE_VOID, JSDOCSTR("") + {"get_node_message",js_get_node_message,1, JSTYPE_VOID, JSDOCSTR("[clearline=<i>false</i>]") ,JSDOCSTR("receive and display an inter-node message") ,310 }, @@ -4167,7 +4185,7 @@ static jsSyncMethodSpec js_bbs_functions[] = { ,JSDOCSTR("send an inter-node message (specify a <i>node_number</i> value of <tt>-1</tt> for 'all active nodes')") ,31700 }, - {"get_telegram", js_get_telegram, 1, JSTYPE_VOID, JSDOCSTR("[user_number=<i>current</i>]") + {"get_telegram", js_get_telegram, 2, JSTYPE_VOID, JSDOCSTR("[user_number=<i>current</i>], [clearline=<i>false</i>]") ,JSDOCSTR("receive and display waiting telegrams for specified (or current) user") ,310 }, diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h index d4165da762eaaa0ba4e4a0f0bafac3c1f5494030..071468dd811fabed7d70b10b7afd4c4c474016a1 100644 --- a/src/sbbs3/sbbs.h +++ b/src/sbbs3/sbbs.h @@ -752,13 +752,13 @@ public: const char* atcode(char* sp, char* str, size_t maxlen); /* getnode.cpp */ - int getsmsg(int usernumber); - int getnmsg(void); + int getsmsg(int usernumber, bool clearline = false); + int getnmsg(bool clearline = false); int whos_online(bool listself);/* Lists active nodes, returns active nodes */ void nodelist(void); int getnodeext(uint number, char * str); int getnodedat(uint number, node_t * node, bool lock); - void nodesync(void); + void nodesync(bool clearline = false); user_t nodesync_user; bool nodesync_inside;