diff --git a/lib/Client/InternalClient.js b/lib/Client/InternalClient.js index c189d00c2..646324fdb 100644 --- a/lib/Client/InternalClient.js +++ b/lib/Client/InternalClient.js @@ -1783,7 +1783,7 @@ var InternalClient = (function () { } break; case _Constants.PacketType.VOICE_STATE_UPDATE: - + console.log(data); var user = self.users.get("id", data.user_id); var server = self.servers.get("id", data.guild_id); @@ -1828,6 +1828,16 @@ var InternalClient = (function () { var user = _ref7; + server.memberMap[user.user.id] = { + roles: user.roles.map(function (pid) { + return server.roles.get("id", pid); + }), + mute: user.mute, + self_mute: false, + deaf: user.deaf, + self_deaf: false, + joinedAt: Date.parse(user.joined_at) + }; server.members.add(self.users.add(new _StructuresUser2["default"](user.user, client))); } diff --git a/lib/Structures/Server.js b/lib/Structures/Server.js index 9e14b054b..968c17cad 100644 --- a/lib/Structures/Server.js +++ b/lib/Structures/Server.js @@ -68,7 +68,7 @@ var Server = (function (_Equality) { this.icon = data.icon; this.afkTimeout = data.afkTimeout; this.afkChannelID = data.afk_channel_id || data.afkChannelID; - this.memberMap = {}; + this.memberMap = data.memberMap || {}; this.memberCount = data.member_count || data.memberCount; this.large = data.large || this.memberCount > 250; @@ -170,7 +170,7 @@ var Server = (function (_Equality) { Server.prototype.detailsOf = function detailsOf(user) { user = this.client.internal.resolver.resolveUser(user); if (user) { - return this.memberMap[user.id]; + return this.memberMap[user.id] || {}; } else { return {}; } @@ -211,14 +211,20 @@ var Server = (function (_Equality) { Server.prototype.eventVoiceJoin = function eventVoiceJoin(user, channel) { // removes from other speaking channels first - this.eventVoiceLeave(user); + var oldChannel = this.eventVoiceLeave(user); + if (oldChannel.id) { + this.client.emit("voiceLeave", oldChannel, user); + } channel.members.add(user); user.voiceChannel = channel; + this.client.emit("voiceJoin", channel, user); }; Server.prototype.eventVoiceStateUpdate = function eventVoiceStateUpdate(channel, user, data) { - // removes from other speaking channels first + if (!user.voiceChannel || user.voiceChannel.id !== channel.id) { + return this.eventVoiceJoin(user, channel); + } if (!this.memberMap[user.id]) { this.memberMap[user.id] = {}; } @@ -232,11 +238,10 @@ var Server = (function (_Equality) { this.memberMap[user.id].self_mute = data.self_mute; this.memberMap[user.id].deaf = data.deaf; this.memberMap[user.id].self_deaf = data.self_deaf; - if ((oldState.mute != data.mute || oldState.self_mute != data.self_mute || oldState.deaf != data.deaf || oldState.self_deaf != data.self_deaf) && oldState.mute !== undefined) { + if (oldState.mute !== undefined && (oldState.mute != data.mute || oldState.self_mute != data.self_mute || oldState.deaf != data.deaf || oldState.self_deaf != data.self_deaf)) { this.client.emit("voiceStateUpdate", channel, user, oldState, this.memberMap[user.id]); } else { this.eventVoiceJoin(user, channel); - this.client.emit("voiceJoin", channel, user); } }; diff --git a/src/Client/InternalClient.js b/src/Client/InternalClient.js index f0378aa2c..bec5f6469 100644 --- a/src/Client/InternalClient.js +++ b/src/Client/InternalClient.js @@ -1548,7 +1548,6 @@ export default class InternalClient { } break; case PacketType.VOICE_STATE_UPDATE: - var user = self.users.get("id", data.user_id); var server = self.servers.get("id", data.guild_id); @@ -1581,6 +1580,14 @@ export default class InternalClient { var testtime = new Date().getTime(); for (var user of data.members) { + server.memberMap[user.user.id] = { + roles: user.roles.map(pid => server.roles.get("id", pid)), + mute: user.mute, + self_mute: false, + deaf: user.deaf, + self_deaf: false, + joinedAt: Date.parse(user.joined_at) + }; server.members.add(self.users.add(new User(user.user, client))); } diff --git a/src/Structures/Server.js b/src/Structures/Server.js index 6ff4831b2..03c345760 100644 --- a/src/Structures/Server.js +++ b/src/Structures/Server.js @@ -37,7 +37,7 @@ export default class Server extends Equality { this.icon = data.icon; this.afkTimeout = data.afkTimeout; this.afkChannelID = data.afk_channel_id || data.afkChannelID; - this.memberMap = {}; + this.memberMap = data.memberMap || {}; this.memberCount = data.member_count || data.memberCount; this.large = data.large || this.memberCount > 250; @@ -105,7 +105,7 @@ export default class Server extends Equality { detailsOf(user) { user = this.client.internal.resolver.resolveUser(user); if (user) { - return this.memberMap[user.id]; + return this.memberMap[user.id] || {}; } else { return {}; } @@ -174,14 +174,20 @@ export default class Server extends Equality { eventVoiceJoin(user, channel) { // removes from other speaking channels first - this.eventVoiceLeave(user); + var oldChannel = this.eventVoiceLeave(user); + if (oldChannel.id) { + this.client.emit("voiceLeave", oldChannel, user); + } channel.members.add(user); user.voiceChannel = channel; + this.client.emit("voiceJoin", channel, user); } eventVoiceStateUpdate(channel, user, data) { - // removes from other speaking channels first + if (!user.voiceChannel || user.voiceChannel.id !== channel.id) { + return this.eventVoiceJoin(user, channel); + } if (!this.memberMap[user.id]) { this.memberMap[user.id] = {}; } @@ -195,13 +201,11 @@ export default class Server extends Equality { this.memberMap[user.id].self_mute = data.self_mute; this.memberMap[user.id].deaf = data.deaf; this.memberMap[user.id].self_deaf = data.self_deaf; - if ((oldState.mute != data.mute || oldState.self_mute != data.self_mute - || oldState.deaf != data.deaf || oldState.self_deaf != data.self_deaf) - && oldState.mute !== undefined) { + if (oldState.mute !== undefined && (oldState.mute != data.mute || oldState.self_mute != data.self_mute + || oldState.deaf != data.deaf || oldState.self_deaf != data.self_deaf)) { this.client.emit("voiceStateUpdate", channel, user, oldState, this.memberMap[user.id]); } else { this.eventVoiceJoin(user, channel); - this.client.emit("voiceJoin", channel, user); } }