forked from mirror/nheko
parent
707248fea3
commit
64f204d984
@ -0,0 +1,85 @@ |
|||||||
|
import QtQuick 2.9 |
||||||
|
import QtQuick.Controls 2.3 |
||||||
|
import QtQuick.Layouts 1.2 |
||||||
|
import QtQuick.Window 2.3 |
||||||
|
|
||||||
|
ApplicationWindow{ |
||||||
|
property var user_data |
||||||
|
property var colors: currentActivePalette |
||||||
|
|
||||||
|
id:userProfileDialog |
||||||
|
height: 500 |
||||||
|
width: 500 |
||||||
|
modality:Qt.WindowModal |
||||||
|
Layout.alignment: Qt.AlignHCenter |
||||||
|
palette: colors |
||||||
|
|
||||||
|
onAfterRendering: { |
||||||
|
userProfileAvatar.url = chat.model.avatarUrl(user_data.userId).replace("mxc://", "image://MxcImage/") |
||||||
|
userProfileName.text = user_data.userName |
||||||
|
matrixUserID.text = user_data.userId |
||||||
|
console.log("this is happening"); |
||||||
|
} |
||||||
|
|
||||||
|
background: Item{ |
||||||
|
id: userProfileItem |
||||||
|
width: userProfileDialog.width |
||||||
|
height: userProfileDialog.height |
||||||
|
anchors.margins: { |
||||||
|
top:20 |
||||||
|
} |
||||||
|
|
||||||
|
ColumnLayout{ |
||||||
|
anchors.fill: userProfileItem |
||||||
|
width: userProfileDialog.width |
||||||
|
spacing: 10 |
||||||
|
|
||||||
|
Avatar{ |
||||||
|
id: userProfileAvatar |
||||||
|
height: 130 |
||||||
|
width: 130 |
||||||
|
displayName: modelData.userName |
||||||
|
Layout.alignment: Qt.AlignHCenter |
||||||
|
} |
||||||
|
|
||||||
|
Label{ |
||||||
|
id: userProfileName |
||||||
|
fontSizeMode: Text.HorizontalFit |
||||||
|
Layout.alignment: Qt.AlignHCenter |
||||||
|
} |
||||||
|
|
||||||
|
Label{ |
||||||
|
id: matrixUserID |
||||||
|
fontSizeMode: Text.HorizontalFit |
||||||
|
Layout.alignment: Qt.AlignHCenter |
||||||
|
} |
||||||
|
|
||||||
|
ScrollView { |
||||||
|
implicitHeight: userProfileDialog.height/2+20 |
||||||
|
implicitWidth: userProfileDialog.width-20 |
||||||
|
clip: true |
||||||
|
Layout.alignment: Qt.AlignHCenter |
||||||
|
ScrollBar.horizontal.policy: ScrollBar.AlwaysOn |
||||||
|
ScrollBar.vertical.policy: ScrollBar.AlwaysOn |
||||||
|
|
||||||
|
Label { |
||||||
|
text: "ABC" |
||||||
|
font.pixelSize: 700 |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
Button{ |
||||||
|
text:"OK" |
||||||
|
onClicked: userProfileDialog.close() |
||||||
|
anchors.margins: { |
||||||
|
right:10 |
||||||
|
bottom:10 |
||||||
|
} |
||||||
|
|
||||||
|
Layout.alignment: Qt.AlignRight | Qt.AlignBottom |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
Item { Layout.fillHeight: true } |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,58 @@ |
|||||||
|
#include "UserProfile.h" |
||||||
|
#include "Logging.h" |
||||||
|
#include "MatrixClient.h" |
||||||
|
#include "Utils.h" |
||||||
|
|
||||||
|
UserProfile::UserProfile(QObject *parent) |
||||||
|
: QObject(parent) |
||||||
|
{} |
||||||
|
|
||||||
|
QMap<QString, QString> |
||||||
|
UserProfile::getDeviceList() |
||||||
|
{ |
||||||
|
return this->deviceList; |
||||||
|
} |
||||||
|
|
||||||
|
void |
||||||
|
UserProfile::fetchDeviceList(const QString &userId) |
||||||
|
{ |
||||||
|
auto localUser = utils::localUser(); |
||||||
|
mtx::requests::QueryKeys req; |
||||||
|
req.device_keys[userId.toStdString()] = {}; |
||||||
|
|
||||||
|
http::client()->query_keys( |
||||||
|
req, |
||||||
|
[user_id = userId.toStdString()](const mtx::responses::QueryKeys &res, |
||||||
|
mtx::http::RequestErr err) { |
||||||
|
if (err) { |
||||||
|
nhlog::net()->warn("failed to query device keys: {} {}", |
||||||
|
err->matrix_error.error, |
||||||
|
static_cast<int>(err->status_code)); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
if (res.device_keys.empty() || |
||||||
|
(res.device_keys.find(user_id) == res.device_keys.end())) { |
||||||
|
nhlog::net()->warn("no devices retrieved {}", user_id); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
auto devices = res.device_keys.at(user_id); |
||||||
|
|
||||||
|
std::vector<DeviceInfo> deviceInfo; |
||||||
|
for (const auto &d : devices) { |
||||||
|
auto device = d.second; |
||||||
|
|
||||||
|
// TODO: Verify signatures and ignore those that don't pass.
|
||||||
|
deviceInfo.emplace_back(DeviceInfo{ |
||||||
|
QString::fromStdString(d.first), |
||||||
|
QString::fromStdString(device.unsigned_info.device_display_name)}); |
||||||
|
} |
||||||
|
|
||||||
|
std::sort(deviceInfo.begin(), |
||||||
|
deviceInfo.end(), |
||||||
|
[](const DeviceInfo &a, const DeviceInfo &b) { |
||||||
|
return a.device_id > b.device_id; |
||||||
|
}); |
||||||
|
}); |
||||||
|
} |
@ -0,0 +1,29 @@ |
|||||||
|
#pragma once |
||||||
|
|
||||||
|
#include <QMap> |
||||||
|
#include <QObject> |
||||||
|
#include <QString> |
||||||
|
|
||||||
|
struct DeviceInfo |
||||||
|
{ |
||||||
|
QString device_id; |
||||||
|
QString display_name; |
||||||
|
}; |
||||||
|
|
||||||
|
class UserProfile : public QObject |
||||||
|
{ |
||||||
|
Q_OBJECT |
||||||
|
Q_PROPERTY(QMap deviceList READ getDeviceList NOTIFY DeviceListUpdated) |
||||||
|
|
||||||
|
public: |
||||||
|
explicit UserProfile(QObject *parent = 0); |
||||||
|
QMap<QString, QString> getDeviceList(); |
||||||
|
|
||||||
|
Q_INVOKABLE void fetchDeviceList(const QString &userID); |
||||||
|
|
||||||
|
signals: |
||||||
|
void DeviceListUpdated(); |
||||||
|
|
||||||
|
private: |
||||||
|
QMap<QString, QString> deviceList; |
||||||
|
}; |
Loading…
Reference in new issue