Minor: Additional functions (#25)

* several functions. fixes #1 and #2

* multi selection functionality
This commit is contained in:
Sebastian Dine
2026-08-03 08:35:38 +02:00
committed by GitHub
parent 2eb7c59f78
commit d3b4762b76
60 changed files with 1859 additions and 172 deletions
@@ -35,6 +35,12 @@ public:
Result<std::vector<AutoDetectedPrint>> detectPrintVariants(std::string_view name,
std::string_view setName) override;
Result<AutoDetectedPrint> detectBySetNo(std::string_view setName,
std::string_view setNo) override;
Result<std::vector<AutoDetectedPrint>> detectVariantsBySetNo(
std::string_view setName,
std::string_view setNo) override;
// Uppercase the alphabetic prefix of a Digi-Battle card number (bo-88 -> BO-88).
// Does not invent zero-padding — CDN keys match API ids literally.
static std::string normalizeCardNumber(std::string_view setNo);
@@ -58,7 +64,8 @@ public:
static Result<std::vector<AutoDetectedPrint>>
parsePrintVariants(const std::string& body,
std::string_view setName,
std::string_view wantedCardName);
std::string_view wantedCardName,
std::string_view wantedSetNo = {});
private:
IHttpClient& http_;
@@ -29,6 +29,12 @@ public:
Result<std::vector<AutoDetectedPrint>> detectPrintVariants(std::string_view name,
std::string_view setId) override;
Result<AutoDetectedPrint> detectBySetNo(std::string_view setId,
std::string_view setNo) override;
Result<std::vector<AutoDetectedPrint>> detectVariantsBySetNo(
std::string_view setId,
std::string_view setNo) override;
// Strip everything after the first '/' (e.g. "4/102" -> "4").
static std::string normalizeCollectorNumber(std::string_view setNo);
@@ -61,6 +67,9 @@ public:
std::string_view setId,
std::string_view wantedCardName);
// Parse TCGdex card-by-id JSON into print metadata (name + localId + rarity).
static Result<AutoDetectedPrint> parsePrintFromCardById(const std::string& body);
private:
IHttpClient& http_;
};
@@ -29,6 +29,12 @@ public:
Result<std::vector<AutoDetectedPrint>> detectPrintVariants(std::string_view name,
std::string_view setId) override;
Result<AutoDetectedPrint> detectBySetNo(std::string_view setId,
std::string_view setNo) override;
Result<std::vector<AutoDetectedPrint>> detectVariantsBySetNo(
std::string_view setId,
std::string_view setNo) override;
static std::string normalizeLocalId(std::string_view setNo);
static std::string buildSetDetailUrl(std::string_view setId);
static std::string buildCardUrl(std::string_view setId, std::string_view localId);
@@ -60,6 +66,15 @@ public:
std::string_view wantedCardName,
const JapanesePokemonEnCatalog& catalog);
// Reverse lookup: set + localId → name via catalog (no HTTP).
static Result<std::vector<AutoDetectedPrint>>
detectVariantsBySetNoFromCatalog(std::string_view setId,
std::string_view localId,
const JapanesePokemonEnCatalog& catalog);
// Parse TCGdex JA card-by-id JSON into print metadata.
static Result<AutoDetectedPrint> parsePrintFromCardResponse(const std::string& body);
private:
IHttpClient& http_;
const JapanesePokemonEnCatalog& catalog_;
@@ -1,8 +1,11 @@
#pragma once
#include "ccm/domain/YuGiOhSetCatalog.hpp"
#include "ccm/ports/ICardPreviewSource.hpp"
#include "ccm/ports/IHttpClient.hpp"
#include "ccm/services/YuGiOhSetCatalogService.hpp"
#include <optional>
#include <string>
#include <string_view>
#include <vector>
@@ -25,6 +28,9 @@ namespace ccm {
// that endpoint returns a richer set listing (with rarities and release
// dates) than Yugipedia, and we don't need image data for it.
//
// Reverse lookup (set + setNo → name) uses the offline set-completion catalog
// written by Sets → Update Yu-Gi-Oh! (`YuGiOhSetCatalogService`).
//
// Region policy: always English (EN/NA/EU/AU) regardless of the card's
// stored Language. Localized scans are intentionally not queried so the user
// sees a consistent, well-stocked gallery (EN scans are the most complete).
@@ -32,6 +38,12 @@ class YuGiOhCardPreviewSource final : public ICardPreviewSource {
public:
explicit YuGiOhCardPreviewSource(IHttpClient& http);
// Optional offline catalog for set+setNo → name reverse lookup. When null
// or empty, detectVariantsBySetNo returns a clear "Update Sets" error.
void setCatalogService(YuGiOhSetCatalogService* catalogStore) noexcept {
catalogStore_ = catalogStore;
}
[[nodiscard]] bool supportsAutoDetectPrint() const noexcept override { return true; }
Result<std::string, PreviewLookupError>
@@ -43,6 +55,12 @@ public:
Result<std::vector<AutoDetectedPrint>> detectPrintVariants(std::string_view name,
std::string_view setId) override;
Result<AutoDetectedPrint> detectBySetNo(std::string_view setId,
std::string_view setNo) override;
Result<std::vector<AutoDetectedPrint>> detectVariantsBySetNo(
std::string_view setId,
std::string_view setNo) override;
// ---- Yugipedia helpers (image preview path) ----------------------------
// Build the list of candidate Yugipedia file names to try, in priority
@@ -116,8 +134,29 @@ public:
std::string_view preferredSetName,
std::string_view wantedCardName);
// Offline reverse lookup against a set-completion catalog. `setId` is the
// pack's set code (e.g. "LOB"); `setNo` may be digits ("005") or a full
// collector code ("LOB-005" / "LOB-EN005").
static Result<std::vector<AutoDetectedPrint>>
detectVariantsBySetNoFromCatalog(const YuGiOhSetCatalog& catalog,
std::string_view setId,
std::string_view setNo);
// YGOPRODeck cardset= dump filtered by collector digits (HTTP fallback when
// the offline catalog is missing or has no match).
static Result<std::vector<AutoDetectedPrint>>
detectVariantsBySetNoFromCardset(const std::string& body,
std::string_view preferredSetName,
std::string_view setNo);
static std::string buildCardsetOnlyUrl(std::string_view setName);
private:
IHttpClient& http_;
IHttpClient& http_;
YuGiOhSetCatalogService* catalogStore_{nullptr};
// Cached offline catalog so reverse auto-detect does not re-parse a
// multi-MB JSON file on every button click.
mutable std::optional<YuGiOhSetCatalog> catalogCache_;
};
} // namespace ccm
@@ -3,6 +3,7 @@
#include "ccm/games/IGameModule.hpp"
#include "ccm/games/yugioh/YuGiOhCardPreviewSource.hpp"
#include "ccm/games/yugioh/YuGiOhSetSource.hpp"
#include "ccm/services/YuGiOhSetCatalogService.hpp"
namespace ccm {
@@ -17,6 +18,15 @@ public:
ISetSource& setSource() override { return setSource_; }
ICardPreviewSource* cardPreviewSource() noexcept override { return &previewSource_; }
// Wire offline set catalog for set+setNo → name reverse auto-detect.
void setCatalogService(YuGiOhSetCatalogService* catalogStore) noexcept {
previewSource_.setCatalogService(catalogStore);
}
[[nodiscard]] YuGiOhCardPreviewSource& previewSource() noexcept {
return previewSource_;
}
private:
YuGiOhSetSource setSource_;
YuGiOhCardPreviewSource previewSource_;
@@ -29,9 +29,11 @@ public:
Result<std::vector<AutoDetectedPrint>> detectPrintVariants(std::string_view name,
std::string_view setId) override;
Result<AutoDetectedPrint> detectBySetNo(std::string_view setNo) override;
Result<AutoDetectedPrint> detectBySetNo(std::string_view setId,
std::string_view setNo) override;
Result<std::vector<AutoDetectedPrint>> detectVariantsBySetNo(
std::string_view setId,
std::string_view setNo) override;
// Prefer "<Name> (Bandai)" / English / Sealdass page depending on setId.
@@ -58,7 +60,9 @@ public:
parsePageImagesResponse(const std::string& body);
static Result<std::vector<AutoDetectedPrint>>
parseAskResponse(const std::string& body, std::string_view preferredSetId);
parseAskResponse(const std::string& body,
std::string_view preferredSetId,
std::string_view wantedSetNo = {});
static AutoDetectedPrint enrichPrint(AutoDetectedPrint print,
std::string_view pageTitle);
@@ -69,7 +73,8 @@ private:
Result<std::vector<AutoDetectedPrint>> askByName(std::string_view name,
std::string_view setId);
Result<std::vector<AutoDetectedPrint>> askByNumber(std::string_view setNo);
Result<std::vector<AutoDetectedPrint>> askByNumber(std::string_view setId,
std::string_view setNo);
IHttpClient& http_;
};