summaryrefslogtreecommitdiff
path: root/windows
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2021-01-20 02:08:48 -0500
committerouwou <26526779+ouwou@users.noreply.github.com>2021-01-20 02:08:48 -0500
commita010aa11a559ba22c94dd3426fd1f313ee0ac667 (patch)
treee5fafac18da04f1c7f6bf7722ec71c428eaba250 /windows
parent5d1db982cbbb375427b9c4475d5e347c5702b6df (diff)
downloadabaddon-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.cpp136
-rw-r--r--windows/guildsettings/banspane.hpp38
-rw-r--r--windows/guildsettings/infopane.cpp4
-rw-r--r--windows/guildsettingswindow.cpp10
-rw-r--r--windows/guildsettingswindow.hpp2
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;
};