D++ (DPP)
C++ Discord API Bot Library
|
Implements a discord voice connection. Each DiscordVoiceClient connects to one voice channel and derives from a websocket client. More...
#include <discordvoiceclient.h>
Public Member Functions | |
virtual void | log (dpp::loglevel severity, const std::string &msg) |
virtual void | OneSecondTimer () |
bool | IsReady () |
voice client is ready to stream audio. The voice client is considered ready if it has a secret key. More... | |
bool | IsConnected () |
Returns true if the voice client is connected to the websocket. More... | |
dpp::utility::uptime | Uptime () |
Returns the connection time of the voice client. More... | |
DiscordVoiceClient (dpp::cluster *_cluster, snowflake _channel_id, snowflake _server_id, const std::string &_token, const std::string &_session_id, const std::string &_host) | |
virtual | ~DiscordVoiceClient () |
virtual bool | HandleFrame (const std::string &buffer) |
virtual void | Error (uint32_t errorcode) |
void | Run () |
void | SendAudio (uint16_t *audio_data, const size_t length, bool use_opus=true) |
Send audio to the voice channel. More... | |
void | PauseAudio (bool pause) |
Pause sending of audio. More... | |
void | StopAudio () |
Immediately stop all audio. Clears the packet queue. More... | |
bool | IsPlaying () |
Returns true if we are playing audio. More... | |
float | GetSecsRemaining () |
Get the number of seconds remaining of the audio output buffer. More... | |
uint32_t | GetTracksRemaining () |
Get the number of tracks remaining in the output buffer. This is calculated by the number of track markers plus one. More... | |
dpp::utility::uptime | GetRemaining () |
Get the time remaining to send the audio output buffer in hours:minutes:seconds. More... | |
void | InsertMarker (const std::string &metadata="") |
Insert a track marker into the audio output buffer. A track marker is an arbitrary flag in the buffer contents that indictes the end of some block of audio of significance to the sender. This may be a song from a streaming site, or some voice audio/speech, a sound effect, or whatever you choose. You can later skip to the next marker using the dpp::DiscordVoiceClient::SkipToNextMarker function. More... | |
void | SkipToNextMarker () |
Skip tp the next track marker, previously inserted by using the dpp::DiscordVoiceClient::InsertMarker function. If there are no markers in the output buffer, then this skips to the end of the buffer and is equivalent to the dpp::DiscordVoiceClient::StopAudio function. More... | |
const std::vector< std::string > | GetMarkerMetadata () |
Get the metdata string associated with each inserted marker. More... | |
bool | IsPaused () |
Returns true if the audio is paused. You can unpause with dpp::DiscordVoiceClient::PauseAudio. More... | |
std::string | DiscoverIP () |
Discord external IP detection. More... | |
virtual void | write (const std::string &data) |
Write to websocket. Encapsulates data in frames if the status is CONNECTED. More... | |
virtual bool | HandleBuffer (std::string &buffer) |
Processes incoming frames from the SSL socket input buffer. More... | |
virtual void | close () |
Close websocket. More... | |
uint64_t | GetBytesOut () |
uint64_t | GetBytesIn () |
void | ReadLoop () |
Nonblocking I/O loop. More... | |
virtual void | log (dpp::loglevel severity, const std::string &msg) const |
Log a message. More... | |
Public Attributes | |
class dpp::cluster * | creator |
bool | terminating |
uint32_t | heartbeat_interval |
time_t | last_heartbeat |
std::thread::native_handle_type | thread_id |
std::string | token |
std::string | sessionid |
snowflake | server_id |
snowflake | channel_id |
std::function< int()> | custom_readable_fd |
Attaching an additional file descriptor to this function will send notifications when there is data to read. More... | |
std::function< int()> | custom_writeable_fd |
Attaching an additional file descriptor to this function will send notifications when you are able to write to the socket. More... | |
std::function< void()> | custom_readable_ready |
This event will be called when you can read from the custom fd. More... | |
std::function< void()> | custom_writeable_ready |
This event will be called when you can write to a custom fd. More... | |
Static Public Attributes | |
static bool | sodium_initialised |
Protected Member Functions | |
virtual void | Connect () |
WSState | GetState () |
Protected Attributes | |
std::string | buffer |
std::string | obuffer |
bool | nonblocking |
int | sfd |
SSL * | ssl |
SSL_CTX * | ctx |
std::string | cipher |
time_t | last_tick |
std::string | hostname |
uint64_t | bytes_out |
uint64_t | bytes_in |
Implements a discord voice connection. Each DiscordVoiceClient connects to one voice channel and derives from a websocket client.
dpp::DiscordVoiceClient::DiscordVoiceClient | ( | dpp::cluster * | _cluster, |
snowflake | _channel_id, | ||
snowflake | _server_id, | ||
const std::string & | _token, | ||
const std::string & | _session_id, | ||
const std::string & | _host | ||
) |
Constructor takes shard id, max shards and token.
_cluster | The owning cluster for this shard |
_server_id | The server id to identify voice connection as |
_token | The voice session token to use for identifying to the websocket |
_session_id | The voice session id to identify with |
_host | The voice server hostname to connect to (hostname:port format) |
|
virtual |
Destructor
|
virtualinherited |
Close websocket.
Reimplemented from dpp::SSLClient.
|
protectedvirtualinherited |
(Re)connect
Reimplemented from dpp::SSLClient.
std::string dpp::DiscordVoiceClient::DiscoverIP | ( | ) |
Discord external IP detection.
|
virtual |
Handle a websocket error.
errorcode | The error returned from the websocket |
Reimplemented from dpp::WSClient.
|
inherited |
Get total bytes received
|
inherited |
Get total bytes sent
const std::vector< std::string > dpp::DiscordVoiceClient::GetMarkerMetadata | ( | ) |
Get the metdata string associated with each inserted marker.
dpp::utility::uptime dpp::DiscordVoiceClient::GetRemaining | ( | ) |
Get the time remaining to send the audio output buffer in hours:minutes:seconds.
float dpp::DiscordVoiceClient::GetSecsRemaining | ( | ) |
Get the number of seconds remaining of the audio output buffer.
|
protectedinherited |
Get websocket state
uint32_t dpp::DiscordVoiceClient::GetTracksRemaining | ( | ) |
Get the number of tracks remaining in the output buffer. This is calculated by the number of track markers plus one.
|
virtualinherited |
Processes incoming frames from the SSL socket input buffer.
buffer | The buffer contents. Can modify this value removing the head elements when processed. |
Reimplemented from dpp::SSLClient.
|
virtual |
Handle JSON from the websocket.
buffer | The entire buffer content from the websocket client |
Reimplemented from dpp::WSClient.
void dpp::DiscordVoiceClient::InsertMarker | ( | const std::string & | metadata = "" | ) |
Insert a track marker into the audio output buffer. A track marker is an arbitrary flag in the buffer contents that indictes the end of some block of audio of significance to the sender. This may be a song from a streaming site, or some voice audio/speech, a sound effect, or whatever you choose. You can later skip to the next marker using the dpp::DiscordVoiceClient::SkipToNextMarker function.
metadata | Arbitrary information related to this track |
bool dpp::DiscordVoiceClient::IsConnected | ( | ) |
Returns true if the voice client is connected to the websocket.
bool dpp::DiscordVoiceClient::IsPaused | ( | ) |
Returns true if the audio is paused. You can unpause with dpp::DiscordVoiceClient::PauseAudio.
bool dpp::DiscordVoiceClient::IsPlaying | ( | ) |
Returns true if we are playing audio.
bool dpp::DiscordVoiceClient::IsReady | ( | ) |
voice client is ready to stream audio. The voice client is considered ready if it has a secret key.
|
virtual |
Log a message to whatever log the user is using. The logged message is passed up the chain to the on_log event in user code which can then do whatever it wants to do with it.
severity | The log level from dpp::loglevel |
msg | The log message to output |
|
virtualinherited |
Log a message.
severity | severity of log message |
msg | Log message to send |
Reimplemented in dpp::DiscordClient.
|
virtual |
Fires every second from the underlying socket I/O loop, used for sending heartbeats
Reimplemented from dpp::WSClient.
void dpp::DiscordVoiceClient::PauseAudio | ( | bool | pause | ) |
Pause sending of audio.
pause | True to pause, false to resume |
|
inherited |
Nonblocking I/O loop.
void dpp::DiscordVoiceClient::Run | ( | ) |
Start and monitor I/O loop
void dpp::DiscordVoiceClient::SendAudio | ( | uint16_t * | audio_data, |
const size_t | length, | ||
bool | use_opus = true |
||
) |
Send audio to the voice channel.
You should send an audio packet of n11520 bytes. Note that this function can be costly as it has to opus encode the PCM audio on the fly, and also encrypt it with libsodium.
audio_data | Raw PCM audio data. Channels are interleaved, with each channel's amplitude being a 16 bit value. |
length | The length of the audio data. The length should be a multiple of 4 (2x 16 bit stero channels) with a maximum length of 11520, which is a complete opus frame at highest quality. |
use_opus | Some containers such as .ogg may contain OPUS encoded data already. In this case, we don't need to encode the frames using opus here. We can set use_opus to false and bypass the codec, only applying libsodium to the stream. |
void dpp::DiscordVoiceClient::SkipToNextMarker | ( | ) |
Skip tp the next track marker, previously inserted by using the dpp::DiscordVoiceClient::InsertMarker function. If there are no markers in the output buffer, then this skips to the end of the buffer and is equivalent to the dpp::DiscordVoiceClient::StopAudio function.
void dpp::DiscordVoiceClient::StopAudio | ( | ) |
Immediately stop all audio. Clears the packet queue.
dpp::utility::uptime dpp::DiscordVoiceClient::Uptime | ( | ) |
Returns the connection time of the voice client.
|
virtualinherited |
Write to websocket. Encapsulates data in frames if the status is CONNECTED.
data | The data to send. |
Reimplemented from dpp::SSLClient.
|
protectedinherited |
Input buffer received from openssl
|
protectedinherited |
Bytes in
|
protectedinherited |
Bytes out
snowflake dpp::DiscordVoiceClient::channel_id |
Channel ID
|
protectedinherited |
SSL cipher in use
class dpp::cluster* dpp::DiscordVoiceClient::creator |
Owning cluster
|
protectedinherited |
OpenSSL context
|
inherited |
Attaching an additional file descriptor to this function will send notifications when there is data to read.
NOTE: Only hook this if you NEED it as it can increase CPU usage of the thread! Returning -1 means that you don't want to be notified.
|
inherited |
This event will be called when you can read from the custom fd.
|
inherited |
Attaching an additional file descriptor to this function will send notifications when you are able to write to the socket.
NOTE: Only hook this if you NEED it as it can increase CPU usage of the thread! You should toggle this to -1 when you do not have anything to write otherwise it'll keep triggering repeatedly (it is level triggered).
|
inherited |
This event will be called when you can write to a custom fd.
uint32_t dpp::DiscordVoiceClient::heartbeat_interval |
Heartbeat interval for sending heartbeat keepalive
|
protectedinherited |
Hostname connected to
time_t dpp::DiscordVoiceClient::last_heartbeat |
Last heartbeat
|
protectedinherited |
For timers
|
protectedinherited |
True if in nonblocking mode. The socket switches to nonblocking mode once ReadLoop is called.
|
protectedinherited |
Output buffer for sending to openssl
snowflake dpp::DiscordVoiceClient::server_id |
Server ID
std::string dpp::DiscordVoiceClient::sessionid |
Discord voice session id
|
protectedinherited |
Raw file descriptor of connection
|
static |
|
protectedinherited |
OpenSSL session
bool dpp::DiscordVoiceClient::terminating |
True when the thread is shutting down
std::thread::native_handle_type dpp::DiscordVoiceClient::thread_id |
Thread ID
std::string dpp::DiscordVoiceClient::token |
Discord voice session token