Move more functions that are ansi specific to ANSIFrame

This commit is contained in:
Deon George 2020-07-30 00:15:48 +10:00
parent 17f2265249
commit d57311e935
4 changed files with 138 additions and 119 deletions

View File

@ -1,11 +1,26 @@
var FRAME_ANSI=(1<<1);
var ANSI_FRAME_LENGTH =22; /* Length of a frame */
var ANSI_FRAME_WIDTH =80; /* Width of a frame */
var ANSI_FRAME_WIDTH =80; /* Width of a frame */
var ANSI_FRAME_HEADER =56; /* Size of page owner (length) */
var ANSI_FRAME_PAGENUM =12; /* Size of page number (length with a-z) */
var ANSI_FRAME_COST = 9; /* Size of cost (length without unit) */
var ANSI_MSG_SENDORNOT ='\1n\1h\1GKEY 1 TO SEND, 2 NOT TO SEND';
var ANSI_MSG_LOGON ='\1n\1h\1GKEY 1 TO LOGON, 2 TO RETURN';
var ANSI_MSG_SENT ='\1n\1h\1GMESSAGE SENT - KEY # TO CONTINUE';
var ANSI_MSG_NOTSENT ='\1n\1h\1GMESSAGE NOT SENT - KEY # TO CONTINUE';
var ANSI_ERR_NO_PARENT ='\1n\1h\1RPARENT FRAME DOESNT EXIST';
var ANSI_ERR_NOT_IMPLEMENTED ='\1n\1h\1RNOT IMPLEMENTED YET?';
var ANSI_ERR_ROUTE ='\1n\1h\1WMISTAKE? \1GTRY AGAIN OR TELL US ON *08';
var ANSI_ERR_METHOD_NOT_EXIST ='\1n\1h\1WMISTAKE? \1GTRY AGAIN OR TELL US ON *08';
var ANSI_ACCESS_DENIED ='\1n\1h\1RACCESS DENIED. \1RMISTAKE? TRY AGAIN OR TELL US *08';
var ANSI_ALREADY_MEMBER ='\1n\1h\1RALREADY MEMBER OF CUG'
var ANSI_INACTIVITY ='\1n\1h\1RINACTIVITY ALERT, DISCONNECT PENDING...';
var ANSI_INACTIVE ='\1n\1h\1RINACTIVITY DISCONNECT';
var ANSI_NOACTION ='\1n\1h\1RNO ACTION PERFORMED';
var ANSI_BASESTAR ='\1N\1G\1H*';
// Our frame object
function ANSIFrame() {
this.version=1; // The version of this frame - in case we update functionality and we need to be
@ -34,17 +49,31 @@ function ANSIFrame() {
this.type = FRAME_TYPE_INFO; // The frame type - see FRAME_TYPES above
this.key=[ null,null,null,null,null,null,null,null,null,null ]; // Key actions [0-9]
/**
* Turn off the cursor
*/
this.cursorOff=function() {
ansi.send('ext_mode','clear','cursor');
console.gotoxy(0,24);
}
this.cursorOn=function(x,y) {
ansi.send('ext_mode','set','cursor');
console.gotoxy(x,y);
}
// Render the frame to the user
this.render=function(withHeader) {
log(LOG_DEBUG,'- ANSI FRAME');
owner = base64_decode(this.owner);
header = '\n\r';
log(LOG_DEBUG,'- FRAME User: ['+JSON.stringify(user)+']');
log(LOG_DEBUG,' - FRAME User: ['+JSON.stringify(user)+']');
// Dont show the page number on system login page
if (user.number || (this.type != FRAME_TYPE_LOGIN && NO_HISTORY_FRAMES.indexOf(this.page) == -1)) {
log(LOG_DEBUG,'- Owner: ['+this.pageowner+']');
log(LOG_DEBUG,' - Owner: ['+this.pageowner+']');
cost = (this.isAccessible ? this.cost+FRAME_COSTUNIT : ' -')
@ -54,10 +83,12 @@ function ANSIFrame() {
(console.screen_columns > 80 ? '\n\r' : '');
}
console.clear();
if ((this.type == FRAME_TYPE_LOGIN) || (this.type == FRAME_TYPE_RESPONSE)) {
return header+this.parse(base64_decode(this.content));
return console.putmsg(header+this.parse(base64_decode(this.content)));
} else {
return header+base64_decode(this.content);
return console.putmsg(header+base64_decode(this.content));
}
};
@ -75,7 +106,7 @@ function ANSIFrame() {
// Load a frame from disk (.tex file)
this.load = function(filename) {
log(LOG_DEBUG,'Loading frame from: '+filename);
log(LOG_DEBUG,'Loading ANSI frame from: '+filename);
f = new File(system.mods_dir+'ansitex/text/'+filename+'.tex');
if (! f.exists || ! f.open('r')) {
@ -349,6 +380,35 @@ function ANSIFrame() {
log(LOG_DEBUG,'Saved file: '+this.page+'.tex');
}
/**
* Send a message to the baseline.
*
* @param text
* @param reposition
*/
this.sendBaseline=function(text,reposition) {
eval('var msg = ANSI_'+text+';');
console.pushxy();
console.gotoxy(0,24);
console.print(msg);
console.cleartoeol();
if (! reposition) {
console.popxy();
}
}
this.clearBaseline=function(reposition) {
console.pushxy();
console.gotoxy(0,24);
console.print('');
console.cleartoeol();
if (! reposition) {
console.popxy();
}
}
Object.defineProperty(this,'accessible',{
get: function() {
log(LOG_DEBUG,'- Checking if user can access frame: '+this.page);

View File

@ -29,19 +29,6 @@ var FRAME_TYPE_RESPONSE ='r'; // Response frame, input fields are embedded in t
// response will be submitted to the Service Provider, or to a method
var FRAME_TYPE_LOGIN ='l'; // Login frame, enables the user to authenticate to the system, or to a CUG
var MSG_SENDORNOT ='\1n\1h\1GKEY 1 TO SEND, 2 NOT TO SEND';
var MSG_LOGON ='\1n\1h\1GKEY 1 TO LOGON, 2 TO RETURN';
var MSG_SENT ='\1n\1h\1GMESSAGE SENT - KEY # TO CONTINUE';
var MSG_NOTSENT ='\1n\1h\1GMESSAGE NOT SENT - KEY # TO CONTINUE';
var ERR_NO_PARENT ='\1n\1h\1RPARENT FRAME DOESNT EXIST';
var ERR_NOT_IMPLEMENTED ='\1n\1h\1RNOT IMPLEMENTED YET?';
var ERR_ROUTE ='\1n\1h\1WMISTAKE? \1GTRY AGAIN OR TELL US ON *08';
var ERR_METHOD_NOT_EXIST ='\1n\1h\1WMISTAKE? \1GTRY AGAIN OR TELL US ON *08';
var ACCESS_DENIED ='\1n\1h\1RACCESS DENIED. \1RMISTAKE? TRY AGAIN OR TELL US *08';
var ALREADY_MEMBER ='\1n\1h\1RALREADY MEMBER OF CUG'
var INACTIVITY ='\1n\1h\1RINACTIVITY ALERT, DISCONNECT PENDING...';
var INACTIVE ='\1n\1h\1RINACTIVITY DISCONNECT';
var NO_HISTORY_FRAMES =['980a','98b','981a'];
var SYSTEM_OWNER =9;
var INKEY_TIMEOUT =10000;

View File

@ -44,14 +44,6 @@ if (!String.prototype.repeat) {
};
}
/**
* Turn off the cursor
*/
function cursorOff() {
ansi.send('ext_mode','clear','cursor');
console.gotoxy(0,24);
}
/**
* Find a message base by code
*
@ -102,14 +94,14 @@ function getPageOwners() {
if (f.open("r")) {
var logo = f.iniGetValue('prefix','logo');
var users = f.iniGetValue('prefix','user');
log(LOG_DEBUG,'+ pageOwner: users='+JSON.stringify(users));
//log(LOG_DEBUG,'+ pageOwner: users='+JSON.stringify(users));
pageowners.push({prefix: 0,logo: logo,user:users});
f.iniGetSections('prefix:').forEach(function (prefix) {
var p = parseInt(prefix.substr(7));
var logo = f.iniGetValue(prefix,'logo','');
var users = f.iniGetValue(prefix,'user','');
log(LOG_DEBUG,'+ pageOwner: users='+JSON.stringify(users));
//log(LOG_DEBUG,'+ pageOwner: users='+JSON.stringify(users));
pageowners.push({prefix: p,logo: logo,user: users});
});
}
@ -119,7 +111,7 @@ function getPageOwners() {
// Sort the pageowners ascending
pageowners.sort(compare);
log(LOG_DEBUG,'+ pageOwner: pageowners='+JSON.stringify(pageowners));
//log(LOG_DEBUG,'+ pageOwner: pageowners='+JSON.stringify(pageowners));
}
return pageowners;
@ -193,7 +185,7 @@ function pageOwner(page) {
if (e !== BreakException) throw e;
}
log(LOG_DEBUG,'+ pageOwner: page='+page+', owner: '+JSON.stringify(o));
//log(LOG_DEBUG,'+ pageOwner: page='+page+', owner: '+JSON.stringify(o));
return o;
}
@ -236,21 +228,4 @@ function compare(a,b) {
return (a.prefix < b.prefix) ? 1 : ((b.prefix < a.prefix) ? -1 : 0);
}
/**
* Send a message to the baseline.
*
* @param text
* @param reposition
*/
function sendBaseline(text,reposition) {
console.pushxy();
console.gotoxy(0,24);
console.print(text);
console.cleartoeol();
if (! reposition) {
console.popxy();
}
}
this;

139
main.js
View File

@ -42,10 +42,8 @@ while(bbs.online) {
var control = []; // Methods that need to process input
var extendedkey = ''; // Current Extended Key being captured
ansi.send('ext_mode','clear','cursor');
while (action != ACTION_TERMINATE && action !=ACTION_EXIT) {
bbs.nodesync(false); // @todo Stop the display of telegrams
bbs.nodesync(); // @todo Stop the display of telegrams
var read = '';
var esc = false;
@ -95,12 +93,12 @@ while(bbs.online) {
if (read === '' && ! (user.security.exemptions&UFLAG_H) ) {
if (time() > timer+((user.number ? INACTIVE_LOGIN : INACTIVE_NOLOGIN)+INKEY_TIMEOUT)/1000) {
sendBaseline(INACTIVE,false);
fo.sendBaseline('INACTIVE',false);
bbs.hangup();
} else if (time() > timer+(user.number ? INACTIVE_LOGIN : INACTIVE_NOLOGIN)/1000) {
timeout = true;
sendBaseline(INACTIVITY,false);
fo.sendBaseline('INACTIVITY',false);
if (cf)
console.write(KEY_ESC+'['+cf.attribute.i+';'+cf.attribute.f+';'+cf.attribute.b+'m');
@ -108,7 +106,7 @@ while(bbs.online) {
} else {
if (timeout) {
sendBaseline('',false);
fo.clearBaseline(false);
if (cf)
console.write(KEY_ESC+'['+cf.attribute.i+';'+cf.attribute.f+';'+cf.attribute.b+'m');
@ -176,7 +174,7 @@ while(bbs.online) {
log(LOG_DEBUG,'- false: Key ['+read+'] ['+pageStr(next_page)+']');
} else {
sendBaseline(ERR_ROUTE,false);
fo.sendBaseline('ERR_ROUTE',false);
}
break;
@ -188,7 +186,7 @@ while(bbs.online) {
action = ACTION_GOTO;
} else {
sendBaseline(ERR_ROUTE,false);
fo.sendBaseline('ERR_ROUTE',false);
}
break;
}
@ -212,14 +210,14 @@ while(bbs.online) {
if (cmd == '00') {
action = ACTION_RELOAD;
cmd = '';
cursorOff();
fo.cursorOff();
break;
}
// Invalid system pages.
if (cmd.match(/^0[2367]/)) {
cursorOff();
sendBaseline(ERR_ROUTE, false);
fo.cursorOff();
fo.sendBaseline('ERR_ROUTE',false);
mode = action = false;
cmd = '';
}
@ -230,13 +228,13 @@ while(bbs.online) {
// If we are not a user
if (! user.number) {
cursorOff();
sendBaseline(ERR_ROUTE,false);
fo.cursorOff();
fo.sendBaseline('ERR_ROUTE',false);
action = false;
} else {
fe = { frame: page, index: read };
cursorOff();
fo.cursorOff();
action = ACTION_EDIT;
log(LOG_DEBUG,'- MODE_BL: EDIT ['+JSON.stringify(fe)+']');
@ -251,15 +249,15 @@ while(bbs.online) {
// Bookmark frame
if (cmd == '05') {
if (! user.number) {
cursorOff();
sendBaseline(ERR_ROUTE, false);
fo.cursorOff();
fo.sendBaseline('ERR_ROUTE',false);
mode = action = false;
cmd = '';
} else {
// @todo
cursorOff();
sendBaseline(ERR_NOT_IMPLEMENTED,false);
fo.cursorOff();
fo.sendBaseline('ERR_NOT_IMPLEMENTED',false);
mode = action = false;
cmd = '';
}
@ -270,15 +268,15 @@ while(bbs.online) {
// Report Problem
if (cmd == '08') {
if (! user.number) {
cursorOff();
sendBaseline(ERR_ROUTE, false);
fo.cursorOff();
fo.sendBaseline('ERR_ROUTE',false);
mode = action = false;
cmd = '';
} else {
// @todo
cursorOff();
sendBaseline(ERR_NOT_IMPLEMENTED,false);
fo.cursorOff();
fo.sendBaseline('ERR_NOT_IMPLEMENTED',false);
mode = action = false;
cmd = '';
}
@ -288,7 +286,7 @@ while(bbs.online) {
// Reload frame
if (cmd == '09') {
cursorOff();
fo.cursorOff();
action = ACTION_GOTO;
cmd = '';
next_page = { frame: fo.frame, index: fo.index};
@ -298,8 +296,8 @@ while(bbs.online) {
// Another star aborts the command
if (read == '*') {
sendBaseline('',false);
cursorOff();
fo.clearBaseline(false);
fo.cursorOff();
mode = action = false;
cmd = '';
@ -312,8 +310,7 @@ while(bbs.online) {
console.gotoxy(cf.c,cf.r);
console.write(KEY_ESC+'['+cf.attribute.i+';'+cf.attribute.f+';'+cf.attribute.b+'m');
console.write(cf.fchar.repeat(cf.fvalue.length));
console.gotoxy(cf.c,cf.r);
ansi.send('ext_mode','set','cursor');
fo.cursorOn(cf.c,cf.r);
cf.fvalue = '';
}
}
@ -322,7 +319,7 @@ while(bbs.online) {
// Nothing typed between * and #
// *# means go back
if (cmd == '') {
sendBaseline('',false);
fo.clearBaseline(false);
action = ACTION_BACKUP;
} else if (cmd == '0') {
@ -333,7 +330,7 @@ while(bbs.online) {
} else if (cmd == '04') {
// If we are not a user
if (! user.number) {
sendBaseline(ERR_ROUTE,false);
fo.sendBaseline('ERR_ROUTE',false);
action = false;
} else {
@ -346,7 +343,7 @@ while(bbs.online) {
}
// Clear the command we are finished processing...
cursorOff();
fo.cursorOff();
cmd = '';
mode = false;
}
@ -513,7 +510,7 @@ while(bbs.online) {
control[control.length-1].process();
} else if (fo.key[1] == '*' || fo.key[1].match(/[0-9]/)) {
sendBaseline('\1n\1h\1RNO ACTION PERFORMED',false);
fo.sendBaseline('NOACTION',false);
mode = MODE_RFSENT;
} else {
@ -554,7 +551,7 @@ while(bbs.online) {
$next_page = $ao->page;
} else {
sendBaseline(ERR_METHOD_NOT_EXIST,false);
fo.sendBaseline('ERR_METHOD_NOT_EXIST',false);
mode = MODE_RFSENT;
}
@ -572,7 +569,7 @@ while(bbs.online) {
mode = false;
} else {
sendBaseline(MSG_NOTSENT,false);
fo.sendBaseline('MSG_NOTSENT',false);
mode = MODE_RFNOTSENT;
}
@ -607,7 +604,7 @@ while(bbs.online) {
// Response form after Sent processing
case MODE_RFSENT:
ansi.send('ext_mode','clear','cursor');
fo.cursorOff();
switch (read) {
case '*':
@ -643,7 +640,7 @@ while(bbs.online) {
// Response form ERROR
case MODE_RFERROR:
cursorOff();
fo.cursorOff();
if (read == '#') {
/*
@ -688,8 +685,8 @@ while(bbs.online) {
// @todo If something on the baseline preserve it
ansi.send('ext_mode','set','cursor');
sendBaseline('\1N\1G\1H*',true);
fo.cursorOn(0,24);
fo.sendBaseline('BASESTAR',true);
action = false;
mode = MODE_BL;
@ -701,38 +698,20 @@ while(bbs.online) {
// Submitting forms
case ACTION_SUBMITRF:
action = false;
cursorOff();
fo.cursorOff();
log(LOG_DEBUG,'- ACTION_SUBMITRF: ['+fo.type+']');
sendBaseline((fo.type == 'l' ? MSG_LOGON : MSG_SENDORNOT),true);
fo.sendBaseline((fo.type == 'l' ? 'MSG_LOGON' : 'MSG_SENDORNOT'),true);
mode = MODE_SUBMITRF;
break;
// GO Backwards
case ACTION_BACKUP:
// Do we have anywhere to go, drop the current page from the history.
if (history.length > 1)
history.pop();
// @todo If in control...
next_page = (history.length > 0) ? history[history.length-1] : null;
log(LOG_DEBUG,'- ACTION_BACKUP: Backing up to ['+(next_page ? pageStr(next_page) : '')+'] current ['+fo.page+']');
// If there is no next page, we'll ignore the request.
if (! next_page || (pageStr(next_page) == fo.page)) {
action = false;
break;
}
// Edit a frame
case ACTION_EDIT:
log(LOG_DEBUG,'- ACTION_EDIT: ['+JSON.stringify(fe)+']');
if (! pageEditor(fe ? fe.frame : fo.frame)) {
cursorOff();
sendBaseline(ACCESS_DENIED,false);
fo.cursorOff();
fo.sendBaseline('ACCESS_DENIED',false);
action = false;
break;
}
@ -758,7 +737,7 @@ while(bbs.online) {
if (fo.page == null) {
fo = current;
// sendbaseline ERR_PAGE
sendBaseline(ERR_NO_PARENT,false);
fo.sendBaseline('ERR_NO_PARENT',false);
mode = action = false;
break;
}
@ -780,6 +759,24 @@ while(bbs.online) {
action = false;
break;
// GO Backwards
case ACTION_BACKUP:
// Do we have anywhere to go, drop the current page from the history.
if (history.length > 1)
history.pop();
// @todo If in control...
next_page = (history.length > 0) ? history[history.length-1] : null;
log(LOG_DEBUG,'- ACTION_BACKUP: Backing up to ['+(next_page ? pageStr(next_page) : '')+'] current ['+fo.page+']');
// If there is no next page, we'll ignore the request.
if (! next_page || (pageStr(next_page) == fo.page)) {
action = false;
break;
}
// Goto specific page
case ACTION_GOTO:
log(LOG_DEBUG,'- ACTION_GOTO: ['+(next_page ? pageStr(next_page) : '')+']');
@ -792,7 +789,7 @@ while(bbs.online) {
if (fo.page == null) {
fo = current;
// sendbaseline ERR_PAGE
sendBaseline(ERR_ROUTE,false);
fo.sendBaseline('ERR_ROUTE',false);
mode = action = false;
break;
}
@ -801,14 +798,14 @@ while(bbs.online) {
// If the user has access to the frame
if (fo.accessible) {
if (fo.isMember && fo.type == FRAME_TYPE_LOGIN) {
sendBaseline(ALREADY_MEMBER,false);
fo.sendBaseline(ALREADY_MEMBER,false);
mode = action = false;
break;
}
// Check if the frame exists, and the user is the Service Provider
} else {
sendBaseline(ACCESS_DENIED,false);
fo.sendBaseline('ACCESS_DENIED',false);
mode = action = false;
// Reset the current frame to what it was.
fo = current;
@ -837,7 +834,8 @@ while(bbs.online) {
// $this->sendBaseline($client,'');
// $current['baseline'] = '';
console.line_counter=0; // @todo fix to suppress a pause that is occurring before clear()
console.clear();
fo.cursorOff();
// Clear any controls
control = [];
bbs.replace_text(NodeActionMain,'\1h%s \1nViewing \1h*'+fo.frame+'#\1n ['+fo.index+']');
@ -847,7 +845,7 @@ while(bbs.online) {
switch(fo.type) {
// Terminate frame
case FRAME_TYPE_TERMINATE:
console.putmsg(fo.render());
fo.render();
mode = false;
action = ACTION_TERMINATE;
@ -877,7 +875,7 @@ while(bbs.online) {
default:
console.putmsg(JSON.stringify(content));
sendBaseline(ERR_ROUTE,false);
fo.sendBaseline('ERR_ROUTE',false);
action = false;
break;
}
@ -892,7 +890,7 @@ while(bbs.online) {
//log(LOG_DEBUG,'FRAME_TYPE_RESPONSE :'+fo.page+', FIELDS: '+fo.frame_fields.count);
fn = 0;
cf = null;
console.putmsg(fo.render());
fo.render();
if (fo.frame_fields.length) {
cf = fo.frame_fields[fn];
@ -900,14 +898,13 @@ while(bbs.online) {
if (cf) {
mode = MODE_FIELD;
ansi.send('ext_mode','set','cursor');
console.gotoxy(cf.c,cf.r);
fo.cursorOn(cf.c,cf.r);
console.write(KEY_ESC+'['+cf.attribute.i+';'+cf.attribute.f+';'+cf.attribute.b+'m');
// There were no editable fields.
} else {
mode = MODE_COMPLETE;
cursorOff();
fo.cursorOff();
}
} else {
@ -927,7 +924,7 @@ while(bbs.online) {
// Standard Frame
case FRAME_TYPE_INFO:
default:
console.putmsg(fo.render());
fo.render();
mode = action = false;
break;