diff options
author | ouwou <26526779+ouwou@users.noreply.github.com> | 2021-07-28 03:34:36 -0400 |
---|---|---|
committer | ouwou <26526779+ouwou@users.noreply.github.com> | 2021-07-28 03:34:36 -0400 |
commit | 014e176e0a7cf457a03278dbdf8495400981b8b2 (patch) | |
tree | af04057a3ed6ca7da1f646a8b7a6440425ec5d94 | |
parent | 9d2d13a3898f05f9e8189f99087198726d476e1b (diff) | |
download | abaddon-portaudio-014e176e0a7cf457a03278dbdf8495400981b8b2.tar.gz abaddon-portaudio-014e176e0a7cf457a03278dbdf8495400981b8b2.zip |
handle THREAD_CREATE
also fix compilation
also change channel_create signal to emit ChannelData
-rw-r--r-- | components/channels.cpp | 56 | ||||
-rw-r--r-- | components/channels.hpp | 4 | ||||
-rw-r--r-- | discord/channel.cpp | 10 | ||||
-rw-r--r-- | discord/channel.hpp | 18 | ||||
-rw-r--r-- | discord/discord.cpp | 18 | ||||
-rw-r--r-- | discord/discord.hpp | 6 | ||||
-rw-r--r-- | discord/objects.cpp | 4 | ||||
-rw-r--r-- | discord/objects.hpp | 12 |
8 files changed, 99 insertions, 29 deletions
diff --git a/components/channels.cpp b/components/channels.cpp index 956fee1..a80cfd8 100644 --- a/components/channels.cpp +++ b/components/channels.cpp @@ -128,6 +128,7 @@ ChannelList::ChannelList() discord.signal_channel_delete().connect(sigc::mem_fun(*this, &ChannelList::UpdateRemoveChannel)); discord.signal_channel_update().connect(sigc::mem_fun(*this, &ChannelList::UpdateChannel)); discord.signal_channel_create().connect(sigc::mem_fun(*this, &ChannelList::UpdateCreateChannel)); + discord.signal_thread_create().connect(sigc::mem_fun(*this, &ChannelList::UpdateCreateThread)); discord.signal_guild_update().connect(sigc::mem_fun(*this, &ChannelList::UpdateGuild)); } @@ -211,32 +212,31 @@ void ChannelList::UpdateChannel(Snowflake id) { channel_row[m_columns.m_sort] = *channel->Position; } -void ChannelList::UpdateCreateChannel(Snowflake id) { - const auto channel = Abaddon::Get().GetDiscordClient().GetChannel(id); - if (!channel.has_value()) return; - if (channel->Type == ChannelType::GUILD_CATEGORY) return (void)UpdateCreateChannelCategory(*channel); - if (channel->Type == ChannelType::DM || channel->Type == ChannelType::GROUP_DM) return UpdateCreateDMChannel(*channel); - if (channel->Type != ChannelType::GUILD_TEXT && channel->Type != ChannelType::GUILD_NEWS) return; +void ChannelList::UpdateCreateChannel(const ChannelData &channel) { + ; + if (channel.Type == ChannelType::GUILD_CATEGORY) return (void)UpdateCreateChannelCategory(channel); + if (channel.Type == ChannelType::DM || channel.Type == ChannelType::GROUP_DM) return UpdateCreateDMChannel(channel); + if (channel.Type != ChannelType::GUILD_TEXT && channel.Type != ChannelType::GUILD_NEWS) return; Gtk::TreeRow channel_row; bool orphan; - if (channel->ParentID.has_value()) { + if (channel.ParentID.has_value()) { orphan = false; - auto iter = GetIteratorForChannelFromID(*channel->ParentID); + auto iter = GetIteratorForChannelFromID(*channel.ParentID); channel_row = *m_model->append(iter->children()); } else { orphan = true; - auto iter = GetIteratorForGuildFromID(*channel->GuildID); + auto iter = GetIteratorForGuildFromID(*channel.GuildID); channel_row = *m_model->append(iter->children()); } channel_row[m_columns.m_type] = RenderType::TextChannel; - channel_row[m_columns.m_id] = channel->ID; - channel_row[m_columns.m_name] = "#" + Glib::Markup::escape_text(*channel->Name); - channel_row[m_columns.m_nsfw] = channel->NSFW(); + channel_row[m_columns.m_id] = channel.ID; + channel_row[m_columns.m_name] = "#" + Glib::Markup::escape_text(*channel.Name); + channel_row[m_columns.m_nsfw] = channel.NSFW(); if (orphan) - channel_row[m_columns.m_sort] = *channel->Position + OrphanChannelSortOffset; + channel_row[m_columns.m_sort] = *channel.Position + OrphanChannelSortOffset; else - channel_row[m_columns.m_sort] = *channel->Position; + channel_row[m_columns.m_sort] = *channel.Position; } void ChannelList::UpdateGuild(Snowflake id) { @@ -265,6 +265,12 @@ void ChannelList::UpdateGuild(Snowflake id) { } } +void ChannelList::UpdateCreateThread(const ChannelData &channel) { + auto parent_row = GetIteratorForChannelFromID(*channel.ParentID); + if (parent_row) + CreateThreadRow(parent_row->children(), channel); +} + void ChannelList::SetActiveChannel(Snowflake id) { const auto channel_iter = GetIteratorForChannelFromID(id); if (channel_iter) { @@ -330,14 +336,8 @@ Gtk::TreeModel::iterator ChannelList::AddGuild(const GuildData &guild) { const auto it = threads.find(channel.ID); if (it == threads.end()) return; - for (const auto &thread : it->second) { - auto thread_row = *m_model->append(row.children()); - thread_row[m_columns.m_type] = RenderType::Thread; - thread_row[m_columns.m_id] = thread.ID; - thread_row[m_columns.m_name] = "- " + Glib::Markup::escape_text(*thread.Name); - thread_row[m_columns.m_sort] = thread.ID; - thread_row[m_columns.m_nsfw] = false; - } + for (const auto &thread : it->second) + CreateThreadRow(row.children(), thread); }; for (const auto &channel : orphan_channels) { @@ -389,6 +389,18 @@ Gtk::TreeModel::iterator ChannelList::UpdateCreateChannelCategory(const ChannelD return cat_row; } +Gtk::TreeModel::iterator ChannelList::CreateThreadRow(const Gtk::TreeNodeChildren &children, const ChannelData &channel) { + auto thread_iter = m_model->append(children); + auto thread_row = *thread_iter; + thread_row[m_columns.m_type] = RenderType::Thread; + thread_row[m_columns.m_id] = channel.ID; + thread_row[m_columns.m_name] = "- " + Glib::Markup::escape_text(*channel.Name); + thread_row[m_columns.m_sort] = channel.ID; + thread_row[m_columns.m_nsfw] = false; + + return thread_iter; +} + void ChannelList::UpdateChannelCategory(const ChannelData &channel) { auto iter = GetIteratorForChannelFromID(channel.ID); if (!iter) return; diff --git a/components/channels.hpp b/components/channels.hpp index 3b81cab..bdc3e84 100644 --- a/components/channels.hpp +++ b/components/channels.hpp @@ -139,7 +139,8 @@ protected: void UpdateRemoveGuild(Snowflake id); void UpdateRemoveChannel(Snowflake id); void UpdateChannel(Snowflake id); - void UpdateCreateChannel(Snowflake id); + void UpdateCreateChannel(const ChannelData &channel); + void UpdateCreateThread(const ChannelData &channel); void UpdateGuild(Snowflake id); Gtk::TreeView m_view; @@ -168,6 +169,7 @@ protected: Gtk::TreeModel::iterator AddGuild(const GuildData &guild); Gtk::TreeModel::iterator UpdateCreateChannelCategory(const ChannelData &channel); + Gtk::TreeModel::iterator CreateThreadRow(const Gtk::TreeNodeChildren &children, const ChannelData &channel); void UpdateChannelCategory(const ChannelData &channel); diff --git a/discord/channel.cpp b/discord/channel.cpp index e5dfb06..685cc72 100644 --- a/discord/channel.cpp +++ b/discord/channel.cpp @@ -1,13 +1,20 @@ #include "../abaddon.hpp" #include "channel.hpp" -void from_json(const nlohmann::json &j, ThreadMetadata &m) { +void from_json(const nlohmann::json &j, ThreadMetadataData &m) { JS_D("archived", m.IsArchived); JS_D("auto_archive_duration", m.AutoArchiveDuration); JS_D("archive_timestamp", m.ArchiveTimestamp); JS_O("locked", m.IsLocked); } +void from_json(const nlohmann::json &j, ThreadMemberObject &m) { + JS_O("id", m.ThreadID); + JS_O("user_id", m.ThreadID); + JS_D("join_timestamp", m.JoinTimestamp); + JS_D("flags", m.Flags); +} + void from_json(const nlohmann::json &j, ChannelData &m) { JS_D("id", m.ID); JS_D("type", m.Type); @@ -29,6 +36,7 @@ void from_json(const nlohmann::json &j, ChannelData &m) { JS_ON("parent_id", m.ParentID); JS_ON("last_pin_timestamp", m.LastPinTimestamp); JS_O("thread_metadata", m.ThreadMetadata); + JS_O("member", m.ThreadMember); } void ChannelData::update_from_json(const nlohmann::json &j) { diff --git a/discord/channel.hpp b/discord/channel.hpp index d262ddf..606686d 100644 --- a/discord/channel.hpp +++ b/discord/channel.hpp @@ -38,13 +38,24 @@ constexpr const char *GetStagePrivacyDisplayString(StagePrivacy e) { } } -struct ThreadMetadata { +// should be moved somewhere? + +struct ThreadMetadataData { bool IsArchived; int AutoArchiveDuration; std::string ArchiveTimestamp; std::optional<bool> IsLocked; - friend void from_json(const nlohmann::json &j, ThreadMetadata &m); + friend void from_json(const nlohmann::json &j, ThreadMetadataData &m); +}; + +struct ThreadMemberObject { + std::optional<Snowflake> ThreadID; + std::optional<Snowflake> UserID; + std::string JoinTimestamp; + int Flags; + + friend void from_json(const nlohmann::json &j, ThreadMemberObject &m); }; struct ChannelData { @@ -67,7 +78,8 @@ struct ChannelData { std::optional<Snowflake> ApplicationID; std::optional<Snowflake> ParentID; // null std::optional<std::string> LastPinTimestamp; // null - std::optional<ThreadMetadata> ThreadMetadata; + std::optional<ThreadMetadataData> ThreadMetadata; + std::optional<ThreadMemberObject> ThreadMember; friend void from_json(const nlohmann::json &j, ChannelData &m); void update_from_json(const nlohmann::json &j); diff --git a/discord/discord.cpp b/discord/discord.cpp index 2c0c7d7..18b4212 100644 --- a/discord/discord.cpp +++ b/discord/discord.cpp @@ -1155,6 +1155,9 @@ void DiscordClient::HandleGatewayMessage(std::string str) { case GatewayEvent::RELATIONSHIP_ADD: { HandleGatewayRelationshipAdd(m); } break; + case GatewayEvent::THREAD_CREATE: { + HandleGatewayThreadCreate(m); + } break; } } break; default: @@ -1381,7 +1384,7 @@ void DiscordClient::HandleGatewayChannelCreate(const GatewayMessage &msg) { for (const auto &p : *data.PermissionOverwrites) m_store.SetPermissionOverwrite(data.ID, p.ID, p); m_store.EndTransaction(); - m_signal_channel_create.emit(data.ID); + m_signal_channel_create.emit(data); } void DiscordClient::HandleGatewayGuildUpdate(const GatewayMessage &msg) { @@ -1635,6 +1638,14 @@ void DiscordClient::HandleGatewayRelationshipAdd(const GatewayMessage &msg) { m_signal_relationship_add.emit(std::move(data)); } +void DiscordClient::HandleGatewayThreadCreate(const GatewayMessage &msg) { + ThreadCreateData data = msg.Data; + + m_store.SetChannel(data.Channel.ID, data.Channel); + + m_signal_thread_create.emit(data.Channel); +} + void DiscordClient::HandleGatewayReadySupplemental(const GatewayMessage &msg) { ReadySupplementalData data = msg.Data; for (const auto &p : data.MergedPresences.Friends) { @@ -1997,6 +2008,7 @@ void DiscordClient::LoadEventMap() { m_event_map["GUILD_JOIN_REQUEST_DELETE"] = GatewayEvent::GUILD_JOIN_REQUEST_DELETE; m_event_map["RELATIONSHIP_REMOVE"] = GatewayEvent::RELATIONSHIP_REMOVE; m_event_map["RELATIONSHIP_ADD"] = GatewayEvent::RELATIONSHIP_ADD; + m_event_map["THREAD_CREATE"] = GatewayEvent::THREAD_CREATE; } DiscordClient::type_signal_gateway_ready DiscordClient::signal_gateway_ready() { @@ -2135,6 +2147,10 @@ DiscordClient::type_signal_message_pinned DiscordClient::signal_message_pinned() return m_signal_message_pinned; } +DiscordClient::type_signal_thread_create DiscordClient::signal_thread_create() { + return m_signal_thread_create; +} + 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 918b1cb..93825af 100644 --- a/discord/discord.hpp +++ b/discord/discord.hpp @@ -236,6 +236,7 @@ private: void HandleGatewayGuildJoinRequestDelete(const GatewayMessage &msg); void HandleGatewayRelationshipRemove(const GatewayMessage &msg); void HandleGatewayRelationshipAdd(const GatewayMessage &msg); + void HandleGatewayThreadCreate(const GatewayMessage &msg); void HandleGatewayReadySupplemental(const GatewayMessage &msg); void HandleGatewayReconnect(const GatewayMessage &msg); void HandleGatewayInvalidSession(const GatewayMessage &msg); @@ -308,7 +309,7 @@ public: typedef sigc::signal<void, Snowflake> type_signal_guild_delete; typedef sigc::signal<void, Snowflake> type_signal_channel_delete; typedef sigc::signal<void, Snowflake> type_signal_channel_update; - typedef sigc::signal<void, Snowflake> type_signal_channel_create; + typedef sigc::signal<void, ChannelData> type_signal_channel_create; typedef sigc::signal<void, Snowflake> type_signal_guild_update; typedef sigc::signal<void, Snowflake, Snowflake> type_signal_role_update; // guild id, role id typedef sigc::signal<void, Snowflake, Snowflake> type_signal_role_create; // guild id, role id @@ -329,6 +330,7 @@ public: typedef sigc::signal<void, GuildJoinRequestDeleteData> type_signal_guild_join_request_delete; typedef sigc::signal<void, Snowflake, RelationshipType> type_signal_relationship_remove; typedef sigc::signal<void, RelationshipAddData> type_signal_relationship_add; + typedef sigc::signal<void, ChannelData> type_signal_thread_create; 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 typedef sigc::signal<void, Message> type_signal_message_sent; @@ -368,6 +370,7 @@ public: type_signal_relationship_add signal_relationship_add(); type_signal_message_unpinned signal_message_unpinned(); type_signal_message_pinned signal_message_pinned(); + type_signal_thread_create signal_thread_create(); type_signal_message_sent signal_message_sent(); type_signal_message_send_fail signal_message_send_fail(); type_signal_disconnected signal_disconnected(); @@ -406,6 +409,7 @@ protected: type_signal_relationship_add m_signal_relationship_add; type_signal_message_unpinned m_signal_message_unpinned; type_signal_message_pinned m_signal_message_pinned; + type_signal_thread_create m_signal_thread_create; type_signal_message_sent m_signal_message_sent; type_signal_message_send_fail m_signal_message_send_fail; type_signal_disconnected m_signal_disconnected; diff --git a/discord/objects.cpp b/discord/objects.cpp index 8588b30..c4b1517 100644 --- a/discord/objects.cpp +++ b/discord/objects.cpp @@ -472,3 +472,7 @@ void to_json(nlohmann::json &j, const FriendRequestObject &m) { void to_json(nlohmann::json &j, const PutRelationshipObject &m) { JS_IF("type", m.Type); } + +void from_json(const nlohmann::json &j, ThreadCreateData &m) { + j.get_to(m.Channel); +} diff --git a/discord/objects.hpp b/discord/objects.hpp index 11c8df4..7c249cd 100644 --- a/discord/objects.hpp +++ b/discord/objects.hpp @@ -71,6 +71,12 @@ enum class GatewayEvent : int { GUILD_JOIN_REQUEST_DELETE, RELATIONSHIP_REMOVE, RELATIONSHIP_ADD, + THREAD_CREATE, + THREAD_UPDATE, + THREAD_DELETE, + THREAD_LIST_SYNC, + THREAD_MEMBER_UPDATE, + THREAD_MEMBERS_UPDATE, }; enum class GatewayCloseCode : uint16_t { @@ -659,3 +665,9 @@ struct PutRelationshipObject { friend void to_json(nlohmann::json &j, const PutRelationshipObject &m); }; + +struct ThreadCreateData { + ChannelData Channel; + + friend void from_json(const nlohmann::json &j, ThreadCreateData &m); +}; |