module.exports.connected = connected; module.exports.processMessage = processMessage; module.exports.processSender = processSender; module.exports.setHandlers = setHandlers; module.exports.setSettings = setSettings; var handlers = { sendHandler: null, findServer: null, findUser: null, killUser: null, newServer: null, newUser: null, parseUmodes: null, getChannel: null, quitUser: null, removeServer: null }; var settings = { ID: null, password: null, name: null, description: null, version: null, me: null, maxUsers: null }; var connection = { 'protoctl': {}, 'prefixes': {}, 'chmodes': [], // 0 - list modes, 1 - argument modes, 2 - argument modes (add only), 3 - standard modes 'umodes': {} }; var chmodeMap = { 'k': { 'name': 'KEY', 'user': true, 'services': true }, 'L': { 'name': 'CHANNELLINK', 'user': true, 'services': true }, 'f': { 'name': 'FLOODPROT', 'user': true, 'services': true }, 'l': { 'name': 'LIMIT', 'user': true, 'services': true }, 'H': { 'name': 'HISTORY', 'user': true, 'services': true }, 'p': { 'name': 'PRIVATE', 'user': true, 'services': true }, 's': { 'name': 'SECRET', 'user': true, 'services': true }, 'm': { 'name': 'MODERATED', 'user': true, 'services': true }, 'n': { 'name': 'NOEXTERNAL', 'user': true, 'services': true }, 't': { 'name': 'TOPIC', 'user': true, 'services': true }, 'i': { 'name': 'INVITE', 'user': true, 'services': true }, 'r': { 'name': 'REGISTERED', 'user': false, 'services': true }, 'z': { 'name': 'SECUREONLY', 'user': true, 'services': true }, 'M': { 'name': 'NONREGMODERATED', 'user': true, 'services': true }, 'Q': { 'name': 'NOKICK', 'user': true, 'services': true }, 'N': { 'name': 'NONICK', 'user': true, 'services': true }, 'R': { 'name': 'NONREGINVITE', 'user': true, 'services': true }, 'T': { 'name': 'NOCTCPS', 'user': true, 'services': true }, 'O': { 'name': 'OPERS', 'user': false, 'services': true }, 'V': { 'name': 'NOINVITE', 'user': true, 'services': true }, 'K': { 'name': 'NOKNOCK', 'user': true, 'services': true }, 'D': { 'name': 'OLDDELAYJOIN', 'user': false, 'services': false }, 'd': { 'name': 'DELAYJOIN', 'user': true, 'services': true }, 'G': { 'name': 'CENSOR', 'user': true, 'services': true }, 'P': { 'name': 'PERMANENT', 'user': false, 'services': true }, 'Z': { 'name': 'SECURE', 'user': false, 'services': false }, 'S': { 'name': 'COLORFILTER', 'user': true, 'services': true }, 'C': { 'name': 'NOCTCP', 'user': true, 'services': true }, 'c': { 'name': 'NOCOLOR', 'user': true, 'services': true } }; function parseChannelModes(modes, args){ var plus = true; var argIndex = 0; var output = {}; for(var i=0; i= 0){ throw 'Unexpected list mode'; } else if(connection.chmodes[1].indexOf(c) >= 0){ if(plus){ output[name] = args[argIndex++]; } else { output[name] = false; argIndex++; } } else if(connection.chmodes[2].indexOf(c) >= 0){ if(plus){ output[name] = args[argIndex++]; } else { output[name] = false; } } else { // treat unknown chars as type 3 output[name] = plus; } } return output; } function parseModePrefix(text){ var modes = []; for(var i=0; i 0) ip += ':'; ip += ipBinary[i*2].toString(16).padStart(2, '0') + ipBinary[i*2+1].toString(16).padStart(2, '0'); } } else { throw 'unknown IP format'; } } else { ip = null; } if(vhost == '*'){ vhost = null; } if(cloakedHost == '*'){ cloakedHost = null; } if(account == '0'){ account = null; } handlers.newUser(nick, distance, TS, ident, host, uid, account, handlers.parseUmodes(umodes), vhost, cloakedHost, ip, realname, msg.sender.server); }, 'SJOIN': function(msg){ var channel = handlers.getChannel(msg.args[1]); channel.setTS(msg.args[0]); var modeArgs = []; for(var i=3; i