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

Implements a websocket client based on the SSL client. More...

#include "wsclient.h"

Inheritance diagram for dpp::websocket_client:
Collaboration diagram for dpp::websocket_client:

Public Member Functions

 websocket_client (const std::string &hostname, const std::string &port="443", const std::string &urlpath="", ws_opcode opcode=OP_BINARY)
 Connect to a specific websocket server. More...
 
virtual ~websocket_client ()=default
 Destroy the websocket client object. More...
 
virtual void close ()
 Close websocket. More...
 
virtual void error (uint32_t errorcode)
 Called upon error frame. 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...
 
std::string get_cipher ()
 Get SSL cipher name. More...
 
virtual bool handle_buffer (std::string &buffer)
 Processes incoming frames from the SSL socket input buffer. More...
 
virtual bool handle_frame (const std::string &buffer)
 Receives raw frame content only without headers. More...
 
virtual void log (dpp::loglevel severity, const std::string &msg) const
 Log a message. More...
 
virtual void one_second_timer ()
 Fires every second from the underlying socket I/O loop, used for sending websocket pings. More...
 
void read_loop ()
 Nonblocking I/O loop. More...
 
void send_close_packet ()
 Send OP_CLOSE error code 1000 to the other side of the connection. More...
 
virtual void write (const std::string &data)
 Write to websocket. More...
 

Public Attributes

socket_callback_t custom_readable_fd
 Attaching an additional file descriptor to this function will send notifications when there is data to read. More...
 
socket_notification_t custom_readable_ready
 This event will be called when you can read from the custom fd. More...
 
socket_callback_t custom_writeable_fd
 Attaching an additional file descriptor to this function will send notifications when you are able to write to the socket. More...
 
socket_notification_t custom_writeable_ready
 This event will be called when you can write to a custom fd. More...
 
bool keepalive
 True if we are keeping the connection alive after it has finished. More...
 

Protected Member Functions

virtual void connect ()
 (Re)connect More...
 
ws_state get_state ()
 Get websocket state. 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...
 
std::string hostname
 Hostname connected to. More...
 
time_t last_tick
 For timers. More...
 
bool make_new
 True if we are establishing a new connection, false if otherwise. More...
 
bool nonblocking
 True if in nonblocking mode. 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...
 
dpp::socket sfd
 Raw file descriptor of connection. More...
 
openssl_connectionssl
 Openssl opaque contexts. More...
 

Detailed Description

Implements a websocket client based on the SSL client.

Constructor & Destructor Documentation

◆ websocket_client()

dpp::websocket_client::websocket_client ( const std::string &  hostname,
const std::string &  port = "443",
const std::string &  urlpath = "",
ws_opcode  opcode = OP_BINARY 
)

Connect to a specific websocket server.

Parameters
hostnameHostname to connect to
portPort to connect to
urlpathThe URL path components of the HTTP request to send
opcodeThe encoding type to use, either OP_BINARY or OP_TEXT
Note
Voice websockets only support OP_TEXT, and other websockets must be OP_BINARY if you are going to send ETF.

References dpp::HTTP_HEADERS, dpp::http_version, and write().

Here is the call graph for this function:

◆ ~websocket_client()

virtual dpp::websocket_client::~websocket_client ( )
virtualdefault

Destroy the websocket client object.

Member Function Documentation

◆ close()

void dpp::websocket_client::close ( )
virtual

Close websocket.

Reimplemented from dpp::ssl_client.

Referenced by dpp::discord_client::handle_frame().

Here is the caller graph for this function:

◆ connect()

void dpp::websocket_client::connect ( )
protectedvirtual

(Re)connect

Reimplemented from dpp::ssl_client.

Referenced by dpp::discord_client::discord_client(), dpp::discord_voice_client::discord_voice_client(), and dpp::discord_voice_client::discover_ip().

Here is the caller graph for this function:

◆ error()

void dpp::websocket_client::error ( uint32_t  errorcode)
virtual

Called upon error frame.

Parameters
errorcodeThe error code from the websocket server

Reimplemented in dpp::discord_voice_client, and dpp::discord_client.

◆ get_bytes_in()

uint64_t dpp::ssl_client::get_bytes_in ( )
inherited

Get total bytes received.

Returns
uint64_t bytes received

References dpp::ssl_client::bytes_in.

◆ get_bytes_out()

uint64_t dpp::ssl_client::get_bytes_out ( )
inherited

Get the bytes out objectGet total bytes sent.

Returns
uint64_t bytes sent

References dpp::ssl_client::bytes_out.

◆ get_cipher()

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

Get SSL cipher name.

Returns
std::string ssl cipher name

References dpp::ssl_client::cipher.

◆ get_state()

ws_state dpp::websocket_client::get_state ( )
protected

Get websocket state.

Returns
websocket state

References dpp::WS_MASKBIT.

Referenced by dpp::discord_client::is_connected(), dpp::discord_voice_client::is_connected(), and dpp::discord_voice_client::one_second_timer().

Here is the caller graph for this function:

◆ handle_buffer()

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

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_client.

References dpp::CONNECTED.

◆ handle_frame()

bool dpp::websocket_client::handle_frame ( const std::string &  buffer)
virtual

Receives raw frame content only without headers.

Parameters
bufferThe buffer contents
Returns
True if the frame was successfully handled. False if no valid frame is in the buffer.

Reimplemented in dpp::discord_voice_client, and dpp::discord_client.

◆ log()

void dpp::ssl_client::log ( dpp::loglevel  severity,
const std::string &  msg 
) const
virtualinherited

Log a message.

Parameters
severityseverity of log message
msgLog message to send

Reimplemented in dpp::discord_voice_client, and dpp::discord_client.

Referenced by dpp::ssl_client::read_loop().

Here is the caller graph for this function:

◆ one_second_timer()

void dpp::websocket_client::one_second_timer ( )
virtual

Fires every second from the underlying socket I/O loop, used for sending websocket pings.

Reimplemented from dpp::ssl_client.

Reimplemented in dpp::discord_voice_client, and dpp::discord_client.

Referenced by dpp::discord_client::one_second_timer().

Here is the caller graph for this function:

◆ read_loop()

◆ send_close_packet()

void dpp::websocket_client::send_close_packet ( )

Send OP_CLOSE error code 1000 to the other side of the connection.

This indicates graceful close.

References dpp::ssl_client::close(), and dpp::HTTP_HEADERS.

Here is the call graph for this function:

◆ write()

void dpp::websocket_client::write ( const std::string &  data)
virtual

Write to websocket.

Encapsulates data in frames if the status is CONNECTED.

Parameters
dataThe data to send.

Reimplemented from dpp::ssl_client.

Referenced by dpp::discord_client::handle_frame(), dpp::discord_voice_client::handle_frame(), dpp::discord_client::one_second_timer(), dpp::discord_voice_client::one_second_timer(), and websocket_client().

Here is the caller graph for this function:

Member Data Documentation

◆ buffer

std::string dpp::ssl_client::buffer
protectedinherited

Input buffer received from socket.

Referenced by dpp::ssl_client::close(), dpp::discord_client::handle_frame(), and dpp::ssl_client::read_loop().

◆ bytes_in

uint64_t dpp::ssl_client::bytes_in
protectedinherited

◆ bytes_out

uint64_t dpp::ssl_client::bytes_out
protectedinherited

◆ cipher

std::string dpp::ssl_client::cipher
protectedinherited

SSL cipher in use.

Referenced by dpp::ssl_client::connect(), and dpp::ssl_client::get_cipher().

◆ custom_readable_fd

socket_callback_t dpp::ssl_client::custom_readable_fd
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.

Referenced by dpp::discord_voice_client::handle_frame(), and dpp::ssl_client::read_loop().

◆ custom_readable_ready

socket_notification_t dpp::ssl_client::custom_readable_ready
inherited

This event will be called when you can read from the custom fd.

Referenced by dpp::discord_voice_client::handle_frame(), and dpp::ssl_client::read_loop().

◆ custom_writeable_fd

socket_callback_t dpp::ssl_client::custom_writeable_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).

Referenced by dpp::discord_voice_client::handle_frame(), and dpp::ssl_client::read_loop().

◆ custom_writeable_ready

socket_notification_t dpp::ssl_client::custom_writeable_ready
inherited

This event will be called when you can write to a custom fd.

Referenced by dpp::discord_voice_client::handle_frame(), and dpp::ssl_client::read_loop().

◆ hostname

std::string dpp::ssl_client::hostname
protectedinherited

◆ keepalive

bool dpp::ssl_client::keepalive
inherited

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

Referenced by dpp::ssl_client::close(), and dpp::ssl_client::ssl_client().

◆ last_tick

time_t dpp::ssl_client::last_tick
protectedinherited

For timers.

Referenced by dpp::ssl_client::read_loop().

◆ make_new

bool dpp::ssl_client::make_new
protectedinherited

True if we are establishing a new connection, false if otherwise.

Referenced by dpp::ssl_client::connect(), and dpp::ssl_client::ssl_client().

◆ nonblocking

bool dpp::ssl_client::nonblocking
protectedinherited

True if in nonblocking mode.

The socket switches to nonblocking mode once ReadLoop is called.

Referenced by dpp::ssl_client::connect(), dpp::ssl_client::read_loop(), and dpp::ssl_client::write().

◆ obuffer

std::string dpp::ssl_client::obuffer
protectedinherited

Output buffer for sending to socket.

Referenced by dpp::ssl_client::close(), dpp::ssl_client::read_loop(), and dpp::ssl_client::write().

◆ plaintext

bool dpp::ssl_client::plaintext
protectedinherited

◆ port

std::string dpp::ssl_client::port
protectedinherited

◆ sfd

◆ ssl


The documentation for this class was generated from the following files: