From cb5452f072d33c8de0bb2c7648056b467243d9a5 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Fri, 6 Nov 2015 21:26:36 +0000 Subject: [PATCH] Added rudimentary voice joining --- lib/Client/InternalClient.js | 59 ++++++++++++++++++++++++++++++++- lib/Client/Resolver/Resolver.js | 8 +++++ src/Client/InternalClient.js | 58 +++++++++++++++++++++++++++++++- src/Client/Resolver/Resolver.js | 8 +++++ 4 files changed, 131 insertions(+), 2 deletions(-) diff --git a/lib/Client/InternalClient.js b/lib/Client/InternalClient.js index 19a46bd0b..5178c1bef 100644 --- a/lib/Client/InternalClient.js +++ b/lib/Client/InternalClient.js @@ -22,7 +22,8 @@ var User = require("../Structures/User.js"), Server = require("../Structures/Server.js"), Message = require("../Structures/Message.js"), Role = require("../Structures/Role.js"), - Invite = require("../Structures/Invite.js"); + Invite = require("../Structures/Invite.js"), + VoiceConnection = require("../Voice/VoiceConnection.js"); var zlib; @@ -47,6 +48,62 @@ var InternalClient = (function () { this.resolver = new Resolver(this); } + //def joinVoiceChannel() + + InternalClient.prototype.joinVoiceChannel = function joinVoiceChannel(chann) { + var self = this; + return new Promise(function (resolve, reject) { + + var channel = self.resolver.resolveVoiceChannel(chann); + + if (channel) { + if (self.voiceConnections[channel]) { + + self.voiceConnections[channel] = {}; + + var session, + token, + serverID, + endpoint, + fired = 0; + + var check = function check(m) { + var data = JSON.parse(m); + + if (data.t === "VOICE_STATE_UPDATE") { + session = data.d.session_id; + fired++; + } else if (data.t === "VOICE_SERVER_UPDATE") { + token = data.d.token; + serverID = data.d.guild_id; + endpoint = data.d.endpoint; + fired++; + } + + if (fired >= 2) { + self.websocket.removeListener('message', check); + } + }; + + self.websocket.on("message", check); + self.sendWS({ + op: 4, + d: { + "guild_id": serverID, + "channel_id": channel.id, + "self_mute": false, + "self_deaf": false + } + }); + } else { + reject(new Error("voice channel connection exists")); + } + } else { + reject(new Error("voice channel does not exist")); + } + }); + }; + // def createServer InternalClient.prototype.createServer = function createServer(name) { diff --git a/lib/Client/Resolver/Resolver.js b/lib/Client/Resolver/Resolver.js index ceec4167f..a0a6e55ca 100644 --- a/lib/Client/Resolver/Resolver.js +++ b/lib/Client/Resolver/Resolver.js @@ -116,6 +116,14 @@ var Resolver = (function () { return found; }; + Resolver.prototype.resolveVoiceChannel = function resolveVoiceChannel(resource) { + // resolveChannel will also work but this is more apt + if (resource instanceof VoiceChannel) { + return resource; + } + return null; + }; + Resolver.prototype.resolveChannel = function resolveChannel(resource) { /* accepts a Message, Channel, Server, String ID, User diff --git a/src/Client/InternalClient.js b/src/Client/InternalClient.js index 32407bd00..6d262aa31 100644 --- a/src/Client/InternalClient.js +++ b/src/Client/InternalClient.js @@ -20,7 +20,8 @@ var User = require("../Structures/User.js"), Server = require("../Structures/Server.js"), Message = require("../Structures/Message.js"), Role = require("../Structures/Role.js"), - Invite = require("../Structures/Invite.js"); + Invite = require("../Structures/Invite.js"), + VoiceConnection = require("../Voice/VoiceConnection.js"); var zlib; @@ -42,6 +43,61 @@ class InternalClient { this.voiceConnections = new Cache(); this.resolver = new Resolver(this); } + + //def joinVoiceChannel() + joinVoiceChannel(chann){ + var self = this; + return new Promise((resolve, reject) => { + + var channel = self.resolver.resolveVoiceChannel(chann); + + if(channel){ + if(self.voiceConnections[channel]){ + + self.voiceConnections[channel] = {}; + + var session, token, serverID, endpoint, fired = 0; + + var check = (m) => { + var data = JSON.parse(m); + + if(data.t === "VOICE_STATE_UPDATE"){ + session = data.d.session_id; + fired++; + }else if(data.t === "VOICE_SERVER_UPDATE"){ + token = data.d.token; + serverID = data.d.guild_id; + endpoint = data.d.endpoint; + fired++; + } + + if(fired >= 2){ + self.websocket.removeListener('message', check); + } + + }; + + self.websocket.on("message", check); + self.sendWS({ + op : 4, + d : { + "guild_id" : serverID, + "channel_id" : channel.id, + "self_mute" : false, + "self_deaf" : false + } + }); + + }else{ + reject(new Error("voice channel connection exists")); + } + }else{ + reject(new Error("voice channel does not exist")); + } + + }); + } + // def createServer createServer(name, region = "london") { var self = this; diff --git a/src/Client/Resolver/Resolver.js b/src/Client/Resolver/Resolver.js index 1d7252715..6dc88e457 100644 --- a/src/Client/Resolver/Resolver.js +++ b/src/Client/Resolver/Resolver.js @@ -98,6 +98,14 @@ class Resolver { return found; } + + resolveVoiceChannel(resource) { + // resolveChannel will also work but this is more apt + if(resource instanceof VoiceChannel){ + return resource; + } + return null; + } resolveChannel(resource) { /*