forked from OpenGamers/abaddon
fix handling of reconnect messages
This commit is contained in:
12
abaddon.cpp
12
abaddon.cpp
@@ -235,13 +235,13 @@ void Abaddon::DiscordOnMessageSent(const Message &data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Abaddon::DiscordOnDisconnect(bool is_reconnecting, GatewayCloseCode close_code) {
|
void Abaddon::DiscordOnDisconnect(bool is_reconnecting, GatewayCloseCode close_code) {
|
||||||
if (!is_reconnecting) {
|
m_channels_history_loaded.clear();
|
||||||
m_channels_history_loaded.clear();
|
m_channels_history_loading.clear();
|
||||||
m_channels_history_loading.clear();
|
m_channels_requested.clear();
|
||||||
m_channels_requested.clear();
|
if (is_reconnecting) return;
|
||||||
m_main_window->set_title(APP_TITLE);
|
m_main_window->set_title(APP_TITLE);
|
||||||
}
|
|
||||||
m_main_window->UpdateComponents();
|
m_main_window->UpdateComponents();
|
||||||
|
|
||||||
if (close_code == GatewayCloseCode::AuthenticationFailed) {
|
if (close_code == GatewayCloseCode::AuthenticationFailed) {
|
||||||
Gtk::MessageDialog dlg(*m_main_window, "Discord rejected your token", false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true);
|
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);
|
dlg.set_position(Gtk::WIN_POS_CENTER);
|
||||||
|
|||||||
@@ -1030,11 +1030,13 @@ void DiscordClient::HandleGatewayMessage(std::string str) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void DiscordClient::HandleGatewayHello(const GatewayMessage &msg) {
|
void DiscordClient::HandleGatewayHello(const GatewayMessage &msg) {
|
||||||
|
m_client_connected = true;
|
||||||
HelloMessageData d = msg.Data;
|
HelloMessageData d = msg.Data;
|
||||||
m_heartbeat_msec = d.HeartbeatInterval;
|
m_heartbeat_msec = d.HeartbeatInterval;
|
||||||
m_heartbeat_waiter.revive();
|
m_heartbeat_waiter.revive();
|
||||||
m_heartbeat_thread = std::thread(std::bind(&DiscordClient::HeartbeatThread, this));
|
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_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) {
|
if (m_wants_resume) {
|
||||||
m_wants_resume = false;
|
m_wants_resume = false;
|
||||||
SendResume();
|
SendResume();
|
||||||
@@ -1477,13 +1479,15 @@ void DiscordClient::HandleGatewayReconnect(const GatewayMessage &msg) {
|
|||||||
m_heartbeat_waiter.kill();
|
m_heartbeat_waiter.kill();
|
||||||
if (m_heartbeat_thread.joinable()) m_heartbeat_thread.join();
|
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
|
m_websocket.Stop(1012); // 1000 (kNormalClosureCode) and 1001 will invalidate the session id
|
||||||
|
|
||||||
std::memset(&m_zstream, 0, sizeof(m_zstream));
|
std::memset(&m_zstream, 0, sizeof(m_zstream));
|
||||||
inflateInit2(&m_zstream, MAX_WBITS + 32);
|
inflateInit2(&m_zstream, MAX_WBITS + 32);
|
||||||
|
|
||||||
m_heartbeat_acked = true;
|
|
||||||
m_wants_resume = true;
|
|
||||||
m_websocket.StartConnection(DiscordGateway);
|
m_websocket.StartConnection(DiscordGateway);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1498,6 +1502,7 @@ void DiscordClient::HandleGatewayInvalidSession(const GatewayMessage &msg) {
|
|||||||
|
|
||||||
m_heartbeat_acked = true;
|
m_heartbeat_acked = true;
|
||||||
m_wants_resume = false;
|
m_wants_resume = false;
|
||||||
|
m_reconnecting = true;
|
||||||
|
|
||||||
m_heartbeat_waiter.kill();
|
m_heartbeat_waiter.kill();
|
||||||
if (m_heartbeat_thread.joinable()) m_heartbeat_thread.join();
|
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);
|
printf("got socket close code: %d\n", code);
|
||||||
auto close_code = static_cast<GatewayCloseCode>(code);
|
auto close_code = static_cast<GatewayCloseCode>(code);
|
||||||
auto cb = [this, close_code]() {
|
auto cb = [this, close_code]() {
|
||||||
inflateEnd(&m_zstream);
|
|
||||||
m_compressed_buf.clear();
|
|
||||||
|
|
||||||
m_heartbeat_waiter.kill();
|
m_heartbeat_waiter.kill();
|
||||||
if (m_heartbeat_thread.joinable()) m_heartbeat_thread.join();
|
if (m_heartbeat_thread.joinable()) m_heartbeat_thread.join();
|
||||||
m_client_connected = false;
|
m_client_connected = false;
|
||||||
@@ -1691,9 +1693,7 @@ void DiscordClient::HandleSocketClose(uint16_t code) {
|
|||||||
m_chan_to_message_map.clear();
|
m_chan_to_message_map.clear();
|
||||||
m_guild_to_users.clear();
|
m_guild_to_users.clear();
|
||||||
|
|
||||||
m_websocket.Stop();
|
m_signal_disconnected.emit(m_reconnecting, close_code);
|
||||||
|
|
||||||
m_signal_disconnected.emit(false, close_code);
|
|
||||||
};
|
};
|
||||||
m_generic_mutex.lock();
|
m_generic_mutex.lock();
|
||||||
m_generic_queue.push(cb);
|
m_generic_queue.push(cb);
|
||||||
|
|||||||
@@ -268,7 +268,8 @@ private:
|
|||||||
HeartbeatWaiter m_heartbeat_waiter;
|
HeartbeatWaiter m_heartbeat_waiter;
|
||||||
std::atomic<bool> m_heartbeat_acked = true;
|
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;
|
std::string m_session_id;
|
||||||
|
|
||||||
mutable std::mutex m_msg_mutex;
|
mutable std::mutex m_msg_mutex;
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ void Websocket::SetUserAgent(std::string agent) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Websocket::Stop() {
|
void Websocket::Stop() {
|
||||||
m_websocket.stop();
|
Stop(ix::WebSocketCloseConstants::kNormalClosureCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Websocket::Stop(uint16_t code) {
|
void Websocket::Stop(uint16_t code) {
|
||||||
|
|||||||
Reference in New Issue
Block a user