summaryrefslogtreecommitdiff
path: root/windows
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2021-01-21 23:49:42 -0500
committerouwou <26526779+ouwou@users.noreply.github.com>2021-01-21 23:49:42 -0500
commit547124c94f8808d6dca407af7b6eb0d29ac12e45 (patch)
treeef79ad6ee56c6e4e294f5b946803558b592bbe59 /windows
parent7b6fb861acc395a913180d8e8d2d3d503a1cf2fc (diff)
downloadabaddon-portaudio-547124c94f8808d6dca407af7b6eb0d29ac12e45.tar.gz
abaddon-portaudio-547124c94f8808d6dca407af7b6eb0d29ac12e45.zip
view and delete invites, more tweaking
Diffstat (limited to 'windows')
-rw-r--r--windows/guildsettings/invitespane.cpp127
-rw-r--r--windows/guildsettings/invitespane.hpp39
-rw-r--r--windows/guildsettingswindow.cpp7
-rw-r--r--windows/guildsettingswindow.hpp2
4 files changed, 174 insertions, 1 deletions
diff --git a/windows/guildsettings/invitespane.cpp b/windows/guildsettings/invitespane.cpp
new file mode 100644
index 0000000..a47460f
--- /dev/null
+++ b/windows/guildsettings/invitespane.cpp
@@ -0,0 +1,127 @@
+#include "invitespane.hpp"
+#include "../../abaddon.hpp"
+
+GuildSettingsInvitesPane::GuildSettingsInvitesPane(Snowflake id)
+ : GuildID(id)
+ , m_model(Gtk::ListStore::create(m_columns))
+ , m_menu_delete("Delete") {
+ set_name("guild-invites-pane");
+ set_hexpand(true);
+ set_vexpand(true);
+
+ m_view.signal_button_press_event().connect(sigc::mem_fun(*this, &GuildSettingsInvitesPane::OnTreeButtonPress), false);
+
+ m_menu_delete.signal_activate().connect(sigc::mem_fun(*this, &GuildSettingsInvitesPane::OnMenuDelete));
+ m_menu.append(m_menu_delete);
+ m_menu.show_all();
+
+ auto &discord = Abaddon::Get().GetDiscordClient();
+ const auto self_id = discord.GetUserData().ID;
+
+ if (discord.HasGuildPermission(self_id, GuildID, Permission::MANAGE_GUILD))
+ discord.FetchGuildInvites(GuildID, sigc::mem_fun(*this, &GuildSettingsInvitesPane::OnInvitesFetch));
+
+ discord.signal_invite_create().connect(sigc::mem_fun(*this, &GuildSettingsInvitesPane::OnInviteCreate));
+ discord.signal_invite_delete().connect(sigc::mem_fun(*this, &GuildSettingsInvitesPane::OnInviteDelete));
+
+ m_view.show();
+ add(m_view);
+
+ m_view.set_model(m_model);
+ m_view.append_column("Code", m_columns.m_col_code);
+ m_view.append_column("Expires", m_columns.m_col_expires);
+ m_view.append_column("Created by", m_columns.m_col_inviter);
+ m_view.append_column("Uses", m_columns.m_col_uses);
+ m_view.append_column("Max uses", m_columns.m_col_max_uses);
+ m_view.append_column("Grants temporary membership", m_columns.m_col_temporary);
+
+ for (const auto column : m_view.get_columns())
+ column->set_resizable(true);
+}
+
+void GuildSettingsInvitesPane::AppendInvite(const InviteData &invite) {
+ auto &discord = Abaddon::Get().GetDiscordClient();
+ auto &row = *m_model->append();
+ row[m_columns.m_col_code] = invite.Code;
+ if (invite.Inviter.has_value())
+ row[m_columns.m_col_inviter] = invite.Inviter->Username + "#" + invite.Inviter->Discriminator;
+
+ if (invite.MaxAge.has_value())
+ if (*invite.MaxAge == 0)
+ row[m_columns.m_col_expires] = "Never";
+ else
+ row[m_columns.m_col_expires] = FormatISO8601(*invite.CreatedAt, *invite.MaxAge);
+
+ row[m_columns.m_col_uses] = *invite.Uses;
+ if (*invite.MaxUses == 0)
+ row[m_columns.m_col_max_uses] = "Unlimited";
+ else
+ row[m_columns.m_col_max_uses] = std::to_string(*invite.MaxUses);
+
+ row[m_columns.m_col_temporary] = *invite.IsTemporary ? "Yes" : "No";
+}
+
+void GuildSettingsInvitesPane::OnInviteFetch(const std::optional<InviteData> &invite) {
+ if (!invite.has_value()) return;
+ AppendInvite(*invite);
+}
+
+void GuildSettingsInvitesPane::OnInvitesFetch(const std::vector<InviteData> &invites) {
+ auto &discord = Abaddon::Get().GetDiscordClient();
+ for (const auto &invite : invites)
+ AppendInvite(invite);
+}
+
+void GuildSettingsInvitesPane::OnInviteCreate(const InviteData &invite) {
+ if (invite.Guild->ID == GuildID)
+ OnInviteFetch(std::make_optional(invite));
+}
+
+void GuildSettingsInvitesPane::OnInviteDelete(const InviteDeleteObject &data) {
+ if (*data.GuildID == GuildID)
+ for (auto &row : m_model->children())
+ if (row[m_columns.m_col_code] == data.Code)
+ m_model->erase(row);
+}
+
+void GuildSettingsInvitesPane::OnMenuDelete() {
+ auto selected_row = *m_view.get_selection()->get_selected();
+ if (selected_row) {
+ auto code = static_cast<Glib::ustring>(selected_row[m_columns.m_col_code]);
+ auto cb = [this](const bool success) {
+ if (!success) {
+ Gtk::MessageDialog dlg("Failed to delete invite", false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true);
+ dlg.run();
+ }
+ };
+ Abaddon::Get().GetDiscordClient().DeleteInvite(code, sigc::track_obj(cb, *this));
+ }
+}
+
+bool GuildSettingsInvitesPane::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_manage = discord.HasGuildPermission(self_id, GuildID, Permission::MANAGE_GUILD);
+ m_menu_delete.set_sensitive(can_manage);
+ 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;
+}
+
+GuildSettingsInvitesPane::ModelColumns::ModelColumns() {
+ add(m_col_code);
+ add(m_col_expires);
+ add(m_col_inviter);
+ add(m_col_temporary);
+ add(m_col_uses);
+ add(m_col_max_uses);
+}
diff --git a/windows/guildsettings/invitespane.hpp b/windows/guildsettings/invitespane.hpp
new file mode 100644
index 0000000..c32f194
--- /dev/null
+++ b/windows/guildsettings/invitespane.hpp
@@ -0,0 +1,39 @@
+#pragma once
+#include <gtkmm.h>
+#include "../../discord/objects.hpp"
+
+class GuildSettingsInvitesPane : public Gtk::ScrolledWindow {
+public:
+ GuildSettingsInvitesPane(Snowflake id);
+
+private:
+ void AppendInvite(const InviteData &invite);
+ void OnInviteFetch(const std::optional<InviteData> &invite);
+ void OnInvitesFetch(const std::vector<InviteData> &invites);
+ void OnInviteCreate(const InviteData &invite);
+ void OnInviteDelete(const InviteDeleteObject &data);
+ void OnMenuDelete();
+ bool OnTreeButtonPress(GdkEventButton *event);
+
+ Gtk::TreeView m_view;
+
+ Snowflake GuildID;
+
+ class ModelColumns : public Gtk::TreeModel::ColumnRecord {
+ public:
+ ModelColumns();
+
+ Gtk::TreeModelColumn<Glib::ustring> m_col_code;
+ Gtk::TreeModelColumn<Glib::ustring> m_col_expires;
+ Gtk::TreeModelColumn<Glib::ustring> m_col_inviter;
+ Gtk::TreeModelColumn<Glib::ustring> m_col_temporary;
+ Gtk::TreeModelColumn<int> m_col_uses;
+ Gtk::TreeModelColumn<Glib::ustring> m_col_max_uses;
+ };
+
+ ModelColumns m_columns;
+ Glib::RefPtr<Gtk::ListStore> m_model;
+
+ Gtk::Menu m_menu;
+ Gtk::MenuItem m_menu_delete;
+};
diff --git a/windows/guildsettingswindow.cpp b/windows/guildsettingswindow.cpp
index 4672729..2124a0e 100644
--- a/windows/guildsettingswindow.cpp
+++ b/windows/guildsettingswindow.cpp
@@ -5,7 +5,8 @@ GuildSettingsWindow::GuildSettingsWindow(Snowflake id)
: m_main(Gtk::ORIENTATION_VERTICAL)
, GuildID(id)
, m_pane_info(id)
- , m_pane_bans(id) {
+ , m_pane_bans(id)
+ , m_pane_invites(id) {
auto &discord = Abaddon::Get().GetDiscordClient();
const auto guild = *discord.GetGuild(id);
@@ -36,7 +37,10 @@ GuildSettingsWindow::GuildSettingsWindow(Snowflake id)
m_pane_info.show();
m_pane_bans.show();
+ m_pane_invites.show();
+ m_stack.set_transition_duration(100);
+ m_stack.set_transition_type(Gtk::STACK_TRANSITION_TYPE_CROSSFADE);
m_stack.set_margin_top(10);
m_stack.set_margin_bottom(10);
m_stack.set_margin_left(10);
@@ -44,6 +48,7 @@ GuildSettingsWindow::GuildSettingsWindow(Snowflake id)
m_stack.add(m_pane_info, "info", "Info");
m_stack.add(m_pane_bans, "bans", "Bans");
+ m_stack.add(m_pane_invites, "invites", "Invites");
m_stack.show();
m_main.add(m_switcher);
diff --git a/windows/guildsettingswindow.hpp b/windows/guildsettingswindow.hpp
index dc189fb..811c937 100644
--- a/windows/guildsettingswindow.hpp
+++ b/windows/guildsettingswindow.hpp
@@ -3,6 +3,7 @@
#include "../discord/snowflake.hpp"
#include "guildsettings/infopane.hpp"
#include "guildsettings/banspane.hpp"
+#include "guildsettings/invitespane.hpp"
class GuildSettingsWindow : public Gtk::Window {
public:
@@ -15,6 +16,7 @@ private:
GuildSettingsInfoPane m_pane_info;
GuildSettingsBansPane m_pane_bans;
+ GuildSettingsInvitesPane m_pane_invites;
Snowflake GuildID;
};