summaryrefslogtreecommitdiff
path: root/src/discord
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2022-03-04 23:03:09 -0500
committerouwou <26526779+ouwou@users.noreply.github.com>2022-03-04 23:03:09 -0500
commitaf60bceada7e55011f6d5ed2f13fef354ced45ef (patch)
tree8303bdcff7c4f55a9e13cec85d560770ad94cf50 /src/discord
parent3583a5d2516f9b71d389ccb95224b21a3dae20a2 (diff)
downloadabaddon-portaudio-af60bceada7e55011f6d5ed2f13fef354ced45ef.tar.gz
abaddon-portaudio-af60bceada7e55011f6d5ed2f13fef354ced45ef.zip
optimize sql for getting unknown member ids
Diffstat (limited to 'src/discord')
-rw-r--r--src/discord/discord.hpp11
-rw-r--r--src/discord/store.cpp25
-rw-r--r--src/discord/store.hpp3
3 files changed, 39 insertions, 0 deletions
diff --git a/src/discord/discord.hpp b/src/discord/discord.hpp
index dfe82cd..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;
diff --git a/src/discord/store.cpp b/src/discord/store.cpp
index d96bb1f..8eb3613 100644
--- a/src/discord/store.cpp
+++ b/src/discord/store.cpp
@@ -576,6 +576,23 @@ std::vector<Snowflake> Store::GetChannelIDsWithParentID(Snowflake channel_id) co
return ret;
}
+std::unordered_set<Snowflake> Store::GetMembersInGuild(Snowflake guild_id) const {
+ auto &s = m_stmt_get_guild_member_ids;
+
+ s->Bind(1, guild_id);
+
+ std::unordered_set<Snowflake> ret;
+ while (s->FetchOne()) {
+ Snowflake x;
+ s->Get(0, x);
+ ret.insert(x);
+ }
+
+ s->Reset();
+
+ return ret;
+}
+
void Store::AddReaction(const MessageReactionAddObject &data, bool byself) {
auto &s = m_stmt_add_reaction;
@@ -2134,6 +2151,14 @@ bool Store::CreateStatements() {
return false;
}
+ m_stmt_get_guild_member_ids = std::make_unique<Statement>(m_db, R"(
+ SELECT user_id FROM members WHERE guild_id = ?
+ )");
+ if (!m_stmt_get_guild_member_ids->OK()) {
+ fprintf(stderr, "failed to prepare get guild member ids statement: %s\n", m_db.ErrStr());
+ return false;
+ }
+
return true;
}
diff --git a/src/discord/store.hpp b/src/discord/store.hpp
index 4320807..a1e5f81 100644
--- a/src/discord/store.hpp
+++ b/src/discord/store.hpp
@@ -44,6 +44,8 @@ public:
std::vector<Message> GetPinnedMessages(Snowflake channel_id) const;
std::vector<ChannelData> GetActiveThreads(Snowflake channel_id) const; // public
std::vector<Snowflake> GetChannelIDsWithParentID(Snowflake channel_id) const;
+ std::unordered_set<Snowflake> GetMembersInGuild(Snowflake guild_id) const;
+ // ^ not the same as GetUsersInGuild since users in a guild may include users who do not have retrieved member data
void AddReaction(const MessageReactionAddObject &data, bool byself);
void RemoveReaction(const MessageReactionRemoveObject &data, bool byself);
@@ -302,5 +304,6 @@ private:
STMT(sub_reaction);
STMT(get_reactions);
STMT(get_chan_ids_parent);
+ STMT(get_guild_member_ids);
#undef STMT
};