From 2de99ca9f5491e1e5964efa183dd0ce37cdaec46 Mon Sep 17 00:00:00 2001 From: apa420 Date: Sat, 11 Aug 2018 16:11:51 +0200 Subject: [PATCH] update, should now be working Toasts for splitheader channels --- .../notifications/NotificationController.cpp | 13 +- src/singletons/Toasts.cpp | 120 ++++++++++++++++-- src/singletons/Toasts.hpp | 6 +- 3 files changed, 126 insertions(+), 13 deletions(-) diff --git a/src/controllers/notifications/NotificationController.cpp b/src/controllers/notifications/NotificationController.cpp index bd6d87de0..3dcd13901 100644 --- a/src/controllers/notifications/NotificationController.cpp +++ b/src/controllers/notifications/NotificationController.cpp @@ -36,6 +36,12 @@ void NotificationController::updateChannelNotification( bool NotificationController::isChannelNotified(const QString &channelName) { + for (std::vector::size_type i = 0; + i != notificationVector.getVector().size(); i++) { + qDebug() << notificationVector.getVector()[i] + << " vector to the left channel to the right " << channelName + << " vectorsize:" << notificationVector.getVector().size(); + } for (std::vector::size_type i = 0; i != notificationVector.getVector().size(); i++) { if (notificationVector.getVector()[i] == channelName) { @@ -44,7 +50,7 @@ bool NotificationController::isChannelNotified(const QString &channelName) } return false; } - +/* class CustomHandler : public WinToastLib::IWinToastHandler { public: @@ -85,7 +91,7 @@ public: } } }; - +*/ void NotificationController::addChannelNotification(const QString &channelName) { notificationVector.appendItem(channelName); @@ -93,7 +99,7 @@ void NotificationController::addChannelNotification(const QString &channelName) if (WinToastLib::WinToast::isCompatible()) { QDir dir; qDebug() << "NaM" << dir.absolutePath(); - ; + /* WinToastLib::WinToastTemplate templ = WinToastLib::WinToastTemplate( WinToastLib::WinToastTemplate::ImageAndText02); @@ -111,6 +117,7 @@ void NotificationController::addChannelNotification(const QString &channelName) WinToastLib::WinToast::instance()->initialize(); WinToastLib::WinToast::instance()->showToast(templ, new CustomHandler()); + */ } } diff --git a/src/singletons/Toasts.cpp b/src/singletons/Toasts.cpp index ed39b7791..e49bdccf6 100644 --- a/src/singletons/Toasts.cpp +++ b/src/singletons/Toasts.cpp @@ -5,6 +5,13 @@ #include "providers/twitch/TwitchChannel.hpp" #include "providers/twitch/TwitchServer.hpp" +#include + +#include +#include + +#include + namespace chatterino { Toasts::Toasts() @@ -13,15 +20,21 @@ Toasts::Toasts() void Toasts::initialize(Settings &settings, Paths &paths) { - getApp()->twitch2->forEachChannel([](ChannelPtr chn) { + getApp()->twitch2->forEachChannel([this](ChannelPtr chn) { auto twchn = dynamic_cast(chn.get()); - twchn->liveStatusChanged.connect([twchn]() { + twchn->liveStatusChanged.connect([twchn, this]() { const auto streamStatus = twchn->accessStreamStatus(); if (streamStatus->live) { - // to Live - getApp()->toasts->updateLiveChannels(twchn->getName()); + // is live + if (getApp()->notifications->isChannelNotified( + twchn->getName()) && + !wasChannelLive(twchn->getName())) { + sendChannelNotification(twchn->getName()); + } + updateLiveChannels(twchn->getName()); } else { - // to Offline + // is Offline + removeFromLiveChannels(twchn->getName()); } }); }); @@ -29,14 +42,21 @@ void Toasts::initialize(Settings &settings, Paths &paths) void Toasts::updateLiveChannels(const QString &channelName) { - if (wasChannelLive(channelName)) { - return; - } else { + if (!wasChannelLive(channelName)) { std::lock_guard lock(mutex_); liveChannels.push_back(channelName); } } +void Toasts::removeFromLiveChannels(const QString &channelName) +{ + if (wasChannelLive(channelName)) { + std::lock_guard lock(mutex_); + liveChannels.erase( + std::find(liveChannels.begin(), liveChannels.end(), channelName)); + } +} + bool Toasts::wasChannelLive(const QString &channelName) { std::lock_guard lock(mutex_); @@ -47,10 +67,92 @@ bool Toasts::wasChannelLive(const QString &channelName) } return false; } + void Toasts::sendChannelNotification(const QString &channelName) { +#ifdef Q_OS_WIN + if (WinToastLib::WinToast::isCompatible()) { + sendWindowsNotification(channelName); + } +#endif + // OSX + + // LINUX } -void Toasts:: +#ifdef Q_OS_WIN + +class CustomHandler : public WinToastLib::IWinToastHandler +{ +public: + void toastActivated() const + { + std::wcout << L"The user clicked in this toast" << std::endl; + QString link = "http://www.google.com"; + QDesktopServices::openUrl(QUrl(link)); + } + + void toastActivated(int actionIndex) const + { + // std::wcout << L"The user clicked on button #" << actionIndex + // << L" in this toast" << std::endl; + } + + void toastFailed() const + { + // std::wcout << L"Error showing current toast" << std::endl; + } + void toastDismissed(WinToastDismissalReason state) const + { + switch (state) { + case UserCanceled: + // std::wcout << L"The user dismissed this toast" << std::endl; + break; + case ApplicationHidden: + /* + std::wcout << L"The application hid the toast using " + L"ToastNotifier.hide()" + << std::endl; + */ + break; + case TimedOut: + // std::wcout << L"The toast has timed out" << std::endl; + break; + default: + // std::wcout << L"Toast not activated" << std::endl; + break; + } + } +}; + +void Toasts::sendWindowsNotification(const QString &channelName) +{ + WinToastLib::WinToastTemplate templ = WinToastLib::WinToastTemplate( + WinToastLib::WinToastTemplate::ImageAndText02); + QString str = channelName + " has just gone live!"; + std::string utf8_text = str.toUtf8().constData(); + std::wstring widestr = std::wstring(utf8_text.begin(), utf8_text.end()); + + templ.setTextField(widestr, WinToastLib::WinToastTemplate::FirstLine); + templ.setTextField(L"Click here to open in browser", + WinToastLib::WinToastTemplate::SecondLine); + WinToastLib::WinToast::instance()->setAppName(L"Chatterino2"); + int mbstowcs(wchar_t * aumi_version, const char *CHATTERINO_VERSION, + size_t size); + std::string(CHATTERINO_VERSION); + std::wstring aumi_version = + std::wstring(CHATTERINO_VERSION.begin(), CHATTERINO_VERSION.end()); + // int mbstowcs(wchar_t *out, const char *in, size_t size); + /* +std::wstring aumi_version = +std::wstring(std::string(CHATTERINO_VERSION).begin(), + std::string(CHATTERINO_VERSION).end());*/ + WinToastLib::WinToast::instance()->setAppUserModelId( + WinToastLib::WinToast::configureAUMI(L"", L"Chatterino 2", L"", + aumi_version)); + WinToastLib::WinToast::instance()->initialize(); + WinToastLib::WinToast::instance()->showToast(templ, new CustomHandler()); +} +#endif } // namespace chatterino diff --git a/src/singletons/Toasts.hpp b/src/singletons/Toasts.hpp index 75eeae90a..c47728dc0 100644 --- a/src/singletons/Toasts.hpp +++ b/src/singletons/Toasts.hpp @@ -12,12 +12,16 @@ class Toasts final : public Singleton public: Toasts(); virtual void initialize(Settings &settings, Paths &paths) override final; + +private: void updateLiveChannels(const QString &channelName); void removeFromLiveChannels(const QString &channelName); -private: bool wasChannelLive(const QString &channelName); + + void shouldChannelBeNotified(const QString &channelName); void sendChannelNotification(const QString &channelName); + void sendWindowsNotification(const QString &channelName); std::vector liveChannels; std::mutex mutex_; };