summaryrefslogtreecommitdiff
path: root/discord
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2021-08-05 04:02:47 -0400
committerouwou <26526779+ouwou@users.noreply.github.com>2021-08-05 04:02:47 -0400
commit856674506c064ba94396752664aede5167c3ec4b (patch)
tree6606a051d2ff0985133c360f3b2cc3221db94805 /discord
parent41a63df1b108a9520a8dfcb862f108b42f9a1bb1 (diff)
downloadabaddon-portaudio-856674506c064ba94396752664aede5167c3ec4b.tar.gz
abaddon-portaudio-856674506c064ba94396752664aede5167c3ec4b.zip
better join/leave thread logic
Diffstat (limited to 'discord')
-rw-r--r--discord/channel.cpp2
-rw-r--r--discord/discord.cpp23
-rw-r--r--discord/discord.hpp15
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;