summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2022-03-03 23:45:30 -0500
committerouwou <26526779+ouwou@users.noreply.github.com>2022-03-03 23:45:30 -0500
commit7f1d3df4a5d640ae3a885886139236e8f9c5555c (patch)
tree0449ccf558357717fa5b570f53828535e24d8b7e /src
parent17f1289c84af11b6e02f5f5de4714c8aad18e47e (diff)
downloadabaddon-portaudio-7f1d3df4a5d640ae3a885886139236e8f9c5555c.tar.gz
abaddon-portaudio-7f1d3df4a5d640ae3a885886139236e8f9c5555c.zip
start sending request guild members for unknown members
Diffstat (limited to 'src')
-rw-r--r--src/abaddon.cpp19
-rw-r--r--src/abaddon.hpp2
-rw-r--r--src/discord/discord.cpp16
-rw-r--r--src/discord/discord.hpp14
-rw-r--r--src/discord/objects.cpp13
-rw-r--r--src/discord/objects.hpp22
6 files changed, 85 insertions, 1 deletions
diff --git a/src/abaddon.cpp b/src/abaddon.cpp
index 51f8052..b287e17 100644
--- a/src/abaddon.cpp
+++ b/src/abaddon.cpp
@@ -325,6 +325,22 @@ void Abaddon::ShowGuildVerificationGateDialog(Snowflake guild_id) {
}
}
+void Abaddon::CheckMessagesForMembers(const ChannelData &chan, const std::vector<Message> &msgs) {
+ if (!chan.GuildID.has_value()) return;
+
+ // TODO sql query
+ std::set<Snowflake> fetch;
+ std::set<Snowflake> ids;
+ for (const auto& msg : msgs)
+ ids.insert(msg.Author.ID);
+ for (const auto id : ids) {
+ const auto member = m_discord.GetMember(id, *chan.GuildID);
+ if (!member.has_value())
+ fetch.insert(id);
+ }
+ m_discord.RequestMembers(*chan.GuildID, fetch.begin(), fetch.end());
+}
+
void Abaddon::SetupUserMenu() {
m_user_menu = Gtk::manage(new Gtk::Menu);
m_user_menu_insert_mention = Gtk::manage(new Gtk::MenuItem("Insert Mention"));
@@ -536,7 +552,8 @@ void Abaddon::ActionChannelOpened(Snowflake id) {
if (m_channels_requested.find(id) == m_channels_requested.end()) {
// dont fire requests we know will fail
if (can_access) {
- m_discord.FetchMessagesInChannel(id, [this, id](const std::vector<Message> &msgs) {
+ m_discord.FetchMessagesInChannel(id, [channel, this, id](const std::vector<Message> &msgs) {
+ CheckMessagesForMembers(*channel, msgs);
m_main_window->UpdateChatWindowContents();
m_channels_requested.insert(id);
});
diff --git a/src/abaddon.hpp b/src/abaddon.hpp
index d9d0bb0..311dcc5 100644
--- a/src/abaddon.hpp
+++ b/src/abaddon.hpp
@@ -93,6 +93,8 @@ public:
protected:
void ShowGuildVerificationGateDialog(Snowflake guild_id);
+ void CheckMessagesForMembers(const ChannelData &chan, const std::vector<Message> &msgs);
+
void SetupUserMenu();
void SaveState();
void LoadState();
diff --git a/src/discord/discord.cpp b/src/discord/discord.cpp
index 6ea0ea6..c11210d 100644
--- a/src/discord/discord.cpp
+++ b/src/discord/discord.cpp
@@ -1464,6 +1464,9 @@ void DiscordClient::HandleGatewayMessage(std::string str) {
case GatewayEvent::USER_GUILD_SETTINGS_UPDATE: {
HandleGatewayUserGuildSettingsUpdate(m);
} break;
+ case GatewayEvent::GUILD_MEMBERS_CHUNK: {
+ HandleGatewayGuildMembersChunk(m);
+ } break;
}
} break;
default:
@@ -2049,6 +2052,14 @@ void DiscordClient::HandleGatewayUserGuildSettingsUpdate(const GatewayMessage &m
}
}
+void DiscordClient::HandleGatewayGuildMembersChunk(const GatewayMessage &msg) {
+ GuildMembersChunkData data = msg.Data;
+ m_store.BeginTransaction();
+ for (const auto &member : data.Members)
+ m_store.SetGuildMember(data.GuildID, member.User->ID, member);
+ m_store.EndTransaction();
+}
+
void DiscordClient::HandleGatewayReadySupplemental(const GatewayMessage &msg) {
ReadySupplementalData data = msg.Data;
for (const auto &p : data.MergedPresences.Friends) {
@@ -2511,6 +2522,7 @@ void DiscordClient::LoadEventMap() {
m_event_map["THREAD_MEMBER_LIST_UPDATE"] = GatewayEvent::THREAD_MEMBER_LIST_UPDATE;
m_event_map["MESSAGE_ACK"] = GatewayEvent::MESSAGE_ACK;
m_event_map["USER_GUILD_SETTINGS_UPDATE"] = GatewayEvent::USER_GUILD_SETTINGS_UPDATE;
+ m_event_map["GUILD_MEMBERS_CHUNK"] = GatewayEvent::GUILD_MEMBERS_CHUNK;
}
DiscordClient::type_signal_gateway_ready DiscordClient::signal_gateway_ready() {
@@ -2677,6 +2689,10 @@ DiscordClient::type_signal_message_ack DiscordClient::signal_message_ack() {
return m_signal_message_ack;
}
+DiscordClient::type_signal_guild_members_chunk DiscordClient::signal_guild_members_chunk() {
+ return m_signal_guild_members_chunk;
+}
+
DiscordClient::type_signal_added_to_thread DiscordClient::signal_added_to_thread() {
return m_signal_added_to_thread;
}
diff --git a/src/discord/discord.hpp b/src/discord/discord.hpp
index 4a7593d..63f8bd5 100644
--- a/src/discord/discord.hpp
+++ b/src/discord/discord.hpp
@@ -152,6 +152,16 @@ public:
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) {
+ 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) {
@@ -262,6 +272,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);
@@ -372,6 +383,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;
@@ -427,6 +439,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();
@@ -479,6 +492,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;
diff --git a/src/discord/objects.cpp b/src/discord/objects.cpp
index 0ee96dc..3c9f770 100644
--- a/src/discord/objects.cpp
+++ b/src/discord/objects.cpp
@@ -119,6 +119,14 @@ void to_json(nlohmann::json &j, const UpdateStatusMessage &m) {
}
}
+void to_json(nlohmann::json &j, const RequestGuildMembersMessage &m) {
+ j["op"] = GatewayOp::RequestGuildMembers;
+ j["d"] = nlohmann::json::object();
+ j["d"]["guild_id"] = m.GuildID;
+ j["d"]["presences"] = m.Presences;
+ j["d"]["user_ids"] = m.UserIDs;
+}
+
void from_json(const nlohmann::json &j, ReadStateEntry &m) {
JS_ON("mention_count", m.MentionCount);
JS_ON("last_message_id", m.LastMessageID);
@@ -626,3 +634,8 @@ void to_json(nlohmann::json &j, const AckBulkData &m) {
void from_json(const nlohmann::json &j, UserGuildSettingsUpdateData &m) {
m.Settings = j;
}
+
+void from_json(const nlohmann::json &j, GuildMembersChunkData &m) {
+ JS_D("members", m.Members);
+ JS_D("guild_id", m.GuildID);
+}
diff --git a/src/discord/objects.hpp b/src/discord/objects.hpp
index fae592a..27542cc 100644
--- a/src/discord/objects.hpp
+++ b/src/discord/objects.hpp
@@ -99,6 +99,7 @@ enum class GatewayEvent : int {
THREAD_MEMBER_LIST_UPDATE,
MESSAGE_ACK,
USER_GUILD_SETTINGS_UPDATE,
+ GUILD_MEMBERS_CHUNK,
};
enum class GatewayCloseCode : uint16_t {
@@ -245,6 +246,14 @@ struct UpdateStatusMessage {
friend void to_json(nlohmann::json &j, const UpdateStatusMessage &m);
};
+struct RequestGuildMembersMessage {
+ Snowflake GuildID;
+ bool Presences;
+ std::vector<Snowflake> UserIDs;
+
+ friend void to_json(nlohmann::json &j, const RequestGuildMembersMessage &m);
+};
+
struct ReadStateEntry {
int MentionCount;
Snowflake LastMessageID;
@@ -841,3 +850,16 @@ struct UserGuildSettingsUpdateData {
friend void from_json(const nlohmann::json &j, UserGuildSettingsUpdateData &m);
};
+
+struct GuildMembersChunkData {
+ /*
+ not needed so not deserialized
+ int ChunkCount;
+ int ChunkIndex;
+ std::vector<?> NotFound;
+ */
+ Snowflake GuildID;
+ std::vector<GuildMember> Members;
+
+ friend void from_json(const nlohmann::json &j, GuildMembersChunkData &m);
+};