diff options
Diffstat (limited to 'src/discord/discord.hpp')
-rw-r--r-- | src/discord/discord.hpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/discord/discord.hpp b/src/discord/discord.hpp index 1a6aa14..6add18f 100644 --- a/src/discord/discord.hpp +++ b/src/discord/discord.hpp @@ -84,6 +84,17 @@ public: void GetArchivedPrivateThreads(Snowflake channel_id, sigc::slot<void(DiscordError, const ArchivedThreadsResponseData &)> callback); std::vector<Snowflake> GetChildChannelIDs(Snowflake parent_id) const; + // get ids of given list of members for who we do not have the member data + template<typename Iter> + std::unordered_set<Snowflake> FilterUnknownMembersFrom(Snowflake guild_id, Iter begin, Iter end) { + std::unordered_set<Snowflake> ret; + const auto known = m_store.GetMembersInGuild(guild_id); + for (auto iter = begin; iter != end; iter++) + if (known.find(*iter) == known.end()) + ret.insert(*iter); + return ret; + } + bool IsThreadJoined(Snowflake thread_id) const; bool HasGuildPermission(Snowflake user_id, Snowflake guild_id, Permission perm) const; @@ -146,10 +157,24 @@ public: void MarkAllAsRead(sigc::slot<void(DiscordError code)> callback); void MuteGuild(Snowflake id, sigc::slot<void(DiscordError code)> callback); void UnmuteGuild(Snowflake id, sigc::slot<void(DiscordError code)> callback); + void MuteThread(Snowflake id, sigc::slot<void(DiscordError code)> callback); + void UnmuteThread(Snowflake id, sigc::slot<void(DiscordError code)> callback); bool CanModifyRole(Snowflake guild_id, Snowflake role_id) const; bool CanModifyRole(Snowflake guild_id, Snowflake role_id, Snowflake user_id) const; + // send op 8 to get member data for unknown members + template<typename Iter> + void RequestMembers(Snowflake guild_id, Iter begin, Iter end) { + if (std::distance(begin, end) == 0) return; + + RequestGuildMembersMessage obj; + obj.GuildID = guild_id; + obj.Presences = false; + obj.UserIDs = { begin, end }; + m_websocket.Send(obj); + } + // real client doesn't seem to use the single role endpoints so neither do we template<typename Iter> auto SetMemberRoles(Snowflake guild_id, Snowflake user_id, Iter begin, Iter end, sigc::slot<void(DiscordError code)> callback) { @@ -260,6 +285,7 @@ private: void HandleGatewayThreadMemberListUpdate(const GatewayMessage &msg); void HandleGatewayMessageAck(const GatewayMessage &msg); void HandleGatewayUserGuildSettingsUpdate(const GatewayMessage &msg); + void HandleGatewayGuildMembersChunk(const GatewayMessage &msg); void HandleGatewayReadySupplemental(const GatewayMessage &msg); void HandleGatewayReconnect(const GatewayMessage &msg); void HandleGatewayInvalidSession(const GatewayMessage &msg); @@ -370,6 +396,7 @@ public: typedef sigc::signal<void, ThreadUpdateData> type_signal_thread_update; typedef sigc::signal<void, ThreadMemberListUpdateData> type_signal_thread_member_list_update; typedef sigc::signal<void, MessageAckData> type_signal_message_ack; + typedef sigc::signal<void, GuildMembersChunkData> type_signal_guild_members_chunk; // not discord dispatch events typedef sigc::signal<void, Snowflake> type_signal_added_to_thread; @@ -425,6 +452,7 @@ public: type_signal_thread_update signal_thread_update(); type_signal_thread_member_list_update signal_thread_member_list_update(); type_signal_message_ack signal_message_ack(); + type_signal_guild_members_chunk signal_guild_members_chunk(); type_signal_added_to_thread signal_added_to_thread(); type_signal_removed_from_thread signal_removed_from_thread(); @@ -477,6 +505,7 @@ protected: type_signal_thread_update m_signal_thread_update; type_signal_thread_member_list_update m_signal_thread_member_list_update; type_signal_message_ack m_signal_message_ack; + type_signal_guild_members_chunk m_signal_guild_members_chunk; type_signal_removed_from_thread m_signal_removed_from_thread; type_signal_added_to_thread m_signal_added_to_thread; |