From 6af71bf639105625f34f1c9109a50c3fe19ecfad Mon Sep 17 00:00:00 2001 From: abalabahaha Date: Fri, 29 Jan 2016 17:46:46 -0800 Subject: [PATCH] The beginnings of the voiceUserStateChange event --- lib/Client/InternalClient.js | 25 +++++++++++++++++++----- lib/Structures/Server.js | 23 +++++++--------------- lib/Structures/User.js | 1 + src/Client/InternalClient.js | 38 ++++++++++++++++++++++++------------ src/Structures/Server.js | 27 +++++++++---------------- src/Structures/User.js | 1 + 6 files changed, 64 insertions(+), 51 deletions(-) diff --git a/lib/Client/InternalClient.js b/lib/Client/InternalClient.js index 9bb9fe83c..4edffaf56 100644 --- a/lib/Client/InternalClient.js +++ b/lib/Client/InternalClient.js @@ -1703,16 +1703,31 @@ var InternalClient = (function () { if (user && server) { if (data.channel_id) { - // speaking + // in voice channel var channel = self.channels.get("id", data.channel_id); - if (channel) { - if (server.eventStartSpeaking(user, channel)) client.emit("voiceJoin", user, channel);else client.emit("warn", "voice state error occurred in adding"); + if (channel && channel.type === "voice") { + var oldState = { + mute: user.voiceState.mute, + self_mute: user.voiceState.self_mute, + deaf: user.voiceState.deaf, + self_deaf: user.voiceState.self_deaf + }; + user.voiceState.mute = data.mute; + user.voiceState.self_mute = data.self_mute; + user.voiceState.deaf = data.deaf; + user.voiceState.self_deaf = data.self_deaf; + if ((oldState.mute != user.voiceState.mute || oldState.self_mute != user.voiceState.self_mute || oldState.deaf != user.voiceState.deaf || oldState.self_deaf != user.voiceState.self_deaf) && oldState.mute !== undefined) { + client.emit("voiceUserStateChange", user, oldState); + } else { + server.eventVoiceJoin(user, channel); + client.emit("voiceJoin", user, channel); + } } else { client.emit("warn", "voice state channel not in cache"); } } else { - // not speaking - client.emit("voiceLeave", user, server.eventStopSpeaking(user)); + // not in voice channel + client.emit("voiceLeave", user, server.eventVoiceLeave(user)); } } else { client.emit("warn", "voice state update but user or server not in cache"); diff --git a/lib/Structures/Server.js b/lib/Structures/Server.js index f35dba368..92ff9ac36 100644 --- a/lib/Structures/Server.js +++ b/lib/Structures/Server.js @@ -153,7 +153,7 @@ var Server = (function (_Equality) { var _user = this.members.get("id", voiceState.user_id); var channel = this.channels.get("id", voiceState.channel_id); if (_user && channel) { - this.eventStartSpeaking(_user, channel); + this.eventVoiceJoin(_user, channel); } else { this.client.emit("warn", "user doesn't exist even though READY expects them to"); } @@ -199,24 +199,15 @@ var Server = (function (_Equality) { return this.name; }; - Server.prototype.eventStartSpeaking = function eventStartSpeaking(user, channel) { - channel = this.channels.get("id", channel.id); - if (channel && channel.type === "voice") { - // good + Server.prototype.eventVoiceJoin = function eventVoiceJoin(user, channel) { + // removes from other speaking channels first + this.eventVoiceLeave(user); - // removes from other speaking channels first - this.eventStopSpeaking(user); - - channel.members.add(user); - user.voiceChannel = channel; - return true; - } else { - // bad - return false; - } + channel.members.add(user); + user.voiceChannel = channel; }; - Server.prototype.eventStopSpeaking = function eventStopSpeaking(user) { + Server.prototype.eventVoiceLeave = function eventVoiceLeave(user) { for (var _iterator3 = this.channels.getAll("type", "voice"), _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; diff --git a/lib/Structures/User.js b/lib/Structures/User.js index f6629c2b8..c63bf2072 100644 --- a/lib/Structures/User.js +++ b/lib/Structures/User.js @@ -37,6 +37,7 @@ var User = (function (_Equality) { channel: null }; this.voiceChannel = null; + this.voiceState = {}; } User.prototype.mention = function mention() { diff --git a/src/Client/InternalClient.js b/src/Client/InternalClient.js index bb5403730..f4ef75f12 100644 --- a/src/Client/InternalClient.js +++ b/src/Client/InternalClient.js @@ -1491,25 +1491,39 @@ export default class InternalClient { var user = self.users.get("id", data.user_id); var server = self.servers.get("id", data.guild_id); - if(user && server){ + if (user && server) { - if(data.channel_id){ - // speaking + if (data.channel_id) { + // in voice channel var channel = self.channels.get("id", data.channel_id); - if(channel){ - if(server.eventStartSpeaking(user, channel)) + if (channel && channel.type === "voice") { + var oldState = { + mute: user.voiceState.mute, + self_mute: user.voiceState.self_mute, + deaf: user.voiceState.deaf, + self_deaf: user.voiceState.self_deaf + }; + user.voiceState.mute = data.mute; + user.voiceState.self_mute = data.self_mute; + user.voiceState.deaf = data.deaf; + user.voiceState.self_deaf = data.self_deaf; + if ((oldState.mute != user.voiceState.mute || oldState.self_mute != user.voiceState.self_mute + || oldState.deaf != user.voiceState.deaf || oldState.self_deaf != user.voiceState.self_deaf) + && oldState.mute !== undefined) { + client.emit("voiceUserStateChange", user, oldState); + } else { + server.eventVoiceJoin(user, channel); client.emit("voiceJoin", user, channel); - else - client.emit("warn", "voice state error occurred in adding"); - }else{ + } + } else { client.emit("warn", "voice state channel not in cache"); } - }else{ - // not speaking - client.emit("voiceLeave", user, server.eventStopSpeaking(user)); + } else { + // not in voice channel + client.emit("voiceLeave", user, server.eventVoiceLeave(user)); } - }else{ + } else { client.emit("warn", "voice state update but user or server not in cache"); } diff --git a/src/Structures/Server.js b/src/Structures/Server.js index 4484ad7b3..30551e3e5 100644 --- a/src/Structures/Server.js +++ b/src/Structures/Server.js @@ -87,7 +87,7 @@ export default class Server extends Equality { let user = this.members.get("id", voiceState.user_id); let channel = this.channels.get("id", voiceState.channel_id); if (user && channel) { - this.eventStartSpeaking(user, channel); + this.eventVoiceJoin(user, channel); } else { this.client.emit("warn", "user doesn't exist even though READY expects them to"); } @@ -161,26 +161,17 @@ export default class Server extends Equality { return this.name; } - eventStartSpeaking(user, channel){ - channel = this.channels.get("id", channel.id); - if(channel && channel.type === "voice"){ - // good + eventVoiceJoin(user, channel) { + // removes from other speaking channels first + this.eventVoiceLeave(user); - // removes from other speaking channels first - this.eventStopSpeaking(user); - - channel.members.add(user); - user.voiceChannel = channel; - return true; - }else{ - // bad - return false; - } + channel.members.add(user); + user.voiceChannel = channel; } - eventStopSpeaking(user){ - for(let chan of this.channels.getAll("type", "voice")){ - if(chan.members.has(user)){ + eventVoiceLeave(user) { + for (let chan of this.channels.getAll("type", "voice")) { + if (chan.members.has(user)) { chan.members.remove(user); user.voiceChannel = null; return chan; diff --git a/src/Structures/User.js b/src/Structures/User.js index d027f8e25..a17847c40 100644 --- a/src/Structures/User.js +++ b/src/Structures/User.js @@ -19,6 +19,7 @@ export default class User extends Equality{ channel : null }; this.voiceChannel = null; + this.voiceState = {}; } get avatarURL(){