Browse Source

Correct some protocol errors in v4 of voice gateway

pull/5849/head
Rapptz 5 years ago
parent
commit
e3922e24d9
  1. 17
      discord/gateway.py
  2. 12
      discord/voice_client.py

17
discord/gateway.py

@ -635,8 +635,8 @@ class DiscordVoiceWebSocket:
Sent only. Tells the client to resume its session. Sent only. Tells the client to resume its session.
HELLO HELLO
Receive only. Tells you that your websocket connection was acknowledged. Receive only. Tells you that your websocket connection was acknowledged.
INVALIDATE_SESSION RESUMED
Sent only. Tells you that your RESUME request has failed and to re-IDENTIFY. Sent only. Tells you that your RESUME request has succeeded.
CLIENT_CONNECT CLIENT_CONNECT
Indicates a user has connected to voice. Indicates a user has connected to voice.
CLIENT_DISCONNECT CLIENT_DISCONNECT
@ -652,7 +652,7 @@ class DiscordVoiceWebSocket:
HEARTBEAT_ACK = 6 HEARTBEAT_ACK = 6
RESUME = 7 RESUME = 7
HELLO = 8 HELLO = 8
INVALIDATE_SESSION = 9 RESUMED = 9
CLIENT_CONNECT = 12 CLIENT_CONNECT = 12
CLIENT_DISCONNECT = 13 CLIENT_DISCONNECT = 13
@ -755,9 +755,8 @@ class DiscordVoiceWebSocket:
await self.initial_connection(data) await self.initial_connection(data)
elif op == self.HEARTBEAT_ACK: elif op == self.HEARTBEAT_ACK:
self._keep_alive.ack() self._keep_alive.ack()
elif op == self.INVALIDATE_SESSION: elif op == self.RESUMED:
log.info('Voice RESUME failed.') log.info('Voice RESUME succeeded.')
await self.identify()
elif op == self.SESSION_DESCRIPTION: elif op == self.SESSION_DESCRIPTION:
self._connection.mode = data['mode'] self._connection.mode = data['mode']
await self.load_secret_key(data) await self.load_secret_key(data)
@ -773,7 +772,9 @@ class DiscordVoiceWebSocket:
state.endpoint_ip = data['ip'] state.endpoint_ip = data['ip']
packet = bytearray(70) packet = bytearray(70)
struct.pack_into('>I', packet, 0, state.ssrc) struct.pack_into('>H', packet, 0, 1) # 1 = Send
struct.pack_into('>H', packet, 2, 70) # 70 = Length
struct.pack_into('>I', packet, 4, state.ssrc)
state.socket.sendto(packet, (state.endpoint_ip, state.voice_port)) state.socket.sendto(packet, (state.endpoint_ip, state.voice_port))
recv = await self.loop.sock_recv(state.socket, 70) recv = await self.loop.sock_recv(state.socket, 70)
log.debug('received packet in initial_connection: %s', recv) log.debug('received packet in initial_connection: %s', recv)
@ -794,8 +795,6 @@ class DiscordVoiceWebSocket:
await self.select_protocol(state.ip, state.port, mode) await self.select_protocol(state.ip, state.port, mode)
log.info('selected the voice protocol for use (%s)', mode) log.info('selected the voice protocol for use (%s)', mode)
await self.client_connect()
@property @property
def latency(self): def latency(self):
""":class:`float`: Latency between a HEARTBEAT and its HEARTBEAT_ACK in seconds.""" """:class:`float`: Latency between a HEARTBEAT and its HEARTBEAT_ACK in seconds."""

12
discord/voice_client.py

@ -121,10 +121,14 @@ class VoiceProtocol:
An abstract method called when the client initiates the connection request. An abstract method called when the client initiates the connection request.
When a connection is requested initially, the library calls the following functions When a connection is requested initially, the library calls the constructor
in order: under ``__init__`` and then calls :meth:`connect`. If :meth:`connect` fails at
some point then :meth:`disconnect` is called.
- ``__init__``
Within this method, to start the voice connection flow it is recommended to
use :meth:`Guild.change_voice_state` to start the flow. After which,
:meth:`on_voice_server_update` and :meth:`on_voice_state_update` will be called.
The order that these two are called is unspecified.
Parameters Parameters
------------ ------------

Loading…
Cancel
Save