diff --git a/lib/Client/InternalClient.js b/lib/Client/InternalClient.js index 7d461d958..03aa438cf 100644 --- a/lib/Client/InternalClient.js +++ b/lib/Client/InternalClient.js @@ -83,6 +83,8 @@ var InternalClient = (function () { }); }; + // def logout + InternalClient.prototype.logout = function logout() { var _this = this; @@ -205,12 +207,10 @@ var InternalClient = (function () { // format: https://discordapi.readthedocs.org/en/latest/reference/channels/messages.html#message-format var channel = self.channels.get("id", data.channel_id); if (channel) { - channel.messages.add(new Message(data, channel, client)); } else { client.emit("warn", "message created but channel is not cached"); } - break; } diff --git a/lib/Client/Resolver/Resolver.js b/lib/Client/Resolver/Resolver.js new file mode 100644 index 000000000..36b89c425 --- /dev/null +++ b/lib/Client/Resolver/Resolver.js @@ -0,0 +1,7 @@ +"use strict"; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Resolver = function Resolver() { + _classCallCheck(this, Resolver); +}; \ No newline at end of file diff --git a/src/Client/InternalClient.js b/src/Client/InternalClient.js index 5f59db805..99efed601 100644 --- a/src/Client/InternalClient.js +++ b/src/Client/InternalClient.js @@ -10,6 +10,7 @@ var Constants = require("../Constants.js"), PacketType = Constants.PacketType; var Cache = require("../Util/Cache.js"); +var Resolver = require("./Resolver/Resolver.js"); var User = require("../Structures/User.js"), Channel = require("../Structures/Channel.js"), @@ -36,6 +37,7 @@ class InternalClient { this.channels = new Cache(); this.servers = new Cache(); this.private_channels = new Cache(); + this.resolver = new Resolver(this); } // def login login(email, password) { @@ -83,6 +85,7 @@ class InternalClient { }); } + // def logout logout() { var self = this; return new Promise((resolve, reject)=>{ @@ -113,6 +116,33 @@ class InternalClient { }); } + + // def startPM + startPM(resUser){ + var self = this; + return new Promise((resolve, reject) => { + var user = self.resolver.resolveUser(resUser); + + if(user){ + + // start the PM + request + .post(`${Endpoints.USER_CHANNELS(user.id)}`) + .set("authorization", self.token) + .end((err, res) => { + if(err){ + reject(new Error(err.response.text)); + }else{ + resolve(self.private_channels.add(new PMChannel(res.body, self.client))); + } + }); + + }else{ + reject(new Error("Unable to resolve resUser to a User")); + } + + }); + } // def getGateway getGateway() { @@ -212,13 +242,10 @@ class InternalClient { // format: https://discordapi.readthedocs.org/en/latest/reference/channels/messages.html#message-format var channel = self.channels.get("id", data.channel_id); if(channel){ - - channel.messages.add( new Message(data, channel, client) ); - + channel.messages.add( new Message(data, channel, client) ); }else{ client.emit("warn", "message created but channel is not cached"); } - break; } diff --git a/src/Client/Resolver/Resolver.js b/src/Client/Resolver/Resolver.js new file mode 100644 index 000000000..17cacaac8 --- /dev/null +++ b/src/Client/Resolver/Resolver.js @@ -0,0 +1,83 @@ +"use strict"; + +var User = require("../../Structures/User.js"), + Channel = require("../../Structures/Channel.js"), + TextChannel = require("../../Structures/TextChannel.js"), + VoiceChannel = require("../../Structures/VoiceChannel.js"), + PMChannel = require("../../Structures/PMChannel.js"), + Server = require("../../Structures/Server.js"), + Message = require("../../Structures/Message.js"); + +class Resolver { + constructor(client) { + this.client = client; + } + + resolveUser(resource) { + /* + accepts a Message, Channel, Server, String ID, User, PMChannel + */ + var found = null; + if(resource instanceof Message){ + found = resource.author; + }else if(resource instanceof TextChannel){ + var lmsg = resource.lastMessage; + if(lmsg){ + found = lmsg.author; + } + }else if(resource instanceof Server){ + found = resource.owner; + }else if(resource instanceof PMChannel){ + found = resource.recipient; + }else if(resource instanceof String || typeof resource === "string"){ + found = this.client.internal.users.get("id", resource); + } + + return found; + } + + resolveChannel(resource) { + /* + accepts a Message, Channel, Server, String ID, User + */ + var self = this; + + return new Promise((resolve, reject) => { + var found = null; + if (resource instanceof Message) { + found = resource.channel; + } else if (resource instanceof Channel) { + found = resource; + } else if (resource instanceof Server) { + found = resource.channels.get("id", resource.id); + } else if (resource instanceof String || typeof resource === "string") { + found = self.client.internal.channels.get("id", resource); + } else if (resource instanceof User) { + // see if a PM exists + var chatFound = false; + for(var pmchat of self.client.internal.private_channels){ + if(pmchat.recipient.equals(resource)){ + chatFound = pmchat; + break; + } + } + if(chatFound){ + // a PM already exists! + found = chatFound; + }else{ + // PM does not exist :\ + self.client.internal.startPM(resource) + .then( pmchannel => resolve(pmchannel) ) + .catch( e => reject(e) ); + return; + } + } + if(found) + resolve(found); + else + reject(); + }); + + } +} +module.exports = Resolver; \ No newline at end of file