fix description & changelog not working on server mods

This commit is contained in:
HJfod 2024-04-22 21:19:07 +03:00
parent f48dc529a8
commit 5c3111e564
4 changed files with 98 additions and 31 deletions

View file

@ -147,6 +147,9 @@ protected:
this->setSprite(CCSprite::createWithTexture(texture));
}
}
else if (event->isCancelled()) {
this->setSprite(nullptr);
}
}
public:

View file

@ -5,6 +5,60 @@
#include <Geode/utils/ColorProvider.hpp>
#include "ConfirmUninstallPopup.hpp"
class FetchTextArea : public CCNode {
public:
using Request = server::ServerRequest<std::optional<std::string>>;
protected:
EventListener<Request> m_listener;
MDTextArea* m_textarea;
CCNode* m_loading;
std::string m_noneText;
bool init(Request const& req, std::string const& noneText, CCSize const& size) {
if (!CCNode::init())
return false;
this->setAnchorPoint({ .5f, .5f });
this->setContentSize(size);
m_noneText = noneText;
m_textarea = MDTextArea::create("", size);
this->addChildAtPosition(m_textarea, Anchor::Center);
m_loading = createLoadingCircle(30);
this->addChildAtPosition(m_loading, Anchor::Center);
m_listener.bind(this, &FetchTextArea::onRequest);
m_listener.setFilter(req);
return true;
}
void onRequest(Request::Event* event) {
if (event->getValue() && event->getValue()->isOk() && event->getValue()->unwrap()) {
m_loading->removeFromParent();
m_textarea->setString(event->getValue()->unwrap()->c_str());
}
else if (!event->getProgress()) {
m_loading->removeFromParent();
m_textarea->setString(m_noneText.c_str());
}
}
public:
static FetchTextArea* create(Request const& req, std::string const& noneText, CCSize const& size) {
auto ret = new FetchTextArea();
if (ret && ret->init(req, noneText, size)) {
ret->autorelease();
return ret;
}
CC_SAFE_DELETE(ret);
return nullptr;
}
};
bool ModPopup::setup(ModSource&& src) {
m_source = std::move(src);
m_noElasticity = true;
@ -665,16 +719,18 @@ void ModPopup::loadTab(ModPopup::Tab tab) {
const float mdScale = .85f;
switch (tab) {
case Tab::Details: {
m_currentTabPage = MDTextArea::create(
m_source.getAbout().value_or("No description provided"),
m_currentTabPage = FetchTextArea::create(
m_source.fetchAbout(),
"No description provided",
size / mdScale
);
m_currentTabPage->setScale(mdScale);
} break;
case Tab::Changelog: {
m_currentTabPage = MDTextArea::create(
m_source.getChangelog().value_or("No changelog provided"),
m_currentTabPage = FetchTextArea::create(
m_source.fetchChangelog(),
"No changelog provided",
size / mdScale
);
m_currentTabPage->setScale(mdScale);

View file

@ -26,28 +26,6 @@ ModMetadata ModSource::getMetadata() const {
}
}, m_value);
}
std::optional<std::string> ModSource::getAbout() const {
return std::visit(makeVisitor {
[](Mod* mod) {
return mod->getMetadata().getDetails();
},
[](server::ServerModMetadata const& metadata) {
// Versions should be guaranteed to have at least one item
return metadata.about;
}
}, m_value);
}
std::optional<std::string> ModSource::getChangelog() const {
return std::visit(makeVisitor {
[](Mod* mod) {
return mod->getMetadata().getChangelog();
},
[](server::ServerModMetadata const& metadata) {
// Versions should be guaranteed to have at least one item
return metadata.changelog;
}
}, m_value);
}
CCNode* ModSource::createModLogo() const {
return std::visit(makeVisitor {
[](Mod* mod) {
@ -95,16 +73,46 @@ server::ServerModMetadata const* ModSource::asServer() const {
return std::get_if<server::ServerModMetadata>(&m_value);
}
server::ServerRequest<server::ServerModMetadata> ModSource::fetchServerInfo() const {
server::ServerRequest<std::optional<std::string>> ModSource::fetchAbout() const {
return std::visit(makeVisitor {
[](Mod* mod) {
return server::getMod(mod->getID());
return server::ServerRequest<std::optional<std::string>>::immediate(Ok(mod->getMetadata().getDetails()));
},
[](server::ServerModMetadata const& metadata) {
return server::ServerRequest<server::ServerModMetadata>::immediate(Ok(metadata));
return server::getMod(metadata.id).map(
[](auto* result) -> Result<std::optional<std::string>, server::ServerError> {
if (result->isOk()) {
return Ok(result->unwrap().about);
}
return Err(result->unwrapErr());
}
);
}
}, m_value);
}
server::ServerRequest<std::optional<std::string>> ModSource::fetchChangelog() const {
return std::visit(makeVisitor {
[](Mod* mod) {
return server::ServerRequest<std::optional<std::string>>::immediate(Ok(mod->getMetadata().getChangelog()));
},
[](server::ServerModMetadata const& metadata) {
return server::getMod(metadata.id).map(
[](auto* result) -> Result<std::optional<std::string>, server::ServerError> {
if (result->isOk()) {
return Ok(result->unwrap().changelog);
}
return Err(result->unwrapErr());
}
);
}
}, m_value);
}
server::ServerRequest<server::ServerModMetadata> ModSource::fetchServerInfo() const {
// Request the info even if this is already a server mod because this might
// not have the full details (for example changelog) and the server cache
// should deal with performance issues
return server::getMod(this->getID());
}
server::ServerRequest<std::unordered_set<std::string>> ModSource::fetchValidTags() const {
return std::visit(makeVisitor {
[](Mod* mod) {

View file

@ -17,8 +17,6 @@ public:
std::string getID() const;
ModMetadata getMetadata() const;
std::optional<std::string> getAbout() const;
std::optional<std::string> getChangelog() const;
CCNode* createModLogo() const;
bool wantsRestart() const;
// note: be sure to call checkUpdates first...
@ -36,6 +34,8 @@ public:
server::ServerModMetadata const* asServer() const;
server::ServerRequest<server::ServerModMetadata> fetchServerInfo() const;
server::ServerRequest<std::optional<std::string>> fetchAbout() const;
server::ServerRequest<std::optional<std::string>> fetchChangelog() const;
server::ServerRequest<std::unordered_set<std::string>> fetchValidTags() const;
server::ServerRequest<std::optional<server::ServerModUpdate>> checkUpdates();
};