From d3d3960f8713fe5b9cacbf2e01134fc638e710ae Mon Sep 17 00:00:00 2001 From: deuce <> Date: Mon, 11 Jan 2016 06:59:14 +0000 Subject: [PATCH] Fix 'er up. Now appears to work. --- exec/hatchit.js | 245 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 243 insertions(+), 2 deletions(-) diff --git a/exec/hatchit.js b/exec/hatchit.js index 0b2106c7e9..f5c2f2d6d7 100644 --- a/exec/hatchit.js +++ b/exec/hatchit.js @@ -33,7 +33,7 @@ function pick_file() files = filedir.map(function(v){return format("%-12s - %s", v.name, v.desc);}); file = uifc.list(WIN_SAV|WIN_ACT|WIN_RHT, "Select File", files, fctx[dir]); if (file >= 0) - return files[file]; + return filedir[file]; return undefined; } @@ -71,9 +71,250 @@ function pick_file() return undefined; } +function pick_area() +{ + areas = Object.keys(tickit.acfg).sort(); + areas = areas.map(function(v){return v.toUpperCase();}); + area = uifc.list(WIN_ORG|WIN_SAV|WIN_BOT|WIN_MID, "Select Area", areas); + if (area >= 0) + return areas[area]; + return undefined; +} + +function pick_origin() +{ + var addr = uifc.list(WIN_ORG|WIN_SAV|WIN_BOT|WIN_MID, "Select Origin", system.fido_addr_list); + if (addr >= 0) + return system.fido_addr_list[addr]; + return undefined; +} + +function add_links(seenbys, links, list) +{ + var l; + var i; + + l = list.split(/,/); + for (i=0; i<l.length; i++) { + if (seenbys[l[i]] !== undefined) { + log(LOG_DEBUG, "Node "+l[i]+" has already seen this."); + continue; + } + links[l[i]]=''; + } +} + +function file_crc(fname) +{ + var f = new File(fname); + var crc; + + if (!f.open("rb")) { + uifc.msg("Unable to open file '"+f.name+"'."); + log(LOG_WARNING, "Unable to open file '"+f.name+"'."); + return false; + } + crc32 = crc32_calc(f.read()); + f.close(); + return crc32; +} + +function parse_addr(addr) +{ + var m; + var ret={}; + + m = addr.match(/^([0-9]+):/); + if (m !== null) + ret.zone = parseInt(m[1], 10); + + m = addr.match(/([0-9]+)\//); + if (m !== null) + ret.net = parseInt(m[1], 10); + + m = addr.match(/\/([0-9]+)/); + if (m !== null) + ret.node = parseInt(m[1], 10); + + m = addr.match(/\.([0-9]+)/); + if (m !== null) + ret.point = parseInt(m[1], 10); + + m = addr.match(/@.+$/); + if (m !== null) + ret.domain = m[1]; + + return ret; +} + +function get_zone(addr) +{ + var m; + + // Figure out the default zone. + m = addr.match(/^([0-9]+):/); + if (m===null) + return undefined; + return parseInt(m[1], 10); +} + +function hatch_file(file, area, origin) +{ + var seenbys={}; + var links={}; + var cfg; + var link; + var tf; + var ff; + var bf; + var defzone; + var addr; + var outb; + var flobase; + var pw; + var i; + var tic = {path:[], seenby:[]}; + var lfile; + var ldesc; + + defzone = get_zone(system.fido_addr_list[0]); + if (defzone === undefined) { + log(LOG_ERROR, "Unable to detect default zone!"); + return false; + } + + // Add us to the path... + tic.path.push(system.fido_addr_list[0]); + + // Add all our addresses... + system.fido_addr_list.forEach(function(addr) { + seenbys[addr]=''; + }); + + // Calculate links + if (tickit.gcfg.links !== undefined) + add_links(seenbys, links, tickit.gcfg.links); + cfg = tickit.acfg[area.toLowerCase()]; + if (cfg !== undefined && cfg.links !== undefined) + add_links(seenbys, links, cfg.links); + + // Add links to seenbys + for (i in links) + tic.seenby.push(i); + + // Now, start generating the TIC/FLO files... + for (link in links) { + if (!sbbsecho.is_flo) { + log(LOG_ERROR, "TickIT doesn't support non-FLO mailers."); + return false; + } + + pw = sbbsecho.get_pw(link); + if (pw===undefined) + pw = ''; + + // Figure out the outbound dir... + addr = parse_addr(link); + if (addr.zone === undefined) + addr.zone = defzone; + + if (addr.zone === undefined || addr.net === undefined || addr.node === undefined) { + log(LOG_ERROR, "Address '"+link+"' is invalid!"); + continue; + } + + outb = sbbsecho.outbound.replace(/[\\\/]+$/g, ''); + if (addr.zone !== defzone) + outb += format(".%03x", addr.zone); + outb = fullpath(outb); + outb = backslash(outb); + + // Create TIC file first... + tf = new File(outb+tickit.get_next_tic_filename()); + if(!tf.open("wb")) { + log(LOG_ERROR, "Unable to create TIC file for "+link+". He will not get file '"+file.name+"'!"); + continue; + } + tf.write('Area '+area+'\r\n'); + tf.write('Origin '+origin+'\r\n'); + tf.write('From '+system.fido_addr_list[0]+'\r\n'); + tf.write('To '+link+'\r\n'); + tf.write('File '+file.name+'\r\n'); + if (file_getcase(file.path).length > file.path.length) { + lfile = file_getcase(file.path); + lfile.replace(/^.*\\\/([^\\\/]+)$/,'$1'); + tf.write('Lfile '+lfile+'\r\n'); + } + tf.write('Size '+file_size(file.path)+'\r\n'); + tf.write('Date '+file_date(file.path)+'\r\n'); + tf.write('Desc '+file.desc+'\r\n'); + if (file.extdesc !== undefined) { + ldesc = file.extdesc.split(/\r?\n/); + ldesc.forEach(function(line) { + tf.write('Ldesc '+line+'\r\n'); + }); + } + tf.write('Created by TickIT '+"$Revision$".split(' ')[1]+'\r\n'); + tf.write('Crc '+file_crc(file.path)+'\r\n'); + for (i=0; i<tic.path.length; i++) + tf.write('Path '+tic.path[i]+'\r\n'); + for (i=0; i<tic.seenby.length; i++) + tf.write('Seenby '+tic.seenby[i]+'\r\n'); + tf.write('Pw '+pw+'\r\n'); + tf.close(); + + // Create bsy file... + flobase = outb+format("%04x%04x", addr.net, addr.node); + bf = new File(flobase+'.bsy'); + while (!bf.open('web+')) { + // TODO: This waits forever... + log(LOG_WARNING, "Waiting for BSY file '"+bf.name+"'..."); + mswait(1000); + } + + // Append to FLO file... + ff = new File(flobase+'.flo'); + if (!ff.open('ab+')) { + log(LOG_ERROR, "Unable to append to '"+ff.name+"' for "+link+". He will not get file '"+file.name+"'!"); + bf.close(); + bf.remove(); + continue; + } + ff.writeln(file.path); + ff.writeln('^'+tf.name); + ff.close(); + bf.close(); + bf.remove(); + } + + return true; +} + function main() { + var file; + var area; + var origin; + uifc.init('HatchIT'); - log("Hatching file: "+pick_file()); + file = pick_file(); + if (file === undefined || file.path === undefined) + return; + area = pick_area(); + if (area === undefined) + return; + origin = pick_origin(); + if (origin === undefined) + return; + var msg = 'Hatch file '+file.name+' into '+area+' from '+origin+'\r\n\r\n'+ + 'Desc: '+file.desc+'\r\n\r\n'+ + 'Long Desc:\r\n'+file.extdesc; + if (uifc.showhelp !== undefined) { + uifc.help_text = msg; + uifc.showhelp(); + } + if (uifc.list(WIN_MID, "Proceed?", ["No", "Yes"]) == 1) { + hatch_file(file, area, origin); + } uifc.bail(); } -- GitLab