diff options
author | ouwou <26526779+ouwou@users.noreply.github.com> | 2021-02-28 02:00:15 -0500 |
---|---|---|
committer | ouwou <26526779+ouwou@users.noreply.github.com> | 2021-02-28 02:00:15 -0500 |
commit | d6a8b8c33372fe41d9e7f8453d15f491b25680a6 (patch) | |
tree | 5510f4ae1065b55e950a013658eef336e5e876a8 /discord | |
parent | 11358da24e0e73044aed389b1dbbf479808ca036 (diff) | |
download | abaddon-portaudio-d6a8b8c33372fe41d9e7f8453d15f491b25680a6.tar.gz abaddon-portaudio-d6a8b8c33372fe41d9e7f8453d15f491b25680a6.zip |
add members panel/change member roles
Diffstat (limited to 'discord')
-rw-r--r-- | discord/discord.cpp | 9 | ||||
-rw-r--r-- | discord/discord.hpp | 11 | ||||
-rw-r--r-- | discord/guild.cpp | 11 | ||||
-rw-r--r-- | discord/guild.hpp | 1 | ||||
-rw-r--r-- | discord/objects.cpp | 4 | ||||
-rw-r--r-- | discord/objects.hpp | 11 | ||||
-rw-r--r-- | discord/user.cpp | 4 | ||||
-rw-r--r-- | discord/user.hpp | 1 |
8 files changed, 52 insertions, 0 deletions
diff --git a/discord/discord.cpp b/discord/discord.cpp index fbe6549..7cd87bc 100644 --- a/discord/discord.cpp +++ b/discord/discord.cpp @@ -1477,6 +1477,15 @@ bool DiscordClient::CheckCode(const http::response_type &r) { return true; } +bool DiscordClient::CheckCode(const http::response_type &r, int expected) { + if (!CheckCode(r)) return false; + if (r.status_code != expected) { + fprintf(stderr, "api request to %s returned %d, expected %d\n", r.url.c_str(), r.status_code, expected); + return false; + } + return true; +} + void DiscordClient::StoreMessageData(Message &msg) { const auto chan = m_store.GetChannel(msg.ChannelID); if (chan.has_value() && chan->GuildID.has_value()) diff --git a/discord/discord.hpp b/discord/discord.hpp index c6723cd..c086aec 100644 --- a/discord/discord.hpp +++ b/discord/discord.hpp @@ -124,6 +124,16 @@ public: void AddGroupDMRecipient(Snowflake channel_id, Snowflake user_id); void RemoveGroupDMRecipient(Snowflake channel_id, Snowflake user_id); + // 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(bool success)> callback) { + ModifyGuildMemberObject obj; + obj.Roles = { begin, end }; + m_http.MakePATCH("/guilds/" + std::to_string(guild_id) + "/members/" + std::to_string(user_id), nlohmann::json(obj).dump(), [this, callback](const http::response_type &response) { + callback(CheckCode(response, 200)); + }); + } + // FetchGuildBans fetches all bans+reasons via api, this func fetches stored bans (so usually just GUILD_BAN_ADD data) std::vector<BanData> GetBansInGuild(Snowflake guild_id); void FetchGuildBan(Snowflake guild_id, Snowflake user_id, sigc::slot<void(BanData)> callback); @@ -196,6 +206,7 @@ private: void HandleSocketClose(uint16_t code); bool CheckCode(const http::response_type &r); + bool CheckCode(const http::response_type &r, int expected); void StoreMessageData(Message &msg); diff --git a/discord/guild.cpp b/discord/guild.cpp index bf99943..5fb524e 100644 --- a/discord/guild.cpp +++ b/discord/guild.cpp @@ -186,3 +186,14 @@ std::vector<Snowflake> GuildData::GetSortedChannels(Snowflake ignore) const { return ret; } + +std::vector<RoleData> GuildData::FetchRoles() const { + if (!Roles.has_value()) return {}; + std::vector<RoleData> ret; + for (const auto thing : *Roles) + ret.push_back(*Abaddon::Get().GetDiscordClient().GetRole(thing.ID)); + std::sort(ret.begin(), ret.end(), [](const RoleData &a, const RoleData &b) -> bool { + return a.Position > b.Position; + }); + return ret; +} diff --git a/discord/guild.hpp b/discord/guild.hpp index e8132e0..c2d7333 100644 --- a/discord/guild.hpp +++ b/discord/guild.hpp @@ -75,4 +75,5 @@ struct GuildData { bool HasAnimatedIcon() const; std::string GetIconURL(std::string ext = "png", std::string size = "32") const; std::vector<Snowflake> GetSortedChannels(Snowflake ignore = Snowflake::Invalid) const; + std::vector<RoleData> FetchRoles() const; // sorted }; diff --git a/discord/objects.cpp b/discord/objects.cpp index af82759..878c459 100644 --- a/discord/objects.cpp +++ b/discord/objects.cpp @@ -363,3 +363,7 @@ void from_json(const nlohmann::json &j, UserNoteUpdateMessage &m) { void from_json(const nlohmann::json &j, RelationshipsData &m) { j.get_to(m.Users); } + +void to_json(nlohmann::json &j, const ModifyGuildMemberObject &m) { + JS_IF("roles", m.Roles); +} diff --git a/discord/objects.hpp b/discord/objects.hpp index bdc16f8..b95be9f 100644 --- a/discord/objects.hpp +++ b/discord/objects.hpp @@ -503,3 +503,14 @@ struct RelationshipsData { friend void from_json(const nlohmann::json &j, RelationshipsData &m); }; + +struct ModifyGuildMemberObject { + // std::optional<std::string> Nick; + // std::optional<bool> IsMuted; + // std::optional<bool> IsDeaf; + // std::optional<Snowflake> ChannelID; + + std::optional<std::vector<Snowflake>> Roles; + + friend void to_json(nlohmann::json &j, const ModifyGuildMemberObject &m); +}; diff --git a/discord/user.cpp b/discord/user.cpp index b399930..0ecf725 100644 --- a/discord/user.cpp +++ b/discord/user.cpp @@ -1,6 +1,10 @@ #include "user.hpp" #include "../abaddon.hpp" +bool UserData::IsDeleted() const { + return Discriminator == "0000"; +} + bool UserData::HasAvatar() const { return Avatar.size() > 0; } diff --git a/discord/user.hpp b/discord/user.hpp index c66a086..025139e 100644 --- a/discord/user.hpp +++ b/discord/user.hpp @@ -49,6 +49,7 @@ struct UserData { friend void to_json(nlohmann::json &j, const UserData &m); void update_from_json(const nlohmann::json &j); + bool IsDeleted() const; bool HasAvatar() const; bool HasAnimatedAvatar() const; std::string GetAvatarURL(std::string ext = "png", std::string size = "32") const; |