From 02f7bfefe3185a38f8935b31c68857b986d709ac Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Thu, 16 Mar 2023 21:15:56 -0400 Subject: withdraw notifications on channel open --- src/abaddon.cpp | 2 ++ src/notifications/notifications.cpp | 15 +++++++++++++-- src/notifications/notifications.hpp | 4 ++++ src/notifications/notifier.hpp | 3 ++- src/notifications/notifier_gio.cpp | 8 ++++++-- src/notifications/notifier_null.cpp | 4 +++- 6 files changed, 30 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/abaddon.cpp b/src/abaddon.cpp index 200183b..e234520 100644 --- a/src/abaddon.cpp +++ b/src/abaddon.cpp @@ -733,6 +733,8 @@ void Abaddon::ActionChannelOpened(Snowflake id, bool expand_to) { } if (id == m_main_window->GetChatActiveChannel()) return; + m_notifications.WithdrawChannel(id); + m_main_window->GetChatWindow()->SetTopic(""); const auto channel = m_discord.GetChannel(id); diff --git a/src/notifications/notifications.cpp b/src/notifications/notifications.cpp index fc7a2d6..5b834ce 100644 --- a/src/notifications/notifications.cpp +++ b/src/notifications/notifications.cpp @@ -99,12 +99,23 @@ void Notifications::CheckMessage(const Message &message) { // notify messages in DMs const auto channel = discord.GetChannel(message.ChannelID); if (channel->IsDM()) { + m_chan_notifications[message.ChannelID].push_back(message.ID); NotifyMessageDM(message); } else if (CheckGuildMessage(message)) { + m_chan_notifications[message.ChannelID].push_back(message.ID); NotifyMessageGuild(message); } } +void Notifications::WithdrawChannel(Snowflake channel_id) { + if (auto it = m_chan_notifications.find(channel_id); it != m_chan_notifications.end()) { + for (const auto notification_id : it->second) { + m_notifier.Withdraw(std::to_string(notification_id)); + } + it->second.clear(); + } +} + Glib::ustring Sanitize(const Message &message) { auto buf = Gtk::TextBuffer::create(); Gtk::TextBuffer::iterator begin, end; @@ -123,7 +134,7 @@ void Notifications::NotifyMessageDM(const Message &message) { const auto body = Sanitize(message); Abaddon::Get().GetImageManager().GetCache().GetFileFromURL(message.Author.GetAvatarURL("png", "64"), [=](const std::string &path) { - m_notifier.Notify(title, body, default_action, path); + m_notifier.Notify(std::to_string(message.ID), title, body, default_action, path); }); } @@ -146,7 +157,7 @@ void Notifications::NotifyMessageGuild(const Message &message) { } const auto body = Sanitize(message); Abaddon::Get().GetImageManager().GetCache().GetFileFromURL(message.Author.GetAvatarURL("png", "64"), [=](const std::string &path) { - m_notifier.Notify(title, body, default_action, path); + m_notifier.Notify(std::to_string(message.ID), title, body, default_action, path); }); } diff --git a/src/notifications/notifications.hpp b/src/notifications/notifications.hpp index 5498938..b4ea584 100644 --- a/src/notifications/notifications.hpp +++ b/src/notifications/notifications.hpp @@ -1,5 +1,7 @@ #pragma once #include "notifier.hpp" +#include +#include class Message; @@ -8,6 +10,7 @@ public: Notifications(); void CheckMessage(const Message &message); + void WithdrawChannel(Snowflake channel_id); private: void NotifyMessageDM(const Message &message); @@ -16,4 +19,5 @@ private: [[nodiscard]] bool IsDND() const; Notifier m_notifier; + std::map> m_chan_notifications; }; diff --git a/src/notifications/notifier.hpp b/src/notifications/notifier.hpp index bed7495..cd3eb71 100644 --- a/src/notifications/notifier.hpp +++ b/src/notifications/notifier.hpp @@ -11,7 +11,8 @@ public: Notifier(); ~Notifier(); - void Notify(const Glib::ustring &title, const Glib::ustring &text, const Glib::ustring &default_action, const std::string &icon_path); + void Notify(const Glib::ustring &id, const Glib::ustring &title, const Glib::ustring &text, const Glib::ustring &default_action, const std::string &icon_path); + void Withdraw(const Glib::ustring &id); private: #ifdef ENABLE_NOTIFICATION_SOUNDS diff --git a/src/notifications/notifier_gio.cpp b/src/notifications/notifier_gio.cpp index e5335d0..ed17ad1 100644 --- a/src/notifications/notifier_gio.cpp +++ b/src/notifications/notifier_gio.cpp @@ -18,7 +18,7 @@ Notifier::~Notifier() { #endif } -void Notifier::Notify(const Glib::ustring &title, const Glib::ustring &text, const Glib::ustring &default_action, const std::string &icon_path) { +void Notifier::Notify(const Glib::ustring &id, const Glib::ustring &title, const Glib::ustring &text, const Glib::ustring &default_action, const std::string &icon_path) { auto n = Gio::Notification::create(title); n->set_body(text); n->set_default_action(default_action); @@ -29,7 +29,7 @@ void Notifier::Notify(const Glib::ustring &title, const Glib::ustring &text, con auto *icon = g_file_icon_new(file); g_notification_set_icon(n->gobj(), icon); - Abaddon::Get().GetApp()->send_notification(n); + Abaddon::Get().GetApp()->send_notification(id, n); g_object_unref(icon); g_object_unref(file); @@ -38,3 +38,7 @@ void Notifier::Notify(const Glib::ustring &title, const Glib::ustring &text, con ma_engine_play_sound(&m_engine, Abaddon::Get().GetResPath("/sound/message.mp3").c_str(), nullptr); #endif } + +void Notifier::Withdraw(const Glib::ustring &id) { + Abaddon::Get().GetApp()->withdraw_notification(id); +} diff --git a/src/notifications/notifier_null.cpp b/src/notifications/notifier_null.cpp index 356d04d..1da99fd 100644 --- a/src/notifications/notifier_null.cpp +++ b/src/notifications/notifier_null.cpp @@ -4,4 +4,6 @@ Notifier::Notifier() {} Notifier::~Notifier() {} -void Notifier::Notify(const Glib::ustring &title, const Glib::ustring &text, const Glib::ustring &default_action, const std::string &icon_path) {} +void Notifier::Notify(const Glib::ustring &id, const Glib::ustring &title, const Glib::ustring &text, const Glib::ustring &default_action, const std::string &icon_path) {} + +void Notifier::Withdraw(const Glib::ustring &id) {} -- cgit v1.2.3