summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2020-10-12 18:17:53 -0400
committerouwou <26526779+ouwou@users.noreply.github.com>2020-10-12 18:17:53 -0400
commitf5ae8c3d3fd4c6b928da6c7c3c785525fc60b7b4 (patch)
treeecc57ee465504d787fd368c634a31ba8fae7f928 /components
parentd48fe29da9d8a19cec982be5a8ea50589fb92c87 (diff)
downloadabaddon-portaudio-f5ae8c3d3fd4c6b928da6c7c3c785525fc60b7b4.tar.gz
abaddon-portaudio-f5ae8c3d3fd4c6b928da6c7c3c785525fc60b7b4.zip
add kick/ban
Diffstat (limited to 'components')
-rw-r--r--components/memberlist.cpp38
-rw-r--r--components/memberlist.hpp10
2 files changed, 47 insertions, 1 deletions
diff --git a/components/memberlist.cpp b/components/memberlist.cpp
index 76f1f1d..77d176a 100644
--- a/components/memberlist.cpp
+++ b/components/memberlist.cpp
@@ -61,6 +61,14 @@ MemberList::MemberList() {
m_menu_insert_mention->signal_activate().connect(sigc::mem_fun(*this, &MemberList::on_insert_mention_activate));
m_menu.append(*m_menu_insert_mention);
+ m_menu_kick = Gtk::manage(new Gtk::MenuItem("_Kick User", true));
+ m_menu_kick->signal_activate().connect(sigc::mem_fun(*this, &MemberList::on_kick_activate));
+ m_menu.append(*m_menu_kick);
+
+ m_menu_ban = Gtk::manage(new Gtk::MenuItem("_Ban User", true));
+ m_menu_ban->signal_activate().connect(sigc::mem_fun(*this, &MemberList::on_ban_activate));
+ m_menu.append(*m_menu_ban);
+
m_menu.show_all();
m_main->set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
@@ -230,10 +238,30 @@ void MemberList::on_insert_mention_activate() {
m_signal_action_insert_mention.emit(row->ID);
}
+void MemberList::on_kick_activate() {
+ auto *row = dynamic_cast<MemberListUserRow *>(m_row_menu_target);
+ if (row == nullptr) return;
+ m_signal_action_kick.emit(row->ID, m_guild_id);
+}
+
+void MemberList::on_ban_activate() {
+ auto *row = dynamic_cast<MemberListUserRow *>(m_row_menu_target);
+ if (row == nullptr) return;
+ m_signal_action_ban.emit(row->ID, m_guild_id);
+}
+
void MemberList::AttachUserMenuHandler(Gtk::ListBoxRow *row, Snowflake id) {
- row->signal_button_press_event().connect([&, row](GdkEventButton *e) -> bool {
+ row->signal_button_press_event().connect([this, row, id](GdkEventButton *e) -> bool {
if (e->type == GDK_BUTTON_PRESS && e->button == GDK_BUTTON_SECONDARY) {
+ const auto &discord = Abaddon::Get().GetDiscordClient();
+ const auto me = discord.GetUserData().ID;
+ const bool has_kick = discord.HasGuildPermission(me, m_guild_id, Permission::KICK_MEMBERS);
+ const bool has_ban = discord.HasGuildPermission(me, m_guild_id, Permission::BAN_MEMBERS);
+ const bool can_manage = discord.CanManageMember(m_chan_id, discord.GetUserData().ID, id);
+
m_row_menu_target = row;
+ m_menu_kick->set_sensitive(has_kick && can_manage);
+ m_menu_ban->set_sensitive(has_ban && can_manage);
m_menu.popup_at_pointer(reinterpret_cast<const GdkEvent *>(e));
return true;
}
@@ -245,3 +273,11 @@ void MemberList::AttachUserMenuHandler(Gtk::ListBoxRow *row, Snowflake id) {
MemberList::type_signal_action_insert_mention MemberList::signal_action_insert_mention() {
return m_signal_action_insert_mention;
}
+
+MemberList::type_signal_action_kick MemberList::signal_action_kick() {
+ return m_signal_action_kick;
+}
+
+MemberList::type_signal_action_ban MemberList::signal_action_ban() {
+ return m_signal_action_ban;
+}
diff --git a/components/memberlist.hpp b/components/memberlist.hpp
index 2a727e5..bc8c680 100644
--- a/components/memberlist.hpp
+++ b/components/memberlist.hpp
@@ -30,6 +30,8 @@ public:
private:
void on_copy_id_activate();
void on_insert_mention_activate();
+ void on_kick_activate();
+ void on_ban_activate();
void UpdateMemberListInternal();
void AttachUserMenuHandler(Gtk::ListBoxRow *row, Snowflake id);
@@ -37,6 +39,8 @@ private:
Gtk::Menu m_menu;
Gtk::MenuItem *m_menu_copy_id;
Gtk::MenuItem *m_menu_insert_mention;
+ Gtk::MenuItem *m_menu_kick;
+ Gtk::MenuItem *m_menu_ban;
Gtk::ListBoxRow *m_row_menu_target = nullptr; // maybe hacky
std::mutex m_mutex;
@@ -52,9 +56,15 @@ private:
public:
typedef sigc::signal<void, Snowflake> type_signal_action_insert_mention;
+ typedef sigc::signal<void, Snowflake, Snowflake> type_signal_action_kick; // user_id, guild_id
+ typedef sigc::signal<void, Snowflake, Snowflake> type_signal_action_ban; // ^
type_signal_action_insert_mention signal_action_insert_mention();
+ type_signal_action_kick signal_action_kick();
+ type_signal_action_ban signal_action_ban();
private:
type_signal_action_insert_mention m_signal_action_insert_mention;
+ type_signal_action_kick m_signal_action_kick;
+ type_signal_action_ban m_signal_action_ban;
};