mirror of
https://github.com/uowuo/abaddon.git
synced 2024-09-20 06:51:51 +00:00
fix handling of reconnect messages
This commit is contained in:
parent
3c7c40edcd
commit
0aaebf9ea7
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) {
|
||||
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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user