summaryrefslogtreecommitdiff
path: root/discord
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2021-04-15 02:32:47 -0400
committerouwou <26526779+ouwou@users.noreply.github.com>2021-04-15 02:32:47 -0400
commit0aaebf9ea77eede8a347aa71b95e86686d04a854 (patch)
tree8f561d7a82327cbd8ccc30b4d33b145b3385fbf8 /discord
parent3c7c40edcd32a7d31cfce4625d00b031351a70e3 (diff)
downloadabaddon-portaudio-0aaebf9ea77eede8a347aa71b95e86686d04a854.tar.gz
abaddon-portaudio-0aaebf9ea77eede8a347aa71b95e86686d04a854.zip
fix handling of reconnect messages
Diffstat (limited to 'discord')
-rw-r--r--discord/discord.cpp16
-rw-r--r--discord/discord.hpp3
-rw-r--r--discord/websocket.cpp2
3 files changed, 11 insertions, 10 deletions
diff --git a/discord/discord.cpp b/discord/discord.cpp
index baa0b28..17ea74c 100644
--- a/discord/discord.cpp
+++ b/discord/discord.cpp
@@ -1030,11 +1030,13 @@ void DiscordClient::HandleGatewayMessage(std::string str) {
}
void DiscordClient::HandleGatewayHello(const GatewayMessage &msg) {
+ m_client_connected = true;
HelloMessageData d = msg.Data;
m_heartbeat_msec = d.HeartbeatInterval;
m_heartbeat_waiter.revive();
m_heartbeat_thread = std::thread(std::bind(&DiscordClient::HeartbeatThread, this));
m_signal_connected.emit(); // socket is connected before this but emitting here should b fine
+ m_reconnecting = false; // maybe should go elsewhere?
if (m_wants_resume) {
m_wants_resume = false;
SendResume();
@@ -1477,13 +1479,15 @@ void DiscordClient::HandleGatewayReconnect(const GatewayMessage &msg) {
m_heartbeat_waiter.kill();
if (m_heartbeat_thread.joinable()) m_heartbeat_thread.join();
+ m_reconnecting = true;
+ m_wants_resume = true;
+ m_heartbeat_acked = true;
+
m_websocket.Stop(1012); // 1000 (kNormalClosureCode) and 1001 will invalidate the session id
std::memset(&m_zstream, 0, sizeof(m_zstream));
inflateInit2(&m_zstream, MAX_WBITS + 32);
- m_heartbeat_acked = true;
- m_wants_resume = true;
m_websocket.StartConnection(DiscordGateway);
}
@@ -1498,6 +1502,7 @@ void DiscordClient::HandleGatewayInvalidSession(const GatewayMessage &msg) {
m_heartbeat_acked = true;
m_wants_resume = false;
+ m_reconnecting = true;
m_heartbeat_waiter.kill();
if (m_heartbeat_thread.joinable()) m_heartbeat_thread.join();
@@ -1680,9 +1685,6 @@ void DiscordClient::HandleSocketClose(uint16_t code) {
printf("got socket close code: %d\n", code);
auto close_code = static_cast<GatewayCloseCode>(code);
auto cb = [this, close_code]() {
- inflateEnd(&m_zstream);
- m_compressed_buf.clear();
-
m_heartbeat_waiter.kill();
if (m_heartbeat_thread.joinable()) m_heartbeat_thread.join();
m_client_connected = false;
@@ -1691,9 +1693,7 @@ void DiscordClient::HandleSocketClose(uint16_t code) {
m_chan_to_message_map.clear();
m_guild_to_users.clear();
- m_websocket.Stop();
-
- m_signal_disconnected.emit(false, close_code);
+ m_signal_disconnected.emit(m_reconnecting, close_code);
};
m_generic_mutex.lock();
m_generic_queue.push(cb);
diff --git a/discord/discord.hpp b/discord/discord.hpp
index b0e6cb6..e39c49f 100644
--- a/discord/discord.hpp
+++ b/discord/discord.hpp
@@ -268,7 +268,8 @@ private:
HeartbeatWaiter m_heartbeat_waiter;
std::atomic<bool> m_heartbeat_acked = true;
- bool m_wants_resume = false;
+ bool m_reconnecting = false; // reconnecting either to resume or reidentify
+ bool m_wants_resume = false; // reconnecting specifically to resume
std::string m_session_id;
mutable std::mutex m_msg_mutex;
diff --git a/discord/websocket.cpp b/discord/websocket.cpp
index 8dcccff..ff50cd3 100644
--- a/discord/websocket.cpp
+++ b/discord/websocket.cpp
@@ -16,7 +16,7 @@ void Websocket::SetUserAgent(std::string agent) {
}
void Websocket::Stop() {
- m_websocket.stop();
+ Stop(ix::WebSocketCloseConstants::kNormalClosureCode);
}
void Websocket::Stop(uint16_t code) {