refactor: abstract metadata handling and clarify names
This commit is contained in:
parent
092d2f8917
commit
fab4a7a602
@ -322,6 +322,7 @@ set(MINECRAFT_SOURCES
|
|||||||
minecraft/WorldList.h
|
minecraft/WorldList.h
|
||||||
minecraft/WorldList.cpp
|
minecraft/WorldList.cpp
|
||||||
|
|
||||||
|
minecraft/mod/MetadataHandler.h
|
||||||
minecraft/mod/Mod.h
|
minecraft/mod/Mod.h
|
||||||
minecraft/mod/Mod.cpp
|
minecraft/mod/Mod.cpp
|
||||||
minecraft/mod/ModDetails.h
|
minecraft/mod/ModDetails.h
|
||||||
|
@ -151,23 +151,23 @@ bool MMCZip::createModdedJar(QString sourceJarPath, QString targetJarPath, const
|
|||||||
continue;
|
continue;
|
||||||
if (mod.type() == Mod::MOD_ZIPFILE)
|
if (mod.type() == Mod::MOD_ZIPFILE)
|
||||||
{
|
{
|
||||||
if (!mergeZipFiles(&zipOut, mod.filename(), addedFiles))
|
if (!mergeZipFiles(&zipOut, mod.fileinfo(), addedFiles))
|
||||||
{
|
{
|
||||||
zipOut.close();
|
zipOut.close();
|
||||||
QFile::remove(targetJarPath);
|
QFile::remove(targetJarPath);
|
||||||
qCritical() << "Failed to add" << mod.filename().fileName() << "to the jar.";
|
qCritical() << "Failed to add" << mod.fileinfo().fileName() << "to the jar.";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (mod.type() == Mod::MOD_SINGLEFILE)
|
else if (mod.type() == Mod::MOD_SINGLEFILE)
|
||||||
{
|
{
|
||||||
// FIXME: buggy - does not work with addedFiles
|
// FIXME: buggy - does not work with addedFiles
|
||||||
auto filename = mod.filename();
|
auto filename = mod.fileinfo();
|
||||||
if (!JlCompress::compressFile(&zipOut, filename.absoluteFilePath(), filename.fileName()))
|
if (!JlCompress::compressFile(&zipOut, filename.absoluteFilePath(), filename.fileName()))
|
||||||
{
|
{
|
||||||
zipOut.close();
|
zipOut.close();
|
||||||
QFile::remove(targetJarPath);
|
QFile::remove(targetJarPath);
|
||||||
qCritical() << "Failed to add" << mod.filename().fileName() << "to the jar.";
|
qCritical() << "Failed to add" << mod.fileinfo().fileName() << "to the jar.";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
addedFiles.insert(filename.fileName());
|
addedFiles.insert(filename.fileName());
|
||||||
@ -176,7 +176,7 @@ bool MMCZip::createModdedJar(QString sourceJarPath, QString targetJarPath, const
|
|||||||
{
|
{
|
||||||
// untested, but seems to be unused / not possible to reach
|
// untested, but seems to be unused / not possible to reach
|
||||||
// FIXME: buggy - does not work with addedFiles
|
// FIXME: buggy - does not work with addedFiles
|
||||||
auto filename = mod.filename();
|
auto filename = mod.fileinfo();
|
||||||
QString what_to_zip = filename.absoluteFilePath();
|
QString what_to_zip = filename.absoluteFilePath();
|
||||||
QDir dir(what_to_zip);
|
QDir dir(what_to_zip);
|
||||||
dir.cdUp();
|
dir.cdUp();
|
||||||
@ -193,7 +193,7 @@ bool MMCZip::createModdedJar(QString sourceJarPath, QString targetJarPath, const
|
|||||||
{
|
{
|
||||||
zipOut.close();
|
zipOut.close();
|
||||||
QFile::remove(targetJarPath);
|
QFile::remove(targetJarPath);
|
||||||
qCritical() << "Failed to add" << mod.filename().fileName() << "to the jar.";
|
qCritical() << "Failed to add" << mod.fileinfo().fileName() << "to the jar.";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
qDebug() << "Adding folder " << filename.fileName() << " from "
|
qDebug() << "Adding folder " << filename.fileName() << " from "
|
||||||
@ -204,7 +204,7 @@ bool MMCZip::createModdedJar(QString sourceJarPath, QString targetJarPath, const
|
|||||||
// Make sure we do not continue launching when something is missing or undefined...
|
// Make sure we do not continue launching when something is missing or undefined...
|
||||||
zipOut.close();
|
zipOut.close();
|
||||||
QFile::remove(targetJarPath);
|
QFile::remove(targetJarPath);
|
||||||
qCritical() << "Failed to add unknown mod type" << mod.filename().fileName() << "to the jar.";
|
qCritical() << "Failed to add unknown mod type" << mod.fileinfo().fileName() << "to the jar.";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -659,23 +659,23 @@ QStringList MinecraftInstance::verboseDescription(AuthSessionPtr session, Minecr
|
|||||||
out << QString("%1:").arg(label);
|
out << QString("%1:").arg(label);
|
||||||
auto modList = model.allMods();
|
auto modList = model.allMods();
|
||||||
std::sort(modList.begin(), modList.end(), [](Mod &a, Mod &b) {
|
std::sort(modList.begin(), modList.end(), [](Mod &a, Mod &b) {
|
||||||
auto aName = a.filename().completeBaseName();
|
auto aName = a.fileinfo().completeBaseName();
|
||||||
auto bName = b.filename().completeBaseName();
|
auto bName = b.fileinfo().completeBaseName();
|
||||||
return aName.localeAwareCompare(bName) < 0;
|
return aName.localeAwareCompare(bName) < 0;
|
||||||
});
|
});
|
||||||
for(auto & mod: modList)
|
for(auto & mod: modList)
|
||||||
{
|
{
|
||||||
if(mod.type() == Mod::MOD_FOLDER)
|
if(mod.type() == Mod::MOD_FOLDER)
|
||||||
{
|
{
|
||||||
out << u8" [📁] " + mod.filename().completeBaseName() + " (folder)";
|
out << u8" [📁] " + mod.fileinfo().completeBaseName() + " (folder)";
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(mod.enabled()) {
|
if(mod.enabled()) {
|
||||||
out << u8" [✔️] " + mod.filename().completeBaseName();
|
out << u8" [✔️] " + mod.fileinfo().completeBaseName();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
out << u8" [❌] " + mod.filename().completeBaseName() + " (disabled)";
|
out << u8" [❌] " + mod.fileinfo().completeBaseName() + " (disabled)";
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
41
launcher/minecraft/mod/MetadataHandler.h
Normal file
41
launcher/minecraft/mod/MetadataHandler.h
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
#include "modplatform/packwiz/Packwiz.h"
|
||||||
|
|
||||||
|
// launcher/minecraft/mod/Mod.h
|
||||||
|
class Mod;
|
||||||
|
|
||||||
|
/* Abstraction file for easily changing the way metadata is stored / handled
|
||||||
|
* Needs to be a class because of -Wunused-function and no C++17 [[maybe_unused]]
|
||||||
|
* */
|
||||||
|
class Metadata {
|
||||||
|
public:
|
||||||
|
using ModStruct = Packwiz::V1::Mod;
|
||||||
|
|
||||||
|
static auto create(QDir& index_dir, ModPlatform::IndexedPack& mod_pack, ModPlatform::IndexedVersion& mod_version) -> ModStruct
|
||||||
|
{
|
||||||
|
return Packwiz::V1::createModFormat(index_dir, mod_pack, mod_version);
|
||||||
|
}
|
||||||
|
|
||||||
|
static auto create(QDir& index_dir, Mod& internal_mod) -> ModStruct
|
||||||
|
{
|
||||||
|
return Packwiz::V1::createModFormat(index_dir, internal_mod);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void update(QDir& index_dir, ModStruct& mod)
|
||||||
|
{
|
||||||
|
Packwiz::V1::updateModIndex(index_dir, mod);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void remove(QDir& index_dir, QString& mod_name)
|
||||||
|
{
|
||||||
|
Packwiz::V1::deleteModIndex(index_dir, mod_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
static auto get(QDir& index_dir, QString& mod_name) -> ModStruct
|
||||||
|
{
|
||||||
|
return Packwiz::V1::getIndexForMod(index_dir, mod_name);
|
||||||
|
}
|
||||||
|
};
|
@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
#include <FileSystem.h>
|
#include <FileSystem.h>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
#include "MetadataHandler.h"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
@ -33,7 +34,7 @@ Mod::Mod(const QFileInfo& file)
|
|||||||
m_changedDateTime = file.lastModified();
|
m_changedDateTime = file.lastModified();
|
||||||
}
|
}
|
||||||
|
|
||||||
Mod::Mod(const QDir& mods_dir, const Packwiz::Mod& metadata)
|
Mod::Mod(const QDir& mods_dir, const Metadata::ModStruct& metadata)
|
||||||
: m_file(mods_dir.absoluteFilePath(metadata.filename))
|
: m_file(mods_dir.absoluteFilePath(metadata.filename))
|
||||||
// It is weird, but name is not reliable for comparing with the JAR files name
|
// It is weird, but name is not reliable for comparing with the JAR files name
|
||||||
// FIXME: Maybe use hash when implemented?
|
// FIXME: Maybe use hash when implemented?
|
||||||
@ -121,8 +122,7 @@ bool Mod::enable(bool value)
|
|||||||
|
|
||||||
bool Mod::destroy(QDir& index_dir)
|
bool Mod::destroy(QDir& index_dir)
|
||||||
{
|
{
|
||||||
// Delete metadata
|
Metadata::remove(index_dir, m_name);
|
||||||
Packwiz::deleteModIndex(index_dir, m_name);
|
|
||||||
|
|
||||||
m_type = MOD_UNKNOWN;
|
m_type = MOD_UNKNOWN;
|
||||||
return FS::deletePath(m_file.filePath());
|
return FS::deletePath(m_file.filePath());
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
#include "ModDetails.h"
|
#include "ModDetails.h"
|
||||||
#include "modplatform/packwiz/Packwiz.h"
|
#include "minecraft/mod/MetadataHandler.h"
|
||||||
|
|
||||||
class Mod
|
class Mod
|
||||||
{
|
{
|
||||||
@ -37,9 +37,9 @@ public:
|
|||||||
|
|
||||||
Mod() = default;
|
Mod() = default;
|
||||||
Mod(const QFileInfo &file);
|
Mod(const QFileInfo &file);
|
||||||
explicit Mod(const QDir& mods_dir, const Packwiz::Mod& metadata);
|
explicit Mod(const QDir& mods_dir, const Metadata::ModStruct& metadata);
|
||||||
|
|
||||||
QFileInfo filename() const { return m_file; }
|
QFileInfo fileinfo() const { return m_file; }
|
||||||
QDateTime dateTimeChanged() const { return m_changedDateTime; }
|
QDateTime dateTimeChanged() const { return m_changedDateTime; }
|
||||||
QString internal_id() const { return m_internal_id; }
|
QString internal_id() const { return m_internal_id; }
|
||||||
ModType type() const { return m_type; }
|
ModType type() const { return m_type; }
|
||||||
@ -82,6 +82,7 @@ protected:
|
|||||||
QDateTime m_changedDateTime;
|
QDateTime m_changedDateTime;
|
||||||
|
|
||||||
QString m_internal_id;
|
QString m_internal_id;
|
||||||
|
/* Name as reported via the file name */
|
||||||
QString m_name;
|
QString m_name;
|
||||||
ModType m_type = MOD_UNKNOWN;
|
ModType m_type = MOD_UNKNOWN;
|
||||||
bool m_from_metadata = false;
|
bool m_from_metadata = false;
|
||||||
|
@ -180,7 +180,7 @@ void ModFolderModel::resolveMod(Mod& m)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto task = new LocalModParseTask(nextResolutionTicket, m.type(), m.filename());
|
auto task = new LocalModParseTask(nextResolutionTicket, m.type(), m.fileinfo());
|
||||||
auto result = task->result();
|
auto result = task->result();
|
||||||
result->id = m.internal_id();
|
result->id = m.internal_id();
|
||||||
activeTickets.insert(nextResolutionTicket, result);
|
activeTickets.insert(nextResolutionTicket, result);
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#include <toml.h>
|
#include <toml.h>
|
||||||
|
|
||||||
#include "FileSystem.h"
|
#include "FileSystem.h"
|
||||||
#include "modplatform/packwiz/Packwiz.h"
|
#include "minecraft/mod/MetadataHandler.h"
|
||||||
|
|
||||||
LocalModUpdateTask::LocalModUpdateTask(QDir index_dir, ModPlatform::IndexedPack& mod, ModPlatform::IndexedVersion& mod_version)
|
LocalModUpdateTask::LocalModUpdateTask(QDir index_dir, ModPlatform::IndexedPack& mod, ModPlatform::IndexedVersion& mod_version)
|
||||||
: m_index_dir(index_dir), m_mod(mod), m_mod_version(mod_version)
|
: m_index_dir(index_dir), m_mod(mod), m_mod_version(mod_version)
|
||||||
@ -18,8 +18,8 @@ void LocalModUpdateTask::executeTask()
|
|||||||
{
|
{
|
||||||
setStatus(tr("Updating index for mod:\n%1").arg(m_mod.name));
|
setStatus(tr("Updating index for mod:\n%1").arg(m_mod.name));
|
||||||
|
|
||||||
auto pw_mod = Packwiz::createModFormat(m_index_dir, m_mod, m_mod_version);
|
auto pw_mod = Metadata::create(m_index_dir, m_mod, m_mod_version);
|
||||||
Packwiz::updateModIndex(m_index_dir, pw_mod);
|
Metadata::update(m_index_dir, pw_mod);
|
||||||
|
|
||||||
emitSucceeded();
|
emitSucceeded();
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#include "ModFolderLoadTask.h"
|
#include "ModFolderLoadTask.h"
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
|
||||||
#include "modplatform/packwiz/Packwiz.h"
|
#include "minecraft/mod/MetadataHandler.h"
|
||||||
|
|
||||||
ModFolderLoadTask::ModFolderLoadTask(QDir& mods_dir, QDir& index_dir)
|
ModFolderLoadTask::ModFolderLoadTask(QDir& mods_dir, QDir& index_dir)
|
||||||
: m_mods_dir(mods_dir), m_index_dir(index_dir), m_result(new Result())
|
: m_mods_dir(mods_dir), m_index_dir(index_dir), m_result(new Result())
|
||||||
@ -17,7 +17,7 @@ void ModFolderLoadTask::run()
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
entry.chop(5); // Remove .toml at the end
|
entry.chop(5); // Remove .toml at the end
|
||||||
Mod mod(m_mods_dir, Packwiz::getIndexForMod(m_index_dir, entry));
|
Mod mod(m_mods_dir, Metadata::get(m_index_dir, entry));
|
||||||
m_result->mods[mod.internal_id()] = mod;
|
m_result->mods[mod.internal_id()] = mod;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,13 +9,15 @@
|
|||||||
#include "modplatform/ModIndex.h"
|
#include "modplatform/ModIndex.h"
|
||||||
#include "minecraft/mod/Mod.h"
|
#include "minecraft/mod/Mod.h"
|
||||||
|
|
||||||
|
namespace Packwiz {
|
||||||
|
|
||||||
// Helpers
|
// Helpers
|
||||||
static inline QString indexFileName(QString const& mod_name)
|
static inline QString indexFileName(QString const& mod_name)
|
||||||
{
|
{
|
||||||
return QString("%1.toml").arg(mod_name);
|
return QString("%1.toml").arg(mod_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Packwiz::createModFormat(QDir& index_dir, ModPlatform::IndexedPack& mod_pack, ModPlatform::IndexedVersion& mod_version) -> Mod
|
auto V1::createModFormat(QDir& index_dir, ModPlatform::IndexedPack& mod_pack, ModPlatform::IndexedVersion& mod_version) -> Mod
|
||||||
{
|
{
|
||||||
Mod mod;
|
Mod mod;
|
||||||
|
|
||||||
@ -33,7 +35,7 @@ auto Packwiz::createModFormat(QDir& index_dir, ModPlatform::IndexedPack& mod_pac
|
|||||||
return mod;
|
return mod;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Packwiz::createModFormat(QDir& index_dir, ::Mod& internal_mod) -> Mod
|
auto V1::createModFormat(QDir& index_dir, ::Mod& internal_mod) -> Mod
|
||||||
{
|
{
|
||||||
auto mod_name = internal_mod.name();
|
auto mod_name = internal_mod.name();
|
||||||
|
|
||||||
@ -44,7 +46,7 @@ auto Packwiz::createModFormat(QDir& index_dir, ::Mod& internal_mod) -> Mod
|
|||||||
|
|
||||||
// Manually construct packwiz mod
|
// Manually construct packwiz mod
|
||||||
mod.name = internal_mod.name();
|
mod.name = internal_mod.name();
|
||||||
mod.filename = internal_mod.filename().fileName();
|
mod.filename = internal_mod.fileinfo().fileName();
|
||||||
|
|
||||||
// TODO: Have a mechanism for telling the UI subsystem that we want to gather user information
|
// TODO: Have a mechanism for telling the UI subsystem that we want to gather user information
|
||||||
// (i.e. which mod provider we want to use). Maybe an object parameter with a signal for that?
|
// (i.e. which mod provider we want to use). Maybe an object parameter with a signal for that?
|
||||||
@ -52,7 +54,7 @@ auto Packwiz::createModFormat(QDir& index_dir, ::Mod& internal_mod) -> Mod
|
|||||||
return mod;
|
return mod;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Packwiz::updateModIndex(QDir& index_dir, Mod& mod)
|
void V1::updateModIndex(QDir& index_dir, Mod& mod)
|
||||||
{
|
{
|
||||||
if(!mod.isValid()){
|
if(!mod.isValid()){
|
||||||
qCritical() << QString("Tried to update metadata of an invalid mod!");
|
qCritical() << QString("Tried to update metadata of an invalid mod!");
|
||||||
@ -94,7 +96,7 @@ void Packwiz::updateModIndex(QDir& index_dir, Mod& mod)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Packwiz::deleteModIndex(QDir& index_dir, QString& mod_name)
|
void V1::deleteModIndex(QDir& index_dir, QString& mod_name)
|
||||||
{
|
{
|
||||||
QFile index_file(index_dir.absoluteFilePath(indexFileName(mod_name)));
|
QFile index_file(index_dir.absoluteFilePath(indexFileName(mod_name)));
|
||||||
|
|
||||||
@ -108,7 +110,7 @@ void Packwiz::deleteModIndex(QDir& index_dir, QString& mod_name)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Packwiz::getIndexForMod(QDir& index_dir, QString& mod_name) -> Mod
|
auto V1::getIndexForMod(QDir& index_dir, QString& mod_name) -> Mod
|
||||||
{
|
{
|
||||||
Mod mod;
|
Mod mod;
|
||||||
|
|
||||||
@ -201,3 +203,5 @@ auto Packwiz::getIndexForMod(QDir& index_dir, QString& mod_name) -> Mod
|
|||||||
|
|
||||||
return mod;
|
return mod;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace Packwiz
|
||||||
|
@ -11,7 +11,9 @@ class QDir;
|
|||||||
// Mod from launcher/minecraft/mod/Mod.h
|
// Mod from launcher/minecraft/mod/Mod.h
|
||||||
class Mod;
|
class Mod;
|
||||||
|
|
||||||
class Packwiz {
|
namespace Packwiz {
|
||||||
|
|
||||||
|
class V1 {
|
||||||
public:
|
public:
|
||||||
struct Mod {
|
struct Mod {
|
||||||
QString name {};
|
QString name {};
|
||||||
@ -58,3 +60,5 @@ class Packwiz {
|
|||||||
* */
|
* */
|
||||||
static auto getIndexForMod(QDir& index_dir, QString& mod_name) -> Mod;
|
static auto getIndexForMod(QDir& index_dir, QString& mod_name) -> Mod;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
} // namespace Packwiz
|
||||||
|
Loading…
Reference in New Issue
Block a user