mirror-chatterino2/src/accountmanager.cpp

134 lines
3.7 KiB
C++
Raw Normal View History

2017-06-11 09:31:45 +02:00
#include "accountmanager.hpp"
#include "common.hpp"
#include "debug/log.hpp"
2017-04-14 17:52:22 +02:00
namespace chatterino {
2017-04-12 17:46:44 +02:00
namespace {
inline QString getEnvString(const char *target)
{
char *val = std::getenv(target);
if (val == nullptr) {
return QString();
}
return QString(val);
}
} // namespace
std::shared_ptr<twitch::TwitchUser> TwitchAccountManager::getCurrent()
2017-04-12 17:46:44 +02:00
{
if (!this->currentUser) {
return this->anonymousUser;
}
return this->currentUser;
2017-04-12 17:46:44 +02:00
}
std::vector<QString> TwitchAccountManager::getUsernames() const
{
std::vector<QString> userNames;
std::lock_guard<std::mutex> lock(this->mutex);
2017-09-24 18:14:22 +02:00
for (const auto &user : this->users) {
userNames.push_back(user->getUserName());
}
return userNames;
}
std::shared_ptr<twitch::TwitchUser> TwitchAccountManager::findUserByUsername(
const QString &username) const
{
std::lock_guard<std::mutex> lock(this->mutex);
for (const auto &user : this->users) {
if (username.compare(user->getUserName(), Qt::CaseInsensitive) == 0) {
return user;
2017-09-24 18:14:22 +02:00
}
}
return nullptr;
}
bool TwitchAccountManager::userExists(const QString &username) const
2017-04-12 17:46:44 +02:00
{
return this->findUserByUsername(username) != nullptr;
2017-04-12 17:46:44 +02:00
}
2017-04-13 16:06:23 +02:00
bool TwitchAccountManager::addUser(std::shared_ptr<twitch::TwitchUser> user)
{
if (this->userExists(user->getNickName())) {
// User already exists in user list
return false;
}
std::lock_guard<std::mutex> lock(this->mutex);
this->users.push_back(user);
return true;
}
AccountManager::AccountManager()
{
this->Twitch.anonymousUser.reset(new twitch::TwitchUser("justinfan64537", "", ""));
this->Twitch.currentUsername.getValueChangedSignal().connect([this](const auto &newValue) {
QString newUsername(QString::fromStdString(newValue));
auto user = this->Twitch.findUserByUsername(newUsername);
if (user) {
debug::Log("[AccountManager:currentUsernameChanged] User successfully updated to {}",
newUsername);
// XXX: Should we set the user regardless if the username is found or not?
// I can see the logic in setting it to nullptr if the `currentUsername` value has been
// set to "" or an invalid username
this->Twitch.currentUser = user;
this->Twitch.userChanged.invoke();
}
});
}
void AccountManager::load()
2017-04-13 16:06:23 +02:00
{
auto keys = pajlada::Settings::SettingManager::getObjectKeys("/accounts");
2017-06-11 12:00:53 +02:00
for (const auto &uid : keys) {
if (uid == "current") {
continue;
}
2017-04-13 16:06:23 +02:00
std::string username =
pajlada::Settings::Setting<std::string>::get("/accounts/" + uid + "/username");
std::string userID =
pajlada::Settings::Setting<std::string>::get("/accounts/" + uid + "/userID");
std::string clientID =
pajlada::Settings::Setting<std::string>::get("/accounts/" + uid + "/clientID");
std::string oauthToken =
pajlada::Settings::Setting<std::string>::get("/accounts/" + uid + "/oauthToken");
2017-04-13 16:06:23 +02:00
if (username.empty() || userID.empty() || clientID.empty() || oauthToken.empty()) {
continue;
2017-04-13 16:06:23 +02:00
}
auto user =
std::make_shared<twitch::TwitchUser>(qS(username), qS(oauthToken), qS(clientID));
2017-04-13 16:06:23 +02:00
this->Twitch.addUser(user);
2017-04-13 16:06:23 +02:00
printf("Adding user %s(%s)\n", username.c_str(), userID.c_str());
}
auto currentUser = this->Twitch.findUserByUsername(
QString::fromStdString(this->Twitch.currentUsername.getValue()));
if (currentUser) {
this->Twitch.currentUser = currentUser;
this->Twitch.userChanged.invoke();
}
2017-04-12 17:46:44 +02:00
}
2017-04-14 17:52:22 +02:00
} // namespace chatterino