36namespace DiscordCoreInternal {
38 class DiscordCoreAPI_Dll EventConverter {
40 EventConverter(std::string eventNew);
45 std::string eventValue{};
63 enum class WebSocketType { Normal = 0, Voice = 1 };
65 enum class WebSocketState {
74 class DiscordCoreAPI_Dll WebSocketCore :
public ErlParser,
public TCPSSLClient {
76 WebSocketCore(DiscordCoreAPI::ConfigManager* configManagerNew, WebSocketType typeOfWebSocketNew);
78 bool connect(
const std::string& baseUrl,
const std::string& relativePath,
const uint16_t portNew,
bool doWePrintErrorsNew,
79 bool areWeAStandaloneSocketNew)
noexcept;
81 void createHeader(std::string& outBuffer, WebSocketOpCode opCode)
noexcept;
83 virtual bool onMessageReceived(std::string_view message)
noexcept = 0;
85 bool sendMessage(std::string& dataToSend,
bool priority)
noexcept;
87 void parseConnectionHeaders(std::string_view stringNew)
noexcept;
89 bool checkForAndSendHeartBeat(
bool =
false) noexcept;
91 virtual
void onClosed() noexcept = 0;
93 void parseMessage() noexcept;
95 void handleBuffer() noexcept;
97 virtual ~WebSocketCore() noexcept = default;
100 std::unique_ptr<
DiscordCoreAPI::ConnectionPackage> connections{
nullptr };
101 DiscordCoreAPI::StopWatch<Milliseconds> heartBeatStopWatch{ 20000ms };
102 DiscordCoreAPI::ConfigManager* configManager{};
103 std::atomic<WebSocketState> currentState{};
104 bool haveWeReceivedHeartbeatAck{
true };
105 const uint32_t maxReconnectTries{ 10 };
106 uint32_t currentReconnectTries{};
107 uint32_t lastNumberReceived{};
108 WebSocketClose closeCode{ 0 };
109 StringBuffer currentMessage{};
110 WebSocketOpCode dataOpCode{};
111 bool areWeHeartBeating{};
112 uint64_t messageLength{};
113 uint64_t messageOffset{};
114 WebSocketType wsType{};
115 bool areWeResuming{};
119 class DiscordCoreAPI_Dll WebSocketClient :
public WebSocketCore {
126 friend class BaseSocketAgent;
127 friend class WebSocketCore;
128 friend class TCPSSLClient;
134 bool onMessageReceived(std::string_view message)
noexcept;
136 void disconnect() noexcept;
138 void onClosed() noexcept;
140 virtual ~WebSocketClient() noexcept;
143 std::unordered_map<uint64_t,
DiscordCoreAPI::UnboundedMessageBlock<VoiceConnectionData>*> voiceConnectionDataBuffersMap{};
145 VoiceConnectionData voiceConnectionData{};
146 std::atomic_bool* doWeQuit{
nullptr };
147 DiscordCoreAPI::Snowflake userId{};
148 bool serverUpdateCollected{};
149 bool stateUpdateCollected{};
150 Jsonifier::Parser parser{};
151 bool areWeCollectingData{};
152 std::string resumeUrl{};
153 std::string sessionId{};
156 class DiscordCoreAPI_Dll BaseSocketAgent {
162 int32_t currentBaseSocket)
noexcept;
164 bool waitForState(DiscordCoreAPI::ConnectionPackage& packageNew, WebSocketState state)
noexcept;
166 void connect(DiscordCoreAPI::ConnectionPackage)
noexcept;
168 std::jthread* getTheTask() noexcept;
170 ~BaseSocketAgent() noexcept;
173 std::unordered_map<uint32_t, std::unique_ptr<WebSocketClient>> shardMap{};
175 std::unique_ptr<std::jthread> taskThread{
nullptr };
176 DiscordCoreAPI::ConfigManager* configManager{};
177 std::atomic_bool* doWeQuit{
nullptr };
178 uint32_t currentBaseSocketAgent{};
179 std::mutex accessMutex{};
181 void run(std::stop_token)
noexcept;
WebSocketOpCodes
For the opcodes that could be sent/received via Discord's websockets.
@ Presence_Update
Update the client's presence.
@ Dispatch
An event was dispatched.
@ Reconnect
You should attempt to reconnect and resume immediately.
@ Request_Guild_Members
Request information about offline guild members in a large guild.
@ Voice_State_Update
Used to join/leave or move between voice channels.
The main namespace for this library.
@ Sending_Identify
Sending the identify payload.
@ Collecting_Hello
Collecting the client hello.
@ Connecting
Connecting - it hasn't started or it's reconnecting.
DiscordCoreClient - The main class for this library.
Data that is received as part of a voice state update event.
Data that is received as part of a voice server update event.
A type of User, to represent the Bot and some of its associated endpoints.
For connecting to a voice-channel. "streamInfo" is used when a socket is created to connect this bot ...
VoiceConnection class - represents the connection to a given voice Channel.