diff --git a/Discord.C++/Gateway.cpp b/Discord.C++/Gateway.cpp index e14c320..66f1395 100644 --- a/Discord.C++/Gateway.cpp +++ b/Discord.C++/Gateway.cpp @@ -103,13 +103,11 @@ void DiscordCPP::Gateway::on_read(boost::system::error_code error_code, std::siz message_stream << beast::make_printable(buffer.data()); std::string message = message_stream.str(); - threadpool->execute([this, message]() { - try { - on_websocket_incoming_message(message); - } catch (const std::exception& e) { - _log.error("Error while handling incoming message: " + std::string(e.what())); - } - }); + try { + on_websocket_incoming_message(message); + } catch (const std::exception& e) { + _log.error("Error while handling incoming message: " + std::string(e.what())); + } } buffer.clear(); diff --git a/Discord.C++/MainGateway.cpp b/Discord.C++/MainGateway.cpp index be6bfe5..378b27b 100644 --- a/Discord.C++/MainGateway.cpp +++ b/Discord.C++/MainGateway.cpp @@ -40,73 +40,74 @@ json DiscordCPP::MainGateway::get_heartbeat_payload() { {"d", ((_sequence_number == 0) ? "null" : std::to_string(_sequence_number))}}; } -void DiscordCPP::MainGateway::on_websocket_incoming_message( - const std::string& message) { +void DiscordCPP::MainGateway::on_websocket_incoming_message(const std::string& message) { std::string decompressed_message = decompress_message(message); - _log.debug("Received message: " + decompressed_message); - - json payload = json::parse(decompressed_message); - int op = payload["op"].get(); - - if ((payload.count("s") > 0) && payload["s"].is_number_integer()) { - _sequence_number = payload["s"].get(); - } - - switch (op) { - case 0: - if (payload["t"].get() == "READY") { - _reconnect_timeout = 0; - _last_heartbeat_ack = time(nullptr); - - _invalid_session = false; - - _session_id = payload["d"]["session_id"].get(); + threadpool->execute([this, decompressed_message]() { + _log.debug("Received message: " + decompressed_message); - _resume_url = payload["d"]["resume_gateway_url"].get() + "?v=10&encoding=json&compress=zlib-stream"; + json payload = json::parse(decompressed_message); + int op = payload["op"].get(); - std::string str = set_trace(payload); + if ((payload.count("s") > 0) && payload["s"].is_number_integer()) { + _sequence_number = payload["s"].get(); + } - _log.info("connected to: " + str + " ]"); - _log.info("session id: " + _session_id); - } else if (payload["t"].get() == "RESUMED") { - _reconnect_timeout = 0; + switch (op) { + case 0: + if (payload["t"].get() == "READY") { + _reconnect_timeout = 0; + _last_heartbeat_ack = time(nullptr); + + _invalid_session = false; + + _session_id = payload["d"]["session_id"].get(); + + _resume_url = payload["d"]["resume_gateway_url"].get() + "?v=10&encoding=json&compress=zlib-stream"; + + std::string str = set_trace(payload); + + _log.info("connected to: " + str + " ]"); + _log.info("session id: " + _session_id); + } else if (payload["t"].get() == "RESUMED") { + _reconnect_timeout = 0; + _last_heartbeat_ack = time(nullptr); + + std::string str = set_trace(payload); + + _log.info("successfully resumed session " + _session_id + + " with trace " + str + " ]"); + } + break; + case 1: + send_heartbeat_ack(); + break; + case 7: + _log.info("received opcode 7: reconnecting to the gateway"); + try { + _client->close(boost::beast::websocket::close_reason(boost::beast::websocket::close_code::going_away, "Server requested reconnect")); + } catch (std::exception& e) { + _log.error("Cannot close websocket: " + std::string(e.what())); + } + break; + case 9: + _invalid_session = true; + break; + case 10: + _heartbeat_interval = payload["d"]["heartbeat_interval"].get(); + _log.debug("set heartbeat_interval: " + + std::to_string(_heartbeat_interval)); + identify(); + break; + case 11: + _log.debug("received heartbeat ACK"); _last_heartbeat_ack = time(nullptr); + break; + default: + break; + } - std::string str = set_trace(payload); - - _log.info("successfully resumed session " + _session_id + - " with trace " + str + " ]"); - } - break; - case 1: - send_heartbeat_ack(); - break; - case 7: - _log.info("received opcode 7: reconnecting to the gateway"); - try { - _client->close(boost::beast::websocket::close_reason(boost::beast::websocket::close_code::going_away, "Server requested reconnect")); - } catch (std::exception& e) { - _log.error("Cannot close websocket: " + std::string(e.what())); - } - break; - case 9: - _invalid_session = true; - break; - case 10: - _heartbeat_interval = payload["d"]["heartbeat_interval"].get(); - _log.debug("set heartbeat_interval: " + - std::to_string(_heartbeat_interval)); - identify(); - break; - case 11: - _log.debug("received heartbeat ACK"); - _last_heartbeat_ack = time(nullptr); - break; - default: - break; - } - - _message_handler(payload); + _message_handler(payload); + }); } DiscordCPP::SharedFuture DiscordCPP::MainGateway::send_heartbeat_ack() { diff --git a/Discord.C++/VoiceGateway.cpp b/Discord.C++/VoiceGateway.cpp index 744c138..190e3a9 100644 --- a/Discord.C++/VoiceGateway.cpp +++ b/Discord.C++/VoiceGateway.cpp @@ -42,40 +42,42 @@ void DiscordCPP::VoiceGateway::identify() { } void DiscordCPP::VoiceGateway::on_websocket_incoming_message(const std::string& message) { - _log.debug("Received message: " + message); + threadpool->execute([this, message]() { + _log.debug("Received message: " + message); - json payload = json::parse(message); - int op = payload["op"].get(); + json payload = json::parse(message); + int op = payload["op"].get(); - if ((payload.count("seq") > 0) && payload["seq"].is_number_integer()) { - _sequence_number = payload["seq"].get(); - } + if ((payload.count("seq") > 0) && payload["seq"].is_number_integer()) { + _sequence_number = payload["seq"].get(); + } - switch (op) { - case 2: - _reconnect_timeout = 0; - _last_heartbeat_ack = time(nullptr); - _resume = true; - _log.info("connected to: " + _url); - break; - case 6: - _log.debug("received heartbeat ack"); - _last_heartbeat_ack = time(nullptr); - break; - case 8: - _heartbeat_interval = payload["d"]["heartbeat_interval"].get(); - identify(); - break; - case 9: - _reconnect_timeout = 0; - _last_heartbeat_ack = time(nullptr); - _resume = true; - _log.info("successfully resumed session for guild with id: " + - _guild_id); - break; - } + switch (op) { + case 2: + _reconnect_timeout = 0; + _last_heartbeat_ack = time(nullptr); + _resume = true; + _log.info("connected to: " + _url); + break; + case 6: + _log.debug("received heartbeat ack"); + _last_heartbeat_ack = time(nullptr); + break; + case 8: + _heartbeat_interval = payload["d"]["heartbeat_interval"].get(); + identify(); + break; + case 9: + _reconnect_timeout = 0; + _last_heartbeat_ack = time(nullptr); + _resume = true; + _log.info("successfully resumed session for guild with id: " + + _guild_id); + break; + } - _message_handler(payload); + _message_handler(payload); + }); } DiscordCPP::VoiceGateway::VoiceGateway(const std::string& token,