summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2023-03-16 21:15:56 -0400
committerouwou <26526779+ouwou@users.noreply.github.com>2023-03-16 21:15:56 -0400
commit02f7bfefe3185a38f8935b31c68857b986d709ac (patch)
tree37e481cd52e13bf864ac88dca5a6943cc7ac4585
parentb83bf2a622ecfb667cc89909ebae9180ed5ac117 (diff)
downloadabaddon-portaudio-02f7bfefe3185a38f8935b31c68857b986d709ac.tar.gz
abaddon-portaudio-02f7bfefe3185a38f8935b31c68857b986d709ac.zip
withdraw notifications on channel open
-rw-r--r--src/abaddon.cpp2
-rw-r--r--src/notifications/notifications.cpp15
-rw-r--r--src/notifications/notifications.hpp4
-rw-r--r--src/notifications/notifier.hpp3
-rw-r--r--src/notifications/notifier_gio.cpp8
-rw-r--r--src/notifications/notifier_null.cpp4
6 files changed, 30 insertions, 6 deletions
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 <map>
+#include <vector>
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<Snowflake, std::vector<Snowflake>> 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) {}