summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2020-12-18 01:13:31 -0500
committerouwou <26526779+ouwou@users.noreply.github.com>2020-12-18 01:13:31 -0500
commit3916a50bf9a7b49a77d7c76b1e41a7773a04f53f (patch)
treefaa5decb5593b27686c7c1d4ff1c37305d634b1f
parent776c350eb654c78a21a6163dcc82d802039c76e6 (diff)
downloadabaddon-portaudio-3916a50bf9a7b49a77d7c76b1e41a7773a04f53f.tar.gz
abaddon-portaudio-3916a50bf9a7b49a77d7c76b1e41a7773a04f53f.zip
add prefetch (default off)
-rw-r--r--abaddon.cpp11
-rw-r--r--components/chatmessage.cpp3
-rw-r--r--imgmanager.cpp4
-rw-r--r--imgmanager.hpp1
-rw-r--r--settings.cpp4
-rw-r--r--settings.hpp1
-rw-r--r--util.hpp28
7 files changed, 50 insertions, 2 deletions
diff --git a/abaddon.cpp b/abaddon.cpp
index 06dfab8..2fd6d39 100644
--- a/abaddon.cpp
+++ b/abaddon.cpp
@@ -37,6 +37,17 @@ Abaddon::Abaddon()
m_discord.signal_guild_update().connect(sigc::mem_fun(*this, &Abaddon::DiscordOnGuildUpdate));
m_discord.signal_reaction_add().connect(sigc::mem_fun(*this, &Abaddon::DiscordOnReactionAdd));
m_discord.signal_reaction_remove().connect(sigc::mem_fun(*this, &Abaddon::DiscordOnReactionRemove));
+ if (m_settings.GetPrefetch())
+ m_discord.signal_message_create().connect([this](Snowflake id) {
+ const auto msg = m_discord.GetMessage(id);
+ const auto author = m_discord.GetUser(msg->Author.ID);
+ if (author.has_value() && author->HasAvatar())
+ m_img_mgr.Prefetch(author->GetAvatarURL());
+ for (const auto &attachment : msg->Attachments) {
+ if (IsURLViewableImage(attachment.ProxyURL))
+ m_img_mgr.Prefetch(attachment.ProxyURL);
+ }
+ });
}
Abaddon::~Abaddon() {
diff --git a/components/chatmessage.cpp b/components/chatmessage.cpp
index 796c468..dc8d670 100644
--- a/components/chatmessage.cpp
+++ b/components/chatmessage.cpp
@@ -56,8 +56,7 @@ ChatMessageItemContainer *ChatMessageItemContainer::FromMessage(Snowflake id) {
// i dont think attachments can be edited
// also this can definitely be done much better holy shit
for (const auto &a : data->Attachments) {
- const auto last3 = a.ProxyURL.substr(a.ProxyURL.length() - 3);
- if (last3 == "png" || last3 == "jpg") {
+ if (IsURLViewableImage(a.ProxyURL)) {
auto *widget = container->CreateImageComponent(a);
container->m_main->add(*widget);
} else {
diff --git a/imgmanager.cpp b/imgmanager.cpp
index 4cd9e66..218c9ca 100644
--- a/imgmanager.cpp
+++ b/imgmanager.cpp
@@ -41,6 +41,10 @@ void ImageManager::LoadFromURL(std::string url, callback_type cb) {
});
}
+void ImageManager::Prefetch(std::string url) {
+ m_cache.GetFileFromURL(url, [](const auto &) {});
+}
+
void ImageManager::RunCallbacks() {
m_cb_mutex.lock();
m_cb_queue.front()();
diff --git a/imgmanager.hpp b/imgmanager.hpp
index c7e2119..46d8ab3 100644
--- a/imgmanager.hpp
+++ b/imgmanager.hpp
@@ -14,6 +14,7 @@ public:
Cache &GetCache();
void LoadFromURL(std::string url, callback_type cb);
+ void Prefetch(std::string url);
Glib::RefPtr<Gdk::Pixbuf> GetFromURLIfCached(std::string url);
Glib::RefPtr<Gdk::Pixbuf> GetPlaceholder(int size);
diff --git a/settings.cpp b/settings.cpp
index e5ecd52..8736d15 100644
--- a/settings.cpp
+++ b/settings.cpp
@@ -61,3 +61,7 @@ std::string SettingsManager::GetLinkColor() const {
int SettingsManager::GetCacheHTTPConcurrency() const {
return GetSettingInt("http", "concurrent", 10);
}
+
+bool SettingsManager::GetPrefetch() const {
+ return GetSettingBool("discord", "prefetch", false);
+}
diff --git a/settings.hpp b/settings.hpp
index c2a292d..a656ac9 100644
--- a/settings.hpp
+++ b/settings.hpp
@@ -15,6 +15,7 @@ public:
bool GetShowEmojis() const;
std::string GetLinkColor() const;
int GetCacheHTTPConcurrency() const;
+ bool GetPrefetch() const;
bool IsValid() const;
diff --git a/util.hpp b/util.hpp
index 2d455c4..3d8ea20 100644
--- a/util.hpp
+++ b/util.hpp
@@ -184,3 +184,31 @@ inline void AddWidgetMenuHandler(Gtk::Widget *widget, Gtk::Menu &menu) {
}, false);
// clang-format on
}
+
+inline std::vector<std::string> StringSplit(const std::string &str, const char *delim) {
+ std::vector<std::string> parts;
+ char *token = std::strtok(const_cast<char *>(str.c_str()), delim);
+ while (token != nullptr) {
+ parts.push_back(token);
+ token = std::strtok(nullptr, delim);
+ }
+ return parts;
+}
+
+inline std::string GetExtension(std::string url) {
+ url = StringSplit(url, "?")[0];
+ url = StringSplit(url, "/").back();
+ return url.find(".") != std::string::npos ? url.substr(url.find_last_of(".")) : "";
+}
+
+inline bool IsURLViewableImage(const std::string &url) {
+ const auto ext = GetExtension(url);
+ static const char *exts[] = { ".jpeg",
+ ".jpg",
+ ".png", nullptr };
+ const char *str = ext.c_str();
+ for (int i = 0; exts[i] != nullptr; i++)
+ if (strcmp(str, exts[i]) == 0)
+ return true;
+ return false;
+}