diff options
-rw-r--r-- | abaddon.cpp | 12 | ||||
-rw-r--r-- | discord/discord.cpp | 16 | ||||
-rw-r--r-- | discord/discord.hpp | 3 | ||||
-rw-r--r-- | discord/websocket.cpp | 2 |
4 files changed, 17 insertions, 16 deletions
diff --git a/abaddon.cpp b/abaddon.cpp index 4df8c67..05557d9 100644 --- a/abaddon.cpp +++ b/abaddon.cpp @@ -235,13 +235,13 @@ void Abaddon::DiscordOnMessageSent(const Message &data) { } void Abaddon::DiscordOnDisconnect(bool is_reconnecting, GatewayCloseCode close_code) { - if (!is_reconnecting) { - m_channels_history_loaded.clear(); - m_channels_history_loading.clear(); - m_channels_requested.clear(); - m_main_window->set_title(APP_TITLE); - } + m_channels_history_loaded.clear(); + m_channels_history_loading.clear(); + m_channels_requested.clear(); + if (is_reconnecting) return; + m_main_window->set_title(APP_TITLE); m_main_window->UpdateComponents(); + if (close_code == GatewayCloseCode::AuthenticationFailed) { Gtk::MessageDialog dlg(*m_main_window, "Discord rejected your token", false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); dlg.set_position(Gtk::WIN_POS_CENTER); diff --git a/discord/discord.cpp b/discord/discord.cpp index e0889cc..1dc8fe9 100644 --- a/discord/discord.cpp +++ b/discord/discord.cpp @@ -1047,11 +1047,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(); @@ -1494,13 +1496,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); } @@ -1515,6 +1519,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(); @@ -1697,9 +1702,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; @@ -1708,9 +1710,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 6ce92bd..0234014 100644 --- a/discord/discord.hpp +++ b/discord/discord.hpp @@ -270,7 +270,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) { |