Skip to content

Commit

Permalink
Merge pull request #1054 from Ryex/more-lax-block-mods-filename-check
Browse files Browse the repository at this point in the history
  • Loading branch information
Scrumplex committed May 6, 2023
2 parents d535f73 + e063595 commit ce5bb29
Showing 1 changed file with 31 additions and 8 deletions.
39 changes: 31 additions & 8 deletions launcher/ui/dialogs/BlockedModsDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -195,18 +195,17 @@ void BlockedModsDialog::watchPath(QString path, bool watch_recursive)
auto to_watch = QFileInfo(path);
auto to_watch_path = to_watch.canonicalFilePath();
if (m_watcher.directories().contains(to_watch_path))
return; // don't watch the same path twice (no loops!)
return; // don't watch the same path twice (no loops!)

qDebug() << "[Blocked Mods Dialog] Adding Watch Path:" << path;
m_watcher.addPath(to_watch_path);

if (!to_watch.isDir() || !watch_recursive)
return;


QDirIterator it(to_watch_path, QDir::Filter::Dirs | QDir::Filter::NoDotAndDotDot, QDirIterator::NoIteratorFlags);
while (it.hasNext()) {
QString watch_dir = QDir(it.next()).canonicalPath(); // resolve symlinks and relative paths
QString watch_dir = QDir(it.next()).canonicalPath(); // resolve symlinks and relative paths
watchPath(watch_dir, watch_recursive);
}
}
Expand Down Expand Up @@ -302,19 +301,43 @@ bool BlockedModsDialog::checkValidPath(QString path)
{
const QFileInfo file = QFileInfo(path);
const QString filename = file.fileName();
QString laxFilename(filename);
laxFilename.replace('+', ' ');

auto compare = [](QString fsfilename, QString metadataFilename) {
return metadataFilename.compare(fsfilename, Qt::CaseInsensitive) == 0;
auto compare = [](QString fsFilename, QString metadataFilename) {
return metadataFilename.compare(fsFilename, Qt::CaseInsensitive) == 0;
};

// super lax compare (but not fuzzy)
// convert to lowercase
// convert all speratores to whitespace
// simplify sequence of internal whitespace to a single space
// efectivly compare two strings ignoring all separators and case
auto laxCompare = [](QString fsfilename, QString metadataFilename) {
// allowed character seperators
QList<QChar> allowedSeperators = { '-', '+', '.' , '_'};

// copy in lowercase
auto fsName = fsfilename.toLower();
auto metaName = metadataFilename.toLower();

// replace all potential allowed seperatores with whitespace
for (auto sep : allowedSeperators) {
fsName = fsName.replace(sep, ' ');
metaName = metaName.replace(sep, ' ');
}

// remove extraneous whitespace
fsName = fsName.simplified();
metaName = metaName.simplified();

return fsName.compare(metaName) == 0;
};

for (auto& mod : m_mods) {
if (compare(filename, mod.name)) {
qDebug() << "[Blocked Mods Dialog] Name match found:" << mod.name << "| From path:" << path;
return true;
}
if (compare(laxFilename, mod.name)) {
if (laxCompare(filename, mod.name)) {
qDebug() << "[Blocked Mods Dialog] Lax name match found:" << mod.name << "| From path:" << path;
return true;
}
Expand Down

0 comments on commit ce5bb29

Please sign in to comment.