Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ############################
- NOT OWNED BY ALUF #######
- ############################
- Utils.js
- ########
- 'use strict';
- var util = require('util'),
- crypto = require('crypto'),
- fs = require('fs'),
- request = require('request');
- var MM = module.parent;
- var crypto_algorithm = 'aes-256-cbc';
- var crypto_key = '05f4PP1rL4JPff4PljY3G4ytZxRN662f'; // If you want to use encryption, change this
- var crypto_iv = 'T9terqJ0NlCk7OwV'; // And this
- exports.encrypt = function(text){
- var cipher = crypto.createCipheriv(crypto_algorithm, crypto_key, crypto_iv);
- return cipher.update(text, 'utf8', 'hex') + cipher.final('hex');
- }
- exports.decrypt = function(text){
- var decipher = crypto.createDecipheriv(crypto_algorithm, crypto_key, crypto_iv);
- return decipher.update(text, 'hex', 'utf8') + decipher.final('utf8');
- }
- exports.walkdir = function(dir, done) {
- var results = [];
- fs.readdir(dir, function(err, list) {
- if (err) return done(err);
- var pending = list.length;
- if (!pending) return done(null, results);
- list.forEach(function(file) {
- file = dir + '/' + file;
- fs.stat(file, function(err, stat) {
- if (stat && stat.isDirectory()) {
- exports.walkdir(file, function(err, res) {
- results = results.concat(res);
- if (!--pending) done(null, results);
- });
- } else {
- results.push(file);
- if (!--pending) done(null, results);
- }
- });
- });
- });
- };
- exports.urlUnzip = function(url, cb){
- var gunzip = require("zlib").createGunzip();
- var buffer = [];
- request(url).pipe(gunzip);
- gunzip.on('data', function(data) {
- buffer.push(data.toString())
- }).on("end", function() {
- cb(buffer.join(''));
- }).on("error", function(e) {
- console.log(e);
- cb(false);
- });
- }
- //utilities.format('someone %action another person %method.', {method: 'on the head', action: 'hit'});
- exports.format = function(string, args){
- if(!string) return false;
- var original_string = string;
- var sarr = [];
- for(var arg in args){
- var keyword = '%'+arg;
- var location = original_string.indexOf(keyword);
- if(location != -1){
- sarr.push([location, args[arg]]);
- var type = typeof args[arg];
- var sign = (type == 'string' ? '%s' : (type == 'number' ? '%d' : '%s'));
- string = string.replace(keyword, sign);
- }
- }
- sarr.sort(function(a,b){
- return a[0] - b[0];
- });
- var arr = [];
- for(var i=0; i<sarr.length; i++){
- arr.push(sarr[i][1]);
- }
- arr.unshift(string);
- return util.format.apply(this, arr);
- }
- exports.randomString = function(length){
- if(!length) length = 10;
- var text = "";
- var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
- for( var i=0; i < length; i++ )
- text += possible.charAt(Math.floor(Math.random() * possible.length));
- return text;
- }
- exports.dateToString = function(timestamp, format){
- format = (format || 'readable');
- var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
- var date = new Date(timestamp * 1000);
- var day = (String(date.getDate()).length == 1 ? '0'+date.getDate() : date.getDate());
- var month = months[date.getMonth()];
- var month_num = (String(date.getMonth() + 1).length == 1 ? '0'+(date.getMonth() + 1) : (date.getMonth() + 1));
- var year = date.getFullYear();
- var hour = date.getHours();
- var minutes = date.getMinutes();
- var seconds = date.getSeconds();
- switch(format){
- case 'readable':
- return day+' '+month+' '+year;
- break;
- case 'hour_mins_seconds':
- return hour+':'+minutes+':'+seconds;
- break;
- case 'DDMMYYYY':
- default:
- return day +''+ month_num +''+year;
- break;
- }
- }
- exports.secondsToString = function(seconds, depth) {
- function numberEnding (number) { //todo: replace with a wiser code
- return (number > 1) ? 's' : '';
- }
- var temp = seconds;
- var result = [];
- depth = depth || 2;
- var years = Math.floor(temp / 31536000);
- if (years) {
- result.push(years + ' year' + numberEnding(years));
- }
- var days = Math.floor((temp %= 31536000) / 86400);
- if (days) {
- result.push(days + ' day' + numberEnding(days));
- }
- var hours = Math.floor((temp %= 86400) / 3600);
- if (hours) {
- result.push(hours + ' hour' + numberEnding(hours));
- }
- var minutes = Math.floor((temp %= 3600) / 60);
- if (minutes) {
- result.push(minutes + ' minute' + numberEnding(minutes));
- }
- var seconds = temp % 60;
- if (seconds) {
- result.push(seconds + ' second' + numberEnding(seconds));
- }
- result = result.slice(0,depth);
- return result.length == 1 ? result[0] : result.slice(0,result.length-1).join(' ')+' and '+result[result.length-1];
- }
- /* OLD
- exports.secondsToString = function(seconds, depth) {
- console.log('seconds to string', seconds);
- function numberEnding (number) { //todo: replace with a wiser code
- return (number > 1) ? 's' : '';
- }
- var temp = seconds;
- var string = '';
- depth = (depth || 2);
- var current_depth = 0;
- var years = Math.floor(temp / 31536000);
- if (years) {
- current_depth++;
- string += years + ' year' + numberEnding(years);
- if(depth <= current_depth) return string;
- }
- var days = Math.floor((temp %= 31536000) / 86400);
- if (days) {
- current_depth++;
- var last = (depth <= current_depth);
- string += (string?' ':'') + (last?'and ':'') + days + ' day' + numberEnding(days);
- if(depth <= current_depth) return string;
- }
- var hours = Math.floor((temp %= 86400) / 3600);
- if (hours) {
- current_depth++;
- var last = (depth <= current_depth);
- string += (string?' ':'') + (last?'and ':'') + hours + ' hour' + numberEnding(hours);
- if(depth <= current_depth) return string;
- }
- var minutes = Math.floor((temp %= 3600) / 60);
- if (minutes) {
- current_depth++;
- var last = (depth <= current_depth);
- string += (string?' ':'') + (last?'and ':'') + minutes + ' minute' + numberEnding(minutes);
- if(depth <= current_depth) return string;
- }
- var seconds = temp % 60;
- if (seconds) {
- string += (string?' and ':'') + seconds + ' second' + numberEnding(seconds);
- return string;
- }
- if(string) return string;
- else return 'less then a second'; //'just now' //or other string you like;
- }*/
- // Base valiable types prototypes //
- // Array //
- exports.array_shuffle = function(o){
- for(var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
- return o;
- };
- exports.array_random = function(array){
- return array[Math.floor(Math.random() * array.length)];
- }
- // Object //
- exports.obj_clone = function(array){
- var oldState = history.state;
- history.replaceState(array);
- var clonedObj = history.state;
- history.replaceState(oldState);
- return clonedObj;
- }
- exports.obj_size = function(obj) {
- var size = 0, key;
- for (key in obj) {
- if (obj.hasOwnProperty(key)) size++;
- }
- return size;
- };
- /* obj_sort required format:
- { 'key': 5, 'key2': 10}
- output:
- [ ['key2', 10], ['key', 5] ]
- */
- exports.obj_sort = function(obj){
- var sort_array = [];
- for(var k in obj){
- sort_array.push([k, obj[k]]);
- }
- sort_array.sort(function(a,b){
- return b[1] - a[1];
- });
- return sort_array;
- }
- exports.obj_deepExtend = function(destination, source) {
- for (var property in source) {
- if (source[property] && source[property].constructor &&
- source[property].constructor === Object) {
- destination[property] = destination[property] || {};
- exports.obj_deepExtend(destination[property], source[property]);
- } else {
- destination[property] = source[property];
- }
- }
- return destination;
- };
- // Number //
- exports.number_random = function(min, max){
- return Math.floor(Math.random() * (max - min + 1)) + min;
- }
- exports.number_tofixed = function(num, length){
- var len = '1';
- for(var i=0; i<length; i++) len += '0';
- return parseFloat(Math.round(num * parseInt(len)) / parseInt(len)).toFixed(length);
- }
- // String //
- exports.string_lowerUperFirst = function(str){
- return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
- }
- exports.string_random = function(length, possible){
- length = length || 10;
- possible = possible || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
- var text = '';
- for( var i=0; i < length; i++ )
- text += possible.charAt(Math.floor(Math.random() * possible.length));
- return text;
- }
- // ------------ end --------------- //
- exports.parseUrl = function(url){
- var hostname = url.split('/').splice(2,1).join('/');
- var path = '/'+url.split('/').splice(3).join('/');
- var domain = url.split('/').splice(2,1)[0].split('.').splice(-2).join('.');
- //var domain = url.split('/')[0].split('.').slice(-2).join('.');
- }
- //arr1: new Array(' ', '¡', '¢', '£', '¤', '¥', '¦', '§', '¨', '©', 'ª', '«', '¬', '­', '®', '¯', '°', '±', '²', '³', '´', 'µ', '¶', '·', '¸', '¹', 'º', '»', '¼', '½', '¾', '¿', 'À', 'Á', 'Â', 'Ã', 'Ä', 'Å', '&Aelig;', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', '×', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'Þ', 'ß', 'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ð', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', '÷', 'Ø', 'ù', 'ú', 'û', 'ü', 'ý', 'þ', 'ÿ', '"', '&', '<', '>', 'œ', 'œ', 'š', 'š', 'ÿ', 'ˆ', '˜', ' ', ' ', ' ', '‌', '‍', '‎', '‏', '–', '—', '‘', '’', '‚', '“', '”', '„', '†', '†', '‰', '‹', '›', '€', 'ƒ', 'α', 'β', 'γ', 'δ', 'ε', 'ζ', 'η', 'θ', 'ι', 'κ', 'λ', 'μ', 'ν', 'ξ', 'ο', 'π', 'ρ', 'σ', 'τ', 'υ', 'φ', 'χ', 'ψ', 'ω', 'α', 'β', 'γ', 'δ', 'ε', 'ζ', 'η', 'θ', 'ι', 'κ', 'λ', 'μ', 'ν', 'ξ', 'ο', 'π', 'ρ', 'ς', 'σ', 'τ', 'υ', 'φ', 'χ', 'ψ', 'ω', 'ϑ', 'ϒ', 'ϖ', '•', '…', '′', '′', '‾', '⁄', '℘', 'ℑ', 'ℜ', '™', 'ℵ', '←', '↑', '→', '↓', '↔', '↵', '←', '↑', '→', '↓', '↔', '∀', '∂', '∃', '∅', '∇', '∈', '∉', '∋', '∏', '∑', '−', '∗', '√', '∝', '∞', '∠', '∧', '∨', '∩', '∪', '∫', '∴', '∼', '≅', '≈', '≠', '≡', '≤', '≥', '⊂', '⊃', '⊄', '⊆', '⊇', '⊕', '⊗', '⊥', '⋅', '⌈', '⌉', '⌊', '⌋', '⟨', '⟩', '◊', '♠', '♣', '♥', '♦'),
- //arr2: new Array(' ', '¡', '¢', '£', '¤', '¥', '¦', '§', '¨', '©', 'ª', '«', '¬', '­', '®', '¯', '°', '±', '²', '³', '´', 'µ', '¶', '·', '¸', '¹', 'º', '»', '¼', '½', '¾', '¿', 'À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', '×', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'Þ', 'ß', 'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ð', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', '÷', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'þ', 'ÿ', '"', '&', '<', '>', 'Œ', 'œ', 'Š', 'š', 'Ÿ', 'ˆ', '˜', ' ', ' ', ' ', '‌', '‍', '‎', '‏', '–', '—', '‘', '’', '‚', '“', '”', '„', '†', '‡', '‰', '‹', '›', '€', 'ƒ', 'Α', 'Β', 'Γ', 'Δ', 'Ε', 'Ζ', 'Η', 'Θ', 'Ι', 'Κ', 'Λ', 'Μ', 'Ν', 'Ξ', 'Ο', 'Π', 'Ρ', 'Σ', 'Τ', 'Υ', 'Φ', 'Χ', 'Ψ', 'Ω', 'α', 'β', 'γ', 'δ', 'ε', 'ζ', 'η', 'θ', 'ι', 'κ', 'λ', 'μ', 'ν', 'ξ', 'ο', 'π', 'ρ', 'ς', 'σ', 'τ', 'υ', 'φ', 'χ', 'ψ', 'ω', 'ϑ', 'ϒ', 'ϖ', '•', '…', '′', '″', '‾', '⁄', '℘', 'ℑ', 'ℜ', '™', 'ℵ', '←', '↑', '→', '↓', '↔', '↵', '⇐', '⇑', '⇒', '⇓', '⇔', '∀', '∂', '∃', '∅', '∇', '∈', '∉', '∋', '∏', '∑', '−', '∗', '√', '∝', '∞', '∠', '∧', '∨', '∩', '∪', '∫', '∴', '∼', '≅', '≈', '≠', '≡', '≤', '≥', '⊂', '⊃', '⊄', '⊆', '⊇', '⊕', '⊗', '⊥', '⋅', '⌈', '⌉', '⌊', '⌋', '〈', '〉', '◊', '♠', '♣', '♥', '♦'),
- exports.chmsg_clean = function(string){
- var name = /<n(.*?)\/>/g.exec(string);
- name = name ? name[1] : false;
- var font = /<f(.*?)\/>/g.exec(string);
- font = font ? font[1] : false
- string = exports.html_decode(exports.html_remove(string));
- return {text: string, name: name, font: font};
- }
- exports.html_view = function(str) {
- return String(str)
- .replace(/</g, '<')
- .replace(/>/g, '>');
- }
- exports.html_encode = function(str) {
- return String(str)
- .replace(/&/g, '&')
- .replace(/"/g, '"')
- .replace(/'/g, ''')
- .replace(/</g, '<')
- .replace(/>/g, '>');
- }
- exports.html_decode = function(value){
- return String(value)
- .replace(/"/g, '"')
- .replace(/'/g, "'")
- .replace(/'/g, "'")
- .replace(/</g, '<')
- .replace(/>/g, '>')
- .replace(/&/g, '&');
- }
- exports.html_remove = function(msg){
- var li = msg.split('<');
- if(li.length == 1){
- return li[0];
- }else{
- var ret = [li[0]];
- for(var data in li){
- li[data] = li[data].split('>', 2);
- if(li[data][1] != '\r\n\u0000')
- ret.push(li[data][1]);
- }
- return ret.join('');
- }
- }
- //
- // Internal functions
- //
- exports.parseContact = function(state, time){
- time = parseInt(time);
- var contact = {state: false, time: false};
- if(state == 'online' && time == 0){
- //ONLINE
- return {state: 'online', time: Math.round(new Date/1000)};
- }
- else if(state == 'online' && time > 0){
- //IDLE
- return {state: 'idle', time: Math.round(new Date/1000) - (time * 60)};
- }
- else if(state == 'offline'){
- //OFF
- return {state: 'offline', time: time};
- }
- return false;
- }
- exports.genUid = function() {
- var min = Math.pow(10, 15);
- var max = Math.pow(10, 16);
- return Math.floor(Math.random() * (max - min + 1)) + min;
- }
- exports.getAnonId = function(n,ssid) { //n is from message body, ssid is user_id
- //example: 5454/16766087 = anon1431
- if(!n || !ssid) return false;
- var id = '';
- for(var i=0; i<4; i++){
- var a = parseInt(n.substr(i, 1)) + parseInt(ssid.substr(i+4, 1));
- id += String(a>9 ? a-10 : a);
- }
- return id;
- }
- exports.getAnonName = function(num, ts) {
- num = String(num).substr(4, 4);
- if(undefined !== ts){
- ts = String(ts).split(".")[0];
- ts = ts.substr(ts.length - 4);
- }else{
- ts = ts || 3452;
- }
- var id = "";
- for(var i = 0; i < num.length; i++){
- var part1 = Number(num.substr(i, 1));
- var part2 = Number(ts.substr(i, 1));
- var part3 = String(part1 + part2);
- id = id + part3.substr(part3.length - 1);
- }
- return "_anon" + id;
- }
- /*
- def aid(self, n, uid):
- '''Generate Anon ID number'''
- try:
- if (int(n) == 0) or (len(n) < 4): n = "3452"
- except ValueError: n = "3452"
- if n != "3452": n = str(int(n))[-4:]
- v1, v5 = 0, ""
- for i in range(0, len(n)): v5 += str(int(n[i:][:1])+int(str(uid)[4:][:4][i:][:1]))[len(str(int(n[i:][:1])+int(str(uid)[4:][:4][i:][:1]))) - 1:]
- return v5
- */
- Socket.j
- ########
- 'use strict';
- var _ = require('underscore'),
- util = require('util'),
- events = require('events'),
- net = require('net'),
- colors = require('colors');
- // Chatango Socket connection handler, for both Rooms and PM
- // Available events: onconnect, data, error, timeout, close, write ( Note: exceptions must be handled! )
- function Socket(host, port)
- {
- this._host = host;
- this._port = port || 443;
- this._socket = new net.Socket();
- this._pingTask = false;
- this._connected = false;
- this._firstCommand = true;
- this._writeLock = false;
- this._writeBuffer = [];
- this._buffer = '';
- this.connect();
- }
- util.inherits(Socket, events.EventEmitter);
- Socket.prototype.connect = function()
- {
- if(this._socket._connecting) return;
- var self = this;
- if(this._socket.destroyed){
- var reconnecting = true;
- console.log('[SOCKET] reconnecting to '+this._host+':'+this._port);
- }else{
- var reconnecting = false;
- console.log('[SOCKET] connecting to '+this._host+':'+this._port);
- }
- this._writeLock = true;
- if(this._socket._events.connect){
- this._socket.connect(this._port, this._host);
- }else{
- this._socket.connect(this._port, this._host, function() {
- self._connected = true;
- self._writeLock = false;
- self._pingTask = setInterval(function() {
- if(self._connected) {
- self.write(['']);
- }
- }, 30000);
- self.emit('onconnect');
- });
- }
- if(reconnecting) return;
- this._socket.on('data', function(data) {
- var buffer = data.toString('utf8');
- if(buffer.substr(-1) !== '\x00')
- {
- self._buffer += buffer;
- }
- else
- {
- if(self._buffer != '')
- {
- buffer = self._buffer + buffer;
- self._buffer = '';
- }
- var messages = buffer.split('\x00');
- _.each(messages, function(message){
- message = message.replace(/(\r|\n)/g, '');
- if(message !== '')
- self.emit('data', message);
- });
- }
- });
- this._socket.on('error', function(exception) {
- self.emit('error', exception);
- });
- this._socket.on('timeout', function(exception) {
- self.emit('timeout', exception);
- });
- this._socket.on('close', function() {
- self._connected = false;
- self._writeBuffer = [];
- self._writeLock = false;
- self._buffer = '';
- self._firstCommand = true;
- clearInterval(self._pingTask);
- self.emit('close');
- });
- }
- Socket.prototype.disconnect = function(){
- this._socket.destroy();
- }
- Socket.prototype.setWriteLock = function(bool) {
- this._writeLock = _.isBoolean(bool) && bool;
- }
- Socket.prototype.write = function(data) {
- if(this._connected)
- {
- if(this._firstCommand)
- {
- var terminator = '\x00';
- this._firstCommand = false;
- }
- else
- var terminator = '\r\n\x00';
- if(this._writeLock)
- this._writeBuffer.push(data);
- else
- {
- _.each(this._writeBuffer, function(value){
- this.write(value);
- }.bind(this));
- if(data)
- this.emit('write', data.join(':'));
- this._socket.write(data.join(':') + terminator);
- }
- }
- }
- exports.Instance = Socket;
- weights.js
- ##########
- // Weights.js by the awesome Lumirayz
- //
- // Requires
- //
- var _ = require("underscore"),
- crypto = require("crypto");
- //
- // External Data
- //
- _chatangoTagserver = {"sw": {"sv10": 110, "sv12": 116, "w12": 75, "sv8": 101, "sv6": 104, "sv4": 110, "sv2": 95}, "ex": {"b55279b3166dd5d30767d68b50c333ab": 21,
- "0a249c2a3a3dcb7e40dcfac36bec194f": 21, "3ae9453fa1557dc71316701777c5ee42": 51, "ebcd66fd5b868f249c1952af02a91cb3": 5, "4913527f3dd834ec1bb3e1eb886b6d62": 56,
- "7a067398784395c6208091bc6c3f3aac": 22, "ce7b7bc84a4e8184edb432085883ae04": 51,"fe8d11abb9c391d5f2494d48bb89221b": 8, "2d14c18e510a550f0d13eac7685ba496": 8,
- "3e772eba0dfbf48d47b4c02d5a3beac9": 56, "eff4fd30f3fa53a4a1cb3442a951ad03": 54, "082baeccd5eabe581cba35bd777b93ef": 56, "e21569f6966d79cfc1b911681182f71f": 34,
- "0b18ed3fb935c9607cb01cc537ec854a": 10, "20e46ddc5e273713109edf7623d89e7a": 22, "72432e25656d6b7dab98148fbd411435": 70, "bb02562ba45ca77e62538e6c5db7c8ae": 10,
- "d78524504941b97ec555ef43c4fd9d3c": 21, "2db735f3815eec18b4326bed35337441": 56, "63ff05c1d26064b8fe609e40d6693126": 56, "ec580e6cbdc2977e09e01eb6a6c62218": 69,
- "246894b6a72e704e8e88afc67e8c7ea9": 20, "028a31683e35c51862adedc316f9d07b": 51, "2b2e3e5ff1550560502ddd282c025996": 27, "e0d3ff2ad4d2bedc7603159cb79501d7": 67,
- "726a56c70721704493191f8b93fe94a3": 21}, "sm": [["5", "w12"], ["6", "w12"], ["7","w12"], ["8", "w12"], ["16", "w12"], ["17", "w12"], ["18", "w12"], ["9", "sv2"],
- ["11", "sv2"], ["12", "sv2"], ["13", "sv2"], ["14", "sv2"], ["15", "sv2"], ["19", "sv4"], ["23", "sv4"], ["24", "sv4"], ["25", "sv4"], ["26", "sv4"], ["28",
- "sv6"], ["29", "sv6"], ["30", "sv6"], ["31", "sv6"], ["32", "sv6"], ["33", "sv6"], ["35", "sv8"], ["36", "sv8"], ["37", "sv8"], ["38", "sv8"], ["39", "sv8"],
- ["40", "sv8"], ["41", "sv8"], ["42", "sv8"], ["43", "sv8"], ["44", "sv8"], ["45", "sv8"], ["46", "sv8"], ["47", "sv8"], ["48", "sv8"], ["49", "sv8"], ["50", "sv8"],
- ["52", "sv10"], ["53", "sv10"], ["55", "sv10"], ["57", "sv10"], ["58", "sv10"], ["59", "sv10"], ["60", "sv10"], ["61", "sv10"], ["62", "sv10"], ["63", "sv10"],
- ["64", "sv10"], ["65", "sv10"], ["66", "sv10"], ["68", "sv2"], ["71", "sv12"],["72", "sv12"], ["73", "sv12"], ["74", "sv12"], ["75", "sv12"], ["76", "sv12"],
- ["77", "sv12"], ["78", "sv12"], ["79", "sv12"], ["80", "sv12"], ["81", "sv12"],["82", "sv12"], ["83", "sv12"], ["84", "sv12"]]};
- //
- // Preprocess
- //
- var weights = _.map(_chatangoTagserver.sm, function(p) {
- return [p[0], _chatangoTagserver.sw[p[1]]];
- });
- //
- // getServerId, getServerHost
- //
- function getServerId(room) {
- room = room.toLowerCase();
- var roomMd5 = crypto.createHash("md5").update(room).digest("hex");
- if(_chatangoTagserver.ex.hasOwnProperty(roomMd5)) {
- // If the room has a server directly assigned, return that one.
- return _chatangoTagserver.ex[roomMd5];
- }
- else {
- // If it doesn't, calculate the server using a weighted choice
- // algorithm which uses a few characters from the room name to
- // get a number from 0 to 1.
- var
- _room = room.replace(/[-_]/g, "q"),
- firstNumberString = _room.substring(0, 5),
- lastNumberString = _room.substring(6, 6 + Math.min(3, _room.length - 5)),
- firstNumber = parseInt(firstNumberString, 36),
- lastNumber;
- if(lastNumberString.length > 0) {
- lastNumber = Math.max(1000, parseInt(lastNumberString, 36));
- }
- else {
- lastNumber = 1000;
- }
- // Use this number to do a weighted choice over all the
- // servers.
- var
- relDiff = (firstNumber % lastNumber) / lastNumber,
- maxDiff = _.reduce(weights, function(acc, next) {
- return acc + next[1];
- }, 0),
- accum = 0;
- for(var i = 0; i < weights.length; i++) {
- var
- currentWeight = weights[i][1] / maxDiff,
- nextWeight = accum + currentWeight;
- if(nextWeight >= relDiff) {
- // BOOYAH, got you.
- return weights[i][0];
- }
- accum = nextWeight;
- }
- // Should not happen.
- return null;
- }
- }
- function getServerHost(room) {
- return "s" + getServerId(room) + ".chatango.com";
- }
- //
- // Exports
- //
- exports.getServerId = getServerId;
- exports.getServerHost = getServerHost;
Add Comment
Please, Sign In to add comment