diff --git a/lib/Client/Client.js b/lib/Client/Client.js index baa4966fa..236eaeb57 100644 --- a/lib/Client/Client.js +++ b/lib/Client/Client.js @@ -251,6 +251,20 @@ var Client = (function (_EventEmitter) { }); }; + Client.prototype.leaveServer = function leaveServer(server) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function (err) {} : arguments[1]; + + var self = this; + return new Promise(function (resolve, reject) { + + self.internal.leaveServer(server).then(function () { + callback();resolve(); + })["catch"](function (e) { + callback(e);reject(e); + }); + }); + }; + return Client; })(EventEmitter); diff --git a/lib/Client/InternalClient.js b/lib/Client/InternalClient.js index 03fdcf11e..5f31e0466 100644 --- a/lib/Client/InternalClient.js +++ b/lib/Client/InternalClient.js @@ -69,6 +69,46 @@ var InternalClient = (function () { }); }; + //def leaveServer + + InternalClient.prototype.leaveServer = function leaveServer(srv) { + var self = this; + return new Promise(function (resolve, reject) { + var server = self.resolver.resolveServer(srv); + if (server) { + + request.del(Endpoints.SERVER(server.id)).set("authorization", self.token).end(function (err, res) { + if (err) { + reject(new Error(err.response.text)); + } else { + // 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; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var chan = _ref; + + server.channels.remove(chan); + } + // remove server + self.servers.remove(server); + resolve(); + } + }); + } else { + reject(new Error("server did not resolve")); + } + }); + }; + // def login InternalClient.prototype.login = function login(email, password) { diff --git a/lib/Client/Resolver/Resolver.js b/lib/Client/Resolver/Resolver.js index 8c250e6f1..ceec4167f 100644 --- a/lib/Client/Resolver/Resolver.js +++ b/lib/Client/Resolver/Resolver.js @@ -20,6 +20,21 @@ var Resolver = (function () { this.internal = internal; } + Resolver.prototype.resolveServer = function resolveServer(resource) { + if (resource instanceof Server) { + return resource; + } else if (resource instanceof ServerChannel) { + return resource.server; + } else if (resource instanceof String || typeof resource === "string") { + return this.internal.servers.get("id", resource); + } else if (resource instanceof Message) { + if (resource.channel instanceof TextChannel) { + return resource.server; + } + } + return null; + }; + Resolver.prototype.resolveFile = function resolveFile(resource) { if (typeof resource === "string" || resource instanceof String) { return fs.createReadStream(resource); diff --git a/lib/Structures/Server.js b/lib/Structures/Server.js index 16acb6b09..b874672ab 100644 --- a/lib/Structures/Server.js +++ b/lib/Structures/Server.js @@ -52,10 +52,10 @@ var Server = (function (_Equality) { data.channels.forEach(function (dataChannel) { if (dataChannel.type === "text") { - var channel = client.internal.channels.add(new TextChannel(dataChannel, client)); + var channel = client.internal.channels.add(new TextChannel(dataChannel, client, _this)); _this.channels.add(channel); } else { - var channel = client.internal.channels.add(new VoiceChannel(dataChannel, client)); + var channel = client.internal.channels.add(new VoiceChannel(dataChannel, client, _this)); _this.channels.add(channel); } }); diff --git a/lib/Structures/ServerChannel.js b/lib/Structures/ServerChannel.js index 46962b693..fe4f9653b 100644 --- a/lib/Structures/ServerChannel.js +++ b/lib/Structures/ServerChannel.js @@ -11,7 +11,7 @@ var PermissionOverwrite = require("./PermissionOverwrite.js"); var ServerChannel = (function (_Channel) { _inherits(ServerChannel, _Channel); - function ServerChannel(data, client) { + function ServerChannel(data, client, server) { var _this = this; _classCallCheck(this, ServerChannel); @@ -20,6 +20,7 @@ var ServerChannel = (function (_Channel) { this.name = data.name; this.type = data.type; this.permissionOverwrites = new Cache(); + this.server = server; data.permission_overwrites.forEach(function (permission) { _this.permissionOverwrites.add(new PermissionOverwrite(permission)); }); diff --git a/lib/Structures/TextChannel.js b/lib/Structures/TextChannel.js index 9e4e153a6..897a1b04c 100644 --- a/lib/Structures/TextChannel.js +++ b/lib/Structures/TextChannel.js @@ -12,10 +12,10 @@ var Cache = require("../Util/Cache.js"); var TextChannel = (function (_ServerChannel) { _inherits(TextChannel, _ServerChannel); - function TextChannel(data, client) { + function TextChannel(data, client, server) { _classCallCheck(this, TextChannel); - _ServerChannel.call(this, data, client); + _ServerChannel.call(this, data, client, server); this.name = data.name; this.topic = data.topic; diff --git a/lib/Structures/VoiceChannel.js b/lib/Structures/VoiceChannel.js index 20cf772c2..333786b58 100644 --- a/lib/Structures/VoiceChannel.js +++ b/lib/Structures/VoiceChannel.js @@ -9,10 +9,10 @@ var ServerChannel = require("./ServerChannel.js"); var VoiceChannel = (function (_ServerChannel) { _inherits(VoiceChannel, _ServerChannel); - function VoiceChannel(data, client) { + function VoiceChannel(data, client, server) { _classCallCheck(this, VoiceChannel); - _ServerChannel.call(this, data, client); + _ServerChannel.call(this, data, client, server); } return VoiceChannel; diff --git a/src/Client/Client.js b/src/Client/Client.js index 756691889..d4c8d4598 100644 --- a/src/Client/Client.js +++ b/src/Client/Client.js @@ -226,6 +226,21 @@ class Client extends EventEmitter { }) }); } + + leaveServer(server, callback=function(err){}){ + var self = this; + return new Promise((resolve, reject) => { + + self.internal.leaveServer(server) + .then(() => { + callback(); resolve(); + }) + .catch(e => { + callback(e); reject(e); + }) + + }); + } } module.exports = Client; \ No newline at end of file diff --git a/src/Client/InternalClient.js b/src/Client/InternalClient.js index 33c1fb672..f2151ff1f 100644 --- a/src/Client/InternalClient.js +++ b/src/Client/InternalClient.js @@ -65,6 +65,36 @@ class InternalClient { }); } + //def leaveServer + leaveServer(srv) { + var self = this; + return new Promise((resolve, reject) => { + var server = self.resolver.resolveServer(srv); + if(server){ + + request + .del(Endpoints.SERVER(server.id)) + .set("authorization", self.token) + .end((err, res) => { + if(err){ + reject(new Error(err.response.text)); + }else{ + // remove channels of server then the server + for(var chan of server.channels){ + server.channels.remove(chan); + } + // remove server + self.servers.remove(server); + resolve(); + } + }); + + }else{ + reject(new Error("server did not resolve")); + } + }); + } + // def login login(email, password) { var self = this; diff --git a/src/Client/Resolver/Resolver.js b/src/Client/Resolver/Resolver.js index ac28af3fb..1d7252715 100644 --- a/src/Client/Resolver/Resolver.js +++ b/src/Client/Resolver/Resolver.js @@ -15,6 +15,21 @@ class Resolver { constructor(internal) { this.internal = internal; } + + resolveServer(resource){ + if(resource instanceof Server){ + return resource; + }else if(resource instanceof ServerChannel){ + return resource.server; + }else if(resource instanceof String || typeof resource === "string"){ + return this.internal.servers.get("id", resource); + }else if(resource instanceof Message){ + if(resource.channel instanceof TextChannel){ + return resource.server; + } + } + return null; + } resolveFile(resource) { if (typeof resource === "string" || resource instanceof String) { diff --git a/src/Structures/Server.js b/src/Structures/Server.js index ba404762a..740893bc7 100644 --- a/src/Structures/Server.js +++ b/src/Structures/Server.js @@ -41,10 +41,10 @@ class Server extends Equality { data.channels.forEach( (dataChannel) => { if(dataChannel.type === "text"){ - var channel = client.internal.channels.add(new TextChannel(dataChannel, client)); + var channel = client.internal.channels.add(new TextChannel(dataChannel, client, this)); this.channels.add(channel); }else{ - var channel = client.internal.channels.add(new VoiceChannel(dataChannel, client)); + var channel = client.internal.channels.add(new VoiceChannel(dataChannel, client, this)); this.channels.add(channel); } } ); diff --git a/src/Structures/ServerChannel.js b/src/Structures/ServerChannel.js index 8cfb0a34b..aee047600 100644 --- a/src/Structures/ServerChannel.js +++ b/src/Structures/ServerChannel.js @@ -5,11 +5,12 @@ var Cache = require("../Util/Cache.js"); var PermissionOverwrite = require("./PermissionOverwrite.js"); class ServerChannel extends Channel{ - constructor(data, client){ + constructor(data, client, server){ super(data, client); this.name = data.name; this.type = data.type; this.permissionOverwrites = new Cache(); + this.server = server; data.permission_overwrites.forEach((permission) => { this.permissionOverwrites.add( new PermissionOverwrite(permission) ); }); diff --git a/src/Structures/TextChannel.js b/src/Structures/TextChannel.js index 98a1a7c92..bced4c7bd 100644 --- a/src/Structures/TextChannel.js +++ b/src/Structures/TextChannel.js @@ -4,8 +4,8 @@ var ServerChannel = require("./ServerChannel.js"); var Cache = require("../Util/Cache.js"); class TextChannel extends ServerChannel{ - constructor(data, client){ - super(data, client); + constructor(data, client, server){ + super(data, client, server); this.name = data.name; this.topic = data.topic; diff --git a/src/Structures/VoiceChannel.js b/src/Structures/VoiceChannel.js index fa8c1efb9..dedd6871d 100644 --- a/src/Structures/VoiceChannel.js +++ b/src/Structures/VoiceChannel.js @@ -3,8 +3,8 @@ var ServerChannel = require("./ServerChannel.js"); class VoiceChannel extends ServerChannel{ - constructor(data, client){ - super(data, client); + constructor(data, client, server){ + super(data, client, server); } }