Class: Discordrb::Voice::VoiceUDP

Inherits:
Object
  • Object
show all
Defined in:
lib/discordrb/voice/network.rb

Overview

Represents a UDP connection to a voice server. This connection is used to send the actual audio data.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeVoiceUDP

Creates a new UDP connection. Only creates a socket as the discovery reply may come before the data is initialized.


43
44
45
46
# File 'lib/discordrb/voice/network.rb', line 43

def initialize
  @socket = UDPSocket.new
  @encrypted = true
end

Instance Attribute Details

#encryptedtrue, false Also known as: encrypted?

Deprecated.

Discord no longer supports unencrypted voice communication.

Returns whether or not UDP communications are encrypted.

Returns:

  • (true, false)

    whether or not UDP communications are encrypted.


35
36
37
# File 'lib/discordrb/voice/network.rb', line 35

def encrypted
  @encrypted
end

#secret_key=(value) ⇒ Object (writeonly)

Sets the secret key used for encryption


39
40
41
# File 'lib/discordrb/voice/network.rb', line 39

def secret_key=(value)
  @secret_key = value
end

Instance Method Details

#connect(ip, port, ssrc) ⇒ Object

Initializes the UDP socket with data obtained from opcode 2.

Parameters:

  • ip (String)

    The IP address to connect to.

  • port (Integer)

    The port to connect to.

  • ssrc (Integer)

    The Super Secret Relay Code (SSRC). Discord uses this to identify different voice users on the same endpoint.


53
54
55
56
57
# File 'lib/discordrb/voice/network.rb', line 53

def connect(ip, port, ssrc)
  @ip = ip
  @port = port
  @ssrc = ssrc
end

#receive_discovery_replyArray(String, Integer)

Waits for a UDP discovery reply, and returns the sent data.

Returns:

  • (Array(String, Integer))

    the IP and port received from the discovery reply.


61
62
63
64
65
66
67
# File 'lib/discordrb/voice/network.rb', line 61

def receive_discovery_reply
  # Wait for a UDP message
  message = @socket.recv(70)
  ip = message[4..-3].delete("\0")
  port = message[-2..-1].to_i
  [ip, port]
end

#send_audio(buf, sequence, time) ⇒ Object

Makes an audio packet from a buffer and sends it to Discord.

Parameters:

  • buf (String)

    The audio data to send, must be exactly one Opus frame

  • sequence (Integer)

    The packet sequence number, incremented by one for subsequent packets

  • time (Integer)

    When this packet should be played back, in no particular unit (essentially just the sequence number multiplied by 960)


74
75
76
77
78
79
80
81
82
# File 'lib/discordrb/voice/network.rb', line 74

def send_audio(buf, sequence, time)
  # Header of the audio packet
  header = [0x80, 0x78, sequence, time, @ssrc].pack('CCnNN')

  # Always encrypt data
  buf = encrypt_audio(header, buf)

  send_packet(header + buf)
end

#send_discoveryObject

Sends the UDP discovery packet with the internally stored SSRC. Discord will send a reply afterwards which can be received using #receive_discovery_reply


86
87
88
89
90
91
92
# File 'lib/discordrb/voice/network.rb', line 86

def send_discovery
  discovery_packet = [@ssrc].pack('N')

  # Add 66 zeroes so the packet is 70 bytes long
  discovery_packet += "\0" * 66
  send_packet(discovery_packet)
end