From fa87adb4a3acdd04b6740a97f06ba463f3408231 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Sat, 10 Jul 2021 02:23:34 -0400 Subject: improve handling of socket close (#31) --- discord/discord.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'discord/discord.cpp') diff --git a/discord/discord.cpp b/discord/discord.cpp index 78036ad..cdee337 100644 --- a/discord/discord.cpp +++ b/discord/discord.cpp @@ -44,6 +44,7 @@ void DiscordClient::Stop() { m_heartbeat_waiter.kill(); if (m_heartbeat_thread.joinable()) m_heartbeat_thread.join(); m_client_connected = false; + m_reconnecting = false; m_store.ClearAll(); m_guild_to_users.clear(); @@ -1682,7 +1683,7 @@ void DiscordClient::HandleGatewayInvalidSession(const GatewayMessage &msg) { m_websocket.Stop(1000); - m_websocket.StartConnection(GetGatewayURL()); + Glib::signal_timeout().connect_once([this] { m_websocket.StartConnection(GetGatewayURL()); }, 1000); } bool IsCompleteMessageObject(const nlohmann::json &j) { @@ -1886,6 +1887,11 @@ void DiscordClient::HandleSocketClose(uint16_t code) { m_store.ClearAll(); m_guild_to_users.clear(); + if (!m_reconnecting && close_code != GatewayCloseCode::Normal) { + Glib::signal_timeout().connect_once([this] { HandleGatewayReconnect(GatewayMessage()); }, 1000); + m_reconnecting = true; + } + m_signal_disconnected.emit(m_reconnecting, close_code); }; m_generic_mutex.lock(); -- cgit v1.2.3 From ca3eacbd790a7e50a7fe5070e975c10255a1e174 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Sat, 10 Jul 2021 03:11:59 -0400 Subject: dont use unordered collections (reduce memory a bit) --- discord/discord.cpp | 14 +++++++------- discord/discord.hpp | 23 +++++++++++------------ 2 files changed, 18 insertions(+), 19 deletions(-) (limited to 'discord/discord.cpp') diff --git a/discord/discord.cpp b/discord/discord.cpp index cdee337..ffab9b6 100644 --- a/discord/discord.cpp +++ b/discord/discord.cpp @@ -234,19 +234,19 @@ std::optional DiscordClient::GetMemberHighestRole(Snowflake guild_id, }); } -std::unordered_set DiscordClient::GetUsersInGuild(Snowflake id) const { +std::set DiscordClient::GetUsersInGuild(Snowflake id) const { auto it = m_guild_to_users.find(id); if (it != m_guild_to_users.end()) return it->second; - return std::unordered_set(); + return {}; } -std::unordered_set DiscordClient::GetChannelsInGuild(Snowflake id) const { +std::set DiscordClient::GetChannelsInGuild(Snowflake id) const { auto it = m_guild_to_channels.find(id); if (it != m_guild_to_channels.end()) return it->second; - return std::unordered_set(); + return {}; } bool DiscordClient::HasGuildPermission(Snowflake user_id, Snowflake guild_id, Permission perm) const { @@ -954,12 +954,12 @@ PresenceStatus DiscordClient::GetUserStatus(Snowflake id) const { return PresenceStatus::Offline; } -std::unordered_map DiscordClient::GetRelationships() const { +std::map DiscordClient::GetRelationships() const { return m_user_relationships; } -std::unordered_set DiscordClient::GetRelationships(RelationshipType type) const { - std::unordered_set ret; +std::set DiscordClient::GetRelationships(RelationshipType type) const { + std::set ret; for (const auto &[id, rtype] : m_user_relationships) if (rtype == type) ret.insert(id); diff --git a/discord/discord.hpp b/discord/discord.hpp index cfce016..6138ea3 100644 --- a/discord/discord.hpp +++ b/discord/discord.hpp @@ -6,9 +6,8 @@ #include #include #include -#include +#include #include -#include #include #include #include @@ -85,8 +84,8 @@ public: std::optional GetBan(Snowflake guild_id, Snowflake user_id) const; Snowflake GetMemberHoistedRole(Snowflake guild_id, Snowflake user_id, bool with_color = false) const; std::optional GetMemberHighestRole(Snowflake guild_id, Snowflake user_id) const; - std::unordered_set GetUsersInGuild(Snowflake id) const; - std::unordered_set GetChannelsInGuild(Snowflake id) const; + std::set GetUsersInGuild(Snowflake id) const; + std::set GetChannelsInGuild(Snowflake id) const; bool HasGuildPermission(Snowflake user_id, Snowflake guild_id, Permission perm) const; @@ -184,8 +183,8 @@ public: PresenceStatus GetUserStatus(Snowflake id) const; - std::unordered_map GetRelationships() const; - std::unordered_set GetRelationships(RelationshipType type) const; + std::map GetRelationships() const; + std::set GetRelationships(RelationshipType type) const; std::optional GetRelationship(Snowflake id) const; private: @@ -255,14 +254,14 @@ private: std::string m_token; void AddUserToGuild(Snowflake user_id, Snowflake guild_id); - std::unordered_map> m_guild_to_users; + std::map> m_guild_to_users; - std::unordered_map> m_guild_to_channels; - std::unordered_map m_guild_join_requests; + std::map> m_guild_to_channels; + std::map m_guild_join_requests; - std::unordered_map m_user_to_status; + std::map m_user_to_status; - std::unordered_map m_user_relationships; + std::map m_user_relationships; UserData m_user_data; UserSettings m_user_settings; @@ -273,7 +272,7 @@ private: std::atomic m_client_connected = false; std::atomic m_ready_received = false; - std::unordered_map m_event_map; + std::map m_event_map; void LoadEventMap(); std::thread m_heartbeat_thread; -- cgit v1.2.3 From b2b55eb06ead0b118607ef55d38343d6a1fcef29 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Sat, 10 Jul 2021 03:42:14 -0400 Subject: disconnect action should interrupt reconnect --- discord/discord.cpp | 12 ++++++++---- discord/discord.hpp | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) (limited to 'discord/discord.cpp') diff --git a/discord/discord.cpp b/discord/discord.cpp index ffab9b6..52dfab9 100644 --- a/discord/discord.cpp +++ b/discord/discord.cpp @@ -32,10 +32,13 @@ void DiscordClient::Start() { m_last_sequence = -1; m_heartbeat_acked = true; m_client_connected = true; + m_client_started = true; m_websocket.StartConnection(GetGatewayURL()); } void DiscordClient::Stop() { + m_client_started = false; + if (!m_client_connected) return; inflateEnd(&m_zstream); @@ -53,7 +56,7 @@ void DiscordClient::Stop() { } bool DiscordClient::IsStarted() const { - return m_client_connected; + return m_client_started; } bool DiscordClient::IsStoreValid() const { @@ -1683,7 +1686,8 @@ void DiscordClient::HandleGatewayInvalidSession(const GatewayMessage &msg) { m_websocket.Stop(1000); - Glib::signal_timeout().connect_once([this] { m_websocket.StartConnection(GetGatewayURL()); }, 1000); + if (m_client_started) + Glib::signal_timeout().connect_once([this] { if (m_client_started) m_websocket.StartConnection(GetGatewayURL()); }, 1000); } bool IsCompleteMessageObject(const nlohmann::json &j) { @@ -1887,8 +1891,8 @@ void DiscordClient::HandleSocketClose(uint16_t code) { m_store.ClearAll(); m_guild_to_users.clear(); - if (!m_reconnecting && close_code != GatewayCloseCode::Normal) { - Glib::signal_timeout().connect_once([this] { HandleGatewayReconnect(GatewayMessage()); }, 1000); + if (m_client_started && !m_reconnecting && close_code != GatewayCloseCode::Normal) { + Glib::signal_timeout().connect_once([this] { if (m_client_started) HandleGatewayReconnect(GatewayMessage()); }, 1000); m_reconnecting = true; } diff --git a/discord/discord.hpp b/discord/discord.hpp index 6138ea3..918b1cb 100644 --- a/discord/discord.hpp +++ b/discord/discord.hpp @@ -271,6 +271,7 @@ private: Websocket m_websocket; std::atomic m_client_connected = false; std::atomic m_ready_received = false; + bool m_client_started = false; std::map m_event_map; void LoadEventMap(); -- cgit v1.2.3 From 41bd2334faa2569aa8826dcb1ddfe42c4c6d4118 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Sat, 10 Jul 2021 03:43:26 -0400 Subject: restrict auto-reconnect to abnormal close code --- discord/discord.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'discord/discord.cpp') diff --git a/discord/discord.cpp b/discord/discord.cpp index 52dfab9..9e620e3 100644 --- a/discord/discord.cpp +++ b/discord/discord.cpp @@ -1891,7 +1891,7 @@ void DiscordClient::HandleSocketClose(uint16_t code) { m_store.ClearAll(); m_guild_to_users.clear(); - if (m_client_started && !m_reconnecting && close_code != GatewayCloseCode::Normal) { + if (m_client_started && !m_reconnecting && close_code == GatewayCloseCode::Abnormal) { Glib::signal_timeout().connect_once([this] { if (m_client_started) HandleGatewayReconnect(GatewayMessage()); }, 1000); m_reconnecting = true; } -- cgit v1.2.3 From f5e78c899a21835dd6673286acd1fa790884ee19 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Sun, 11 Jul 2021 01:27:47 -0400 Subject: more reliable menu sensitivty/actions --- abaddon.cpp | 3 +-- discord/discord.cpp | 26 ++++++++++++++------------ windows/mainwindow.cpp | 16 +++++++++------- 3 files changed, 24 insertions(+), 21 deletions(-) (limited to 'discord/discord.cpp') diff --git a/abaddon.cpp b/abaddon.cpp index a34ec2c..99a2520 100644 --- a/abaddon.cpp +++ b/abaddon.cpp @@ -432,8 +432,7 @@ void Abaddon::ActionConnect() { } void Abaddon::ActionDisconnect() { - if (m_discord.IsStarted()) - StopDiscord(); + StopDiscord(); } void Abaddon::ActionSetToken() { diff --git a/discord/discord.cpp b/discord/discord.cpp index 9e620e3..fab2c49 100644 --- a/discord/discord.cpp +++ b/discord/discord.cpp @@ -24,6 +24,8 @@ DiscordClient::DiscordClient(bool mem_store) } void DiscordClient::Start() { + if (m_client_started) return; + m_http.SetBase(GetAPIURL()); std::memset(&m_zstream, 0, sizeof(m_zstream)); @@ -37,22 +39,22 @@ void DiscordClient::Start() { } void DiscordClient::Stop() { - m_client_started = false; + if (m_client_started) { + inflateEnd(&m_zstream); + m_compressed_buf.clear(); - if (!m_client_connected) return; - - inflateEnd(&m_zstream); - m_compressed_buf.clear(); + m_heartbeat_waiter.kill(); + if (m_heartbeat_thread.joinable()) m_heartbeat_thread.join(); + m_client_connected = false; + m_reconnecting = false; - m_heartbeat_waiter.kill(); - if (m_heartbeat_thread.joinable()) m_heartbeat_thread.join(); - m_client_connected = false; - m_reconnecting = false; + m_store.ClearAll(); + m_guild_to_users.clear(); - m_store.ClearAll(); - m_guild_to_users.clear(); + m_websocket.Stop(); + } - m_websocket.Stop(); + m_client_started = false; } bool DiscordClient::IsStarted() const { diff --git a/windows/mainwindow.cpp b/windows/mainwindow.cpp index 35846b7..2eb669e 100644 --- a/windows/mainwindow.cpp +++ b/windows/mainwindow.cpp @@ -149,13 +149,6 @@ MainWindow::MainWindow() void MainWindow::UpdateComponents() { bool discord_active = Abaddon::Get().IsDiscordActive(); - std::string token = Abaddon::Get().GetDiscordToken(); - m_menu_discord_connect.set_sensitive(token.size() > 0 && !discord_active); - m_menu_discord_disconnect.set_sensitive(discord_active); - m_menu_discord_join_guild.set_sensitive(discord_active); - m_menu_discord_set_token.set_sensitive(!discord_active); - m_menu_discord_set_status.set_sensitive(discord_active); - if (!discord_active) { m_chat.Clear(); m_members.Clear(); @@ -259,6 +252,15 @@ void MainWindow::OnDiscordSubmenuPopup(const Gdk::Rectangle *flipped_rect, const m_menu_discord_add_recipient.set_visible(false); if (channel.has_value() && channel->GetDMRecipients().size() + 1 < 10) m_menu_discord_add_recipient.set_visible(channel->Type == ChannelType::GROUP_DM); + + const bool discord_active = Abaddon::Get().GetDiscordClient().IsStarted(); + + std::string token = Abaddon::Get().GetDiscordToken(); + m_menu_discord_connect.set_sensitive(token.size() > 0 && !discord_active); + m_menu_discord_disconnect.set_sensitive(discord_active); + m_menu_discord_join_guild.set_sensitive(discord_active); + m_menu_discord_set_token.set_sensitive(!discord_active); + m_menu_discord_set_status.set_sensitive(discord_active); } void MainWindow::OnViewSubmenuPopup(const Gdk::Rectangle *flipped_rect, const Gdk::Rectangle *final_rect, bool flipped_x, bool flipped_y) { -- cgit v1.2.3