Class: Discordrb::Voice::VoiceWS
- Inherits:
-
Object
- Object
- Discordrb::Voice::VoiceWS
- Defined in:
- lib/discordrb/voice/network.rb
Overview
Represents a websocket client connection to the voice server. The websocket connection (sometimes called vWS) is used to manage general data about the connection, such as sending the speaking packet, which determines the green circle around users on Discord, and obtaining UDP connection info.
Constant Summary collapse
- VOICE_GATEWAY_VERSION =
The version of the voice gateway that's supposed to be used.
4
Instance Attribute Summary collapse
-
#udp ⇒ VoiceUDP
readonly
The UDP voice connection over which the actual audio data is sent.
Instance Method Summary collapse
-
#connect ⇒ Object
Communication goes like this: me discord | | websocket connect -> | | | | <- websocket opcode 2 | | UDP discovery -> | | | | <- UDP reply packet | | websocket opcode 1 -> | | | ...
-
#destroy ⇒ Object
Disconnects the websocket and kills the thread.
-
#initialize(channel, bot, token, session, endpoint) ⇒ VoiceWS
constructor
Makes a new voice websocket client, but doesn't connect it (see #connect for that).
-
#send_heartbeat ⇒ Object
Send a heartbeat (op 3), has to be done every @heartbeat_interval seconds or the connection will terminate.
-
#send_init(server_id, bot_user_id, session_id, token) ⇒ Object
Send a connection init packet (op 0).
-
#send_speaking(value) ⇒ Object
Send a speaking packet (op 5).
-
#send_udp_connection(ip, port, mode) ⇒ Object
Sends the UDP connection packet (op 1).
Constructor Details
#initialize(channel, bot, token, session, endpoint) ⇒ VoiceWS
Makes a new voice websocket client, but doesn't connect it (see #connect for that)
170 171 172 173 174 175 176 177 178 179 180 181 |
# File 'lib/discordrb/voice/network.rb', line 170 def initialize(channel, bot, token, session, endpoint) raise 'libsodium is unavailable - unable to create voice bot! Please read https://github.com/shardlab/discordrb/wiki/Installing-libsodium' unless LIBSODIUM_AVAILABLE @channel = channel @bot = bot @token = token @session = session @endpoint = endpoint.split(':').first @udp = VoiceUDP.new end |
Instance Attribute Details
#udp ⇒ VoiceUDP (readonly)
Returns the UDP voice connection over which the actual audio data is sent.
162 163 164 |
# File 'lib/discordrb/voice/network.rb', line 162 def udp @udp end |
Instance Method Details
#connect ⇒ Object
Communication goes like this: me discord | | websocket connect -> | | | | <- websocket opcode 2 | | UDP discovery -> | | | | <- UDP reply packet | | websocket opcode 1 -> | | | ...
296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 |
# File 'lib/discordrb/voice/network.rb', line 296 def connect # Connect websocket @thread = Thread.new do Thread.current[:discordrb_name] = 'vws' init_ws end @bot.debug('Started websocket initialization, now waiting for UDP discovery reply') # Now wait for opcode 2 and the resulting UDP reply packet ip, port = @udp.receive_discovery_reply @bot.debug("UDP discovery reply received! #{ip} #{port}") # Send UDP init packet with received UDP data send_udp_connection(ip, port, @udp_mode) @bot.debug('Waiting for op 4 now') # Wait for op 4, then finish sleep 0.05 until @ready end |
#destroy ⇒ Object
Disconnects the websocket and kills the thread
319 320 321 |
# File 'lib/discordrb/voice/network.rb', line 319 def destroy @heartbeat_running = false end |
#send_heartbeat ⇒ Object
Send a heartbeat (op 3), has to be done every @heartbeat_interval seconds or the connection will terminate
219 220 221 222 223 224 225 226 227 |
# File 'lib/discordrb/voice/network.rb', line 219 def send_heartbeat millis = Time.now.strftime('%s%L').to_i @bot.debug("Sending voice heartbeat at #{millis}") @client.send({ op: 3, d: millis }.to_json) end |
#send_init(server_id, bot_user_id, session_id, token) ⇒ Object
Send a connection init packet (op 0)
188 189 190 191 192 193 194 195 196 197 198 |
# File 'lib/discordrb/voice/network.rb', line 188 def send_init(server_id, bot_user_id, session_id, token) @client.send({ op: 0, d: { server_id: server_id, user_id: bot_user_id, session_id: session_id, token: token } }.to_json) end |
#send_speaking(value) ⇒ Object
Send a speaking packet (op 5). This determines the green circle around the avatar in the voice channel
231 232 233 234 235 236 237 238 239 240 |
# File 'lib/discordrb/voice/network.rb', line 231 def send_speaking(value) @bot.debug("Speaking: #{value}") @client.send({ op: 5, d: { speaking: value, delay: 0 } }.to_json) end |
#send_udp_connection(ip, port, mode) ⇒ Object
Sends the UDP connection packet (op 1)
204 205 206 207 208 209 210 211 212 213 214 215 216 |
# File 'lib/discordrb/voice/network.rb', line 204 def send_udp_connection(ip, port, mode) @client.send({ op: 1, d: { protocol: 'udp', data: { address: ip, port: port, mode: mode } } }.to_json) end |