fix handling of reconnect messages

This commit is contained in:
ouwou 2021-04-15 02:32:47 -04:00
parent 3c7c40edcd
commit 0aaebf9ea7
4 changed files with 17 additions and 16 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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) {