forked from OpenGamers/abaddon
add bans to guild settings, tweak some other things
This commit is contained in:
136
windows/guildsettings/banspane.cpp
Normal file
136
windows/guildsettings/banspane.cpp
Normal file
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user