2014-02-15 06:12:11 +00:00
|
|
|
(function () {
|
|
|
|
var root, crypto = false;
|
|
|
|
|
|
|
|
if (typeof window === "undefined") {
|
|
|
|
root = module.exports;
|
|
|
|
} else {
|
|
|
|
root = window.utils = {};
|
|
|
|
}
|
|
|
|
|
|
|
|
if (typeof require === "function") {
|
|
|
|
crypto = require("crypto");
|
2013-10-16 22:36:05 +00:00
|
|
|
}
|
2014-02-15 06:12:11 +00:00
|
|
|
|
|
|
|
var Set = function (items) {
|
|
|
|
this._items = {};
|
|
|
|
var self = this;
|
|
|
|
if (items instanceof Array)
|
|
|
|
items.forEach(function (it) { self.add(it); });
|
|
|
|
};
|
|
|
|
|
|
|
|
Set.prototype.contains = function (what) {
|
|
|
|
return (what in this._items);
|
|
|
|
};
|
|
|
|
|
|
|
|
Set.prototype.add = function (what) {
|
|
|
|
this._items[what] = true;
|
|
|
|
};
|
|
|
|
|
|
|
|
Set.prototype.remove = function (what) {
|
|
|
|
if (what in this._items)
|
|
|
|
delete this._items[what];
|
|
|
|
};
|
|
|
|
|
|
|
|
Set.prototype.clear = function () {
|
|
|
|
this._items = {};
|
|
|
|
};
|
|
|
|
|
|
|
|
Set.prototype.forEach = function (fn) {
|
|
|
|
for (var k in this._items) {
|
|
|
|
fn(k);
|
|
|
|
}
|
|
|
|
};
|
2013-10-16 22:36:05 +00:00
|
|
|
|
2014-02-15 06:12:11 +00:00
|
|
|
root.Set = Set;
|
|
|
|
|
|
|
|
root.isValidChannelName = function (name) {
|
2014-01-23 21:53:53 +00:00
|
|
|
return name.match(/^[\w-]{1,30}$/);
|
2013-08-16 15:37:26 +00:00
|
|
|
},
|
|
|
|
|
2014-02-15 06:12:11 +00:00
|
|
|
root.isValidUserName = function (name) {
|
2014-01-23 21:53:53 +00:00
|
|
|
return name.match(/^[\w-]{1,20}$/);
|
2013-08-15 03:51:59 +00:00
|
|
|
},
|
|
|
|
|
2014-02-15 06:12:11 +00:00
|
|
|
root.isValidEmail = function (email) {
|
2013-12-12 20:48:23 +00:00
|
|
|
if (email.length > 255) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!email.match(/^[^@]+?@[^@]+$/)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (email.match(/^[^@]+?@(localhost|127\.0\.0\.1)$/)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
},
|
|
|
|
|
2014-02-15 06:12:11 +00:00
|
|
|
root.randomSalt = function (length) {
|
2013-08-15 03:51:59 +00:00
|
|
|
var chars = "abcdefgihjklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
|
|
+ "0123456789!@#$%^&*_+=~";
|
|
|
|
var salt = [];
|
|
|
|
for(var i = 0; i < length; i++) {
|
|
|
|
salt.push(chars[parseInt(Math.random()*chars.length)]);
|
|
|
|
}
|
|
|
|
return salt.join('');
|
2013-08-18 22:58:16 +00:00
|
|
|
},
|
|
|
|
|
2014-02-15 06:12:11 +00:00
|
|
|
root.maskIP = function (ip) {
|
2013-08-18 22:58:16 +00:00
|
|
|
if(ip.match(/^\d+\.\d+\.\d+\.\d+$/)) {
|
|
|
|
// standard 32 bit IP
|
|
|
|
return ip.replace(/\d+\.\d+\.(\d+\.\d+)/, "x.x.$1");
|
|
|
|
} else if(ip.match(/^\d+\.\d+\.\d+/)) {
|
|
|
|
// /24 range
|
|
|
|
return ip.replace(/\d+\.\d+\.(\d+)/, "x.x.$1.*");
|
|
|
|
}
|
2013-08-24 02:06:29 +00:00
|
|
|
},
|
|
|
|
|
2014-02-15 06:12:11 +00:00
|
|
|
root.formatTime = function (sec) {
|
2013-08-24 02:06:29 +00:00
|
|
|
if(sec === "--:--")
|
|
|
|
return sec;
|
|
|
|
|
|
|
|
sec = Math.floor(+sec);
|
|
|
|
var h = "", m = "", s = "";
|
|
|
|
|
|
|
|
if(sec >= 3600) {
|
|
|
|
h = "" + Math.floor(sec / 3600);
|
|
|
|
if(h.length < 2)
|
|
|
|
h = "0" + h;
|
|
|
|
sec %= 3600;
|
|
|
|
}
|
|
|
|
|
|
|
|
m = "" + Math.floor(sec / 60);
|
|
|
|
if(m.length < 2)
|
|
|
|
m = "0" + m;
|
|
|
|
|
|
|
|
s = "" + (sec % 60);
|
|
|
|
if(s.length < 2)
|
|
|
|
s = "0" + s;
|
2013-08-29 00:25:53 +00:00
|
|
|
|
2013-08-24 02:06:29 +00:00
|
|
|
if(h === "")
|
|
|
|
return [m, s].join(":");
|
|
|
|
|
|
|
|
return [h, m, s].join(":");
|
2013-08-29 00:25:53 +00:00
|
|
|
},
|
|
|
|
|
2014-02-15 06:12:11 +00:00
|
|
|
root.newRateLimiter = function () {
|
2013-08-29 00:25:53 +00:00
|
|
|
return {
|
|
|
|
count: 0,
|
|
|
|
lastTime: 0,
|
|
|
|
throttle: function (opts) {
|
|
|
|
if (typeof opts === "undefined")
|
|
|
|
opts = {};
|
|
|
|
|
|
|
|
var burst = +opts.burst,
|
|
|
|
sustained = +opts.sustained,
|
|
|
|
cooldown = +opts.cooldown;
|
|
|
|
|
|
|
|
if (isNaN(burst))
|
|
|
|
burst = 10;
|
|
|
|
|
|
|
|
if (isNaN(sustained))
|
|
|
|
sustained = 2;
|
|
|
|
|
|
|
|
if (isNaN(cooldown))
|
|
|
|
cooldown = burst / sustained;
|
|
|
|
|
2013-09-06 20:53:23 +00:00
|
|
|
// Cooled down, allow and clear buffer
|
|
|
|
if (this.lastTime < Date.now() - cooldown*1000) {
|
|
|
|
this.count = 1;
|
2013-08-29 00:25:53 +00:00
|
|
|
this.lastTime = Date.now();
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2013-09-06 20:53:23 +00:00
|
|
|
// Haven't reached burst cap yet, allow
|
|
|
|
if (this.count < burst) {
|
|
|
|
this.count++;
|
2013-08-29 00:25:53 +00:00
|
|
|
this.lastTime = Date.now();
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
var diff = Date.now() - this.lastTime;
|
|
|
|
if (diff < 1000/sustained)
|
|
|
|
return true;
|
|
|
|
|
|
|
|
this.lastTime = Date.now();
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
};
|
2013-10-06 06:43:25 +00:00
|
|
|
},
|
|
|
|
|
2014-02-15 06:12:11 +00:00
|
|
|
root.formatLink = function (id, type) {
|
2013-10-06 06:43:25 +00:00
|
|
|
switch (type) {
|
|
|
|
case "yt":
|
|
|
|
return "http://youtu.be/" + id;
|
|
|
|
case "vi":
|
|
|
|
return "http://vimeo.com/" + id;
|
|
|
|
case "dm":
|
|
|
|
return "http://dailymotion.com/video/" + id;
|
|
|
|
case "sc":
|
|
|
|
return id;
|
|
|
|
case "li":
|
|
|
|
return "http://livestream.com/" + id;
|
|
|
|
case "tw":
|
|
|
|
return "http://twitch.tv/" + id;
|
|
|
|
case "jt":
|
|
|
|
return "http://justin.tv/" + id;
|
|
|
|
case "rt":
|
|
|
|
return id;
|
|
|
|
case "jw":
|
|
|
|
return id;
|
|
|
|
case "im":
|
|
|
|
return "http://imgur.com/a/" + id;
|
|
|
|
case "us":
|
|
|
|
return "http://ustream.tv/" + id;
|
|
|
|
default:
|
|
|
|
return "";
|
|
|
|
}
|
2013-10-16 22:36:05 +00:00
|
|
|
},
|
|
|
|
|
2014-02-15 06:12:11 +00:00
|
|
|
root.isLive = function (type) {
|
2014-01-06 15:55:12 +00:00
|
|
|
switch (type) {
|
|
|
|
case "li":
|
|
|
|
case "tw":
|
|
|
|
case "jt":
|
|
|
|
case "us":
|
|
|
|
case "rt":
|
|
|
|
case "cu":
|
2014-02-03 02:04:50 +00:00
|
|
|
case "im":
|
2014-01-06 15:55:12 +00:00
|
|
|
case "jw":
|
|
|
|
return true;
|
|
|
|
default:
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
2014-02-15 06:12:11 +00:00
|
|
|
root.sha1 = function (data) {
|
|
|
|
if (!crypto) {
|
|
|
|
return "";
|
|
|
|
}
|
2014-01-24 17:20:16 +00:00
|
|
|
var shasum = crypto.createHash("sha1");
|
|
|
|
shasum.update(data);
|
|
|
|
return shasum.digest("hex");
|
|
|
|
}
|
2014-02-15 06:12:11 +00:00
|
|
|
})();
|