Update presence dynamically and reduce allocations
This commit is contained in:
parent
4428388b3f
commit
9a9dbda571
11 changed files with 145 additions and 79 deletions
73
src/timeline/PresenceEmitter.cpp
Normal file
73
src/timeline/PresenceEmitter.cpp
Normal file
|
|
@ -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;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue