diff --git a/lib/Client/Client.js b/lib/Client/Client.js index 236eaeb57..1569c8bf2 100644 --- a/lib/Client/Client.js +++ b/lib/Client/Client.js @@ -251,6 +251,8 @@ var Client = (function (_EventEmitter) { }); }; + // def leaveServer + Client.prototype.leaveServer = function leaveServer(server) { var callback = arguments.length <= 1 || arguments[1] === undefined ? function (err) {} : arguments[1]; @@ -265,6 +267,26 @@ var Client = (function (_EventEmitter) { }); }; + // def createChannel + + Client.prototype.createChannel = function createChannel(server, name) { + var type = arguments.length <= 2 || arguments[2] === undefined ? "text" : arguments[2]; + var callback = arguments.length <= 3 || arguments[3] === undefined ? function (err, channel) {} : arguments[3]; + + var self = this; + return new Promise(function (resolve, reject) { + if (typeof type === "function") { + // options is the callback + callback = type; + } + self.internal.createChannel(server, name, type).then(function (channel) { + callback(channel);resolve(channel); + })["catch"](function (e) { + callback(e);reject(e); + }); + }); + }; + return Client; })(EventEmitter); diff --git a/lib/Client/InternalClient.js b/lib/Client/InternalClient.js index 27a059d8f..1f1ba83ba 100644 --- a/lib/Client/InternalClient.js +++ b/lib/Client/InternalClient.js @@ -384,6 +384,35 @@ var InternalClient = (function () { }); }; + // def createChannel + + InternalClient.prototype.createChannel = function createChannel(server, name) { + var type = arguments.length <= 2 || arguments[2] === undefined ? "text" : arguments[2]; + + var self = this; + + return new Promise(function (resolve, reject) { + + server = self.resolver.resolveServer(server); + + request.post(Endpoints.SERVER_CHANNELS(server.id)).set("authorization", self.token).send({ + name: name, type: type + }).end(function (err, res) { + if (err) { + reject(err); + } else { + var channel; + if (res.body.type === "text") { + channel = new TextChannel(res.body, self.client, server); + } else { + channel = new VoiceChannel(res.body, self.client, server); + } + resolve(server.channels.add(self.channels.add(channel))); + } + }); + }); + }; + InternalClient.prototype.sendWS = function sendWS(object) { if (this.websocket) this.websocket.send(JSON.stringify(object)); }; @@ -760,11 +789,14 @@ var InternalClient = (function () { var channel = self.channels.get("id", data.channel_id); if (user && channel) { - - user.typing.since = Date.now(); - user.typing.channel = channel; - client.emit("userTypingStart", user, channel); - + if (user.typing.since) { + user.typing.since = Date.now(); + user.typing.channel = channel; + } else { + user.typing.since = Date.now(); + user.typing.channel = channel; + client.emit("userTypingStart", user, channel); + } setTimeout(function () { if (Date.now() - user.typing.since > 5990) { // they haven't typed since diff --git a/lib/index.js b/lib/index.js index bf031a273..f7a95f082 100644 --- a/lib/index.js +++ b/lib/index.js @@ -13,7 +13,10 @@ a.on("warn", function (m) { }); a.on("message", function (m) { - if (m.content === "$$$") a.reply(m, "I have you cached as being " + m.author.status); + if (m.content === "$$$") a.createChannel(m.channel.server, "quackducks").then(function (c) { + + a.sendMessage(c, "I'm alive!"); + }); }); a.on("userTypingStart", function (user, chan) { console.log(user.username + " typing"); diff --git a/src/Client/Client.js b/src/Client/Client.js index d4c8d4598..9be71b6f8 100644 --- a/src/Client/Client.js +++ b/src/Client/Client.js @@ -227,6 +227,7 @@ class Client extends EventEmitter { }); } + // def leaveServer leaveServer(server, callback=function(err){}){ var self = this; return new Promise((resolve, reject) => { @@ -241,6 +242,25 @@ class Client extends EventEmitter { }); } + + // def createChannel + createChannel(server, name, type="text", callback=function(err,channel){}){ + var self = this; + return new Promise((resolve, reject) => { + if (typeof type === "function") { + // options is the callback + callback = type; + } + self.internal.createChannel(server, name, type) + .then((channel) => { + callback(channel); resolve(channel); + }) + .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 22c7f248d..c16430f62 100644 --- a/src/Client/InternalClient.js +++ b/src/Client/InternalClient.js @@ -413,9 +413,41 @@ class InternalClient { }); } + + // def createChannel + createChannel(server, name, type = "text") { + var self = this; + + return new Promise((resolve, reject) => { + + server = self.resolver.resolveServer(server); + + request + .post(Endpoints.SERVER_CHANNELS(server.id)) + .set("authorization", self.token) + .send({ + name, type + }) + .end((err, res) => { + if (err) { + reject(err); + } else { + var channel; + if (res.body.type === "text") { + channel = new TextChannel(res.body, self.client, server); + } else { + channel = new VoiceChannel(res.body, self.client, server); + } + resolve(server.channels.add(self.channels.add(channel))); + } + }) + + }); + + } sendWS(object) { - if(this.websocket) + if (this.websocket) this.websocket.send(JSON.stringify(object)); } @@ -703,7 +735,7 @@ class InternalClient { case PacketType.SERVER_MEMBER_ADD: var server = self.servers.get("id", data.guild_id); if (server) { - + server.memberMap[data.user.id] = { roles: data.roles.map((pid) => server.roles.get("id", pid)), mute: false, @@ -715,7 +747,7 @@ class InternalClient { "serverNewMember", server, server.members.add(self.users.add(new User(data.user, client))) - ); + ); } else { client.emit("warn", "server member added but server doesn't exist in cache"); @@ -723,106 +755,109 @@ class InternalClient { break; case PacketType.SERVER_MEMBER_REMOVE: var server = self.servers.get("id", data.guild_id); - if(server){ + if (server) { var user = self.users.get("id", data.user.id); - if(user){ + if (user) { server.memberMap[data.user.id] = null; server.members.remove(user); client.emit("serverMemberRemoved", server, user); - }else{ + } else { client.emit("warn", "server member removed but user doesn't exist in cache"); } - }else{ + } else { client.emit("warn", "server member removed but server doesn't exist in cache"); } break; case PacketType.SERVER_MEMBER_UPDATE: var server = self.servers.get("id", data.guild_id); - if(server){ + if (server) { var user = self.users.get("id", data.user.id); - if(user){ + if (user) { server.memberMap[data.user.id].roles = data.roles.map((pid) => server.roles.get("id", pid)); server.memberMap[data.user.id].mute = data.mute; server.memberMap[data.user.id].deaf = data.deaf; client.emit("serverMemberUpdated", server, user); - }else{ + } else { client.emit("warn", "server member removed but user doesn't exist in cache"); } - }else{ + } else { client.emit("warn", "server member updated but server doesn't exist in cache"); } break; case PacketType.PRESENCE_UPDATE: - + var user = self.users.get("id", data.user.id); - - if(user){ - + + if (user) { + data.user.username = data.user.username || user.username; data.user.id = data.user.id || user.id; data.user.avatar = data.user.avatar || user.avatar; data.user.discriminator = data.user.discriminator || user.discriminator; - + var presenceUser = new User(data.user, client); - - if(presenceUser.equalsStrict(user)){ + + if (presenceUser.equalsStrict(user)) { // a real presence update client.emit("presence", user, data.status, data.game_id); user.status = data.status; user.gameID = data.game_id; - - }else{ + + } else { // a name change or avatar change client.emit("userUpdate", user, presenceUser); self.users.update(user, presenceUser); } - - }else{ + + } else { client.emit("warn", "presence update but user not in cache"); } - + break; case PacketType.TYPING: - + var user = self.users.get("id", data.user_id); var channel = self.channels.get("id", data.channel_id); - - if(user && channel){ - - user.typing.since = Date.now(); - user.typing.channel = channel; - client.emit("userTypingStart", user, channel); - - setTimeout( () => { - if(Date.now() - user.typing.since > 5990){ + + if (user && channel) { + if (user.typing.since) { + user.typing.since = Date.now(); + user.typing.channel = channel; + } else { + user.typing.since = Date.now(); + user.typing.channel = channel; + client.emit("userTypingStart", user, channel); + } + setTimeout(() => { + if (Date.now() - user.typing.since > 5990) { // they haven't typed since user.typing.since = null; user.typing.channel = null; client.emit("userTypingStop", user, channel); } }, 6000); - - }else{ + + } else { client.emit("warn", "user typing but user or channel not existant in cache"); } break; case PacketType.SERVER_BAN_ADD: var user = self.users.get("id", data.user.id); var server = self.servers.get("id", data.guild_id); - - if(user && server){ + + if (user && server) { client.emit("userBanned", user, server); - }else{ + } else { client.emit("warn", "user banned but user/server not in cache."); } break; case PacketType.SERVER_BAN_REMOVE: var user = self.users.get("id", data.user.id); var server = self.servers.get("id", data.guild_id); - - if(user && server){ + + if (user && server) { client.emit("userUnbanned", user, server); - }else{ + } else { client.emit("warn", "user unbanned but user/server not in cache."); } break; diff --git a/src/index.js b/src/index.js index ff4709eb5..43561bc30 100644 --- a/src/index.js +++ b/src/index.js @@ -8,7 +8,11 @@ a.on("warn", (m) => console.log("[warn]", m)); a.on("message", m => { if(m.content === "$$$") - a.reply(m, "I have you cached as being " + m.author.status); + a.createChannel(m.channel.server, "quackducks").then( c => { + + a.sendMessage(c, "I'm alive!"); + + } ); }); a.on("userTypingStart", (user, chan) => { console.log(user.username + " typing");