diff options
author | ouwou <26526779+ouwou@users.noreply.github.com> | 2020-10-12 18:17:53 -0400 |
---|---|---|
committer | ouwou <26526779+ouwou@users.noreply.github.com> | 2020-10-12 18:17:53 -0400 |
commit | f5ae8c3d3fd4c6b928da6c7c3c785525fc60b7b4 (patch) | |
tree | ecc57ee465504d787fd368c634a31ba8fae7f928 /components | |
parent | d48fe29da9d8a19cec982be5a8ea50589fb92c87 (diff) | |
download | abaddon-portaudio-f5ae8c3d3fd4c6b928da6c7c3c785525fc60b7b4.tar.gz abaddon-portaudio-f5ae8c3d3fd4c6b928da6c7c3c785525fc60b7b4.zip |
add kick/ban
Diffstat (limited to 'components')
-rw-r--r-- | components/memberlist.cpp | 38 | ||||
-rw-r--r-- | components/memberlist.hpp | 10 |
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; }; |