diff --git a/core/bbs.js b/core/bbs.js index 99bbbffb..578a6295 100644 --- a/core/bbs.js +++ b/core/bbs.js @@ -8,7 +8,6 @@ var miscUtil = require('./misc_util.js'); var database = require('./database.js'); var clientConns = require('./client_connections.js'); -var iconv = require('iconv-lite'); var paths = require('path'); var async = require('async'); var util = require('util'); @@ -98,7 +97,9 @@ function initialize(cb) { process.exit(); }); - iconv.extendNodeEncodings(); + // Init some extensions + require('iconv-lite').extendNodeEncodings(); + require('string-format').extend(String.prototype, require('./string_util.js').stringFormatExtensions); callback(null); }, @@ -132,7 +133,7 @@ function initialize(cb) { userId : 1, names : [ 'real_name', 'sex', 'email_address' ], }; - + user.loadProperties(propLoadOpts, function propsLoaded(err, props) { if(!err) { conf.config.general.sysOp = { @@ -192,6 +193,7 @@ function startListening() { clientConns.addNewClient(client); client.on('ready', function onClientReady() { + // Go to module -- use default error handler prepareClient(client, function onPrepared() { require('./connect.js').connectEntry(client); diff --git a/core/connect.js b/core/connect.js index 819919ed..b326ed9e 100644 --- a/core/connect.js +++ b/core/connect.js @@ -85,10 +85,10 @@ function prepareTerminal(term) { function displayBanner(term) { // :TODO: add URL(s) to banner - term.pipeWrite(util.format( - '|33Conected to |32EN|33|01i|00|32|22GMA|32|01½|00 |33BBS version|31|01 %s\n' + + term.pipeWrite( + ('|33Conected to |32EN|33|01i|00|32|22GMA|32|01½|00 |33BBS version|31|01 {0}\n' + '|00|33Copyright (c) 2014-2015 Bryan Ashby |33|01- |31|01http://l33t.codes/\n' + - '|00', packageJson.version)); + '|00').format(packageJson.version)); } function connectEntry(client) { diff --git a/core/ftn_util.js b/core/ftn_util.js index a53d4a07..baf5668f 100644 --- a/core/ftn_util.js +++ b/core/ftn_util.js @@ -44,7 +44,8 @@ function getDateFromFtnDateTime(dateTime) { } function getFormattedFTNAddress(address, dimensions) { - var addr = util.format('%d:%d', address.zone, address.net); + //var addr = util.format('%d:%d', address.zone, address.net); + var addr = '{0}:{1}'.format(address.zone, address.net); switch(dimensions) { case 2 : case '2D' : @@ -53,18 +54,18 @@ function getFormattedFTNAddress(address, dimensions) { case 3 : case '3D' : - addr += util.format('/%d', address.node); + addr += '/{0}'.format(address.node); break; case 4 : case '4D': - addr += util.format('.%d', address.point || 0); // missing and 0 are equiv for point + addr += '.{0}'.format(address.point || 0); // missing and 0 are equiv for point break; case 5 : case '5D' : if(address.domain) { - addr += util.format('@%s', address.domain); + addr += '@{0}'.format(address.domain); } break; } diff --git a/core/message_area.js b/core/message_area.js index 89069ca6..a3288f74 100644 --- a/core/message_area.js +++ b/core/message_area.js @@ -87,9 +87,9 @@ function getMessageListForArea(options, areaName, cb) { [ function fetchMessages(callback) { msgDb.each( - 'SELECT message_id, message_uuid, reply_to_message_id, to_user_name, from_user_name, subject, modified_timestamp, view_count ' - 'FROM message ' - 'WHERE area_name=? ' + 'SELECT message_id, message_uuid, reply_to_message_id, to_user_name, from_user_name, subject, modified_timestamp, view_count ' + + 'FROM message ' + + 'WHERE area_name=? ' + 'ORDER BY message_id;', [ areaName.toLowerCase() ], function msgRow(err, row) { diff --git a/core/string_util.js b/core/string_util.js index 6fb8f7a7..8aaae22a 100644 --- a/core/string_util.js +++ b/core/string_util.js @@ -177,17 +177,40 @@ function debugEscapedString(s) { return JSON.stringify(s).slice(1, -1); } -function format(fmt) { - if (!arguments.length) { - return fmt; - } - - var args = typeof arguments[1]; - args = (("string" === args || "number" === args) ? arguments : arguments[1]); - - for(var arg in args) { - fmt = fmt.replace(RegExp("\\{" + arg + "\\}", "gi"), args[arg]); - } - - return fmt; -} +// +// Extend String.format's object syntax with some modifiers +// e.g.: '{username!styleL33t}'.format( { username : 'Leet User' } ) -> "L33t U53r" +// +var stringFormatExtensions = { + styleUpper : function(s) { + return stylizeString(s, 'upper'); + }, + styleLower : function(s) { + return stylizeString(s, 'lower'); + }, + styleTitle : function(s) { + return stylizeString(s, 'title'); + }, + styleFirstLower : function(s) { + return stylizeString(s, 'first lower'); + }, + styleSmallVowels : function(s) { + return stylizeString(s, 'small vowels'); + }, + styleBigVowels : function(s) { + return stylizeString(s, 'big vowels'); + }, + styleSmallI : function(s) { + return stylizeString(s, 'small i'); + }, + styleMixed : function(s) { + return stylizeString(s, 'mixed'); + }, + styleL33t : function(s) { + return stylizeString(s, 'l33t'); + } + + // :TODO: Add padding/etc. modifiers. +}; + +exports.stringFormatExtensions = stringFormatExtensions; \ No newline at end of file diff --git a/mods/msg_area_list.js b/mods/msg_area_list.js index 107cf4a1..50335257 100644 --- a/mods/msg_area_list.js +++ b/mods/msg_area_list.js @@ -104,9 +104,8 @@ MessageAreaListModule.prototype.mciReady = function(mciData, cb) { function populateAreaListView(callback) { var areaListItems = []; for(var i = 0; i < self.messageAreas.length; ++i) { - areaListItems.push(strUtil.format( - self.entryFormat, - { index : i, name : self.messageAreas[i].name, desc : self.messageAreas[i].desc }) + areaListItems.push(self.entryFormat.format( + { index : i, name : self.messageAreas[i].name, desc : self.messageAreas[i].desc } ) ); } diff --git a/package.json b/package.json index 8f6b9f8f..d0eb6f51 100644 --- a/package.json +++ b/package.json @@ -13,12 +13,12 @@ "sqlite3" : "3.0.x", "ssh2" : "0.4.x", "strip-json-comments" : "1.0.x", - "gapbuffer" : "0.0.2", "node-uuid" : "1.4.x", "moment" : "2.10.x", "gaze" : "0.5.x", "mkdirp" : "0.5.x", - "pty.js" : "0.2.x" + "pty.js" : "0.2.x", + "string-format" : "0.5.x" }, "engine" : "node >= 0.12.2" } \ No newline at end of file