diff options
Diffstat (limited to 'libs/uibase')
| -rw-r--r-- | libs/uibase/include/uibase/iplugingame.h | 7 | ||||
| -rw-r--r-- | libs/uibase/include/uibase/nxmurl.h | 18 | ||||
| -rw-r--r-- | libs/uibase/src/nxmurl.cpp | 33 |
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(); } |
