diff --git a/src/controllers/commands/commandcontroller.cpp b/src/controllers/commands/commandcontroller.cpp index 9b897f902..ef83da322 100644 --- a/src/controllers/commands/commandcontroller.cpp +++ b/src/controllers/commands/commandcontroller.cpp @@ -130,7 +130,7 @@ QString CommandController::execCommand(const QString &text, ChannelPtr channel, return ""; } - user->ignore(target, [channel](auto resultCode, const QString &message) { + user->ignore(target, [channel](const QString &message) { channel->addMessage(messages::Message::createSystemMessage(message)); }); @@ -147,7 +147,7 @@ QString CommandController::execCommand(const QString &text, ChannelPtr channel, return ""; } - user->unignore(target, [channel](auto resultCode, const QString &message) { + user->unignore(target, [channel](const QString &message) { channel->addMessage(messages::Message::createSystemMessage(message)); }); diff --git a/src/providers/twitch/twitchaccount.cpp b/src/providers/twitch/twitchaccount.cpp index c089a7c22..9a0788496 100644 --- a/src/providers/twitch/twitchaccount.cpp +++ b/src/providers/twitch/twitchaccount.cpp @@ -3,7 +3,6 @@ #include "const.hpp" #include "debug/log.hpp" #include "util/networkrequest.hpp" -#include "util/rapidjson-helpers.hpp" #include "util/urlfetch.hpp" namespace chatterino { @@ -119,138 +118,93 @@ void TwitchAccount::loadIgnores() } void TwitchAccount::ignore(const QString &targetName, - std::function onFinished) + std::function onFinished) { util::twitch::getUserID(targetName, QThread::currentThread(), [=](QString targetUserID) { - this->ignoreByID(targetUserID, targetName, onFinished); // - }); -} + QString url("https://api.twitch.tv/kraken/users/" + this->getUserId() + "/blocks/" + + targetUserID); -void TwitchAccount::ignoreByID(const QString &targetUserID, const QString &targetName, - std::function onFinished) -{ - QString url("https://api.twitch.tv/kraken/users/" + this->getUserId() + "/blocks/" + - targetUserID); + util::NetworkRequest req(url); + req.setRequestType(util::NetworkRequest::PutRequest); + req.setCaller(QThread::currentThread()); + req.makeAuthorizedV5(this->getOAuthClient(), this->getOAuthToken()); - util::NetworkRequest req(url); - req.setRequestType(util::NetworkRequest::PutRequest); - req.setCaller(QThread::currentThread()); - req.makeAuthorizedV5(this->getOAuthClient(), this->getOAuthToken()); + req.onError([=](int errorCode) { + onFinished("An unknown error occured while trying to ignore user " + targetName + " (" + + QString::number(errorCode) + ")"); - req.onError([=](int errorCode) { - onFinished(IgnoreResult_Failed, "An unknown error occured while trying to ignore user " + - targetName + " (" + QString::number(errorCode) + ")"); + return true; + }); - return true; - }); - - req.onSuccess([=](const rapidjson::Document &document) { - if (!document.IsObject()) { - onFinished(IgnoreResult_Failed, "Bad JSON data while ignoring user " + targetName); - return false; - } - - auto userIt = document.FindMember("user"); - if (userIt == document.MemberEnd()) { - onFinished(IgnoreResult_Failed, - "Bad JSON data while ignoring user (missing user) " + targetName); - return false; - } - - auto ignoredUser = TwitchUser::fromJSON(userIt->value); - { - std::lock_guard lock(this->ignoresMutex); - - auto res = this->ignores.insert(ignoredUser); - if (!res.second) { - const TwitchUser &existingUser = *(res.first); - existingUser.update(ignoredUser); - onFinished(IgnoreResult_AlreadyIgnored, - "User " + targetName + " is already ignored"); + req.onSuccess([=](const rapidjson::Document &document) { + if (!document.IsObject()) { + onFinished("Bad JSON data while ignoring user " + targetName); return false; } - } - onFinished(IgnoreResult_Success, "Successfully ignored user " + targetName); - return true; + auto userIt = document.FindMember("user"); + if (userIt == document.MemberEnd()) { + onFinished("Bad JSON data while ignoring user (missing user) " + targetName); + return false; + } + + auto ignoredUser = TwitchUser::fromJSON(userIt->value); + { + std::lock_guard lock(this->ignoresMutex); + + auto res = this->ignores.insert(ignoredUser); + if (!res.second) { + const TwitchUser &existingUser = *(res.first); + existingUser.update(ignoredUser); + onFinished("User " + targetName + " is already ignored"); + return false; + } + } + onFinished("Successfully ignored user " + targetName); + + return true; + }); + + req.execute(); }); - - req.execute(); } void TwitchAccount::unignore(const QString &targetName, - std::function onFinished) + std::function onFinished) { util::twitch::getUserID(targetName, QThread::currentThread(), [=](QString targetUserID) { - this->unignoreByID(targetUserID, targetName, onFinished); // + QString url("https://api.twitch.tv/kraken/users/" + this->getUserId() + "/blocks/" + + targetUserID); + + util::NetworkRequest req(url); + req.setRequestType(util::NetworkRequest::DeleteRequest); + req.setCaller(QThread::currentThread()); + req.makeAuthorizedV5(this->getOAuthClient(), this->getOAuthToken()); + + req.onError([=](int errorCode) { + onFinished("An unknown error occured while trying to unignore user " + targetName + + " (" + QString::number(errorCode) + ")"); + + return true; + }); + + req.onSuccess([=](const rapidjson::Document &document) { + TwitchUser ignoredUser; + ignoredUser.id = targetUserID; + { + std::lock_guard lock(this->ignoresMutex); + + this->ignores.erase(ignoredUser); + } + onFinished("Successfully unignored user " + targetName); + + return true; + }); + + req.execute(); }); } -void TwitchAccount::unignoreByID( - const QString &targetUserID, const QString &targetName, - std::function onFinished) -{ - QString url("https://api.twitch.tv/kraken/users/" + this->getUserId() + "/blocks/" + - targetUserID); - - util::NetworkRequest req(url); - req.setRequestType(util::NetworkRequest::DeleteRequest); - req.setCaller(QThread::currentThread()); - req.makeAuthorizedV5(this->getOAuthClient(), this->getOAuthToken()); - - req.onError([=](int errorCode) { - onFinished(UnignoreResult_Failed, - "An unknown error occured while trying to unignore user " + targetName + " (" + - QString::number(errorCode) + ")"); - - return true; - }); - - req.onSuccess([=](const rapidjson::Document &document) { - TwitchUser ignoredUser; - ignoredUser.id = targetUserID; - { - std::lock_guard lock(this->ignoresMutex); - - this->ignores.erase(ignoredUser); - } - onFinished(UnignoreResult_Success, "Successfully unignored user " + targetName); - - return true; - }); - - req.execute(); -} - -void TwitchAccount::checkFollow(const QString targetUserID, - std::function onFinished) -{ - QString url("https://api.twitch.tv/kraken/users/" + this->getUserId() + "/follows/channels/" + - targetUserID); - - util::NetworkRequest req(url); - req.setRequestType(util::NetworkRequest::GetRequest); - req.setCaller(QThread::currentThread()); - req.makeAuthorizedV5(this->getOAuthClient(), this->getOAuthToken()); - - req.onError([=](int errorCode) { - if (errorCode == 203) { - onFinished(FollowResult_NotFollowing); - } else { - onFinished(FollowResult_Failed); - } - - return true; - }); - - req.onSuccess([=](const rapidjson::Document &document) { - onFinished(FollowResult_Following); - return true; - }); - - req.execute(); -} - std::set TwitchAccount::getIgnores() const { std::lock_guard lock(this->ignoresMutex); diff --git a/src/providers/twitch/twitchaccount.hpp b/src/providers/twitch/twitchaccount.hpp index 649fd1f81..2f510c519 100644 --- a/src/providers/twitch/twitchaccount.hpp +++ b/src/providers/twitch/twitchaccount.hpp @@ -9,24 +9,6 @@ #include namespace chatterino { - -enum IgnoreResult { - IgnoreResult_Success, - IgnoreResult_AlreadyIgnored, - IgnoreResult_Failed, -}; - -enum UnignoreResult { - UnignoreResult_Success, - UnignoreResult_Failed, -}; - -enum FollowResult { - FollowResult_Following, - FollowResult_NotFollowing, - FollowResult_Failed, -}; - namespace providers { namespace twitch { @@ -55,17 +37,8 @@ public: bool isAnon() const; void loadIgnores(); - - void ignore(const QString &targetName, - std::function onFinished); - void ignoreByID(const QString &targetUserID, const QString &targetName, - std::function onFinished); - void unignore(const QString &targetName, - std::function onFinished); - void unignoreByID(const QString &targetUserID, const QString &targetName, - std::function onFinished); - - void checkFollow(const QString targetUserID, std::function onFinished); + void ignore(const QString &targetName, std::function onFinished); + void unignore(const QString &targetName, std::function onFinished); std::set getIgnores() const; diff --git a/src/util/networkrequest.hpp b/src/util/networkrequest.hpp index f1de1066d..2c9b158e5 100644 --- a/src/util/networkrequest.hpp +++ b/src/util/networkrequest.hpp @@ -372,7 +372,7 @@ private: QObject::connect(worker, &NetworkWorker::doneUrl, this->data.caller, [data = this->data](auto reply) mutable { if (reply->error() != QNetworkReply::NetworkError::NoError) { - data.onError(reply->error()); + // TODO: We might want to call an onError callback here return; } diff --git a/src/widgets/accountpopup.cpp b/src/widgets/accountpopup.cpp index 560aa9d34..5ba54a5bd 100644 --- a/src/widgets/accountpopup.cpp +++ b/src/widgets/accountpopup.cpp @@ -98,51 +98,32 @@ AccountPopupWidget::AccountPopupWidget(ChannelPtr _channel) "/follows/channels/" + this->popupWidgetUser.userID); this->ui->follow->setEnabled(false); - if (!this->relationship.isFollowing()) { + if (!this->relationship.following) { util::twitch::put(requestUrl, [this](QJsonObject obj) { qDebug() << "follows channel: " << obj; - this->relationship.setFollowing(true); + this->relationship.following = true; emit refreshButtons(); }); } else { util::twitch::sendDelete(requestUrl, [this] { - this->relationship.setFollowing(false); + this->relationship.following = false; emit refreshButtons(); }); } }); QObject::connect(this->ui->ignore, &QPushButton::clicked, this, [=]() { - auto currentUser = getApp()->accounts->Twitch.getCurrent(); + QUrl requestUrl("https://api.twitch.tv/kraken/users/" + this->loggedInUser.userID + + "/blocks/" + this->popupWidgetUser.userID); - if (!this->relationship.isIgnoring()) { - currentUser->ignoreByID(this->popupWidgetUser.userID, this->popupWidgetUser.username, - [=](auto result, const auto &message) { - switch (result) { - case IgnoreResult_Success: { - this->relationship.setIgnoring(true); - emit refreshButtons(); - } break; - case IgnoreResult_AlreadyIgnored: { - this->relationship.setIgnoring(true); - emit refreshButtons(); - } break; - case IgnoreResult_Failed: { - } break; - } - }); + if (!this->relationship.ignoring) { + util::twitch::put(requestUrl, [this](auto) { + this->relationship.ignoring = true; // + }); } else { - currentUser->unignoreByID(this->popupWidgetUser.userID, this->popupWidgetUser.username, - [=](auto result, const auto &message) { - switch (result) { - case UnignoreResult_Success: { - this->relationship.setIgnoring(false); - emit refreshButtons(); - } break; - case UnignoreResult_Failed: { - } break; - } - }); + util::twitch::sendDelete(requestUrl, [this] { + this->relationship.ignoring = false; // + }); } }); @@ -177,7 +158,8 @@ AccountPopupWidget::AccountPopupWidget(ChannelPtr _channel) void AccountPopupWidget::setName(const QString &name) { - this->relationship.reset(); + this->relationship.following = false; + this->relationship.ignoring = false; this->popupWidgetUser.username = name; this->ui->lblUsername->setText(name); @@ -224,24 +206,17 @@ void AccountPopupWidget::getUserData() this->loadAvatar(QUrl(obj.value("logo").toString())); }); - auto app = getApp(); - auto currentUser = app->accounts->Twitch.getCurrent(); + util::twitch::get("https://api.twitch.tv/kraken/users/" + this->loggedInUser.userID + + "/follows/channels/" + this->popupWidgetUser.userID, + this, [=](const QJsonObject &obj) { + this->ui->follow->setEnabled(true); + this->relationship.following = obj.contains("channel"); - currentUser->checkFollow(this->popupWidgetUser.userID, [=](auto result) { - this->relationship.setFollowing(result == FollowResult_Following); + emit refreshButtons(); + }); - emit refreshButtons(); - }); - - bool isIgnoring = false; - for (const auto &ignoredUser : currentUser->getIgnores()) { - if (this->popupWidgetUser.userID == ignoredUser.id) { - isIgnoring = true; - break; - } - } - this->relationship.setIgnoring(isIgnoring); - emit refreshButtons(); + // TODO: Get ignore relationship between logged in user and popup widget user and update + // relationship.ignoring } void AccountPopupWidget::loadAvatar(const QUrl &avatarUrl) @@ -352,24 +327,28 @@ void AccountPopupWidget::refreshLayouts() void AccountPopupWidget::actuallyRefreshButtons() { - if (this->relationship.isFollowingSet()) { - if (this->relationship.isFollowing()) { + if (this->relationship.following) { + if (this->ui->follow->text() != "Unfollow") { this->ui->follow->setText("Unfollow"); - } else { - this->ui->follow->setText("Follow"); + this->ui->follow->setEnabled(true); + } + } else { + if (this->ui->follow->text() != "Follow") { + this->ui->follow->setText("Follow"); + this->ui->follow->setEnabled(true); } - - this->ui->follow->setEnabled(true); } - if (this->relationship.isIgnoringSet()) { - if (this->relationship.isIgnoring()) { + if (this->relationship.ignoring) { + if (this->ui->ignore->text() != "Unignore") { this->ui->ignore->setText("Unignore"); - } else { - this->ui->ignore->setText("Ignore"); + this->ui->ignore->setEnabled(true); + } + } else { + if (this->ui->ignore->text() != "Ignore") { + this->ui->ignore->setText("Ignore"); + this->ui->ignore->setEnabled(true); } - - this->ui->ignore->setEnabled(true); } } @@ -389,7 +368,8 @@ void AccountPopupWidget::showEvent(QShowEvent *) this->popupWidgetUser.refreshUserType(this->channel, false); this->ui->follow->setEnabled(false); - this->ui->ignore->setEnabled(false); + // XXX: Uncomment when ignore/unignore is fully implemented + // this->ui->ignore->setEnabled(false); this->refreshButtons(); diff --git a/src/widgets/accountpopup.hpp b/src/widgets/accountpopup.hpp index 05d6ef0e6..f8fed98b2 100644 --- a/src/widgets/accountpopup.hpp +++ b/src/widgets/accountpopup.hpp @@ -71,53 +71,8 @@ private: User popupWidgetUser; struct { - void reset() - { - this->following = -1; - this->ignoring = -1; - } - - bool isFollowing() const - { - return this->following == 1; - } - - bool isFollowingSet() const - { - return this->following != -1; - } - - void setFollowing(bool newVal) - { - if (newVal) { - this->following = 1; - } else { - this->following = 0; - } - } - - bool isIgnoring() const - { - return this->ignoring == 1; - } - - bool isIgnoringSet() const - { - return this->ignoring != -1; - } - - void setIgnoring(bool newVal) - { - if (newVal) { - this->ignoring = 1; - } else { - this->ignoring = 0; - } - } - - private: - int following = -1; - int ignoring = -1; + bool following = false; + bool ignoring = false; } relationship; protected: