ModList: check owner when displaying mod devs

This commit is contained in:
Fleeym 2024-06-03 17:39:15 +03:00
parent 170506e533
commit e6e1d34694
5 changed files with 43 additions and 1 deletions

View file

@ -1,5 +1,7 @@
#include "Server.hpp"
#include <Geode/utils/JsonValidation.hpp>
#include <Geode/utils/ranges.hpp>
#include <fmt/core.h>
#include <loader/ModMetadataImpl.hpp>
#include <fmt/chrono.h>
@ -418,6 +420,7 @@ Result<ServerModMetadata> ServerModMetadata::parse(matjson::Value const& raw) {
auto dev = ServerDeveloper();
obj.needs("username").into(dev.username);
obj.needs("display_name").into(dev.displayName);
obj.needs("is_owner").into(dev.isOwner);
res.developers.push_back(dev);
developerNames.push_back(dev.displayName);
}
@ -454,6 +457,24 @@ Result<ServerModMetadata> ServerModMetadata::parse(matjson::Value const& raw) {
return Ok(res);
}
std::string ServerModMetadata::formatDevelopersToString() const {
std::optional<ServerDeveloper> owner = ranges::find(developers, [] (auto item) {
return item.isOwner;
});
switch (developers.size()) {
case 0: return "Unknown"; break;
case 1: return developers.front().displayName; break;
case 2: return developers.front().displayName + " & " + developers.back().displayName; break;
default: {
if (owner) {
return fmt::format("{} + {} More", owner->displayName, developers.size() - 1);
} else {
return fmt::format("{} + {} More", developers.front().displayName, developers.size() - 1);
}
} break;
}
}
Result<ServerModsList> ServerModsList::parse(matjson::Value const& raw) {
auto json = raw;
JsonChecker checker(json);

View file

@ -21,6 +21,7 @@ namespace server {
struct ServerDeveloper final {
std::string username;
std::string displayName;
bool isOwner;
};
struct ServerModVersion final {
@ -60,6 +61,7 @@ namespace server {
static Result<ServerModMetadata> parse(matjson::Value const& json);
ModMetadata latestVersion() const;
std::string formatDevelopersToString() const;
bool hasUpdateForInstalledMod() const;
};

View file

@ -63,7 +63,7 @@ bool ModItem::init(ModSource&& source) {
m_developers->ignoreAnchorPointForPosition(false);
m_developers->setAnchorPoint({ .0f, .5f });
auto by = "By " + ModMetadata::formatDeveloperDisplayString(m_source.getMetadata().getDevelopers());
auto by = "By " + m_source.formatDevelopers();
m_developerLabel = CCLabelBMFont::create(by.c_str(), "goldFont.fnt");
m_developerLabel->setID("developers-label");
auto developersBtn = CCMenuItemSpriteExtra::create(

View file

@ -1,4 +1,6 @@
#include "ModSource.hpp"
#include <Geode/loader/ModMetadata.hpp>
#include <Geode/ui/GeodeUI.hpp>
#include <server/DownloadManager.hpp>
#include <Geode/binding/GameObject.hpp>
@ -68,6 +70,22 @@ ModMetadata ModSource::getMetadata() const {
},
}, m_value);
}
std::string ModSource::formatDevelopers() const {
return std::visit(makeVisitor {
[](Mod* mod) {
return ModMetadata::formatDeveloperDisplayString(mod->getMetadata().getDevelopers());
},
[](server::ServerModMetadata const& metadata) {
// Versions should be guaranteed to have at least one item
return metadata.formatDevelopersToString();
},
[](ModSuggestion const& suggestion) {
return ModMetadata::formatDeveloperDisplayString(suggestion.suggestion.getDevelopers());
},
}, m_value);
}
CCNode* ModSource::createModLogo() const {
return std::visit(makeVisitor {
[](Mod* mod) {

View file

@ -44,6 +44,7 @@ public:
server::ServerModMetadata const* asServer() const;
ModSuggestion const* asSuggestion() const;
std::string formatDevelopers() const;
server::ServerRequest<server::ServerModMetadata> fetchServerInfo() const;
server::ServerRequest<std::optional<std::string>> fetchAbout() const;
server::ServerRequest<std::optional<std::string>> fetchChangelog() const;