Nuke skins.json, use nice yggdrasil implementation instead. Grabs all Mojang account skins on addition, active on startup

This commit is contained in:
Sky 2013-11-27 18:45:29 +00:00
parent 7d7579d7f0
commit 38732636d3
3 changed files with 51 additions and 87 deletions

View File

@ -178,7 +178,24 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi
actionManageAccounts->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); actionManageAccounts->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
actionManageAccounts->setLayoutDirection(Qt::RightToLeft); actionManageAccounts->setLayoutDirection(Qt::RightToLeft);
activeAccountChanged(); MojangAccountPtr account = MMC->accounts()->activeAccount();
if(account != nullptr)
{
auto job = new NetJob("Startup player skins: " + account->username());
for(AccountProfile profile : account->profiles())
{
auto meta = MMC->metacache()->resolveEntry("skins", profile.name() + ".png");
auto action = CacheDownload::make(
QUrl("http://skins.minecraft.net/MinecraftSkins/" + profile.name() + ".png"),
meta);
job->addNetAction(action);
meta->stale = true;
}
connect(job, SIGNAL(succeeded()), SLOT(activeAccountChanged()));
job->start();
}
connect(actionManageAccounts, SIGNAL(clicked()), this, SLOT(on_actionManageAccounts_triggered())); connect(actionManageAccounts, SIGNAL(clicked()), this, SLOT(on_actionManageAccounts_triggered()));
ui->mainToolBar->addWidget(actionManageAccounts); ui->mainToolBar->addWidget(actionManageAccounts);
@ -221,7 +238,11 @@ void MainWindow::activeAccountChanged()
if(account != nullptr) if(account != nullptr)
{ {
actionManageAccounts->setIcon(SkinUtils::getFaceFromCache(account->username())); const AccountProfile *profile = account->currentProfile();
if(profile != nullptr)
{
actionManageAccounts->setIcon(SkinUtils::getFaceFromCache(profile->name()));
}
} }
} }
@ -642,52 +663,6 @@ void MainWindow::prepareLaunch(BaseInstance* instance, MojangAccountPtr account)
tDialog.exec(updateTask); tDialog.exec(updateTask);
delete updateTask; delete updateTask;
} }
QString playerName = account->currentProfile()->name();
auto job = new NetJob("Player skin: " + playerName);
auto meta = MMC->metacache()->resolveEntry("skins", playerName + ".png");
auto action = CacheDownload::make(
QUrl("http://skins.minecraft.net/MinecraftSkins/" + playerName + ".png"),
meta);
job->addNetAction(action);
meta->stale = true;
connect(job, SIGNAL(succeeded()), SLOT(activeAccountChanged()));
job->start();
auto filename = MMC->metacache()->resolveEntry("skins", "skins.json")->getFullPath();
QFile listFile(filename);
// Add skin mapping
QByteArray data;
{
if (!listFile.open(QIODevice::ReadWrite))
{
QLOG_ERROR() << "Failed to open/make skins list JSON";
return;
}
data = listFile.readAll();
}
QJsonParseError jsonError;
QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &jsonError);
QJsonObject root = jsonDoc.object();
QJsonObject mappings = root.value("mappings").toObject();
QJsonArray usernames = mappings.value(account->username()).toArray();
if (!usernames.contains(playerName))
{
usernames.prepend(playerName);
mappings[account->username()] = usernames;
root["mappings"] = mappings;
jsonDoc.setObject(root);
// QJson hack - shouldn't have to clear the file every time a save happens
listFile.resize(0);
listFile.write(jsonDoc.toJson());
}
} }
void MainWindow::launchInstance(BaseInstance *instance, MojangAccountPtr account) void MainWindow::launchInstance(BaseInstance *instance, MojangAccountPtr account)

View File

@ -21,6 +21,7 @@
#include <logger/QsLog.h> #include <logger/QsLog.h>
#include <logic/auth/AuthenticateTask.h> #include <logic/auth/AuthenticateTask.h>
#include <logic/net/NetJob.h>
#include <gui/dialogs/LoginDialog.h> #include <gui/dialogs/LoginDialog.h>
#include <gui/dialogs/ProgressDialog.h> #include <gui/dialogs/ProgressDialog.h>
@ -112,5 +113,21 @@ void AccountListDialog::onLoginComplete()
MojangAccountPtr account = m_authTask->getMojangAccount(); MojangAccountPtr account = m_authTask->getMojangAccount();
m_accounts->addAccount(account); m_accounts->addAccount(account);
//ui->listView->update(); //ui->listView->update();
// Grab associated player skins
auto job = new NetJob("Player skins: " + account->username());
for(AccountProfile profile : account->profiles())
{
auto meta = MMC->metacache()->resolveEntry("skins", profile.name() + ".png");
auto action = CacheDownload::make(
QUrl("http://skins.minecraft.net/MinecraftSkins/" + profile.name() + ".png"),
meta);
job->addNetAction(action);
meta->stale = true;
}
connect(job, SIGNAL(succeeded()), SIGNAL(activeAccountChanged()));
job->start();
} }

View File

@ -24,52 +24,24 @@
namespace SkinUtils namespace SkinUtils
{ {
/*
* Given a username, return a pixmap of the cached skin (if it exists), QPixmap() otherwise
*/
QPixmap getFaceFromCache(QString username, int height, int width) QPixmap getFaceFromCache(QString username, int height, int width)
{ {
bool gotFace = false;
QByteArray data;
{
auto filename =
MMC->metacache()->resolveEntry("skins", "skins.json")->getFullPath();
QFile listFile(filename);
if (!listFile.open(QIODevice::ReadOnly))
return QPixmap();
data = listFile.readAll();
}
QJsonParseError jsonError;
QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &jsonError);
QJsonObject root = jsonDoc.object();
QJsonObject mappings = root.value("mappings").toObject();
if (!mappings[username].isUndefined())
{
QJsonArray usernames = mappings.value(username).toArray();
if (!usernames.isEmpty())
{
QString mapped_username = usernames[0].toString();
if (!mapped_username.isEmpty())
{
QFile fskin(MMC->metacache() QFile fskin(MMC->metacache()
->resolveEntry("skins", mapped_username + ".png") ->resolveEntry("skins", username + ".png")
->getFullPath()); ->getFullPath());
if (fskin.exists()) if (fskin.exists())
{ {
QPixmap skin(MMC->metacache() QPixmap skin(fskin.fileName());
->resolveEntry("skins", mapped_username + ".png") if(!skin.isNull())
->getFullPath()); {
return skin.copy(8, 8, 8, 8).scaled(height, width, Qt::KeepAspectRatio);
QPixmap face =
skin.copy(8, 8, 8, 8).scaled(height, width, Qt::KeepAspectRatio);
return face;
}
}
} }
} }
if(!gotFace) return QPixmap(); return QPixmap();
} }
} }