irc-framework
Version:
A better IRC framework for node.js
122 lines (111 loc) • 3.61 kB
JavaScript
;
require("core-js/modules/es.array.filter.js");
require("core-js/modules/es.array.index-of.js");
require("core-js/modules/es.array.map.js");
require("core-js/modules/es.array.slice.js");
require("core-js/modules/es.array.splice.js");
require("core-js/modules/es.object.to-string.js");
var _ = {
map: require('lodash/map')
};
var Helper = {
parseMask: parseMask,
parseWhoFlags: parseWhoFlags,
splitOnce: splitOnce
};
module.exports = Helper;
function parseMask(mask) {
var nick = '';
var user = '';
var host = '';
var sep1 = mask.indexOf('!');
var sep2 = mask.indexOf('@');
if (sep1 === -1 && sep2 === -1) {
// something
if (mask.indexOf('.') > -1) {
host = mask;
} else {
nick = mask;
}
} else if (sep1 === -1 && sep2 !== -1) {
// something@something
nick = mask.substring(0, sep2);
host = mask.substring(sep2 + 1);
} else if (sep1 !== -1 && sep2 === -1) {
// something!something
nick = mask.substring(0, sep1);
user = mask.substring(sep1 + 1);
} else {
// something!something@something
nick = mask.substring(0, sep1);
user = mask.substring(sep1 + 1, sep2);
host = mask.substring(sep2 + 1);
}
return {
nick: nick,
user: user,
host: host
};
}
function parseWhoFlags(flagsParam, networkOptions) {
// https://modern.ircdocs.horse/#rplwhoreply-352
// unrealircd https://github.com/unrealircd/unrealircd/blob/8536778/doc/conf/help/help.conf#L429
var unparsedFlags = flagsParam.split('');
// the flags object to be returned
var parsedFlags = {};
// function to check for flags existence and remove it if existing
var hasThenRemove = function hasThenRemove(flag) {
var flagIdx = unparsedFlags.indexOf(flag);
if (flagIdx > -1) {
unparsedFlags.splice(flagIdx, 1);
return true;
}
return false;
};
// away is represented by H = Here, G = Gone
parsedFlags.away = !hasThenRemove('H');
parsedFlags.away = hasThenRemove('G');
// add bot mode if its flag is supported by the ircd
var bot_mode_token = networkOptions.BOT;
if (bot_mode_token) {
parsedFlags.bot = hasThenRemove(bot_mode_token);
}
// common extended flags
parsedFlags.registered = hasThenRemove('r');
parsedFlags.operator = hasThenRemove('*');
parsedFlags.secure = hasThenRemove('s');
// filter PREFIX array against the prefix's in who reply returning matched PREFIX objects
var chan_prefixes = networkOptions.PREFIX.filter(function (f) {
return hasThenRemove(f.symbol);
});
// use _.map to return an array of mode strings from matched PREFIX objects
parsedFlags.channel_modes = _.map(chan_prefixes, 'mode');
return {
parsedFlags: parsedFlags,
unparsedFlags: unparsedFlags
};
}
function splitOnce(input, separator) {
if (typeof input !== 'string' || typeof separator !== 'string') {
throw new TypeError('input and separator must be strings');
}
var splitPos;
if (separator === '') {
// special handling required for empty string as separator
// cannot match '' at start, so start searching after first character
splitPos = input.indexOf(separator, 1);
if (splitPos === input.length) {
// cannot match '' at end, so if that's all we found, act like we found nothing
splitPos = -1;
}
} else {
// normal non-zero-length separator
splitPos = input.indexOf(separator);
}
// no separator found
if (splitPos < 0) {
return [input];
}
// the normal case: split around first instance of separator
return [input.slice(0, splitPos), input.slice(splitPos + separator.length)];
}