mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-09-21 09:05:10 -07:00
Picture downloads were throttled to a uniform 10 requests/second per host with no way to tune a specific server. A rate-limited API host (Scryfall caps at 10 req/s) can trip 429s during bursts, and CDN hosts with no rate limit were throttled needlessly. Introduce developer-owned per-host caps that users can only ever lower, never raise, exposed in the download settings page: - DownloadSettings::DEVELOPER_HOST_CAPS sets the ceiling per host (api.scryfall.com 9, cards.scryfall.io unlimited, others 10). - A new hostRequestLimits setting stores user overrides in downloads.ini; clampHostRequestLimit() bounds them to [1, devCap] so a user can reduce api.scryfall.com to 5 but never raise it above 9. - The picture worker seeds, halves on 429, and recovers its sustained per-host allowance against the effective ceiling instead of the global maximum, and skips per-host accounting entirely for unlocked hosts (cards.scryfall.io) while global pacing and 429 backoff still apply. - The deck editor settings page gains one spinbox per known host, each clamped to its developer cap.
71 lines
2.6 KiB
C++
71 lines
2.6 KiB
C++
/**
|
|
* @file download_settings.h
|
|
* @ingroup NetworkSettings
|
|
*/
|
|
//! \todo Document this file.
|
|
|
|
#ifndef COCKATRICE_DOWNLOADSETTINGS_H
|
|
#define COCKATRICE_DOWNLOADSETTINGS_H
|
|
|
|
#include "settings_manager.h"
|
|
|
|
#include <QHash>
|
|
|
|
class DownloadSettings : public SettingsManager
|
|
{
|
|
Q_OBJECT
|
|
friend class SettingsCache;
|
|
|
|
static const QStringList DEFAULT_DOWNLOAD_URLS;
|
|
static const QString SCRYFALL_NAMED_LOCALIZED_URL;
|
|
static const QHash<QString, int> DEVELOPER_HOST_CAPS;
|
|
|
|
public:
|
|
/** @brief Per-host request allowance (requests/second) when no developer cap applies. */
|
|
static constexpr int DEFAULT_HOST_REQUEST_LIMIT = 10;
|
|
/** @brief Floor for any per-host request allowance. */
|
|
static constexpr int MIN_HOST_REQUEST_LIMIT = 1;
|
|
/** @brief Developer cap marking a host as never throttled per host (pacing still applies). */
|
|
static constexpr int UNLIMITED_HOST_QUOTA = -1;
|
|
|
|
/**
|
|
* @brief Developer-set per-host allowance ceilings (requests/second), keyed by host.
|
|
*
|
|
* Hosts not present default to DEFAULT_HOST_REQUEST_LIMIT. An entry of
|
|
* UNLIMITED_HOST_QUOTA marks a host that users may still lower, but that is never
|
|
* throttled per host by default. Users can never raise a host's allowance above its
|
|
* developer cap.
|
|
*/
|
|
static const QHash<QString, int> &getDeveloperHostCaps();
|
|
|
|
explicit DownloadSettings(const QString &, QObject *);
|
|
|
|
QStringList getAllURLs() const;
|
|
void setDownloadUrls(const QStringList &downloadURLs);
|
|
void resetToDefaultURLs();
|
|
[[nodiscard]] bool addLocalizedScryfallUrl();
|
|
[[nodiscard]] bool getPicDownload() const;
|
|
void setPicDownload(bool _picDownload);
|
|
[[nodiscard]] bool getDownloadSpoilersStatus() const;
|
|
void setDownloadSpoilerStatus(bool _spoilerStatus);
|
|
|
|
/** @brief User-set per-host request allowances (requests/second). Missing hosts use the developer default. */
|
|
QHash<QString, int> getHostRequestLimits() const;
|
|
void setHostRequestLimits(const QHash<QString, int> &hostRequestLimits);
|
|
|
|
/**
|
|
* @brief Clamps the user's requested allowance for a host against its developer cap.
|
|
* @param host The host to clamp for
|
|
* @param requested The user-requested allowance in requests/second
|
|
* @return The effective allowance. Users may lower a host's allowance but never raise it
|
|
* above the developer cap; hosts with UNLIMITED_HOST_QUOTA have no upper bound.
|
|
*/
|
|
[[nodiscard]] int clampHostRequestLimit(const QString &host, int requested) const;
|
|
|
|
signals:
|
|
void picDownloadChanged();
|
|
void downloadSpoilerStatusChanged();
|
|
void hostRequestLimitsChanged();
|
|
};
|
|
|
|
#endif // COCKATRICE_DOWNLOADSETTINGS_H
|