From 50dda3300a94516735e7ebb6b8073f6fa2dddea5 Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Wed, 10 May 2017 21:17:19 -0600 Subject: [PATCH] Faster, better predefined MCI handling --- core/predefined_mci.js | 330 +++++++++++++++++++++-------------------- 1 file changed, 169 insertions(+), 161 deletions(-) diff --git a/core/predefined_mci.js b/core/predefined_mci.js index 25697a13..68998044 100644 --- a/core/predefined_mci.js +++ b/core/predefined_mci.js @@ -48,174 +48,182 @@ function userStatAsString(client, statName, defaultValue) { return (StatLog.getUserStat(client.user, statName) || defaultValue).toString(); } +const PREDEFINED_MCI_GENERATORS = { + // + // Board + // + BN : function boardName() { return Config.general.boardName; }, + + // ENiGMA + VL : function versionLabel() { return 'ENiGMA½ v' + packageJson.version; }, + VN : function version() { return packageJson.version; }, + + // +op info + SN : function opUserName() { return StatLog.getSystemStat('sysop_username'); }, + SR : function opRealName() { return StatLog.getSystemStat('sysop_real_name'); }, + SL : function opLocation() { return StatLog.getSystemStat('sysop_location'); }, + SA : function opAffils() { return StatLog.getSystemStat('sysop_affiliation'); }, + SS : function opSex() { return StatLog.getSystemStat('sysop_sex'); }, + SE : function opEmail() { return StatLog.getSystemStat('sysop_email_address'); }, + // :TODO: op age, web, ????? + + // + // Current user / session + // + UN : function userName(client) { return client.user.username; }, + UI : function userId(client) { return client.user.userId.toString(); }, + UG : function groups(client) { return _.values(client.user.groups).join(', '); }, + UR : function realName(client) { return userStatAsString(client, 'real_name', ''); }, + LO : function location(client) { return userStatAsString(client, 'location', ''); }, + UA : function age(client) { return client.user.getAge().toString(); }, + BD : function birthdate(client) { return moment(client.user.properties.birthdate).format(client.currentTheme.helpers.getDateFormat()); }, // iNiQUiTY + US : function sex(client) { return userStatAsString(client, 'sex', ''); }, + UE : function emailAddres(client) { return userStatAsString(client, 'email_address', ''); }, + UW : function webAddress(client) { return userStatAsString(client, 'web_address', ''); }, + UF : function affils(client) { return userStatAsString(client, 'affiliation', ''); }, + UT : function themeId(client) { return userStatAsString(client, 'theme_id', ''); }, + UC : function loginCount(client) { return userStatAsString(client, 'login_count', 0); }, + ND : function connectedNode(client) { return client.node.toString(); }, + IP : function clientIpAddress(client) { return client.remoteAddress; }, + ST : function serverName(client) { return client.session.serverName; }, + FN : function activeFileBaseFilterName(client) { + const activeFilter = FileBaseFilters.getActiveFilter(client); + return activeFilter ? activeFilter.name : ''; + }, + DN : function userNumDownloads(client) { return userStatAsString(client, 'dl_total_count', 0); }, // Obv/2 + DK : function userByteDownload(client) { // Obv/2 uses DK=downloaded Kbytes + const byteSize = StatLog.getUserStatNum(client.user, 'dl_total_bytes'); + return formatByteSize(byteSize, true); // true=withAbbr + }, + UP : function userNumUploadsclient(client) { return userStatAsString(client, 'ul_total_count', 0); }, // Obv/2 + UK : function userByteUpload(client) { // Obv/2 uses UK=uploaded Kbytes + const byteSize = StatLog.getUserStatNum(client.user, 'ul_total_bytes'); + return formatByteSize(byteSize, true); // true=withAbbr + }, + NR : function userUpDownRatio(client) { // Obv/2 + return getRatio(client, 'ul_total_count', 'dl_total_count'); + }, + KR : function userUpDownByteRatio(client) { // Obv/2 uses KR=upload/download Kbyte ratio + return getRatio(client, 'ul_total_bytes', 'dl_total_bytes'); + }, + + MS : function accountCreatedclient(client) { return moment(client.user.properties.account_created).format(client.currentTheme.helpers.getDateFormat()); }, + PS : function userPostCount(client) { return userStatAsString(client, 'post_count', 0); }, + PC : function userPostCallRatio(client) { return getRatio(client, 'post_count', 'login_count'); }, + + MD : function currentMenuDescription(client) { + return _.has(client, 'currentMenuModule.menuConfig.desc') ? client.currentMenuModule.menuConfig.desc : ''; + }, + + MA : function messageAreaName(client) { + const area = getMessageAreaByTag(client.user.properties.message_area_tag); + return area ? area.name : ''; + }, + MC : function messageConfName(client) { + const conf = getMessageConferenceByTag(client.user.properties.message_conf_tag); + return conf ? conf.name : ''; + }, + ML : function messageAreaDescription(client) { + const area = getMessageAreaByTag(client.user.properties.message_area_tag); + return area ? area.desc : ''; + }, + CM : function messageConfDescription(client) { + const conf = getMessageConferenceByTag(client.user.properties.message_conf_tag); + return conf ? conf.desc : ''; + }, + + SH : function termHeight(client) { return client.term.termHeight.toString(); }, + SW : function termWidth(client) { return client.term.termWidth.toString(); }, + + // + // Date/Time + // + // :TODO: change to CD for 'Current Date' + DT : function date(client) { return moment().format(client.currentTheme.helpers.getDateFormat()); }, + CT : function time(client) { return moment().format(client.currentTheme.helpers.getTimeFormat()) ;}, + + // + // OS/System Info + // + OS : function operatingSystem() { + return { + linux : 'Linux', + darwin : 'Mac OS X', + win32 : 'Windows', + sunos : 'SunOS', + freebsd : 'FreeBSD', + }[os.platform()] || os.type(); + }, + + OA : function systemArchitecture() { return os.arch(); }, + + SC : function systemCpuModel() { + // + // Clean up CPU strings a bit for better display + // + return os.cpus()[0].model + .replace(/\(R\)|\(TM\)|processor|CPU/g, '') + .replace(/\s+(?= )/g, ''); + }, + + // :TODO: MCI for core count, e.g. os.cpus().length + + // :TODO: cpu load average (over N seconds): http://stackoverflow.com/questions/9565912/convert-the-output-of-os-cpus-in-node-js-to-percentage + NV : function nodeVersion() { return process.version; }, + + AN : function activeNodes() { return clientConnections.getActiveConnections().length.toString(); }, + + TC : function totalCalls() { return StatLog.getSystemStat('login_count').toString(); }, + + RR : function randomRumor() { + // start the process of picking another random one + setNextRandomRumor(); + + return StatLog.getSystemStat('random_rumor'); + }, + + // + // System File Base, Up/Download Info + // + // :TODO: DD - Today's # of downloads (iNiQUiTY) + // + // :TODO: System stat log for total ul/dl, total ul/dl bytes + + // :TODO: PT - Messages posted *today* (Obv/2) + // -> Include FTN/etc. + // :TODO: NT - New users today (Obv/2) + // :TODO: CT - Calls *today* (Obv/2) + // :TODO: TF - Total files on the system (Obv/2) + // :TODO: FT - Files uploaded/added *today* (Obv/2) + // :TODO: DD - Files downloaded *today* (iNiQUiTY) + // :TODO: TP - total message/posts on the system (Obv/2) + // -> Include FTN/etc. + // :TODO: LC - name of last caller to system (Obv/2) + // :TODO: TZ - Average *system* post/call ratio (iNiQUiTY) + + + // + // Special handling for XY + // + XY : function xyHack() { return; /* nothing */ }, +}; + function getPredefinedMCIValue(client, code) { if(!client || !code) { return; } - try { - return { - // - // Board - // - BN : function boardName() { return Config.general.boardName; }, + const generator = PREDEFINED_MCI_GENERATORS[code]; - // ENiGMA - VL : function versionLabel() { return 'ENiGMA½ v' + packageJson.version; }, - VN : function version() { return packageJson.version; }, + if(generator) { + let value; + try { + value = generator(client); + } catch(e) { + Log.error( { code : code, exception : e.message }, 'Exception caught generating predefined MCI value' ); + } - // +op info - SN : function opUserName() { return StatLog.getSystemStat('sysop_username'); }, - SR : function opRealName() { return StatLog.getSystemStat('sysop_real_name'); }, - SL : function opLocation() { return StatLog.getSystemStat('sysop_location'); }, - SA : function opAffils() { return StatLog.getSystemStat('sysop_affiliation'); }, - SS : function opSex() { return StatLog.getSystemStat('sysop_sex'); }, - SE : function opEmail() { return StatLog.getSystemStat('sysop_email_address'); }, - // :TODO: op age, web, ????? - - // - // Current user / session - // - UN : function userName() { return client.user.username; }, - UI : function userId() { return client.user.userId.toString(); }, - UG : function groups() { return _.values(client.user.groups).join(', '); }, - UR : function realName() { return userStatAsString(client, 'real_name', ''); }, - LO : function location() { return userStatAsString(client, 'location', ''); }, - UA : function age() { return client.user.getAge().toString(); }, - BD : function birthdate() { return moment(client.user.properties.birthdate).format(client.currentTheme.helpers.getDateFormat()); }, // iNiQUiTY - US : function sex() { return userStatAsString(client, 'sex', ''); }, - UE : function emailAddres() { return userStatAsString(client, 'email_address', ''); }, - UW : function webAddress() { return userStatAsString(client, 'web_address', ''); }, - UF : function affils() { return userStatAsString(client, 'affiliation', ''); }, - UT : function themeId() { return userStatAsString(client, 'theme_id', ''); }, - UC : function loginCount() { return userStatAsString(client, 'login_count', 0); }, - ND : function connectedNode() { return client.node.toString(); }, - IP : function clientIpAddress() { return client.remoteAddress; }, - ST : function serverName() { return client.session.serverName; }, - FN : function activeFileBaseFilterName() { - const activeFilter = FileBaseFilters.getActiveFilter(client); - return activeFilter ? activeFilter.name : ''; - }, - DN : function userNumDownloads() { return userStatAsString(client, 'dl_total_count', 0); }, // Obv/2 - DK : function userByteDownload() { // Obv/2 uses DK=downloaded Kbytes - const byteSize = StatLog.getUserStatNum(client.user, 'dl_total_bytes'); - return formatByteSize(byteSize, true); // true=withAbbr - }, - UP : function userNumUploads() { return userStatAsString(client, 'ul_total_count', 0); }, // Obv/2 - UK : function userByteUpload() { // Obv/2 uses UK=uploaded Kbytes - const byteSize = StatLog.getUserStatNum(client.user, 'ul_total_bytes'); - return formatByteSize(byteSize, true); // true=withAbbr - }, - NR : function userUpDownRatio() { // Obv/2 - return getRatio(client, 'ul_total_count', 'dl_total_count'); - }, - KR : function userUpDownByteRatio() { // Obv/2 uses KR=upload/download Kbyte ratio - return getRatio(client, 'ul_total_bytes', 'dl_total_bytes'); - }, - - MS : function accountCreated() { return moment(client.user.properties.account_created).format(client.currentTheme.helpers.getDateFormat()); }, - PS : function userPostCount() { return userStatAsString(client, 'post_count', 0); }, - PC : function userPostCallRatio() { return getRatio(client, 'post_count', 'login_count'); }, - - MD : function currentMenuDescription() { - return _.has(client, 'currentMenuModule.menuConfig.desc') ? client.currentMenuModule.menuConfig.desc : ''; - }, - - MA : function messageAreaName() { - const area = getMessageAreaByTag(client.user.properties.message_area_tag); - return area ? area.name : ''; - }, - MC : function messageConfName() { - const conf = getMessageConferenceByTag(client.user.properties.message_conf_tag); - return conf ? conf.name : ''; - }, - ML : function messageAreaDescription() { - const area = getMessageAreaByTag(client.user.properties.message_area_tag); - return area ? area.desc : ''; - }, - CM : function messageConfDescription() { - const conf = getMessageConferenceByTag(client.user.properties.message_conf_tag); - return conf ? conf.desc : ''; - }, - - SH : function termHeight() { return client.term.termHeight.toString(); }, - SW : function termWidth() { return client.term.termWidth.toString(); }, - - // - // Date/Time - // - // :TODO: change to CD for 'Current Date' - DT : function date() { return moment().format(client.currentTheme.helpers.getDateFormat()); }, - CT : function time() { return moment().format(client.currentTheme.helpers.getTimeFormat()) ;}, - - // - // OS/System Info - // - OS : function operatingSystem() { - return { - linux : 'Linux', - darwin : 'Mac OS X', - win32 : 'Windows', - sunos : 'SunOS', - freebsd : 'FreeBSD', - }[os.platform()] || os.type(); - }, - - OA : function systemArchitecture() { return os.arch(); }, - SC : function systemCpuModel() { - // - // Clean up CPU strings a bit for better display - // - return os.cpus()[0].model.replace(/\(R\)|\(TM\)|processor|CPU/g, '') - .replace(/\s+(?= )/g, ''); - }, - - // :TODO: MCI for core count, e.g. os.cpus().length - - // :TODO: cpu load average (over N seconds): http://stackoverflow.com/questions/9565912/convert-the-output-of-os-cpus-in-node-js-to-percentage - NV : function nodeVersion() { return process.version; }, - - AN : function activeNodes() { return clientConnections.getActiveConnections().length.toString(); }, - - TC : function totalCalls() { return StatLog.getSystemStat('login_count').toString(); }, - - RR : function randomRumor() { - // start the process of picking another random one - setNextRandomRumor(); - - return StatLog.getSystemStat('random_rumor'); - }, - - // - // System File Base, Up/Download Info - // - // :TODO: DD - Today's # of downloads (iNiQUiTY) - // - // :TODO: System stat log for total ul/dl, total ul/dl bytes - - // :TODO: PT - Messages posted *today* (Obv/2) - // -> Include FTN/etc. - // :TODO: NT - New users today (Obv/2) - // :TODO: CT - Calls *today* (Obv/2) - // :TODO: TF - Total files on the system (Obv/2) - // :TODO: FT - Files uploaded/added *today* (Obv/2) - // :TODO: DD - Files downloaded *today* (iNiQUiTY) - // :TODO: TP - total message/posts on the system (Obv/2) - // -> Include FTN/etc. - // :TODO: LC - name of last caller to system (Obv/2) - // :TODO: TZ - Average *system* post/call ratio (iNiQUiTY) - - - // - // Special handling for XY - // - XY : function xyHack() { return; /* nothing */ }, - - }[code](); // :TODO: Just call toString() here and remove above - DRY - - } catch(e) { - // Don't use client.log here as we may not have a client logger established yet!! - Log.warn( { code : code, exception : e.message }, 'Exception caught attempting to construct predefined MCI value'); + return value; } }