summary refs log tree commit diff
path: root/src/timeline/PresenceEmitter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/timeline/PresenceEmitter.cpp')
-rw-r--r--src/timeline/PresenceEmitter.cpp73
1 files changed, 73 insertions, 0 deletions
diff --git a/src/timeline/PresenceEmitter.cpp b/src/timeline/PresenceEmitter.cpp
new file mode 100644

index 00000000..c052bf43 --- /dev/null +++ b/src/timeline/PresenceEmitter.cpp
@@ -0,0 +1,73 @@ +#include "PresenceEmitter.h" + +#include <QCache> +#include <Utils.h> + +#include "Cache.h" + +namespace { +struct CacheEntry +{ + QString status; + mtx::presence::PresenceState state; +}; +} + +static QCache<QString, CacheEntry> presences; + +static QString +presenceToStr(mtx::presence::PresenceState state) +{ + switch (state) { + case mtx::presence::PresenceState::offline: + return QStringLiteral("offline"); + case mtx::presence::PresenceState::unavailable: + return QStringLiteral("unavailable"); + case mtx::presence::PresenceState::online: + default: + return QStringLiteral("online"); + } +} + +static CacheEntry * +pullPresence(const QString &id) +{ + auto p = cache::presence(id.toStdString()); + auto c = new CacheEntry{ + utils::replaceEmoji(QString::fromStdString(p.status_msg).toHtmlEscaped()), p.presence}; + presences.insert(id, c); + return c; +} + +void +PresenceEmitter::sync( + const std::vector<mtx::events::Event<mtx::events::presence::Presence>> &presences_) +{ + for (const auto &p : presences_) { + auto id = QString::fromStdString(p.sender); + presences.remove(id); + emit presenceChanged(std::move(id)); + } +} + +QString +PresenceEmitter::userPresence(QString id) const +{ + if (id.isEmpty()) + return {}; + else if (auto p = presences[id]) + return presenceToStr(p->state); + else + return presenceToStr(pullPresence(id)->state); +} + +QString +PresenceEmitter::userStatus(QString id) const +{ + if (id.isEmpty()) + return {}; + else if (auto p = presences[id]) + return p->status; + else + return pullPresence(id)->status; +}