mirror of
https://github.com/discordjs/discord.js.git
synced 2026-03-18 20:43:30 +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.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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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`);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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 => {
|
||||||
|
|||||||
Reference in New Issue
Block a user