D++ (DPP)
C++ Discord API Bot Library
dpp::discord_client Class Reference

Implements a discord client. Each discord_client connects to one shard and derives from a websocket client. More...

#include <discordclient.h>

+ Inheritance diagram for dpp::discord_client:
+ Collaboration diagram for dpp::discord_client:

Public Member Functions

 discord_client (discord_client &old, uint64_t sequence, const std::string &session_id)
 Construct a discord_client object from another discord_client object Used when resuming, the url to connect to will be taken from the resume url of the other object, along with the seq number. More...
 
 discord_client (dpp::cluster *_cluster, uint32_t _shard_id, uint32_t _max_shards, const std::string &_token, uint32_t intents=0, bool compressed=true, websocket_protocol_t ws_protocol=ws_json)
 Construct a new discord_client object. More...
 
virtual ~discord_client ()=default
 Destroy the discord client object. More...
 
discord_clientclear_queue ()
 Clear the outbound message queue. More...
 
virtual void close () override
 Close websocket. More...
 
void complete_handshake (const struct socket_events *ev)
 Called while SSL handshake is in progress. If the handshake completes, the state of the socket is progressed to an established state. More...
 
discord_clientconnect_voice (snowflake guild_id, snowflake channel_id, bool self_mute=false, bool self_deaf=false, bool enable_dave=false)
 Connect to a voice channel. More...
 
discord_clientdisconnect_voice (snowflake guild_id)
 Disconnect from the connected voice channel on a guild. More...
 
void enable_raw_tracing ()
 For low-level debugging, calling this function will enable low level I/O logging for this connection to the logger. This can be very loud, and output a lot of data, so only enable it selectively where you need it. More...
 
virtual void error (uint32_t errorcode) override
 Handle a websocket error. More...
 
uint64_t get_bytes_in ()
 Get total bytes received. More...
 
uint64_t get_bytes_out ()
 Get the bytes out objectGet total bytes sent. More...
 
uint64_t get_channel_count ()
 Get the Channel Count for this shard. More...
 
std::string get_cipher ()
 Get SSL cipher name. More...
 
uint64_t get_decompressed_bytes_in ()
 Get decompressed total bytes received. More...
 
uint64_t get_guild_count ()
 Get the Guild Count for this shard. More...
 
uint64_t get_member_count ()
 Get the Member Count for this shard. More...
 
size_t get_queue_size ()
 Get the size of the outbound message queue. More...
 
uint64_t get_unique_id () const
 Every request made has a unique ID. This increments for every request, starting at 1. You can use this for statistics, or to associate requests and replies in external event loops. More...
 
dpp::utility::uptime get_uptime ()
 Returns the connection time of the shard. More...
 
voiceconnget_voice (snowflake guild_id)
 Get the dpp::voiceconn object for a specific guild on this shard. More...
 
virtual bool handle_buffer (std::string &buffer) override
 Processes incoming frames from the SSL socket input buffer. More...
 
virtual void handle_event (const std::string &event, json &j, const std::string &raw)
 Handle an event (opcode 0) More...
 
virtual bool handle_frame (const std::string &buffer, ws_opcode opcode) override
 Handle JSON from the websocket. More...
 
bool is_connected ()
 Returns true if the shard is connected. More...
 
virtual void log (dpp::loglevel severity, const std::string &msg) const override
 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. More...
 
virtual void on_disconnect () override
 Called when the HTTP socket is closed. More...
 
void on_error (dpp::socket fd, const struct dpp::socket_events &, int error_code)
 Called when there is an error on the TCP socket. More...
 
void on_read (dpp::socket fd, const struct dpp::socket_events &ev)
 Called when the TCP socket has data to read. More...
 
void on_write (dpp::socket fd, const struct dpp::socket_events &e)
 Called when the TCP socket can be written to without blocking. More...
 
virtual void one_second_timer () override
 Fires every second from the underlying socket I/O loop, used for sending heartbeats and any queued outbound websocket frames. More...
 
void queue_message (const std::string &j, bool to_front=false)
 Queue a message to be sent via the websocket. More...
 
void read_loop ()
 Set up non blocking I/O and configure on_read, on_write and on_error. More...
 
void run ()
 Start and monitor I/O loop. More...
 
void send_close_packet ()
 Send OP_CLOSE error code 1000 to the other side of the connection. This indicates graceful close. More...
 
void socket_write (const std::string_view data)
 Write to the output buffer. More...
 
virtual void write (const std::string_view data, ws_opcode _opcode=OP_AUTO)
 Write to websocket. Encapsulates data in frames if the status is CONNECTED. More...
 

Public Attributes

std::unordered_map< snowflake, std::unique_ptr< voiceconn > > connecting_voice_channels
 List of voice channels we are connecting to keyed by guild id. More...
 
class dpp::clustercreator
 Owning cluster. More...
 
uint32_t heartbeat_interval
 Heartbeat interval for sending heartbeat keepalive. More...
 
uint32_t intents
 Privileged gateway intents. More...
 
bool keepalive
 True if we are keeping the connection alive after it has finished. More...
 
time_t last_heartbeat
 Last heartbeat. More...
 
time_t last_heartbeat_ack
 Last heartbeat ACK (opcode 11) More...
 
uint64_t last_seq
 Last sequence number received, for resumes and pings. More...
 
uint32_t max_shards
 Total number of shards. More...
 
class clusterowner
 Owning cluster. More...
 
std::string private_key_file
 Private key PEM file path for inbound SSL connections. More...
 
websocket_protocol_t protocol
 Current websocket protocol, currently either ETF or JSON. More...
 
std::string public_key_file
 Public key PEM file path for inbound SSL connections. More...
 
bool ready
 True if READY or RESUMED has been received. More...
 
uint32_t reconnects
 Reconnection count. More...
 
std::string resume_gateway_url
 The gateway address we reconnect to when we resume a session. More...
 
uint32_t resumes
 Resume count. More...
 
std::string sessionid
 Discord session id. More...
 
uint32_t shard_id
 Shard ID of this client. More...
 
std::string token
 Discord bot token. More...
 
std::shared_mutex voice_mutex
 Mutex for voice connections map. More...
 
double websocket_ping
 Websocket latency in fractional seconds. More...
 

Protected Member Functions

virtual void connect () override
 Connect to websocket server. More...
 
void disconnect_voice_internal (snowflake guild_id, bool send_json=true)
 Disconnect from the connected voice channel on a guild. More...
 
void do_raw_trace (const std::string &message) const
 If raw_trace is set to true, log a debug message for this connection. More...
 
ws_state get_state () const
 Get websocket state. More...
 
virtual void on_buffer_drained ()
 
void start_connecting ()
 Start connecting the websocket. More...
 

Protected Attributes

std::string buffer
 Input buffer received from socket. More...
 
uint64_t bytes_in
 Bytes in. More...
 
uint64_t bytes_out
 Bytes out. More...
 
std::string cipher
 SSL cipher in use. More...
 
uint8_t connect_retries {0}
 How many times we retried connect() More...
 
bool connected {false}
 True if connection is completed. More...
 
std::string hostname
 Hostname connected to. More...
 
std::string last_ping_message
 Stores the most recent ping message on this shard, which we check for to monitor latency. More...
 
time_t last_tick
 For timers. More...
 
std::string obuffer
 Output buffer for sending to socket. More...
 
bool plaintext
 True for a plain text connection. More...
 
std::string port
 Port connected to. More...
 
bool raw_trace {false}
 Set this to true to log all IO to debug for this connection. This is an internal developer facility. Do not enable it unless you need to, as it will be very noisy. More...
 
dpp::socket sfd
 Raw file descriptor of connection. More...
 
openssl_connection * ssl
 Openssl opaque contexts. More...
 
time_t start
 Start time of connection. More...
 
bool tcp_connect_done {false}
 True if tcp connect() succeeded. More...
 
bool timed_out
 If true the connection timed out while waiting, when waiting for SSL negotiation, TCP connect(), or HTTP. More...
 
time_t timeout
 Time at which the connection should be abandoned, if we are still connecting or negotiating with a HTTP server. More...
 
timer timer_handle
 Timer handle for one second timer. More...
 
uint64_t unique_id
 Unique ID of socket used as a nonce You can use this to identify requests vs reply if you want. D++ itself only sets this, and does not use it in any logic. It starts at 1 and increments for each request made. More...
 

Friends

class dpp::cluster
 Needed to allow cluster::set_presence to use the ETF functions. More...
 
class dpp::events::guild_create
 Needed so that guild_create can request member chunks if you have the correct intents. More...
 
class dpp::events::voice_state_update
 Needed so that voice_state_update can call dpp::discord_client::disconnect_voice_internal. More...
 

Detailed Description

Implements a discord client. Each discord_client connects to one shard and derives from a websocket client.

Constructor & Destructor Documentation

◆ discord_client() [1/2]

dpp::discord_client::discord_client ( dpp::cluster _cluster,
uint32_t  _shard_id,
uint32_t  _max_shards,
const std::string &  _token,
uint32_t  intents = 0,
bool  compressed = true,
websocket_protocol_t  ws_protocol = ws_json 
)

Construct a new discord_client object.

Parameters
_clusterThe owning cluster for this shard
_shard_idThe ID of the shard to start
_max_shardsThe total number of shards across all clusters
_tokenThe bot token to use for identifying to the websocket
intentsPrivileged intents to use, a bitmask of values from dpp::intents
compressedTrue if the received data will be gzip compressed
ws_protocolWebsocket protocol to use for the connection, JSON or ETF
Exceptions
std::bad_allocPassed up to the caller if any internal objects fail to allocate, after cleanup has completed

◆ discord_client() [2/2]

dpp::discord_client::discord_client ( discord_client old,
uint64_t  sequence,
const std::string &  session_id 
)
explicit

Construct a discord_client object from another discord_client object Used when resuming, the url to connect to will be taken from the resume url of the other object, along with the seq number.

Parameters
oldPrevious connection to resume from
sequenceSequence number of previous session
session_idSession ID of previous session

◆ ~discord_client()

virtual dpp::discord_client::~discord_client ( )
virtualdefault

Destroy the discord client object.

Member Function Documentation

◆ clear_queue()

discord_client & dpp::discord_client::clear_queue ( )

Clear the outbound message queue.

Returns
reference to self

◆ close()

virtual void dpp::websocket_client::close ( )
overridevirtualinherited

Close websocket.

Reimplemented from dpp::ssl_connection.

◆ complete_handshake()

void dpp::ssl_connection::complete_handshake ( const struct socket_events ev)
inherited

Called while SSL handshake is in progress. If the handshake completes, the state of the socket is progressed to an established state.

Parameters
evSocket events for the socket

◆ connect()

virtual void dpp::websocket_client::connect ( )
overrideprotectedvirtualinherited

Connect to websocket server.

Reimplemented from dpp::ssl_connection.

◆ connect_voice()

discord_client & dpp::discord_client::connect_voice ( snowflake  guild_id,
snowflake  channel_id,
bool  self_mute = false,
bool  self_deaf = false,
bool  enable_dave = false 
)

Connect to a voice channel.

Parameters
guild_idGuild where the voice channel is
channel_idChannel ID of the voice channel
self_muteTrue if the bot should mute itself
self_deafTrue if the bot should deafen itself
enable_daveTrue to enable DAVE E2EE - EXPERIMENTAL
Returns
reference to self
Note
This is NOT a synchronous blocking call! The bot isn't instantly ready to send or listen for audio, as we have to wait for the connection to the voice server to be established! e.g. wait for dpp::cluster::on_voice_ready event, and then send the audio within that event.

◆ disconnect_voice()

discord_client & dpp::discord_client::disconnect_voice ( snowflake  guild_id)

Disconnect from the connected voice channel on a guild.

Parameters
guild_idThe guild who's voice channel you wish to disconnect from
Returns
reference to self
Note
This is NOT a synchronous blocking call! The bot isn't instantly disconnected.

◆ disconnect_voice_internal()

void dpp::discord_client::disconnect_voice_internal ( snowflake  guild_id,
bool  send_json = true 
)
protected

Disconnect from the connected voice channel on a guild.

Parameters
guild_idThe guild who's voice channel you wish to disconnect from
send_jsonTrue if we should send a json message confirming we are leaving the VC Should be set to false if we already receive this message in an event.

◆ do_raw_trace()

void dpp::ssl_connection::do_raw_trace ( const std::string &  message) const
protectedinherited

If raw_trace is set to true, log a debug message for this connection.

Parameters
messagedebug message

◆ enable_raw_tracing()

void dpp::ssl_connection::enable_raw_tracing ( )
inherited

For low-level debugging, calling this function will enable low level I/O logging for this connection to the logger. This can be very loud, and output a lot of data, so only enable it selectively where you need it.

Generally, you won't need this, it is a library development utility.

◆ error()

virtual void dpp::discord_client::error ( uint32_t  errorcode)
overridevirtual

Handle a websocket error.

Parameters
errorcodeThe error returned from the websocket

Reimplemented from dpp::websocket_client.

◆ get_bytes_in()

uint64_t dpp::ssl_connection::get_bytes_in ( )
inherited

Get total bytes received.

Returns
uint64_t bytes received

◆ get_bytes_out()

uint64_t dpp::ssl_connection::get_bytes_out ( )
inherited

Get the bytes out objectGet total bytes sent.

Returns
uint64_t bytes sent

◆ get_channel_count()

uint64_t dpp::discord_client::get_channel_count ( )

Get the Channel Count for this shard.

Returns
uint64_t channel count

◆ get_cipher()

std::string dpp::ssl_connection::get_cipher ( )
inherited

Get SSL cipher name.

Returns
std::string ssl cipher name

◆ get_decompressed_bytes_in()

uint64_t dpp::discord_client::get_decompressed_bytes_in ( )

Get decompressed total bytes received.

This will always return 0 if the connection is not compressed

Returns
uint64_t compressed bytes received

◆ get_guild_count()

uint64_t dpp::discord_client::get_guild_count ( )

Get the Guild Count for this shard.

Returns
uint64_t guild count

◆ get_member_count()

uint64_t dpp::discord_client::get_member_count ( )

Get the Member Count for this shard.

Returns
uint64_t member count

◆ get_queue_size()

size_t dpp::discord_client::get_queue_size ( )

Get the size of the outbound message queue.

Returns
The size of the queue

◆ get_state()

ws_state dpp::websocket_client::get_state ( ) const
protectedinherited

Get websocket state.

Returns
websocket state

◆ get_unique_id()

uint64_t dpp::ssl_connection::get_unique_id ( ) const
inherited

Every request made has a unique ID. This increments for every request, starting at 1. You can use this for statistics, or to associate requests and replies in external event loops.

Returns
Unique ID

◆ get_uptime()

dpp::utility::uptime dpp::discord_client::get_uptime ( )

Returns the connection time of the shard.

Returns
dpp::utility::uptime Detail of how long the shard has been connected for

◆ get_voice()

voiceconn * dpp::discord_client::get_voice ( snowflake  guild_id)

Get the dpp::voiceconn object for a specific guild on this shard.

Parameters
guild_idThe guild ID to retrieve the voice connection for
Returns
voiceconn* The voice connection for the guild, or nullptr if there is no voice connection to this guild.

◆ handle_buffer()

virtual bool dpp::websocket_client::handle_buffer ( std::string &  buffer)
overridevirtualinherited

Processes incoming frames from the SSL socket input buffer.

Parameters
bufferThe buffer contents. Can modify this value removing the head elements when processed.

Reimplemented from dpp::ssl_connection.

◆ handle_event()

virtual void dpp::discord_client::handle_event ( const std::string &  event,
json j,
const std::string &  raw 
)
virtual

Handle an event (opcode 0)

Parameters
eventEvent name, e.g. MESSAGE_CREATE
jJSON object for the event content
rawRaw JSON event string

◆ handle_frame()

virtual bool dpp::discord_client::handle_frame ( const std::string &  buffer,
ws_opcode  opcode 
)
overridevirtual

Handle JSON from the websocket.

Parameters
bufferThe entire buffer content from the websocket client
opcodeThe type of frame, e.g. text or binary
Returns
True if a frame has been handled

Reimplemented from dpp::websocket_client.

◆ is_connected()

bool dpp::discord_client::is_connected ( )

Returns true if the shard is connected.

Returns
True if connected

◆ log()

virtual void dpp::discord_client::log ( dpp::loglevel  severity,
const std::string &  msg 
) const
overridevirtual

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.

Parameters
severityThe log level from dpp::loglevel
msgThe log message to output

Reimplemented from dpp::ssl_connection.

◆ on_buffer_drained()

virtual void dpp::ssl_connection::on_buffer_drained ( )
protectedvirtualinherited

Reimplemented in dpp::http_server_request.

◆ on_disconnect()

virtual void dpp::discord_client::on_disconnect ( )
overridevirtual

Called when the HTTP socket is closed.

Reimplemented from dpp::websocket_client.

◆ on_error()

void dpp::ssl_connection::on_error ( dpp::socket  fd,
const struct dpp::socket_events ,
int  error_code 
)
inherited

Called when there is an error on the TCP socket.

Parameters
fdFile descriptor
error_codeError code

◆ on_read()

void dpp::ssl_connection::on_read ( dpp::socket  fd,
const struct dpp::socket_events ev 
)
inherited

Called when the TCP socket has data to read.

Parameters
fdFile descriptor
evSocket events

◆ on_write()

void dpp::ssl_connection::on_write ( dpp::socket  fd,
const struct dpp::socket_events e 
)
inherited

Called when the TCP socket can be written to without blocking.

Parameters
fdFile descriptor
eSocket events

◆ one_second_timer()

virtual void dpp::discord_client::one_second_timer ( )
overridevirtual

Fires every second from the underlying socket I/O loop, used for sending heartbeats and any queued outbound websocket frames.

Reimplemented from dpp::websocket_client.

◆ queue_message()

void dpp::discord_client::queue_message ( const std::string &  j,
bool  to_front = false 
)

Queue a message to be sent via the websocket.

Parameters
jThe JSON data of the message to be sent
to_frontIf set to true, will place the message at the front of the queue not the back (this is for urgent messages such as heartbeat, presence, so they can take precedence over chunk requests etc)

◆ read_loop()

void dpp::ssl_connection::read_loop ( )
inherited

Set up non blocking I/O and configure on_read, on_write and on_error.

Exceptions
std::exceptionAny std::exception (or derivative) thrown from read_loop() indicates setup failed

◆ run()

void dpp::discord_client::run ( )

Start and monitor I/O loop.

◆ send_close_packet()

void dpp::websocket_client::send_close_packet ( )
inherited

Send OP_CLOSE error code 1000 to the other side of the connection. This indicates graceful close.

Note
This informs Discord to invalidate the session, you cannot resume if you send this

◆ socket_write()

void dpp::ssl_connection::socket_write ( const std::string_view  data)
inherited

Write to the output buffer.

Parameters
dataData to be written to the buffer.
Note
The data may not be written immediately and may be written at a later time to the socket.

◆ start_connecting()

void dpp::discord_client::start_connecting ( )
protected

Start connecting the websocket.

Called from the constructor, or during reconnection

◆ write()

virtual void dpp::websocket_client::write ( const std::string_view  data,
ws_opcode  _opcode = OP_AUTO 
)
virtualinherited

Write to websocket. Encapsulates data in frames if the status is CONNECTED.

Parameters
dataThe data to send.
_opcodeThe opcode of the data to send, either binary or text. The default is to use the socket's opcode as set in the constructor.

Friends And Related Function Documentation

◆ dpp::cluster

friend class dpp::cluster
friend

Needed to allow cluster::set_presence to use the ETF functions.

◆ dpp::events::guild_create

friend class dpp::events::guild_create
friend

Needed so that guild_create can request member chunks if you have the correct intents.

◆ dpp::events::voice_state_update

friend class dpp::events::voice_state_update
friend

Needed so that voice_state_update can call dpp::discord_client::disconnect_voice_internal.

Member Data Documentation

◆ buffer

std::string dpp::ssl_connection::buffer
protectedinherited

Input buffer received from socket.

◆ bytes_in

uint64_t dpp::ssl_connection::bytes_in
protectedinherited

Bytes in.

◆ bytes_out

uint64_t dpp::ssl_connection::bytes_out
protectedinherited

Bytes out.

◆ cipher

std::string dpp::ssl_connection::cipher
protectedinherited

SSL cipher in use.

◆ connect_retries

uint8_t dpp::ssl_connection::connect_retries {0}
protectedinherited

How many times we retried connect()

◆ connected

bool dpp::ssl_connection::connected {false}
protectedinherited

True if connection is completed.

◆ connecting_voice_channels

std::unordered_map<snowflake, std::unique_ptr<voiceconn> > dpp::discord_client::connecting_voice_channels

List of voice channels we are connecting to keyed by guild id.

◆ creator

class dpp::cluster* dpp::discord_client::creator

Owning cluster.

◆ heartbeat_interval

uint32_t dpp::discord_client::heartbeat_interval

Heartbeat interval for sending heartbeat keepalive.

Note
value in milliseconds

◆ hostname

std::string dpp::ssl_connection::hostname
protectedinherited

Hostname connected to.

◆ intents

uint32_t dpp::discord_client::intents

Privileged gateway intents.

See also
dpp::intents

◆ keepalive

bool dpp::ssl_connection::keepalive
inherited

True if we are keeping the connection alive after it has finished.

◆ last_heartbeat

time_t dpp::discord_client::last_heartbeat

Last heartbeat.

◆ last_heartbeat_ack

time_t dpp::discord_client::last_heartbeat_ack

Last heartbeat ACK (opcode 11)

◆ last_ping_message

std::string dpp::discord_client::last_ping_message
protected

Stores the most recent ping message on this shard, which we check for to monitor latency.

◆ last_seq

uint64_t dpp::discord_client::last_seq

Last sequence number received, for resumes and pings.

◆ last_tick

time_t dpp::ssl_connection::last_tick
protectedinherited

For timers.

◆ max_shards

uint32_t dpp::discord_client::max_shards

Total number of shards.

◆ obuffer

std::string dpp::ssl_connection::obuffer
protectedinherited

Output buffer for sending to socket.

◆ owner

class cluster* dpp::ssl_connection::owner
inherited

Owning cluster.

◆ plaintext

bool dpp::ssl_connection::plaintext
protectedinherited

True for a plain text connection.

◆ port

std::string dpp::ssl_connection::port
protectedinherited

Port connected to.

◆ private_key_file

std::string dpp::ssl_connection::private_key_file
inherited

Private key PEM file path for inbound SSL connections.

◆ protocol

websocket_protocol_t dpp::discord_client::protocol

Current websocket protocol, currently either ETF or JSON.

◆ public_key_file

std::string dpp::ssl_connection::public_key_file
inherited

Public key PEM file path for inbound SSL connections.

◆ raw_trace

bool dpp::ssl_connection::raw_trace {false}
protectedinherited

Set this to true to log all IO to debug for this connection. This is an internal developer facility. Do not enable it unless you need to, as it will be very noisy.

◆ ready

bool dpp::discord_client::ready

True if READY or RESUMED has been received.

◆ reconnects

uint32_t dpp::discord_client::reconnects

Reconnection count.

◆ resume_gateway_url

std::string dpp::discord_client::resume_gateway_url

The gateway address we reconnect to when we resume a session.

◆ resumes

uint32_t dpp::discord_client::resumes

Resume count.

◆ sessionid

std::string dpp::discord_client::sessionid

Discord session id.

◆ sfd

dpp::socket dpp::ssl_connection::sfd
protectedinherited

Raw file descriptor of connection.

◆ shard_id

uint32_t dpp::discord_client::shard_id

Shard ID of this client.

◆ ssl

openssl_connection* dpp::ssl_connection::ssl
protectedinherited

Openssl opaque contexts.

◆ start

time_t dpp::ssl_connection::start
protectedinherited

Start time of connection.

◆ tcp_connect_done

bool dpp::ssl_connection::tcp_connect_done {false}
protectedinherited

True if tcp connect() succeeded.

◆ timed_out

bool dpp::websocket_client::timed_out
protectedinherited

If true the connection timed out while waiting, when waiting for SSL negotiation, TCP connect(), or HTTP.

◆ timeout

time_t dpp::websocket_client::timeout
protectedinherited

Time at which the connection should be abandoned, if we are still connecting or negotiating with a HTTP server.

◆ timer_handle

timer dpp::ssl_connection::timer_handle
protectedinherited

Timer handle for one second timer.

◆ token

std::string dpp::discord_client::token

Discord bot token.

◆ unique_id

uint64_t dpp::ssl_connection::unique_id
protectedinherited

Unique ID of socket used as a nonce You can use this to identify requests vs reply if you want. D++ itself only sets this, and does not use it in any logic. It starts at 1 and increments for each request made.

◆ voice_mutex

std::shared_mutex dpp::discord_client::voice_mutex

Mutex for voice connections map.

◆ websocket_ping

double dpp::discord_client::websocket_ping

Websocket latency in fractional seconds.

D++ Library version 10.1.2D++ Library version 10.1.1D++ Library version 10.1.0D++ Library version 10.0.35D++ Library version 10.0.34D++ Library version 10.0.33D++ Library version 10.0.32D++ Library version 10.0.31D++ Library version 10.0.30D++ Library version 10.0.29D++ Library version 10.0.28D++ Library version 10.0.27D++ Library version 10.0.26D++ Library version 10.0.25D++ Library version 10.0.24D++ Library version 10.0.23D++ Library version 10.0.22D++ Library version 10.0.21D++ Library version 10.0.20D++ Library version 10.0.19D++ Library version 10.0.18D++ Library version 10.0.17D++ Library version 10.0.16D++ Library version 10.0.15D++ Library version 10.0.14D++ Library version 10.0.13D++ Library version 10.0.12D++ Library version 10.0.11D++ Library version 10.0.10D++ Library version 10.0.9D++ Library version 10.0.8D++ Library version 10.0.7D++ Library version 10.0.6D++ Library version 10.0.5D++ Library version 10.0.4D++ Library version 10.0.3D++ Library version 10.0.2D++ Library version 10.0.1D++ Library version 10.0.0D++ Library version 9.0.19D++ Library version 9.0.18D++ Library version 9.0.17D++ Library version 9.0.16D++ Library version 9.0.15D++ Library version 9.0.14D++ Library version 9.0.13D++ Library version 9.0.12D++ Library version 9.0.11D++ Library version 9.0.10D++ Library version 9.0.9D++ Library version 9.0.8D++ Library version 9.0.7D++ Library version 9.0.6D++ Library version 9.0.5D++ Library version 9.0.4D++ Library version 9.0.3D++ Library version 9.0.2D++ Library version 9.0.1D++ Library version 9.0.0D++ Library version 1.0.2D++ Library version 1.0.1D++ Library version 1.0.0