added interval fixes - bots die gracefully now

This commit is contained in:
Amish Shah
2015-12-06 19:02:10 +00:00
parent 4486b623f5
commit e072c58460
5 changed files with 109 additions and 65 deletions

View File

@@ -138,14 +138,40 @@ var InternalClient = (function () {
this.channels = new _UtilCache2["default"](); this.channels = new _UtilCache2["default"]();
this.servers = new _UtilCache2["default"](); this.servers = new _UtilCache2["default"]();
this.private_channels = new _UtilCache2["default"](); this.private_channels = new _UtilCache2["default"]();
this.typingIntervals = [];
this.intervals = {
typing: [],
kai: null,
misc: []
};
this.voiceConnection = null; this.voiceConnection = null;
this.resolver = new _ResolverResolver2["default"](this); this.resolver = new _ResolverResolver2["default"](this);
this.readyTime = null; this.readyTime = null;
this.messageAwaits = {}; this.messageAwaits = {};
} }
InternalClient.prototype.cleanIntervals = function cleanIntervals() {
for (var _iterator = this.intervals.typing.concat(this.intervals.misc).concat(this.intervals.kai), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
var _ref;
if (_isArray) {
if (_i >= _iterator.length) break;
_ref = _iterator[_i++];
} else {
_i = _iterator.next();
if (_i.done) break;
_ref = _i.value;
}
var interval = _ref;
if (interval) {
clearInterval(interval);
}
}
};
//def leaveVoiceChannel //def leaveVoiceChannel
InternalClient.prototype.leaveVoiceChannel = function leaveVoiceChannel() { InternalClient.prototype.leaveVoiceChannel = function leaveVoiceChannel() {
@@ -276,19 +302,19 @@ var InternalClient = (function () {
return _superagent2["default"].del(_Constants.Endpoints.SERVER(server.id)).set("authorization", this.token).end().then(function () { return _superagent2["default"].del(_Constants.Endpoints.SERVER(server.id)).set("authorization", this.token).end().then(function () {
// remove channels of server then the server // remove channels of server then the server
for (var _iterator = server.channels, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { for (var _iterator2 = server.channels, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
var _ref; var _ref2;
if (_isArray) { if (_isArray2) {
if (_i >= _iterator.length) break; if (_i2 >= _iterator2.length) break;
_ref = _iterator[_i++]; _ref2 = _iterator2[_i2++];
} else { } else {
_i = _iterator.next(); _i2 = _iterator2.next();
if (_i.done) break; if (_i2.done) break;
_ref = _i.value; _ref2 = _i2.value;
} }
var chan = _ref; var chan = _ref2;
_this6.channels.remove(chan); _this6.channels.remove(chan);
} }
@@ -607,19 +633,19 @@ var InternalClient = (function () {
if (data.permissions) { if (data.permissions) {
newData.permissions = 0; newData.permissions = 0;
for (var _iterator2 = data.permissions, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { for (var _iterator3 = data.permissions, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {
var _ref2; var _ref3;
if (_isArray2) { if (_isArray3) {
if (_i2 >= _iterator2.length) break; if (_i3 >= _iterator3.length) break;
_ref2 = _iterator2[_i2++]; _ref3 = _iterator3[_i3++];
} else { } else {
_i2 = _iterator2.next(); _i3 = _iterator3.next();
if (_i2.done) break; if (_i3.done) break;
_ref2 = _i2.value; _ref3 = _i3.value;
} }
var perm = _ref2; var perm = _ref3;
if (perm instanceof String || typeof perm === "string") { if (perm instanceof String || typeof perm === "string") {
newData.permissions |= _Constants.Permissions[perm] || 0; newData.permissions |= _Constants.Permissions[perm] || 0;
@@ -679,19 +705,19 @@ var InternalClient = (function () {
return r.id; return r.id;
}); });
for (var _iterator3 = roles, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { for (var _iterator4 = roles, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {
var _ref3; var _ref4;
if (_isArray3) { if (_isArray4) {
if (_i3 >= _iterator3.length) break; if (_i4 >= _iterator4.length) break;
_ref3 = _iterator3[_i3++]; _ref4 = _iterator4[_i4++];
} else { } else {
_i3 = _iterator3.next(); _i4 = _iterator4.next();
if (_i3.done) break; if (_i4.done) break;
_ref3 = _i3.value; _ref4 = _i4.value;
} }
var role = _ref3; var role = _ref4;
if (!role.server.memberMap[member.id]) { if (!role.server.memberMap[member.id]) {
return Promise.reject(new Error("member not in server")); return Promise.reject(new Error("member not in server"));
@@ -750,19 +776,19 @@ var InternalClient = (function () {
return r.id; return r.id;
}); });
for (var _iterator4 = roles, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { for (var _iterator5 = roles, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) {
var _ref4; var _ref5;
if (_isArray4) { if (_isArray5) {
if (_i4 >= _iterator4.length) break; if (_i5 >= _iterator5.length) break;
_ref4 = _iterator4[_i4++]; _ref5 = _iterator5[_i5++];
} else { } else {
_i4 = _iterator4.next(); _i5 = _iterator5.next();
if (_i4.done) break; if (_i5.done) break;
_ref4 = _i4.value; _ref5 = _i5.value;
} }
var role = _ref4; var role = _ref5;
if (!role.server.memberMap[member.id]) { if (!role.server.memberMap[member.id]) {
return Promise.reject(new Error("member not in server")); return Promise.reject(new Error("member not in server"));
@@ -925,12 +951,12 @@ var InternalClient = (function () {
return this.resolver.resolveChannel(channel).then(function (channel) { return this.resolver.resolveChannel(channel).then(function (channel) {
if (_this23.typingIntervals[channel.id]) { if (_this23.intervals.typing[channel.id]) {
// typing interval already exists, leave it alone // typing interval already exists, leave it alone
throw new Error("Already typing in that channel"); throw new Error("Already typing in that channel");
} }
_this23.typingIntervals[channel.id] = setInterval(function () { _this23.intervals.typing[channel.id] = setInterval(function () {
return _this23.sendTyping(channel)["catch"](function (error) { return _this23.sendTyping(channel)["catch"](function (error) {
return _this23.emit("error", error); return _this23.emit("error", error);
}); });
@@ -947,13 +973,13 @@ var InternalClient = (function () {
return this.resolver.resolveChannel(channel).then(function (channel) { return this.resolver.resolveChannel(channel).then(function (channel) {
if (!_this24.typingIntervals[channel.id]) { if (!_this24.intervals.typing[channel.id]) {
// typing interval doesn't exist // typing interval doesn't exist
throw new Error("Not typing in that channel"); throw new Error("Not typing in that channel");
} }
clearInterval(_this24.typingIntervals[channel.id]); clearInterval(_this24.intervals.typing[channel.id]);
_this24.typingIntervals[channel.id] = false; _this24.intervals.typing[channel.id] = false;
}); });
}; };
@@ -1112,6 +1138,7 @@ var InternalClient = (function () {
self.websocket = null; self.websocket = null;
self.state = _ConnectionState2["default"].DISCONNECTED; self.state = _ConnectionState2["default"].DISCONNECTED;
client.emit("disconnected"); client.emit("disconnected");
self.cleanIntervals();
}; };
this.websocket.onerror = function (e) { this.websocket.onerror = function (e) {
@@ -1147,7 +1174,7 @@ var InternalClient = (function () {
}); });
self.state = _ConnectionState2["default"].READY; self.state = _ConnectionState2["default"].READY;
setInterval(function () { self.intervals.kai = setInterval(function () {
return self.sendWS({ op: 1, d: Date.now() }); return self.sendWS({ op: 1, d: Date.now() });
}, data.heartbeat_interval); }, data.heartbeat_interval);
@@ -1229,19 +1256,19 @@ var InternalClient = (function () {
var server = self.servers.get("id", data.id); var server = self.servers.get("id", data.id);
if (server) { if (server) {
for (var _iterator5 = server.channels, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { for (var _iterator6 = server.channels, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) {
var _ref5; var _ref6;
if (_isArray5) { if (_isArray6) {
if (_i5 >= _iterator5.length) break; if (_i6 >= _iterator6.length) break;
_ref5 = _iterator5[_i5++]; _ref6 = _iterator6[_i6++];
} else { } else {
_i5 = _iterator5.next(); _i6 = _iterator6.next();
if (_i5.done) break; if (_i6.done) break;
_ref5 = _i5.value; _ref6 = _i6.value;
} }
var channel = _ref5; var channel = _ref6;
self.channels.remove(channel); self.channels.remove(channel);
} }

View File

@@ -334,13 +334,12 @@ var VoiceConnection = (function (_EventEmitter) {
case 2: case 2:
self.vWSData = data.d; self.vWSData = data.d;
KAI = setInterval(function () { self.KAI = KAI = self.client.internal.intervals.misc["voiceKAI"] = setInterval(function () {
if (vWS && vWS.readyState === _ws2["default"].OPEN) vWS.send(JSON.stringify({ if (vWS && vWS.readyState === _ws2["default"].OPEN) vWS.send(JSON.stringify({
op: 3, op: 3,
d: null d: null
})); }));
}, data.d.heartbeat_interval); }, data.d.heartbeat_interval);
self.KAI = KAI;
var udpPacket = new Buffer(70); var udpPacket = new Buffer(70);
udpPacket.writeUIntBE(data.d.ssrc, 0, 4); udpPacket.writeUIntBE(data.d.ssrc, 0, 4);

View File

@@ -75,14 +75,27 @@ export default class InternalClient {
this.channels = new Cache(); this.channels = new Cache();
this.servers = new Cache(); this.servers = new Cache();
this.private_channels = new Cache(); this.private_channels = new Cache();
this.typingIntervals = [];
this.intervals = {
typing : [],
kai : null,
misc : []
};
this.voiceConnection = null; this.voiceConnection = null;
this.resolver = new Resolver(this); this.resolver = new Resolver(this);
this.readyTime = null; this.readyTime = null;
this.messageAwaits = {}; this.messageAwaits = {};
} }
cleanIntervals(){
for(let interval of this.intervals.typing.concat(this.intervals.misc).concat(this.intervals.kai)){
if(interval){
clearInterval(interval);
}
}
}
get uptime() { get uptime() {
return (this.readyTime ? Date.now() - this.readyTime : null); return (this.readyTime ? Date.now() - this.readyTime : null);
} }
@@ -830,12 +843,12 @@ export default class InternalClient {
return this.resolver.resolveChannel(channel) return this.resolver.resolveChannel(channel)
.then(channel => { .then(channel => {
if(this.typingIntervals[channel.id]){ if(this.intervals.typing[channel.id]){
// typing interval already exists, leave it alone // typing interval already exists, leave it alone
throw new Error("Already typing in that channel"); throw new Error("Already typing in that channel");
} }
this.typingIntervals[channel.id] = setInterval( this.intervals.typing[channel.id] = setInterval(
() => this.sendTyping(channel) () => this.sendTyping(channel)
.catch(error => this.emit("error", error)), .catch(error => this.emit("error", error)),
4000 4000
@@ -851,13 +864,13 @@ export default class InternalClient {
return this.resolver.resolveChannel(channel) return this.resolver.resolveChannel(channel)
.then(channel => { .then(channel => {
if(!this.typingIntervals[channel.id]){ if(!this.intervals.typing[channel.id]){
// typing interval doesn't exist // typing interval doesn't exist
throw new Error("Not typing in that channel"); throw new Error("Not typing in that channel");
} }
clearInterval(this.typingIntervals[channel.id]); clearInterval(this.intervals.typing[channel.id]);
this.typingIntervals[channel.id] = false; this.intervals.typing[channel.id] = false;
}); });
} }
@@ -1016,6 +1029,7 @@ export default class InternalClient {
self.websocket = null; self.websocket = null;
self.state = ConnectionState.DISCONNECTED; self.state = ConnectionState.DISCONNECTED;
client.emit("disconnected"); client.emit("disconnected");
self.cleanIntervals();
}; };
this.websocket.onerror = e => { this.websocket.onerror = e => {
@@ -1051,7 +1065,7 @@ export default class InternalClient {
}); });
self.state = ConnectionState.READY; self.state = ConnectionState.READY;
setInterval(() => self.sendWS({ op: 1, d: Date.now() }), data.heartbeat_interval); self.intervals.kai = setInterval(() => self.sendWS({ op: 1, d: Date.now() }), data.heartbeat_interval);
client.emit("ready"); client.emit("ready");
client.emit("debug", `ready packet took ${Date.now() - startTime}ms to process`); client.emit("debug", `ready packet took ${Date.now() - startTime}ms to process`);

View File

@@ -302,14 +302,13 @@ export default class VoiceConnection extends EventEmitter {
case 2: case 2:
self.vWSData = data.d; self.vWSData = data.d;
KAI = setInterval(() => { self.KAI = KAI = self.client.internal.intervals.misc["voiceKAI"] = setInterval(() => {
if (vWS && vWS.readyState === WebSocket.OPEN) if (vWS && vWS.readyState === WebSocket.OPEN)
vWS.send(JSON.stringify({ vWS.send(JSON.stringify({
op: 3, op: 3,
d: null d: null
})); }));
}, data.d.heartbeat_interval); }, data.d.heartbeat_interval);
self.KAI = KAI;
var udpPacket = new Buffer(70); var udpPacket = new Buffer(70);
udpPacket.writeUIntBE(data.d.ssrc, 0, 4); udpPacket.writeUIntBE(data.d.ssrc, 0, 4);

View File

@@ -7,6 +7,11 @@ var request = require("superagent");
client.on("ready", () => { client.on("ready", () => {
console.log("ready"); console.log("ready");
setTimeout(() => {
client.internal.websocket.close();
}, 3000);
}); });
client.on("message", msg => { client.on("message", msg => {