summaryrefslogtreecommitdiff
path: root/discord/discord.cpp
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2021-03-12 01:55:46 -0500
committerouwou <26526779+ouwou@users.noreply.github.com>2021-03-12 01:55:46 -0500
commitae38add9310cf95756e3f0ea3c1ecfa3eaaffbec (patch)
treed351e277f3e2d089104e2a11b030ccb6b202a95f /discord/discord.cpp
parentf35dea89f9dd88e6570b9c713ded2017bf2f5889 (diff)
downloadabaddon-portaudio-ae38add9310cf95756e3f0ea3c1ecfa3eaaffbec.tar.gz
abaddon-portaudio-ae38add9310cf95756e3f0ea3c1ecfa3eaaffbec.zip
add ability to reorder roles
- some other small tweaks
Diffstat (limited to 'discord/discord.cpp')
-rw-r--r--discord/discord.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/discord/discord.cpp b/discord/discord.cpp
index ff4b8bf..4fa1a63 100644
--- a/discord/discord.cpp
+++ b/discord/discord.cpp
@@ -571,6 +571,58 @@ void DiscordClient::ModifyRoleColor(Snowflake guild_id, Snowflake role_id, Gdk::
ModifyRoleColor(guild_id, role_id, int_color, callback);
}
+void DiscordClient::ModifyRolePosition(Snowflake guild_id, Snowflake role_id, int position, sigc::slot<void(bool success)> callback) {
+ const auto roles = GetGuild(guild_id)->FetchRoles();
+ if (position > roles.size()) return;
+ // gay and makes you send every role in between new and old position
+ size_t index_from = -1, index_to = -1;
+ for (size_t i = 0; i < roles.size(); i++) {
+ const auto &role = roles[i];
+ if (role.ID == role_id)
+ index_from = i;
+ else if (role.Position == position)
+ index_to = i;
+ if (index_from != -1 && index_to != -1) break;
+ }
+
+ if (index_from == -1 || index_to == -1) return;
+
+ int dir;
+ size_t range_from, range_to;
+ if (index_to > index_from) {
+ dir = 1;
+ range_from = index_from + 1;
+ range_to = index_to + 1;
+ } else {
+ dir = -1;
+ range_from = index_to;
+ range_to = index_from;
+ }
+
+ ModifyGuildRolePositionsObject obj;
+
+ obj.Positions.push_back({ roles[index_from].ID, position });
+ for (size_t i = range_from; i < range_to; i++)
+ obj.Positions.push_back({ roles[i].ID, roles[i].Position + dir });
+
+ m_http.MakePATCH("/guilds/" + std::to_string(guild_id) + "/roles", nlohmann::json(obj).dump(), [this, callback](const http::response_type &response) {
+ callback(CheckCode(response));
+ });
+}
+
+bool DiscordClient::CanModifyRole(Snowflake guild_id, Snowflake role_id, Snowflake user_id) const {
+ const auto guild = *GetGuild(guild_id);
+ if (guild.OwnerID == user_id) return true;
+ const auto role = *GetRole(role_id);
+ const auto has_modify = HasGuildPermission(user_id, guild_id, Permission::MANAGE_CHANNELS);
+ const auto highest = GetMemberHighestRole(guild_id, user_id);
+ return has_modify && highest.has_value() && highest->Position > role.Position;
+}
+
+bool DiscordClient::CanModifyRole(Snowflake guild_id, Snowflake role_id) const {
+ return CanModifyRole(guild_id, role_id, GetUserData().ID);
+}
+
std::vector<BanData> DiscordClient::GetBansInGuild(Snowflake guild_id) {
return m_store.GetBans(guild_id);
}