diff options
author | ouwou <26526779+ouwou@users.noreply.github.com> | 2021-01-21 23:49:42 -0500 |
---|---|---|
committer | ouwou <26526779+ouwou@users.noreply.github.com> | 2021-01-21 23:49:42 -0500 |
commit | 547124c94f8808d6dca407af7b6eb0d29ac12e45 (patch) | |
tree | ef79ad6ee56c6e4e294f5b946803558b592bbe59 /windows | |
parent | 7b6fb861acc395a913180d8e8d2d3d503a1cf2fc (diff) | |
download | abaddon-portaudio-547124c94f8808d6dca407af7b6eb0d29ac12e45.tar.gz abaddon-portaudio-547124c94f8808d6dca407af7b6eb0d29ac12e45.zip |
view and delete invites, more tweaking
Diffstat (limited to 'windows')
-rw-r--r-- | windows/guildsettings/invitespane.cpp | 127 | ||||
-rw-r--r-- | windows/guildsettings/invitespane.hpp | 39 | ||||
-rw-r--r-- | windows/guildsettingswindow.cpp | 7 | ||||
-rw-r--r-- | windows/guildsettingswindow.hpp | 2 |
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; }; |