aboutsummaryrefslogtreecommitdiff
path: root/libs/uibase
diff options
context:
space:
mode:
Diffstat (limited to 'libs/uibase')
-rw-r--r--libs/uibase/include/uibase/iplugingame.h7
-rw-r--r--libs/uibase/include/uibase/nxmurl.h18
-rw-r--r--libs/uibase/src/nxmurl.cpp33
3 files changed, 48 insertions, 10 deletions
diff --git a/libs/uibase/include/uibase/iplugingame.h b/libs/uibase/include/uibase/iplugingame.h
index 93ee09f..c7760f1 100644
--- a/libs/uibase/include/uibase/iplugingame.h
+++ b/libs/uibase/include/uibase/iplugingame.h
@@ -314,6 +314,13 @@ public:
*/
virtual QStringList CCPlugins() const { return {}; }
+ /**
+ * @brief Get the blueprint plugin prefix for blueprint autoloading
+ *
+ * @node Primarily used by Starfield
+ */
+ virtual QString blueprintPrefix() const { return ""; }
+
/*
* @brief determine the load order mechanism used by this game.
*
diff --git a/libs/uibase/include/uibase/nxmurl.h b/libs/uibase/include/uibase/nxmurl.h
index bd06d3d..dd1935e 100644
--- a/libs/uibase/include/uibase/nxmurl.h
+++ b/libs/uibase/include/uibase/nxmurl.h
@@ -75,6 +75,21 @@ public:
*/
int userId() const { return m_UserId; }
+ /**
+ * @return if collection link
+ */
+ bool isCollection() const { return m_Collection; }
+
+ /**
+ * @return collection ID
+ */
+ QString collectionId() const { return m_CollectionId; }
+
+ /**
+ * @return collection revision
+ */
+ int collectionRevision() const { return m_CollectionRevision; }
+
private:
QString m_Game;
QString m_Key;
@@ -82,6 +97,9 @@ private:
int m_FileId;
int m_Expires;
int m_UserId;
+ bool m_Collection;
+ QString m_CollectionId;
+ int m_CollectionRevision;
};
#endif // NXMURL_H
diff --git a/libs/uibase/src/nxmurl.cpp b/libs/uibase/src/nxmurl.cpp
index 33bb22f..bdb9f7b 100644
--- a/libs/uibase/src/nxmurl.cpp
+++ b/libs/uibase/src/nxmurl.cpp
@@ -29,16 +29,29 @@ NXMUrl::NXMUrl(const QString& url)
{
QUrl nxm(url);
QUrlQuery query(nxm);
- QRegularExpression exp("(?:nxm|modl)://[a-z0-9]+/mods/(\\d+)/files/(\\d+)",
- QRegularExpression::CaseInsensitiveOption);
- auto match = exp.match(url);
- if (!match.hasMatch()) {
+
+ static const QRegularExpression modRegex(
+ "(?:nxm|modl)://[a-z0-9]+/mods/(\\d+)/files/(\\d+)",
+ QRegularExpression::CaseInsensitiveOption);
+ static const QRegularExpression collectionRegex(
+ "(?:nxm|modl)://[a-z0-9]+/collections/([a-z0-9]+)/revisions/(\\d+)",
+ QRegularExpression::CaseInsensitiveOption);
+
+ m_Game = nxm.host();
+
+ if (const auto modMatch = modRegex.match(url); modMatch.hasMatch()) {
+ m_Collection = false;
+ m_ModId = modMatch.captured(1).toInt();
+ m_FileId = modMatch.captured(2).toInt();
+ m_Key = query.queryItemValue("key");
+ m_Expires = query.queryItemValue("expires").toInt();
+ m_UserId = query.queryItemValue("user_id").toInt();
+ } else if (const auto collectionMatch = collectionRegex.match(url);
+ collectionMatch.hasMatch()) {
+ m_Collection = true;
+ m_CollectionId = collectionMatch.captured(1);
+ m_CollectionRevision = collectionMatch.captured(2).toInt();
+ } else {
throw MOBase::InvalidNXMLinkException(url);
}
- m_Game = nxm.host();
- m_ModId = match.captured(1).toInt();
- m_FileId = match.captured(2).toInt();
- m_Key = query.queryItemValue("key");
- m_Expires = query.queryItemValue("expires").toInt();
- m_UserId = query.queryItemValue("user_id").toInt();
}