diff options
Diffstat (limited to 'discord')
-rw-r--r-- | discord/channel.cpp | 16 | ||||
-rw-r--r-- | discord/channel.hpp | 29 | ||||
-rw-r--r-- | discord/discord.cpp | 28 | ||||
-rw-r--r-- | discord/discord.hpp | 6 | ||||
-rw-r--r-- | discord/guild.cpp | 1 | ||||
-rw-r--r-- | discord/guild.hpp | 1 | ||||
-rw-r--r-- | discord/message.hpp | 2 | ||||
-rw-r--r-- | discord/objects.cpp | 4 | ||||
-rw-r--r-- | discord/objects.hpp | 12 | ||||
-rw-r--r-- | discord/store.cpp | 15 |
10 files changed, 105 insertions, 9 deletions
diff --git a/discord/channel.cpp b/discord/channel.cpp index 9d90eb5..685cc72 100644 --- a/discord/channel.cpp +++ b/discord/channel.cpp @@ -1,6 +1,20 @@ #include "../abaddon.hpp" #include "channel.hpp" +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); @@ -21,6 +35,8 @@ void from_json(const nlohmann::json &j, ChannelData &m) { JS_O("application_id", m.ApplicationID); 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 68597e6..606686d 100644 --- a/discord/channel.hpp +++ b/discord/channel.hpp @@ -15,9 +15,10 @@ enum class ChannelType : int { GUILD_NEWS = 5, GUILD_STORE = 6, /* 7 and 8 were used for LFG */ - /* 9 and 10 were used for threads */ - PUBLIC_THREAD = 11, - PRIVATE_THREAD = 12, + /* 9 was used for threads */ + GUILD_NEWS_THREAD = 10, + GUILD_PUBLIC_THREAD = 11, + GUILD_PRIVATE_THREAD = 12, GUILD_STAGE_VOICE = 13, }; @@ -37,6 +38,26 @@ constexpr const char *GetStagePrivacyDisplayString(StagePrivacy e) { } } +// 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, 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 { Snowflake ID; ChannelType Type; @@ -57,6 +78,8 @@ struct ChannelData { std::optional<Snowflake> ApplicationID; std::optional<Snowflake> ParentID; // null std::optional<std::string> LastPinTimestamp; // null + 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 a95e4fa..61c224a 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: @@ -1209,7 +1212,7 @@ void DiscordClient::ProcessNewGuild(GuildData &guild) { m_store.BeginTransaction(); m_store.SetGuild(guild.ID, guild); - if (guild.Channels.has_value()) + if (guild.Channels.has_value()) { for (auto &c : *guild.Channels) { c.GuildID = guild.ID; m_store.SetChannel(c.ID, c); @@ -1218,6 +1221,14 @@ void DiscordClient::ProcessNewGuild(GuildData &guild) { m_store.SetPermissionOverwrite(c.ID, p.ID, p); } } + } + + if (guild.Threads.has_value()) { + for (auto& c : *guild.Threads) { + c.GuildID = guild.ID; + m_store.SetChannel(c.ID, c); + } + } for (auto &r : *guild.Roles) m_store.SetRole(r.ID, r); @@ -1373,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) { @@ -1627,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) { @@ -1989,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() { @@ -2127,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/guild.cpp b/discord/guild.cpp index d387729..1c79a38 100644 --- a/discord/guild.cpp +++ b/discord/guild.cpp @@ -43,6 +43,7 @@ void from_json(const nlohmann::json &j, GuildData &m) { // JS_O("voice_states", m.VoiceStates); // JS_O("members", m.Members); JS_O("channels", m.Channels); + JS_O("threads", m.Threads); // JS_O("presences", m.Presences); JS_ON("max_presences", m.MaxPresences); JS_O("max_members", m.MaxMembers); diff --git a/discord/guild.hpp b/discord/guild.hpp index a57bc15..3c3828d 100644 --- a/discord/guild.hpp +++ b/discord/guild.hpp @@ -80,6 +80,7 @@ struct GuildData { std::optional<int> MaxVideoChannelUsers; std::optional<int> ApproximateMemberCount; std::optional<int> ApproximatePresenceCount; + std::optional<std::vector<ChannelData>> Threads; // only with permissions to view, id only // undocumented // std::map<std::string, Unknown> GuildHashes; diff --git a/discord/message.hpp b/discord/message.hpp index a6ea039..56f4c0f 100644 --- a/discord/message.hpp +++ b/discord/message.hpp @@ -27,7 +27,7 @@ enum class MessageType { GUILD_DISCOVERY_REQUALIFIED = 15, // yep GUILD_DISCOVERY_GRACE_PERIOD_INITIAL_WARNING = 16, // yep GUILD_DISCOVERY_GRACE_PERIOD_FINAL_WARNING = 17, // yep - THREAD_CREATED = 18, // nope + THREAD_CREATED = 18, // yep INLINE_REPLY = 19, // yep APPLICATION_COMMAND = 20, // yep THREAD_STARTER_MESSAGE = 21, // nope 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); +}; diff --git a/discord/store.cpp b/discord/store.cpp index 2439da5..3cac46e 100644 --- a/discord/store.cpp +++ b/discord/store.cpp @@ -194,6 +194,12 @@ void Store::SetGuild(Snowflake id, const GuildData &guild) { Bind(m_set_guild_stmt, 37, guild.ApproximateMemberCount); Bind(m_set_guild_stmt, 38, guild.ApproximatePresenceCount); Bind(m_set_guild_stmt, 39, guild.IsLazy); + if (guild.Threads.has_value()) { + snowflakes.clear(); + for (const auto &x : *guild.Threads) snowflakes.push_back(x.ID); + Bind(m_set_guild_stmt, 40, nlohmann::json(snowflakes).dump()); + } else + Bind(m_set_guild_stmt, 40, "[]"s); if (!RunInsert(m_set_guild_stmt)) fprintf(stderr, "guild insert failed: %s\n", sqlite3_errstr(m_db_err)); @@ -626,6 +632,10 @@ std::optional<GuildData> Store::GetGuild(Snowflake id) const { Get(m_get_guild_stmt, 36, ret.ApproximateMemberCount); Get(m_get_guild_stmt, 37, ret.ApproximatePresenceCount); Get(m_get_guild_stmt, 38, ret.IsLazy); + Get(m_get_guild_stmt, 39, tmp); + ret.Threads.emplace(); + for (const auto &id : nlohmann::json::parse(tmp).get<std::vector<Snowflake>>()) + ret.Threads->emplace_back().ID = id; Reset(m_get_guild_stmt); @@ -934,7 +944,8 @@ bool Store::CreateTables() { max_video_users INTEGER, approx_members INTEGER, approx_presences INTEGER, - lazy BOOL + lazy BOOL, + threads TEXT NOT NULL /* json */ ) )"; @@ -1116,7 +1127,7 @@ bool Store::CreateStatements() { const char *set_guild = R"( REPLACE INTO guilds VALUES ( - ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? + ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) )"; |