diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/user.cpp | 28 | ||||
-rw-r--r-- | lib/user.h | 11 |
2 files changed, 38 insertions, 1 deletions
diff --git a/lib/user.cpp b/lib/user.cpp index 17db5760..fdb82a38 100644 --- a/lib/user.cpp +++ b/lib/user.cpp @@ -33,6 +33,9 @@ #include <QtCore/QStringBuilder> #include <QtCore/QElapsedTimer> +#include <QtCore/QCryptographicHash> +#include <QtCore/QtEndian> + #include <functional> using namespace QMatrixClient; @@ -47,8 +50,21 @@ class User::Private return Avatar(move(url)); } + qreal makeHueF(QString userId) + { + QByteArray hash = QCryptographicHash::hash(userId.toUtf8(), + QCryptographicHash::Sha1); + QDataStream dataStream(qToLittleEndian(hash).left(2)); + dataStream.setByteOrder(QDataStream::LittleEndian); + quint16 hashValue; + dataStream >> hashValue; + qreal hueF = static_cast<qreal>(hashValue)/std::numeric_limits<quint16>::max(); + Q_ASSERT((0 <= hueF) && (hueF <= 1)); + return hueF; + } + Private(QString userId, Connection* connection) - : userId(move(userId)), connection(connection) + : userId(move(userId)), connection(connection), hueF(makeHueF(userId)) { } QString userId; @@ -57,6 +73,7 @@ class User::Private QString bridged; QString mostUsedName; QMultiHash<QString, const Room*> otherNames; + qreal hueF; Avatar mostUsedAvatar { makeAvatar({}) }; std::vector<Avatar> otherAvatars; auto otherAvatar(const QUrl& url) @@ -222,6 +239,11 @@ bool User::isGuest() const return *it == ':'; } +int User::hue() const +{ + return int(hueF()*359); +} + QString User::name(const Room* room) const { return d->nameForRoom(room); @@ -428,3 +450,7 @@ void User::processEvent(const RoomMemberEvent& event, const Room* room, updateAvatarUrl(event.avatarUrl(), d->avatarUrlForRoom(room), room); } } + +qreal User::hueF() const { + return d->hueF; +} @@ -33,6 +33,8 @@ namespace QMatrixClient Q_OBJECT Q_PROPERTY(QString id READ id CONSTANT) Q_PROPERTY(bool isGuest READ isGuest CONSTANT) + Q_PROPERTY(int hue READ hue CONSTANT) + Q_PROPERTY(qreal hueF READ hueF CONSTANT) Q_PROPERTY(QString name READ name NOTIFY nameChanged) Q_PROPERTY(QString displayName READ displayname NOTIFY nameChanged STORED false) Q_PROPERTY(QString fullName READ fullName NOTIFY nameChanged STORED false) @@ -95,6 +97,15 @@ namespace QMatrixClient */ bool isGuest() const; + /** Hue color component of this user based on id. + * The implementation is based on XEP-0392: + * https://xmpp.org/extensions/xep-0392.html + * Naming and ranges are the same as QColor's hue methods: + * https://doc.qt.io/qt-5/qcolor.html#integer-vs-floating-point-precision + */ + int hue() const; + qreal hueF() const; + const Avatar& avatarObject(const Room* room = nullptr) const; Q_INVOKABLE QImage avatar(int dimension, const Room* room = nullptr); Q_INVOKABLE QImage avatar(int requestedWidth, int requestedHeight, |