diff options
author | ouwou <26526779+ouwou@users.noreply.github.com> | 2021-01-20 02:08:48 -0500 |
---|---|---|
committer | ouwou <26526779+ouwou@users.noreply.github.com> | 2021-01-20 02:08:48 -0500 |
commit | a010aa11a559ba22c94dd3426fd1f313ee0ac667 (patch) | |
tree | e5fafac18da04f1c7f6bf7722ec71c428eaba250 /windows | |
parent | 5d1db982cbbb375427b9c4475d5e347c5702b6df (diff) | |
download | abaddon-portaudio-a010aa11a559ba22c94dd3426fd1f313ee0ac667.tar.gz abaddon-portaudio-a010aa11a559ba22c94dd3426fd1f313ee0ac667.zip |
add bans to guild settings, tweak some other things
Diffstat (limited to 'windows')
-rw-r--r-- | windows/guildsettings/banspane.cpp | 136 | ||||
-rw-r--r-- | windows/guildsettings/banspane.hpp | 38 | ||||
-rw-r--r-- | windows/guildsettings/infopane.cpp | 4 | ||||
-rw-r--r-- | windows/guildsettingswindow.cpp | 10 | ||||
-rw-r--r-- | windows/guildsettingswindow.hpp | 2 |
5 files changed, 185 insertions, 5 deletions
diff --git a/windows/guildsettings/banspane.cpp b/windows/guildsettings/banspane.cpp new file mode 100644 index 0000000..fb4b42b --- /dev/null +++ b/windows/guildsettings/banspane.cpp @@ -0,0 +1,136 @@ +#include "banspane.hpp" +#include "../../abaddon.hpp" + +// gtk_list_store_set_value: assertion 'column >= 0 && column < priv->n_columns' failed +// dont care to figure out why this happens cuz it doesnt seem to break anything + +GuildSettingsBansPane::GuildSettingsBansPane(Snowflake id) + : GuildID(id) + , m_menu_unban("Unban") + , m_menu_copy_id("Copy ID") + , m_model(Gtk::ListStore::create(m_columns)) { + set_name("guild-bans-pane"); + set_hexpand(true); + set_vexpand(true); + + auto &discord = Abaddon::Get().GetDiscordClient(); + + discord.signal_guild_ban_add().connect(sigc::mem_fun(*this, &GuildSettingsBansPane::OnBanAdd)); + discord.signal_guild_ban_remove().connect(sigc::mem_fun(*this, &GuildSettingsBansPane::OnBanRemove)); + + const auto self_id = discord.GetUserData().ID; + const auto can_ban = discord.HasGuildPermission(self_id, GuildID, Permission::BAN_MEMBERS); + + if (can_ban) { + discord.FetchGuildBans(id, sigc::mem_fun(*this, &GuildSettingsBansPane::OnGuildBansFetch)); + } else { + for (const auto &ban : discord.GetBansInGuild(id)) + OnGuildBanFetch(ban); + } + + m_menu_unban.signal_activate().connect(sigc::mem_fun(*this, &GuildSettingsBansPane::OnMenuUnban)); + m_menu_copy_id.signal_activate().connect(sigc::mem_fun(*this, &GuildSettingsBansPane::OnMenuCopyID)); + m_menu_unban.show(); + m_menu_copy_id.show(); + m_menu.append(m_menu_unban); + m_menu.append(m_menu_copy_id); + + m_view.signal_button_press_event().connect(sigc::mem_fun(*this, &GuildSettingsBansPane::OnTreeButtonPress), false); + m_view.show(); + add(m_view); + + m_view.set_model(m_model); + m_view.append_column("User", m_columns.m_col_user); + m_view.append_column("Reason", m_columns.m_col_reason); +} + +void GuildSettingsBansPane::OnGuildBanFetch(const BanData &ban) { + const auto user = Abaddon::Get().GetDiscordClient().GetUser(ban.User.ID); + auto &row = *m_model->append(); + row[m_columns.m_col_id] = ban.User.ID; + if (user.has_value()) + row[m_columns.m_col_user] = user->Username + "#" + user->Discriminator; + else + row[m_columns.m_col_user] = "<@" + std::to_string(ban.User.ID) + ">"; + + row[m_columns.m_col_reason] = ban.Reason; +} + +void GuildSettingsBansPane::OnGuildBansFetch(const std::vector<BanData> &bans) { + for (const auto &ban : bans) { + const auto user = Abaddon::Get().GetDiscordClient().GetUser(ban.User.ID); + auto &row = *m_model->append(); + row[m_columns.m_col_id] = user->ID; + row[m_columns.m_col_user] = user->Username + "#" + user->Discriminator; + row[m_columns.m_col_reason] = ban.Reason; + } +} + +void GuildSettingsBansPane::OnMenuUnban() { + auto selected_row = *m_view.get_selection()->get_selected(); + if (selected_row) { + Snowflake id = selected_row[m_columns.m_col_id]; + auto cb = [this](bool success) { + if (!success) { + Gtk::MessageDialog dlg("Failed to unban user", false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); + dlg.run(); + } + }; + Abaddon::Get().GetDiscordClient().UnbanUser(GuildID, id, sigc::track_obj(cb, *this)); + } +} + +void GuildSettingsBansPane::OnMenuCopyID() { + auto selected_row = *m_view.get_selection()->get_selected(); + if (selected_row) + Gtk::Clipboard::get()->set_text(std::to_string(static_cast<Snowflake>(selected_row[m_columns.m_col_id]))); +} + +bool GuildSettingsBansPane::OnTreeButtonPress(GdkEventButton *event) { + if (event->type == GDK_BUTTON_PRESS && event->button == GDK_BUTTON_SECONDARY) { + auto &discord = Abaddon::Get().GetDiscordClient(); + const auto self_id = discord.GetUserData().ID; + const auto can_ban = discord.HasGuildPermission(self_id, GuildID, Permission::BAN_MEMBERS); + m_menu_unban.set_sensitive(can_ban); + auto selection = m_view.get_selection(); + Gtk::TreeModel::Path path; + if (m_view.get_path_at_pos(event->x, event->y, path)) { + m_view.get_selection()->select(path); + m_menu.popup_at_pointer(reinterpret_cast<GdkEvent *>(event)); + } + + return true; + } + + return false; +} + +void GuildSettingsBansPane::OnBanRemove(Snowflake guild_id, Snowflake user_id) { + if (guild_id != GuildID) return; + for (auto &child : m_model->children()) { + if (static_cast<Snowflake>(child[m_columns.m_col_id]) == user_id) { + m_model->erase(child); + break; + } + } +} + +void GuildSettingsBansPane::OnBanAdd(Snowflake guild_id, Snowflake user_id) { + if (guild_id != GuildID) return; + auto &discord = Abaddon::Get().GetDiscordClient(); + if (discord.HasGuildPermission(discord.GetUserData().ID, guild_id, Permission::BAN_MEMBERS)) { + discord.FetchGuildBan(guild_id, user_id, sigc::mem_fun(*this, &GuildSettingsBansPane::OnGuildBanFetch)); + } else { + auto user = *discord.GetUser(user_id); + auto &row = *m_model->append(); + row[m_columns.m_col_id] = user_id; + row[m_columns.m_col_user] = user.Username + "#" + user.Discriminator; + row[m_columns.m_col_reason] = ""; + } +} + +GuildSettingsBansPane::ModelColumns::ModelColumns() { + add(m_col_id); + add(m_col_user); + add(m_col_reason); +} diff --git a/windows/guildsettings/banspane.hpp b/windows/guildsettings/banspane.hpp new file mode 100644 index 0000000..c3e1933 --- /dev/null +++ b/windows/guildsettings/banspane.hpp @@ -0,0 +1,38 @@ +#pragma once +#include <gtkmm.h> +#include "../../discord/snowflake.hpp" +#include "../../discord/ban.hpp" + +class GuildSettingsBansPane : public Gtk::ScrolledWindow { +public: + GuildSettingsBansPane(Snowflake id); + +private: + void OnGuildBanFetch(const BanData &ban); + void OnGuildBansFetch(const std::vector<BanData> &bans); + void OnMenuUnban(); + void OnMenuCopyID(); + bool OnTreeButtonPress(GdkEventButton *event); + void OnBanRemove(Snowflake guild_id, Snowflake user_id); + void OnBanAdd(Snowflake guild_id, Snowflake user_id); + + Gtk::TreeView m_view; + + Snowflake GuildID; + + class ModelColumns : public Gtk::TreeModel::ColumnRecord { + public: + ModelColumns(); + + Gtk::TreeModelColumn<Glib::ustring> m_col_user; + Gtk::TreeModelColumn<Glib::ustring> m_col_reason; + Gtk::TreeModelColumn<Snowflake> m_col_id; + }; + + ModelColumns m_columns; + Glib::RefPtr<Gtk::ListStore> m_model; + + Gtk::Menu m_menu; + Gtk::MenuItem m_menu_unban; + Gtk::MenuItem m_menu_copy_id; +}; diff --git a/windows/guildsettings/infopane.cpp b/windows/guildsettings/infopane.cpp index 862c082..7ab672d 100644 --- a/windows/guildsettings/infopane.cpp +++ b/windows/guildsettings/infopane.cpp @@ -12,10 +12,6 @@ GuildSettingsInfoPane::GuildSettingsInfoPane(Snowflake id) const auto can_modify = discord.HasGuildPermission(self_id, id, Permission::MANAGE_GUILD); set_name("guild-info-pane"); - set_margin_top(10); - set_margin_bottom(10); - set_margin_left(10); - set_margin_top(10); m_guild_name.set_sensitive(can_modify); m_guild_name.set_text(guild.Name); diff --git a/windows/guildsettingswindow.cpp b/windows/guildsettingswindow.cpp index 618bcf5..4672729 100644 --- a/windows/guildsettingswindow.cpp +++ b/windows/guildsettingswindow.cpp @@ -4,7 +4,8 @@ GuildSettingsWindow::GuildSettingsWindow(Snowflake id) : m_main(Gtk::ORIENTATION_VERTICAL) , GuildID(id) - , m_pane_info(id) { + , m_pane_info(id) + , m_pane_bans(id) { auto &discord = Abaddon::Get().GetDiscordClient(); const auto guild = *discord.GetGuild(id); @@ -34,8 +35,15 @@ GuildSettingsWindow::GuildSettingsWindow(Snowflake id) m_switcher.show(); m_pane_info.show(); + m_pane_bans.show(); + + m_stack.set_margin_top(10); + m_stack.set_margin_bottom(10); + m_stack.set_margin_left(10); + m_stack.set_margin_right(10); m_stack.add(m_pane_info, "info", "Info"); + m_stack.add(m_pane_bans, "bans", "Bans"); m_stack.show(); m_main.add(m_switcher); diff --git a/windows/guildsettingswindow.hpp b/windows/guildsettingswindow.hpp index 1904216..dc189fb 100644 --- a/windows/guildsettingswindow.hpp +++ b/windows/guildsettingswindow.hpp @@ -2,6 +2,7 @@ #include <gtkmm.h> #include "../discord/snowflake.hpp" #include "guildsettings/infopane.hpp" +#include "guildsettings/banspane.hpp" class GuildSettingsWindow : public Gtk::Window { public: @@ -13,6 +14,7 @@ private: Gtk::StackSwitcher m_switcher; GuildSettingsInfoPane m_pane_info; + GuildSettingsBansPane m_pane_bans; Snowflake GuildID; }; |