summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2021-01-16 23:48:19 -0500
committerouwou <26526779+ouwou@users.noreply.github.com>2021-01-16 23:48:19 -0500
commit3a25249a0dc5b8ebbb7039da2af9fefb69fcf04d (patch)
tree2177a0bb7c1e94410694a527ede18b8ed212b8d6
parent462f801af20562f151cd7ad7fa70aa65695b3e22 (diff)
downloadabaddon-portaudio-3a25249a0dc5b8ebbb7039da2af9fefb69fcf04d.tar.gz
abaddon-portaudio-3a25249a0dc5b8ebbb7039da2af9fefb69fcf04d.zip
add role list to user menu
-rw-r--r--abaddon.cpp27
-rw-r--r--abaddon.hpp2
-rw-r--r--discord/member.cpp16
-rw-r--r--discord/member.hpp3
4 files changed, 48 insertions, 0 deletions
diff --git a/abaddon.cpp b/abaddon.cpp
index 2578e8e..e72bc0f 100644
--- a/abaddon.cpp
+++ b/abaddon.cpp
@@ -82,6 +82,9 @@ int Abaddon::StartGTK() {
m_user_menu_kick = Gtk::manage(new Gtk::MenuItem("Kick"));
m_user_menu_copy_id = Gtk::manage(new Gtk::MenuItem("Copy ID"));
m_user_menu_open_dm = Gtk::manage(new Gtk::MenuItem("Open DM"));
+ m_user_menu_roles = Gtk::manage(new Gtk::MenuItem("Roles"));
+ m_user_menu_roles_submenu = Gtk::manage(new Gtk::Menu);
+ m_user_menu_roles->set_submenu(*m_user_menu_roles_submenu);
m_user_menu_insert_mention->signal_activate().connect(sigc::mem_fun(*this, &Abaddon::on_user_menu_insert_mention));
m_user_menu_ban->signal_activate().connect(sigc::mem_fun(*this, &Abaddon::on_user_menu_ban));
m_user_menu_kick->signal_activate().connect(sigc::mem_fun(*this, &Abaddon::on_user_menu_kick));
@@ -91,6 +94,7 @@ int Abaddon::StartGTK() {
m_user_menu->append(*m_user_menu_ban);
m_user_menu->append(*m_user_menu_kick);
m_user_menu->append(*m_user_menu_open_dm);
+ m_user_menu->append(*m_user_menu_roles);
m_user_menu->append(*m_user_menu_copy_id);
m_user_menu->show_all();
@@ -241,7 +245,30 @@ void Abaddon::ShowUserMenu(const GdkEvent *event, Snowflake id, Snowflake guild_
m_shown_user_menu_id = id;
m_shown_user_menu_guild_id = guild_id;
+ const auto guild = m_discord.GetGuild(guild_id);
const auto me = m_discord.GetUserData().ID;
+ const auto user = m_discord.GetMember(id, guild_id);
+
+ for (const auto child : m_user_menu_roles_submenu->get_children())
+ delete child;
+ if (guild.has_value() && user.has_value()) {
+ m_user_menu_roles->set_visible(true);
+ for (const auto role : user->GetSortedRoles()) {
+ auto *item = Gtk::manage(new Gtk::MenuItem(role.Name));
+ if (role.Color != 0) {
+ Gdk::RGBA color;
+ color.set_red(((role.Color & 0xFF0000) >> 16) / 255.0);
+ color.set_green(((role.Color & 0x00FF00) >> 8) / 255.0);
+ color.set_blue(((role.Color & 0x0000FF) >> 0) / 255.0);
+ color.set_alpha(1.0);
+ item->override_color(color);
+ }
+ item->show();
+ m_user_menu_roles_submenu->append(*item);
+ }
+ } else
+ m_user_menu_roles->set_visible(false);
+
if (me == id) {
m_user_menu_ban->set_sensitive(false);
m_user_menu_kick->set_sensitive(false);
diff --git a/abaddon.hpp b/abaddon.hpp
index 4b409a3..9622089 100644
--- a/abaddon.hpp
+++ b/abaddon.hpp
@@ -87,6 +87,8 @@ protected:
Gtk::MenuItem *m_user_menu_kick;
Gtk::MenuItem *m_user_menu_copy_id;
Gtk::MenuItem *m_user_menu_open_dm;
+ Gtk::MenuItem *m_user_menu_roles;
+ Gtk::Menu *m_user_menu_roles_submenu;
void on_user_menu_insert_mention();
void on_user_menu_ban();
diff --git a/discord/member.cpp b/discord/member.cpp
index 35e7c93..0e4f6fc 100644
--- a/discord/member.cpp
+++ b/discord/member.cpp
@@ -1,4 +1,5 @@
#include "member.hpp"
+#include "../abaddon.hpp"
void from_json(const nlohmann::json &j, GuildMember &m) {
JS_O("user", m.User);
@@ -10,6 +11,21 @@ void from_json(const nlohmann::json &j, GuildMember &m) {
JS_D("mute", m.IsMuted);
}
+std::vector<RoleData> GuildMember::GetSortedRoles() const {
+ std::vector<RoleData> roles;
+ for (const auto role_id : Roles) {
+ const auto role = Abaddon::Get().GetDiscordClient().GetRole(role_id);
+ if (!role.has_value()) continue;
+ roles.push_back(std::move(*role));
+ }
+
+ std::sort(roles.begin(), roles.end(), [](const RoleData &a, const RoleData &b) {
+ return a.Position > b.Position;
+ });
+
+ return roles;
+}
+
GuildMember GuildMember::from_update_json(const nlohmann::json &j) {
GuildMember ret;
JS_D("roles", ret.Roles);
diff --git a/discord/member.hpp b/discord/member.hpp
index 0a5e57d..087f2bf 100644
--- a/discord/member.hpp
+++ b/discord/member.hpp
@@ -2,6 +2,7 @@
#include "snowflake.hpp"
#include "json.hpp"
#include "user.hpp"
+#include "role.hpp"
#include <string>
#include <vector>
@@ -14,6 +15,8 @@ struct GuildMember {
bool IsDeafened;
bool IsMuted;
+ std::vector<RoleData> GetSortedRoles() const;
+
friend void from_json(const nlohmann::json &j, GuildMember &m);
static GuildMember from_update_json(const nlohmann::json &j);
};