mirror of
https://github.com/discordjs/discord.js.git
synced 2026-03-09 16:13:31 +01:00
added interval fixes - bots die gracefully now
This commit is contained in:
@@ -138,14 +138,40 @@ var InternalClient = (function () {
|
||||
this.channels = new _UtilCache2["default"]();
|
||||
this.servers = new _UtilCache2["default"]();
|
||||
this.private_channels = new _UtilCache2["default"]();
|
||||
this.typingIntervals = [];
|
||||
|
||||
this.intervals = {
|
||||
typing: [],
|
||||
kai: null,
|
||||
misc: []
|
||||
};
|
||||
|
||||
this.voiceConnection = null;
|
||||
this.resolver = new _ResolverResolver2["default"](this);
|
||||
this.readyTime = null;
|
||||
|
||||
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
|
||||
|
||||
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 () {
|
||||
// remove channels of server then the server
|
||||
for (var _iterator = server.channels, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
|
||||
var _ref;
|
||||
for (var _iterator2 = server.channels, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
|
||||
var _ref2;
|
||||
|
||||
if (_isArray) {
|
||||
if (_i >= _iterator.length) break;
|
||||
_ref = _iterator[_i++];
|
||||
if (_isArray2) {
|
||||
if (_i2 >= _iterator2.length) break;
|
||||
_ref2 = _iterator2[_i2++];
|
||||
} else {
|
||||
_i = _iterator.next();
|
||||
if (_i.done) break;
|
||||
_ref = _i.value;
|
||||
_i2 = _iterator2.next();
|
||||
if (_i2.done) break;
|
||||
_ref2 = _i2.value;
|
||||
}
|
||||
|
||||
var chan = _ref;
|
||||
var chan = _ref2;
|
||||
|
||||
_this6.channels.remove(chan);
|
||||
}
|
||||
@@ -607,19 +633,19 @@ var InternalClient = (function () {
|
||||
|
||||
if (data.permissions) {
|
||||
newData.permissions = 0;
|
||||
for (var _iterator2 = data.permissions, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
|
||||
var _ref2;
|
||||
for (var _iterator3 = data.permissions, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {
|
||||
var _ref3;
|
||||
|
||||
if (_isArray2) {
|
||||
if (_i2 >= _iterator2.length) break;
|
||||
_ref2 = _iterator2[_i2++];
|
||||
if (_isArray3) {
|
||||
if (_i3 >= _iterator3.length) break;
|
||||
_ref3 = _iterator3[_i3++];
|
||||
} else {
|
||||
_i2 = _iterator2.next();
|
||||
if (_i2.done) break;
|
||||
_ref2 = _i2.value;
|
||||
_i3 = _iterator3.next();
|
||||
if (_i3.done) break;
|
||||
_ref3 = _i3.value;
|
||||
}
|
||||
|
||||
var perm = _ref2;
|
||||
var perm = _ref3;
|
||||
|
||||
if (perm instanceof String || typeof perm === "string") {
|
||||
newData.permissions |= _Constants.Permissions[perm] || 0;
|
||||
@@ -679,19 +705,19 @@ var InternalClient = (function () {
|
||||
return r.id;
|
||||
});
|
||||
|
||||
for (var _iterator3 = roles, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {
|
||||
var _ref3;
|
||||
for (var _iterator4 = roles, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {
|
||||
var _ref4;
|
||||
|
||||
if (_isArray3) {
|
||||
if (_i3 >= _iterator3.length) break;
|
||||
_ref3 = _iterator3[_i3++];
|
||||
if (_isArray4) {
|
||||
if (_i4 >= _iterator4.length) break;
|
||||
_ref4 = _iterator4[_i4++];
|
||||
} else {
|
||||
_i3 = _iterator3.next();
|
||||
if (_i3.done) break;
|
||||
_ref3 = _i3.value;
|
||||
_i4 = _iterator4.next();
|
||||
if (_i4.done) break;
|
||||
_ref4 = _i4.value;
|
||||
}
|
||||
|
||||
var role = _ref3;
|
||||
var role = _ref4;
|
||||
|
||||
if (!role.server.memberMap[member.id]) {
|
||||
return Promise.reject(new Error("member not in server"));
|
||||
@@ -750,19 +776,19 @@ var InternalClient = (function () {
|
||||
return r.id;
|
||||
});
|
||||
|
||||
for (var _iterator4 = roles, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {
|
||||
var _ref4;
|
||||
for (var _iterator5 = roles, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) {
|
||||
var _ref5;
|
||||
|
||||
if (_isArray4) {
|
||||
if (_i4 >= _iterator4.length) break;
|
||||
_ref4 = _iterator4[_i4++];
|
||||
if (_isArray5) {
|
||||
if (_i5 >= _iterator5.length) break;
|
||||
_ref5 = _iterator5[_i5++];
|
||||
} else {
|
||||
_i4 = _iterator4.next();
|
||||
if (_i4.done) break;
|
||||
_ref4 = _i4.value;
|
||||
_i5 = _iterator5.next();
|
||||
if (_i5.done) break;
|
||||
_ref5 = _i5.value;
|
||||
}
|
||||
|
||||
var role = _ref4;
|
||||
var role = _ref5;
|
||||
|
||||
if (!role.server.memberMap[member.id]) {
|
||||
return Promise.reject(new Error("member not in server"));
|
||||
@@ -925,12 +951,12 @@ var InternalClient = (function () {
|
||||
|
||||
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
|
||||
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.emit("error", error);
|
||||
});
|
||||
@@ -947,13 +973,13 @@ var InternalClient = (function () {
|
||||
|
||||
return this.resolver.resolveChannel(channel).then(function (channel) {
|
||||
|
||||
if (!_this24.typingIntervals[channel.id]) {
|
||||
if (!_this24.intervals.typing[channel.id]) {
|
||||
// typing interval doesn't exist
|
||||
throw new Error("Not typing in that channel");
|
||||
}
|
||||
|
||||
clearInterval(_this24.typingIntervals[channel.id]);
|
||||
_this24.typingIntervals[channel.id] = false;
|
||||
clearInterval(_this24.intervals.typing[channel.id]);
|
||||
_this24.intervals.typing[channel.id] = false;
|
||||
});
|
||||
};
|
||||
|
||||
@@ -1112,6 +1138,7 @@ var InternalClient = (function () {
|
||||
self.websocket = null;
|
||||
self.state = _ConnectionState2["default"].DISCONNECTED;
|
||||
client.emit("disconnected");
|
||||
self.cleanIntervals();
|
||||
};
|
||||
|
||||
this.websocket.onerror = function (e) {
|
||||
@@ -1147,7 +1174,7 @@ var InternalClient = (function () {
|
||||
});
|
||||
self.state = _ConnectionState2["default"].READY;
|
||||
|
||||
setInterval(function () {
|
||||
self.intervals.kai = setInterval(function () {
|
||||
return self.sendWS({ op: 1, d: Date.now() });
|
||||
}, data.heartbeat_interval);
|
||||
|
||||
@@ -1229,19 +1256,19 @@ var InternalClient = (function () {
|
||||
var server = self.servers.get("id", data.id);
|
||||
if (server) {
|
||||
|
||||
for (var _iterator5 = server.channels, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) {
|
||||
var _ref5;
|
||||
for (var _iterator6 = server.channels, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) {
|
||||
var _ref6;
|
||||
|
||||
if (_isArray5) {
|
||||
if (_i5 >= _iterator5.length) break;
|
||||
_ref5 = _iterator5[_i5++];
|
||||
if (_isArray6) {
|
||||
if (_i6 >= _iterator6.length) break;
|
||||
_ref6 = _iterator6[_i6++];
|
||||
} else {
|
||||
_i5 = _iterator5.next();
|
||||
if (_i5.done) break;
|
||||
_ref5 = _i5.value;
|
||||
_i6 = _iterator6.next();
|
||||
if (_i6.done) break;
|
||||
_ref6 = _i6.value;
|
||||
}
|
||||
|
||||
var channel = _ref5;
|
||||
var channel = _ref6;
|
||||
|
||||
self.channels.remove(channel);
|
||||
}
|
||||
|
||||
@@ -334,13 +334,12 @@ var VoiceConnection = (function (_EventEmitter) {
|
||||
case 2:
|
||||
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({
|
||||
op: 3,
|
||||
d: null
|
||||
}));
|
||||
}, data.d.heartbeat_interval);
|
||||
self.KAI = KAI;
|
||||
|
||||
var udpPacket = new Buffer(70);
|
||||
udpPacket.writeUIntBE(data.d.ssrc, 0, 4);
|
||||
|
||||
@@ -75,14 +75,27 @@ export default class InternalClient {
|
||||
this.channels = new Cache();
|
||||
this.servers = new Cache();
|
||||
this.private_channels = new Cache();
|
||||
this.typingIntervals = [];
|
||||
|
||||
this.intervals = {
|
||||
typing : [],
|
||||
kai : null,
|
||||
misc : []
|
||||
};
|
||||
|
||||
this.voiceConnection = null;
|
||||
this.resolver = new Resolver(this);
|
||||
this.readyTime = null;
|
||||
|
||||
this.messageAwaits = {};
|
||||
}
|
||||
|
||||
cleanIntervals(){
|
||||
for(let interval of this.intervals.typing.concat(this.intervals.misc).concat(this.intervals.kai)){
|
||||
if(interval){
|
||||
clearInterval(interval);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
get uptime() {
|
||||
return (this.readyTime ? Date.now() - this.readyTime : null);
|
||||
}
|
||||
@@ -830,12 +843,12 @@ export default class InternalClient {
|
||||
return this.resolver.resolveChannel(channel)
|
||||
.then(channel => {
|
||||
|
||||
if(this.typingIntervals[channel.id]){
|
||||
if(this.intervals.typing[channel.id]){
|
||||
// typing interval already exists, leave it alone
|
||||
throw new Error("Already typing in that channel");
|
||||
}
|
||||
|
||||
this.typingIntervals[channel.id] = setInterval(
|
||||
this.intervals.typing[channel.id] = setInterval(
|
||||
() => this.sendTyping(channel)
|
||||
.catch(error => this.emit("error", error)),
|
||||
4000
|
||||
@@ -851,13 +864,13 @@ export default class InternalClient {
|
||||
return this.resolver.resolveChannel(channel)
|
||||
.then(channel => {
|
||||
|
||||
if(!this.typingIntervals[channel.id]){
|
||||
if(!this.intervals.typing[channel.id]){
|
||||
// typing interval doesn't exist
|
||||
throw new Error("Not typing in that channel");
|
||||
}
|
||||
|
||||
clearInterval(this.typingIntervals[channel.id]);
|
||||
this.typingIntervals[channel.id] = false;
|
||||
clearInterval(this.intervals.typing[channel.id]);
|
||||
this.intervals.typing[channel.id] = false;
|
||||
|
||||
});
|
||||
}
|
||||
@@ -1016,6 +1029,7 @@ export default class InternalClient {
|
||||
self.websocket = null;
|
||||
self.state = ConnectionState.DISCONNECTED;
|
||||
client.emit("disconnected");
|
||||
self.cleanIntervals();
|
||||
};
|
||||
|
||||
this.websocket.onerror = e => {
|
||||
@@ -1051,7 +1065,7 @@ export default class InternalClient {
|
||||
});
|
||||
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("debug", `ready packet took ${Date.now() - startTime}ms to process`);
|
||||
|
||||
@@ -302,14 +302,13 @@ export default class VoiceConnection extends EventEmitter {
|
||||
case 2:
|
||||
self.vWSData = data.d;
|
||||
|
||||
KAI = setInterval(() => {
|
||||
self.KAI = KAI = self.client.internal.intervals.misc["voiceKAI"] = setInterval(() => {
|
||||
if (vWS && vWS.readyState === WebSocket.OPEN)
|
||||
vWS.send(JSON.stringify({
|
||||
op: 3,
|
||||
d: null
|
||||
}));
|
||||
}, data.d.heartbeat_interval);
|
||||
self.KAI = KAI;
|
||||
|
||||
var udpPacket = new Buffer(70);
|
||||
udpPacket.writeUIntBE(data.d.ssrc, 0, 4);
|
||||
|
||||
@@ -7,6 +7,11 @@ var request = require("superagent");
|
||||
|
||||
client.on("ready", () => {
|
||||
console.log("ready");
|
||||
|
||||
setTimeout(() => {
|
||||
client.internal.websocket.close();
|
||||
}, 3000);
|
||||
|
||||
});
|
||||
|
||||
client.on("message", msg => {
|
||||
|
||||
Reference in New Issue
Block a user