From e166c83d33bbf5aebe172111c8a7614c1dece48c Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Fri, 11 Jun 2021 01:24:23 -0400 Subject: basic pins window --- abaddon.cpp | 10 ++++++++++ abaddon.hpp | 1 + discord/discord.cpp | 12 ++++++++++++ discord/discord.hpp | 2 ++ windows/mainwindow.cpp | 15 +++++++++++++++ windows/mainwindow.hpp | 4 ++++ windows/pinnedwindow.cpp | 32 ++++++++++++++++++++++++++++++++ windows/pinnedwindow.hpp | 20 ++++++++++++++++++++ 8 files changed, 96 insertions(+) create mode 100644 windows/pinnedwindow.cpp create mode 100644 windows/pinnedwindow.hpp diff --git a/abaddon.cpp b/abaddon.cpp index da7bf90..27091e2 100644 --- a/abaddon.cpp +++ b/abaddon.cpp @@ -14,6 +14,7 @@ #include "abaddon.hpp" #include "windows/guildsettingswindow.hpp" #include "windows/profilewindow.hpp" +#include "windows/pinnedwindow.hpp" #ifdef _WIN32 #pragma comment(lib, "crypt32.lib") @@ -99,6 +100,7 @@ int Abaddon::StartGTK() { m_main_window->signal_action_set_status().connect(sigc::mem_fun(*this, &Abaddon::ActionSetStatus)); m_main_window->signal_action_reload_settings().connect(sigc::mem_fun(*this, &Abaddon::ActionReloadSettings)); m_main_window->signal_action_add_recipient().connect(sigc::mem_fun(*this, &Abaddon::ActionAddRecipient)); + m_main_window->signal_action_view_pins().connect(sigc::mem_fun(*this, &Abaddon::ActionViewPins)); m_main_window->GetChannelList()->signal_action_channel_item_select().connect(sigc::mem_fun(*this, &Abaddon::ActionChannelOpened)); m_main_window->GetChannelList()->signal_action_guild_leave().connect(sigc::mem_fun(*this, &Abaddon::ActionLeaveGuild)); @@ -625,6 +627,14 @@ void Abaddon::ActionAddRecipient(Snowflake channel_id) { } } +void Abaddon::ActionViewPins(Snowflake channel_id) { + const auto data = m_discord.GetChannel(channel_id); + if (!data.has_value()) return; + auto window = new PinnedWindow(*data); + ManageHeapWindow(window); + window->show(); +} + bool Abaddon::ShowConfirm(const Glib::ustring &prompt, Gtk::Window *window) { ConfirmDialog dlg(window != nullptr ? *window : *m_main_window); dlg.SetConfirmText(prompt); diff --git a/abaddon.hpp b/abaddon.hpp index bee8e75..47cd3d9 100644 --- a/abaddon.hpp +++ b/abaddon.hpp @@ -47,6 +47,7 @@ public: void ActionReactionRemove(Snowflake id, const Glib::ustring ¶m); void ActionGuildSettings(Snowflake id); void ActionAddRecipient(Snowflake channel_id); + void ActionViewPins(Snowflake channel_id); bool ShowConfirm(const Glib::ustring &prompt, Gtk::Window *window = nullptr); diff --git a/discord/discord.cpp b/discord/discord.cpp index 3c5baed..b11120a 100644 --- a/discord/discord.cpp +++ b/discord/discord.cpp @@ -710,6 +710,18 @@ void DiscordClient::PutRelationship(Snowflake id, sigc::slot, DiscordError code)> callback) { + m_http.MakeGET("/channels/" + std::to_string(id) + "/pins", [this, callback](const http::response_type &response) { + if (!CheckCode(response)) { + callback({}, GetCodeFromResponse(response)); + return; + } + + auto data = nlohmann::json::parse(response.text).get>(); + callback(std::move(data), DiscordError::NONE); + }); +} + bool DiscordClient::CanModifyRole(Snowflake guild_id, Snowflake role_id, Snowflake user_id) const { const auto guild = *GetGuild(guild_id); if (guild.OwnerID == user_id) return true; diff --git a/discord/discord.hpp b/discord/discord.hpp index a3f72ba..28f7fb6 100644 --- a/discord/discord.hpp +++ b/discord/discord.hpp @@ -170,6 +170,8 @@ public: void SetUserNote(Snowflake user_id, std::string note, sigc::slot callback); void FetchUserRelationships(Snowflake user_id, sigc::slot)> callback); + void FetchPinned(Snowflake id, sigc::slot, DiscordError code)> callback); + void GetVerificationGateInfo(Snowflake guild_id, sigc::slot)> callback); void AcceptVerificationGate(Snowflake guild_id, VerificationGateInfoObject info, sigc::slot callback); diff --git a/windows/mainwindow.cpp b/windows/mainwindow.cpp index cbf91d9..4d6a1dc 100644 --- a/windows/mainwindow.cpp +++ b/windows/mainwindow.cpp @@ -42,7 +42,9 @@ MainWindow::MainWindow() m_menu_view.set_label("View"); m_menu_view.set_submenu(m_menu_view_sub); m_menu_view_friends.set_label("Friends"); + m_menu_view_pins.set_label("Pins"); m_menu_view_sub.append(m_menu_view_friends); + m_menu_view_sub.append(m_menu_view_pins); m_menu_view_sub.signal_popped_up().connect(sigc::mem_fun(*this, &MainWindow::OnViewSubmenuPopup)); m_menu_bar.append(m_menu_file); @@ -92,6 +94,10 @@ MainWindow::MainWindow() m_content_stack.set_visible_child("friends"); }); + m_menu_view_pins.signal_activate().connect([this] { + m_signal_action_view_pins.emit(GetChatActiveChannel()); + }); + m_content_box.set_hexpand(true); m_content_box.set_vexpand(true); m_content_box.show(); @@ -263,6 +269,11 @@ void MainWindow::OnDiscordSubmenuPopup(const Gdk::Rectangle *flipped_rect, const void MainWindow::OnViewSubmenuPopup(const Gdk::Rectangle *flipped_rect, const Gdk::Rectangle *final_rect, bool flipped_x, bool flipped_y) { m_menu_view_friends.set_sensitive(Abaddon::Get().GetDiscordClient().IsStarted()); + auto channel_id = GetChatActiveChannel(); + auto channel = Abaddon::Get().GetDiscordClient().GetChannel(channel_id); + m_menu_view_pins.set_sensitive(false); + if (channel.has_value()) + m_menu_view_pins.set_sensitive(channel->Type == ChannelType::GUILD_TEXT); } ChannelList *MainWindow::GetChannelList() { @@ -308,3 +319,7 @@ MainWindow::type_signal_action_reload_settings MainWindow::signal_action_reload_ MainWindow::type_signal_action_add_recipient MainWindow::signal_action_add_recipient() { return m_signal_action_add_recipient; } + +MainWindow::type_signal_action_view_pins MainWindow::signal_action_view_pins() { + return m_signal_action_view_pins; +} diff --git a/windows/mainwindow.hpp b/windows/mainwindow.hpp index 30fd3de..25c1acb 100644 --- a/windows/mainwindow.hpp +++ b/windows/mainwindow.hpp @@ -43,6 +43,7 @@ public: typedef sigc::signal type_signal_action_set_status; typedef sigc::signal type_signal_action_reload_settings; typedef sigc::signal type_signal_action_add_recipient; // channel id + typedef sigc::signal type_signal_action_view_pins; // channel id type_signal_action_connect signal_action_connect(); type_signal_action_disconnect signal_action_disconnect(); @@ -52,6 +53,7 @@ public: type_signal_action_set_status signal_action_set_status(); type_signal_action_reload_settings signal_action_reload_settings(); type_signal_action_add_recipient signal_action_add_recipient(); + type_signal_action_view_pins signal_action_view_pins(); protected: type_signal_action_connect m_signal_action_connect; @@ -62,6 +64,7 @@ protected: type_signal_action_set_status m_signal_action_set_status; type_signal_action_reload_settings m_signal_action_reload_settings; type_signal_action_add_recipient m_signal_action_add_recipient; + type_signal_action_view_pins m_signal_action_view_pins; protected: Gtk::Box m_main_box; @@ -96,5 +99,6 @@ protected: Gtk::MenuItem m_menu_view; Gtk::Menu m_menu_view_sub; Gtk::MenuItem m_menu_view_friends; + Gtk::MenuItem m_menu_view_pins; void OnViewSubmenuPopup(const Gdk::Rectangle *flipped_rect, const Gdk::Rectangle *final_rect, bool flipped_x, bool flipped_y); }; diff --git a/windows/pinnedwindow.cpp b/windows/pinnedwindow.cpp new file mode 100644 index 0000000..0d677ee --- /dev/null +++ b/windows/pinnedwindow.cpp @@ -0,0 +1,32 @@ +#include "pinnedwindow.hpp" +#include "../abaddon.hpp" + +PinnedWindow::PinnedWindow(const ChannelData &data) + : ChannelID(data.ID) { + if (data.GuildID.has_value()) + GuildID = *data.GuildID; + + set_name("pinned-messages"); + set_default_size(450, 375); + set_title("#" + *data.Name + " - Pinned Messages"); + set_position(Gtk::WIN_POS_CENTER); + get_style_context()->add_class("app-window"); + get_style_context()->add_class("app-popup"); + get_style_context()->add_class("pinned-messages-window"); + + add(m_chat); + m_chat.show(); + + m_chat.SetActiveChannel(ChannelID); + + FetchPinned(); +} + +void PinnedWindow::FetchPinned() { + Abaddon::Get().GetDiscordClient().FetchPinned(ChannelID, sigc::mem_fun(*this, &PinnedWindow::OnFetchedPinned)); +} + +void PinnedWindow::OnFetchedPinned(const std::vector &msgs, DiscordError code) { + if (code != DiscordError::NONE) return; + m_chat.SetMessages(msgs.begin(), msgs.end()); +} diff --git a/windows/pinnedwindow.hpp b/windows/pinnedwindow.hpp new file mode 100644 index 0000000..a118876 --- /dev/null +++ b/windows/pinnedwindow.hpp @@ -0,0 +1,20 @@ +#pragma once +#include +#include "../discord/errors.hpp" +#include "../discord/channel.hpp" +#include "../discord/message.hpp" +#include "../components/chatlist.hpp" + +class PinnedWindow : public Gtk::Window { +public: + PinnedWindow(const ChannelData &data); + + Snowflake GuildID; + Snowflake ChannelID; + +private: + void FetchPinned(); + void OnFetchedPinned(const std::vector &msgs, DiscordError code); + + ChatList m_chat; +}; -- cgit v1.2.3