diff options
author | ouwou <26526779+ouwou@users.noreply.github.com> | 2021-08-05 04:02:47 -0400 |
---|---|---|
committer | ouwou <26526779+ouwou@users.noreply.github.com> | 2021-08-05 04:02:47 -0400 |
commit | 856674506c064ba94396752664aede5167c3ec4b (patch) | |
tree | 6606a051d2ff0985133c360f3b2cc3221db94805 /discord | |
parent | 41a63df1b108a9520a8dfcb862f108b42f9a1bb1 (diff) | |
download | abaddon-portaudio-856674506c064ba94396752664aede5167c3ec4b.tar.gz abaddon-portaudio-856674506c064ba94396752664aede5167c3ec4b.zip |
better join/leave thread logic
Diffstat (limited to 'discord')
-rw-r--r-- | discord/channel.cpp | 2 | ||||
-rw-r--r-- | discord/discord.cpp | 23 | ||||
-rw-r--r-- | discord/discord.hpp | 15 |
3 files changed, 34 insertions, 6 deletions
diff --git a/discord/channel.cpp b/discord/channel.cpp index f78e0cd..60f481b 100644 --- a/discord/channel.cpp +++ b/discord/channel.cpp @@ -10,7 +10,7 @@ void from_json(const nlohmann::json &j, ThreadMetadataData &m) { void from_json(const nlohmann::json &j, ThreadMemberObject &m) { JS_O("id", m.ThreadID); - JS_O("user_id", m.ThreadID); + JS_O("user_id", m.UserID); JS_D("join_timestamp", m.JoinTimestamp); JS_D("flags", m.Flags); } diff --git a/discord/discord.cpp b/discord/discord.cpp index 5a7c07e..aa363f5 100644 --- a/discord/discord.cpp +++ b/discord/discord.cpp @@ -1254,7 +1254,7 @@ void DiscordClient::ProcessNewGuild(GuildData &guild) { if (guild.Threads.has_value()) { for (auto &c : *guild.Threads) { - m_joined_threads.push_back(c.ID); + m_joined_threads.insert(c.ID); c.GuildID = guild.ID; m_store.SetChannel(c.ID, c); } @@ -1670,10 +1670,10 @@ void DiscordClient::HandleGatewayRelationshipAdd(const GatewayMessage &msg) { // remarkably this doesnt actually mean a thread was created // it can also mean you gained access to a thread. yay ... +// except sometimes it doesnt??? i dont know whats going on void DiscordClient::HandleGatewayThreadCreate(const GatewayMessage &msg) { ThreadCreateData data = msg.Data; m_store.SetChannel(data.Channel.ID, data.Channel); - m_joined_threads.push_back(data.Channel.ID); m_signal_thread_create.emit(data.Channel); } @@ -1695,6 +1695,17 @@ void DiscordClient::HandleGatewayThreadListSync(const GatewayMessage &msg) { void DiscordClient::HandleGatewayThreadMembersUpdate(const GatewayMessage &msg) { ThreadMembersUpdateData data = msg.Data; + if (data.AddedMembers.has_value() && + std::find_if(data.AddedMembers->begin(), data.AddedMembers->end(), [this](const auto &x) { + return *x.UserID == m_user_data.ID; // safe to assume UserID is present here + }) != data.AddedMembers->end()) { + m_joined_threads.insert(data.ID); + m_signal_added_to_thread.emit(data.ID); + } else if (data.RemovedMemberIDs.has_value() && + std::find(data.RemovedMemberIDs->begin(), data.RemovedMemberIDs->end(), m_user_data.ID) != data.RemovedMemberIDs->end()) { + m_joined_threads.erase(data.ID); + m_signal_removed_from_thread.emit(data.ID); + } m_signal_thread_members_update.emit(data); } @@ -2218,6 +2229,14 @@ DiscordClient::type_signal_thread_members_update DiscordClient::signal_thread_me return m_signal_thread_members_update; } +DiscordClient::type_signal_added_to_thread DiscordClient::signal_added_to_thread() { + return m_signal_added_to_thread; +} + +DiscordClient::type_signal_removed_from_thread DiscordClient::signal_removed_from_thread() { + return m_signal_removed_from_thread; +} + DiscordClient::type_signal_message_sent DiscordClient::signal_message_sent() { return m_signal_message_sent; } diff --git a/discord/discord.hpp b/discord/discord.hpp index a589702..11b8cbd 100644 --- a/discord/discord.hpp +++ b/discord/discord.hpp @@ -266,7 +266,7 @@ private: std::map<Snowflake, GuildApplicationData> m_guild_join_requests; std::map<Snowflake, PresenceStatus> m_user_to_status; std::map<Snowflake, RelationshipType> m_user_relationships; - std::vector<Snowflake> m_joined_threads; + std::set<Snowflake> m_joined_threads; UserData m_user_data; UserSettings m_user_settings; @@ -338,9 +338,14 @@ public: typedef sigc::signal<void, ThreadDeleteData> type_signal_thread_delete; typedef sigc::signal<void, ThreadListSyncData> type_signal_thread_list_sync; typedef sigc::signal<void, ThreadMembersUpdateData> type_signal_thread_members_update; - typedef sigc::signal<void, Message> type_signal_message_unpinned; // not a real event - typedef sigc::signal<void, Message> type_signal_message_pinned; // not a real event either + + // not discord dispatch events + typedef sigc::signal<void, Snowflake> type_signal_added_to_thread; + typedef sigc::signal<void, Snowflake> type_signal_removed_from_thread; + typedef sigc::signal<void, Message> type_signal_message_unpinned; + typedef sigc::signal<void, Message> type_signal_message_pinned; typedef sigc::signal<void, Message> type_signal_message_sent; + typedef sigc::signal<void, std::string /* nonce */, float /* retry_after */> type_signal_message_send_fail; // retry after param will be 0 if it failed for a reason that isnt slowmode typedef sigc::signal<void, bool, GatewayCloseCode> type_signal_disconnected; // bool true if reconnecting typedef sigc::signal<void> type_signal_connected; @@ -381,6 +386,8 @@ public: type_signal_thread_delete signal_thread_delete(); type_signal_thread_list_sync signal_thread_list_sync(); type_signal_thread_members_update signal_thread_members_update(); + type_signal_added_to_thread signal_added_to_thread(); + type_signal_removed_from_thread signal_removed_from_thread(); type_signal_message_sent signal_message_sent(); type_signal_message_send_fail signal_message_send_fail(); type_signal_disconnected signal_disconnected(); @@ -423,6 +430,8 @@ protected: type_signal_thread_delete m_signal_thread_delete; type_signal_thread_list_sync m_signal_thread_list_sync; type_signal_thread_members_update m_signal_thread_members_update; + type_signal_removed_from_thread m_signal_removed_from_thread; + type_signal_added_to_thread m_signal_added_to_thread; type_signal_message_sent m_signal_message_sent; type_signal_message_send_fail m_signal_message_send_fail; type_signal_disconnected m_signal_disconnected; |