Skip to content

Commit

Permalink
fix mojang api url for playername query
Browse files Browse the repository at this point in the history
the old url is deprecated (stopped service)
  • Loading branch information
EtlamGit committed Nov 21, 2023
1 parent cd82e3a commit 2118992
Showing 1 changed file with 21 additions and 64 deletions.
85 changes: 21 additions & 64 deletions minutor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -119,10 +119,6 @@ Minutor::Minutor()
connect(this, SIGNAL(worldLoaded(bool)),
depth, SLOT (setEnabled(bool)));

// player cache request/response to Mojang API
connect(&this->qnam, &QNetworkAccessManager::finished,
this, &Minutor::updatePlayerCache);

m_ui.centralwidget->setLayout(mainLayout);
layout()->setContentsMargins(0, 0, 0, 0);

Expand Down Expand Up @@ -457,7 +453,7 @@ void Minutor::viewDimension(QString dim_string)

void Minutor::viewDimension(const DimensionInfo &dim) {
// update visability of Structure Overlays
for (QAction * action : qAsConst(structureOverlayActions)) {
for (auto action : structureOverlayActions) {
QString dimension = action->data().toMap()["dimension"].toString();
if (dimension.isEmpty() ||
!dimension.compare(dim.name, Qt::CaseInsensitive)) {
Expand Down Expand Up @@ -798,39 +794,32 @@ void Minutor::loadWorld(QDir path) {
NBT player(it.filePath());

// player name from file name (old)
QString playerUUID = it.fileInfo().completeBaseName();
QString playerName = playerUUID;
QIcon playerIcon;
QString playerName = it.fileInfo().completeBaseName();
if (path.dirName() == "playerdata") {
// player name via UUID
QRegExp id("[0-9a-z]{8,8}\\-[0-9a-z]{4,4}\\-[0-9a-z]{4,4}"
"\\-[0-9a-z]{4,4}\\-[0-9a-z]{12,12}");
if (id.exactMatch(playerUUID)) {
if (id.exactMatch(playerName)) {
QSettings settings;
// when present, remove old style cache
if (settings.contains("PlayerCache/"+playerUUID)) {
settings.remove("PlayerCache/"+playerUUID);
if (settings.contains("PlayerCache/"+playerName)) {
settings.remove("PlayerCache/"+playerName);
}
// check cache for player name
if (settings.contains("PlayerCache/"+playerUUID+"/name")) {
playerName = settings.value("PlayerCache/"+playerUUID+"/name", playerUUID).toString();
} else if (playerUUID[14]=='4') {
// check cache for playerName
if (settings.contains("PlayerCache/"+playerName+"/name")) {
playerName = settings.value("PlayerCache/"+playerName+"/name", playerName).toString();
} else if (playerName[14]=='4') {
// only version 4 UUIDs can be resolved at Mojang API
// trigger HTTPS request to get player name
QString url = playerUUID;
QString url = playerName;
url = "https://sessionserver.mojang.com/session/minecraft/profile/" + url.remove('-');

QNetworkRequest request;
request.setUrl(QUrl(url));
request.setRawHeader("User-Agent", "Minutor");
pendingNetworkAccess[this->qnam.get(request)] = playerUUID;
}
// check cache for player texture
if (settings.contains("PlayerCache/"+playerUUID+"/texture")) {
QString data64 = settings.value("PlayerCache/"+playerUUID+"/texture", playerUUID).toString();
QByteArray data = QByteArray::fromBase64(data64.toUtf8());
QImage head(reinterpret_cast<unsigned char *>(data.data()), 8, 8, QImage::Format_ARGB32);
playerIcon = QIcon(QPixmap::fromImage(head).scaled(16,16));
connect(&this->qnam, &QNetworkAccessManager::finished,
this, &Minutor::updatePlayerCache);
this->qnam.get(request);
}
} else continue;
}
Expand All @@ -855,7 +844,6 @@ void Minutor::loadWorld(QDir path) {
}
QAction *p = new QAction(this);
p->setText(playerName);
p->setIcon(playerIcon);
p->setData(locations.count());
locations.append(Location(posX, posZ, dimension));
connect(p, SIGNAL(triggered()),
Expand All @@ -869,7 +857,6 @@ void Minutor::loadWorld(QDir path) {
dimension = player.at("SpawnDimension")->toString();
p = new QAction(this);
p->setText(playerName+"'s Bed");
p->setIcon(playerIcon);
p->setData(locations.count());
locations.append(Location(player.at("SpawnX")->toDouble(),
player.at("SpawnZ")->toDouble(),
Expand All @@ -895,58 +882,28 @@ void Minutor::loadWorld(QDir path) {
toggleOverlays();
}

void Minutor::updatePlayerCache(QNetworkReply * reply) {
void Minutor::updatePlayerCache(QNetworkReply* reply) {
auto response = reply->readAll();
if (response.length() == 0) {
reply->deleteLater();
return;
}
// we got a response
// response to initial profil query
if (reply->request().url().toString().contains("sessionserver.mojang.com")) {
if (response.length() > 0) {
// we got a response
QJsonDocument json = QJsonDocument::fromJson(response);
if (!json.isEmpty() && json.object().contains("name")) {
QString playerName = json["name"].toString();
// reconstruct player UUID
QString playerUUID = pendingNetworkAccess[reply];
QString playerUUID = reply->url().path().split("/").last();
playerUUID.insert(20, '-');
playerUUID.insert(16, '-');
playerUUID.insert(12, '-');
playerUUID.insert(8, '-');
// store in player cache
QSettings settings;
settings.setValue("PlayerCache/"+playerUUID+"/name", playerName);

// get URL to skin texture
QString value = json["properties"][0]["value"].toString();
QJsonDocument vjson = QJsonDocument::fromJson(QByteArray::fromBase64(value.toUtf8()));
if (!vjson.isEmpty()) {
QString url = vjson.object()["textures"].toObject()["SKIN"].toObject()["url"].toString();
if (!url.isEmpty()) {
QNetworkRequest request;
request.setUrl(QUrl(url));
request.setRawHeader("User-Agent", "Minutor");
pendingNetworkAccess[this->qnam.get(request)] = playerUUID;
}
}
}
pendingNetworkAccess.remove(reply);
}
// response with skin texture
if (reply->request().url().toString().contains("textures.minecraft.net")) {
QImage skin;
skin.loadFromData(response);
QImage head(skin.copy(QRect(8,8,8,8)));
// reconstruct player UUID
QString playerUUID = pendingNetworkAccess[reply];
// store in player cache
QSettings settings;
QString data = QByteArray(reinterpret_cast<char*>(head.bits()), 4*8*8).toBase64();
settings.setValue("PlayerCache/"+playerUUID+"/texture", data);

pendingNetworkAccess.remove(reply);
}

reply->deleteLater();
}


void Minutor::rescanWorlds() {
worldActions.clear();
getWorldList();
Expand Down

0 comments on commit 2118992

Please sign in to comment.