diff --git a/docs/docs_client.rst b/docs/docs_client.rst index 90091b3c7..ab5e2be87 100644 --- a/docs/docs_client.rst +++ b/docs/docs_client.rst @@ -822,6 +822,16 @@ Set the nickname of a user on a server. - **callback** - `function` taking the following: - **error** - error if any occurred. +setNote(user, note, `callback`) + ~~~~~~~~~~~~~~~~~~~ + + Set the note of a user. This will only work for user accounts. + + - **user** - A `User Resolvable`_ to which the note is applied. + - **note** - `String`, content of the note, or `null` to clear. + - **callback** - `function` taking the following: + - **error** - error if any occurred. + Events ------ @@ -957,6 +967,11 @@ userUnbanned Emitted when a user is unbanned from a server. Supplies two parameters, a User_ object and a Server_ object. +noteUpdated +~~~~~~~~~~~ + +Emitted when a note is updated. Supplies a User_ object (containing the updated note) and the old note. + voiceJoin ~~~~~~~~ diff --git a/docs/docs_user.rst b/docs/docs_user.rst index 2ec5253b0..0fc7fdc59 100644 --- a/docs/docs_user.rst +++ b/docs/docs_user.rst @@ -87,6 +87,12 @@ createdAt A `Date` referring to when the user was created. + +note +~~~~ + +The note of the user, `String`. + Functions --------- diff --git a/lib/Client/Client.js b/lib/Client/Client.js index 51150d777..2f28dab41 100644 --- a/lib/Client/Client.js +++ b/lib/Client/Client.js @@ -791,6 +791,14 @@ var Client = (function (_EventEmitter) { return this.internal.setNickname(server, nick, user).then(dataCallback(callback), errorCallback(callback)); }; + // def setNote + + Client.prototype.setNote = function setNote(user, note) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function () /*err, {}*/{} : arguments[2]; + + return this.internal.setNote(user, note).then(dataCallback(callback), errorCallback(callback)); + }; + // def createRole Client.prototype.createRole = function createRole(server) { diff --git a/lib/Client/InternalClient.js b/lib/Client/InternalClient.js index 6ca101171..7045cbcfe 100644 --- a/lib/Client/InternalClient.js +++ b/lib/Client/InternalClient.js @@ -1060,6 +1060,19 @@ var InternalClient = (function () { return this.apiRequest("patch", _Constants.Endpoints.SERVER_MEMBERS(server.id) + "/" + (user.id === this.user.id ? "@me/nick" : user.id), true, { nick: nick }); }; + //def setNote + + InternalClient.prototype.setNote = function setNote(user, note) { + user = this.resolver.resolveUser(user); + note = note || ""; + + if (!user) { + return Promise.reject(new Error("Failed to resolve user")); + } + + return this.apiRequest("put", _Constants.Endpoints.ME_NOTES + "/" + user.id, true, { note: note }); + }; + // def createRole InternalClient.prototype.createRole = function createRole(server, data) { @@ -1778,6 +1791,22 @@ var InternalClient = (function () { self.incoming_friend_requests = null; self.outgoing_friend_requests = null; } + + // add notes to users + if (data.notes) { + for (note in data.notes) { + var user = self.users.get("id", note); + if (user) { + var newUser = user; + newUser.note = data.notes[note]; + + self.users.update(user, newUser); + } else { + client.emit("warn", "note in ready packet but user not cached"); + } + } + } + self.state = _ConnectionState2["default"].READY; client.emit("debug", "ready packet took " + (Date.now() - startTime) + "ms to process"); @@ -2242,6 +2271,26 @@ var InternalClient = (function () { client.emit("warn", "user unbanned but user/server not in cache."); } break; + case _Constants.PacketType.USER_NOTE_UPDATE: + if (_this36.user.bot) { + return; + } + var user = self.users.get("id", data.id); + var oldNote = user.note; + var note = data.note || null; + + // user in cache + if (user) { + var updatedUser = user; + updatedUser.note = note; + + client.emit("noteUpdated", user, oldNote); + + self.users.update(user, updatedUser); + } else { + client.emit("warn", "note updated but user not in cache"); + } + break; case _Constants.PacketType.VOICE_STATE_UPDATE: var user = self.users.get("id", data.user_id); var server = self.servers.get("id", data.guild_id); diff --git a/lib/Constants.js b/lib/Constants.js index 485d82e99..696abee8b 100644 --- a/lib/Constants.js +++ b/lib/Constants.js @@ -12,6 +12,7 @@ var Endpoints = { ME_SERVER: function ME_SERVER(serverID) { return Endpoints.ME + "/guilds/" + serverID; }, + ME_NOTES: API + "/users/@me/notes", GATEWAY: API + "/gateway", AVATAR: function AVATAR(userID, avatar) { return API + "/users/" + userID + "/avatars/" + avatar + ".jpg"; @@ -135,6 +136,7 @@ var PacketType = { SERVER_UPDATE: "GUILD_UPDATE", TYPING: "TYPING_START", USER_UPDATE: "USER_UPDATE", + USER_NOTE_UPDATE: "USER_NOTE_UPDATE", VOICE_STATE_UPDATE: "VOICE_STATE_UPDATE", FRIEND_ADD: "RELATIONSHIP_ADD", FRIEND_REMOVE: "RELATIONSHIP_REMOVE" diff --git a/lib/Structures/User.js b/lib/Structures/User.js index ac25dbe7f..948d36b2a 100644 --- a/lib/Structures/User.js +++ b/lib/Structures/User.js @@ -37,6 +37,7 @@ var User = (function (_Equality) { since: null, channel: null }; + this.note = data.note || null; this.voiceChannel = null; this.voiceState = {}; } diff --git a/src/Client/Client.js b/src/Client/Client.js index cc8389d3b..122678adb 100644 --- a/src/Client/Client.js +++ b/src/Client/Client.js @@ -848,6 +848,12 @@ export default class Client extends EventEmitter { .then(dataCallback(callback), errorCallback(callback)); } + // def setNote + setNote(user, note, callback = (/*err, {}*/) => { }) { + return this.internal.setNote(user,note) + .then(dataCallback(callback), errorCallback(callback)); + } + // def createRole createRole(server, data = null, callback = (/*err, role*/) => { }) { if (typeof data === "function") { diff --git a/src/Client/InternalClient.js b/src/Client/InternalClient.js index 9abdb9e69..6a3c0e279 100644 --- a/src/Client/InternalClient.js +++ b/src/Client/InternalClient.js @@ -915,6 +915,18 @@ export default class InternalClient { return this.apiRequest("patch", `${Endpoints.SERVER_MEMBERS(server.id)}/${user.id === this.user.id ? "@me/nick" : user.id}`, true, { nick: nick }); } + //def setNote + setNote(user, note) { + user = this.resolver.resolveUser(user); + note = note || ""; + + if(!user) { + return Promise.reject(new Error("Failed to resolve user")); + } + + return this.apiRequest("put", `${Endpoints.ME_NOTES}/${user.id}`, true, { note: note }); + } + // def createRole createRole(server, data) { server = this.resolver.resolveServer(server); @@ -1551,6 +1563,23 @@ export default class InternalClient { self.incoming_friend_requests = null; self.outgoing_friend_requests = null; } + + // add notes to users + if(data.notes) { + for(note in data.notes) { + var user = self.users.get("id", note); + if(user) { + var newUser = user; + newUser.note = data.notes[note]; + + self.users.update(user, newUser); + } else { + client.emit("warn", "note in ready packet but user not cached"); + } + } + } + + self.state = ConnectionState.READY; client.emit("debug", `ready packet took ${Date.now() - startTime}ms to process`); @@ -1985,6 +2014,27 @@ export default class InternalClient { client.emit("warn", "user unbanned but user/server not in cache."); } break; + case PacketType.USER_NOTE_UPDATE: + if(this.user.bot) { + return; + } + var user = self.users.get("id", data.id); + var oldNote = user.note; + var note = data.note || null; + + // user in cache + if(user) { + var updatedUser = user; + updatedUser.note = note; + + client.emit("noteUpdated", user, oldNote); + + self.users.update(user, updatedUser); + + } else { + client.emit("warn", "note updated but user not in cache"); + } + break; case PacketType.VOICE_STATE_UPDATE: var user = self.users.get("id", data.user_id); var server = self.servers.get("id", data.guild_id); diff --git a/src/Constants.js b/src/Constants.js index 23ac1bcf0..6b2e9e631 100644 --- a/src/Constants.js +++ b/src/Constants.js @@ -8,6 +8,7 @@ export const Endpoints = { ME: `${API}/users/@me`, ME_CHANNELS: `${API}/users/@me/channels`, ME_SERVER: (serverID) => `${Endpoints.ME}/guilds/${serverID}`, + ME_NOTES: `${API}/users/@me/notes`, GATEWAY: `${API}/gateway`, AVATAR : (userID, avatar) => `${API}/users/${userID}/avatars/${avatar}.jpg`, INVITE: (id) => `${API}/invite/${id}`, @@ -93,6 +94,7 @@ export const PacketType = { SERVER_UPDATE : "GUILD_UPDATE", TYPING : "TYPING_START", USER_UPDATE : "USER_UPDATE", + USER_NOTE_UPDATE: "USER_NOTE_UPDATE", VOICE_STATE_UPDATE : "VOICE_STATE_UPDATE", FRIEND_ADD : "RELATIONSHIP_ADD", FRIEND_REMOVE : "RELATIONSHIP_REMOVE" diff --git a/src/Structures/User.js b/src/Structures/User.js index 07a3421c1..1042f20fd 100644 --- a/src/Structures/User.js +++ b/src/Structures/User.js @@ -19,6 +19,7 @@ export default class User extends Equality{ since : null, channel : null }; + this.note = data.note || null; this.voiceChannel = null; this.voiceState = {}; }