diff --git a/forms/accountpopupform.ui b/forms/accountpopupform.ui index 8ce31e364..1e816a144 100644 --- a/forms/accountpopupform.ui +++ b/forms/accountpopupform.ui @@ -6,8 +6,8 @@ 0 0 - 400 - 131 + 317 + 145 @@ -19,60 +19,72 @@ AccountPopup + + + - - - - Purge - - - - Views + Views: - 420 + Loading... - Followers + Followers: - 69 + Loading... - Account Age + Created at: - 6 years + Loading... + + + + + 100 + 100 + + + + Loading... + + + true + + + @@ -91,7 +103,7 @@ - USERNAME + Loading... @@ -110,13 +122,6 @@ - - - - AVATAR - - - diff --git a/src/messages/messagebuilder.cpp b/src/messages/messagebuilder.cpp index 03df558cc..ccf3b0453 100644 --- a/src/messages/messagebuilder.cpp +++ b/src/messages/messagebuilder.cpp @@ -10,7 +10,7 @@ MessageBuilder::MessageBuilder() : _words() { _parseTime = std::chrono::system_clock::now(); - regex.setPattern("[[:ascii:]]*\\.[A-Z]+"); + regex.setPattern("[[:ascii:]]*\\.[A-Z]+\/[[:ascii:]]+"); regex.setPatternOptions(QRegularExpression::CaseInsensitiveOption); } diff --git a/src/widgets/accountpopup.cpp b/src/widgets/accountpopup.cpp index ae38c5879..e792e7214 100644 --- a/src/widgets/accountpopup.cpp +++ b/src/widgets/accountpopup.cpp @@ -3,6 +3,12 @@ #include "ui_accountpopupform.h" #include +#include +#include +#include +#include +#include +#include namespace chatterino { namespace widgets { @@ -22,20 +28,119 @@ AccountPopupWidget::AccountPopupWidget(std::shared_ptr &channel) connect(_ui->btnClose, &QPushButton::clicked, [=]() { hide(); // }); - - connect(_ui->btnPurge, &QPushButton::clicked, [=]() { - qDebug() << "xD: " << _channel->name; - printf("Channel pointer in dialog: %p\n", _channel.get()); - - //_channel->sendMessage(QString(".timeout %1 0").arg(_ui->lblUsername->text())); - _channel->sendMessage("xD"); - }); } void AccountPopupWidget::setName(const QString &name) { _ui->lblUsername->setText(name); + getUserId(); } +void AccountPopupWidget::getUserId() +{ + QUrl nameUrl("https://api.twitch.tv/kraken/users?login=" + _ui->lblUsername->text()); + + QNetworkRequest req(nameUrl); + req.setRawHeader(QByteArray("Accept"),QByteArray("application/vnd.twitchtv.v5+json")); + req.setRawHeader(QByteArray("Client-ID"),QByteArray("7ue61iz46fz11y3cugd0l3tawb4taal")); + + static auto manager = new QNetworkAccessManager(); + auto *reply = manager->get(req); + + QObject::connect(reply,&QNetworkReply::finished,this,[=] + { + if(reply->error() == QNetworkReply::NoError){ + auto doc = QJsonDocument::fromJson(reply->readAll()); + auto obj = doc.object(); + auto array = obj.value("users").toArray(); + + userID = array.at(0).toObject().value("_id").toString(); + + getUserData(); + } + }); + +} + +void AccountPopupWidget::getUserData() +{ + QUrl idUrl("https://api.twitch.tv/kraken/channels/" + userID); + + QNetworkRequest req(idUrl); + req.setRawHeader(QByteArray("Accept"),QByteArray("application/vnd.twitchtv.v5+json")); + req.setRawHeader(QByteArray("Client-ID"),QByteArray("7ue61iz46fz11y3cugd0l3tawb4taal")); + + static auto manager = new QNetworkAccessManager(); + auto *reply = manager->get(req); + + QObject::connect(reply,&QNetworkReply::finished,this,[=] + { + if(reply->error() == QNetworkReply::NoError){ + auto doc = QJsonDocument::fromJson(reply->readAll()); + auto obj = doc.object(); + + _ui->lblFollowers->setText(QString::number(obj.value("followers").toInt())); + _ui->lblViews->setText(QString::number(obj.value("views").toInt())); + _ui->lblAccountAge->setText(obj.value("created_at").toString().section("T",0,0)); + + loadAvatar(QUrl(obj.value("logo").toString())); + } + else + { + _ui->lblFollowers->setText("ERROR"); + _ui->lblViews->setText("ERROR"); + _ui->lblAccountAge->setText("ERROR"); + } + }); +} + +void AccountPopupWidget::loadAvatar(const QUrl &avatarUrl) +{ + if(!avatarMap.tryGet(userID,this->avatar)) + { + if(!avatarUrl.isEmpty()) + { + QNetworkRequest req(avatarUrl); + static auto manager = new QNetworkAccessManager(); + auto *reply = manager->get(req); + + QObject::connect(reply,&QNetworkReply::finished,this,[=] + { + if(reply->error() == QNetworkReply::NoError) + { + const auto data = reply->readAll(); + this->avatar.loadFromData(data); + this->avatarMap.insert(userID,avatar); + _ui->lblAvatar->setPixmap(avatar); + } + else + { + _ui->lblAvatar->setText("ERROR"); + } + }); + } + else + { + _ui->lblAvatar->setText("No Avatar"); + } + } + else + { + _ui->lblAvatar->setPixmap(this->avatar); + } +} + +void AccountPopupWidget::focusOutEvent(QFocusEvent *event) +{ + hide(); + + _ui->lblFollowers->setText("Loading..."); + _ui->lblViews->setText("Loading..."); + _ui->lblAccountAge->setText("Loading..."); + _ui->lblUsername->setText("Loading..."); + _ui->lblAvatar->setText("Loading..."); +} + + } // namespace widgets } // namespace chatterino diff --git a/src/widgets/accountpopup.hpp b/src/widgets/accountpopup.hpp index b5f177107..07b77b166 100644 --- a/src/widgets/accountpopup.hpp +++ b/src/widgets/accountpopup.hpp @@ -1,4 +1,5 @@ #pragma once +#include "concurrentmap.hpp" #include @@ -25,7 +26,19 @@ public: private: Ui::AccountPopup *_ui; + void getUserId(); + void getUserData(); + void loadAvatar(const QUrl &avatarUrl); + std::shared_ptr &_channel; + + QString userID; + QPixmap avatar; + + ConcurrentMap avatarMap; + +protected: + virtual void focusOutEvent(QFocusEvent *event) override; }; } // namespace widgets diff --git a/src/widgets/chatwidgetview.cpp b/src/widgets/chatwidgetview.cpp index ce6cf8cb2..6c82c5977 100644 --- a/src/widgets/chatwidgetview.cpp +++ b/src/widgets/chatwidgetview.cpp @@ -383,7 +383,7 @@ void ChatWidgetView::mouseReleaseEvent(QMouseEvent *event) switch (link.getType()) { case messages::Link::UserInfo: { - auto user = message->getMessage()->getUserName(); + auto user = link.getValue(); this->userPopupWidget.setName(user); this->userPopupWidget.move(event->screenPos().toPoint()); this->userPopupWidget.show();