From bbdba7b50b7b7ec8916718ef34a551ec5a0f4bd9 Mon Sep 17 00:00:00 2001 From: superadminist <18433706+superadminist@users.noreply.github.com> Date: Mon, 10 Aug 2026 18:17:27 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=8F=91=E5=B8=83=20v1.11.2=20=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=AE=89=E5=85=A8=E4=B8=8E=E5=88=B7=E6=96=B0=E4=BD=93?= =?UTF-8?q?=E9=AA=8C=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复 Provider 切换和 Codex 额度缓存异常,增加分时数据延迟清理、更新前 usage.db 备份及清理审计日志,并更新 v1.11.2 文档与界面截图。 --- README.en.md | 4 +- README.ja.md | 4 +- README.ko.md | 4 +- README.md | 7 +- README.zh-TW.md | 4 +- app_identity.py | 2 +- app_update.py | 9 ++ data/history.py | 130 +++++++++++++++++------- data/store.py | 74 ++++++++++++-- docs/images/tokenmeter-v1.11.2-dark.png | Bin 0 -> 78115 bytes installer/TokenMeter.iss | 2 +- release-notes/v1.11.2.md | 19 ++++ tests/test_history.py | 122 ++++++++++++++++------ tests/test_qt_ui.py | 13 +++ tests/test_refresh.py | 68 ++++++++++++- tests/test_store.py | 104 +++++++++++++++++++ tests/test_update.py | 32 ++++++ ui/qt_panel.py | 15 ++- ui/qt_settings.py | 4 +- ui/qt_widget.py | 109 ++++++++++++++------ updater_version_info.txt | 8 +- version_info.txt | 8 +- 22 files changed, 607 insertions(+), 135 deletions(-) create mode 100644 docs/images/tokenmeter-v1.11.2-dark.png create mode 100644 release-notes/v1.11.2.md diff --git a/README.en.md b/README.en.md index 74164d7..bc3fa7f 100644 --- a/README.en.md +++ b/README.en.md @@ -43,7 +43,7 @@ TokenMeter is a lightweight Windows desktop monitor for token usage, API costs, | Light theme | Dark theme | | --- | --- | -| ![TokenMeter light theme](docs/images/token-spider-ui-v3-light.png) | ![TokenMeter dark theme](docs/images/token-spider-ui-v3-dark.png) | +| ![TokenMeter light theme](docs/images/token-spider-ui-v3-light.png) | ![TokenMeter dark theme](docs/images/tokenmeter-v1.11.2-dark.png) | ## Requirements @@ -137,7 +137,7 @@ TokenMeter/ ## Version and releases -Current version: `1.11.1`. See [GitHub Releases](https://github.com/zensoku142/TokenMeter/releases) for change notes and checksums. +Current version: `1.11.2`. See [GitHub Releases](https://github.com/zensoku142/TokenMeter/releases) for change notes and checksums. ## License diff --git a/README.ja.md b/README.ja.md index 332370a..e404b51 100644 --- a/README.ja.md +++ b/README.ja.md @@ -43,7 +43,7 @@ TokenMeter は、DeepSeek と Xiaomi MiMo の Token 消費量、API コスト、 | ライトテーマ | ダークテーマ | | --- | --- | -| ![TokenMeter ライトテーマ](docs/images/token-spider-ui-v3-light.png) | ![TokenMeter ダークテーマ](docs/images/token-spider-ui-v3-dark.png) | +| ![TokenMeter ライトテーマ](docs/images/token-spider-ui-v3-light.png) | ![TokenMeter ダークテーマ](docs/images/tokenmeter-v1.11.2-dark.png) | ## 動作要件 @@ -129,7 +129,7 @@ TokenMeter/ ## バージョンと Release -現在のバージョン:`1.11.1`。変更履歴とチェックサムは [GitHub Releases](https://github.com/zensoku142/TokenMeter/releases) を参照してください。 +現在のバージョン:`1.11.2`。変更履歴とチェックサムは [GitHub Releases](https://github.com/zensoku142/TokenMeter/releases) を参照してください。 ## License diff --git a/README.ko.md b/README.ko.md index f251a34..2818dae 100644 --- a/README.ko.md +++ b/README.ko.md @@ -43,7 +43,7 @@ TokenMeter는 DeepSeek와 Xiaomi MiMo의 Token 소비량, API 비용, 계정 잔 | 라이트 테마 | 다크 테마 | | --- | --- | -| ![TokenMeter 라이트 테마](docs/images/token-spider-ui-v3-light.png) | ![TokenMeter 다크 테마](docs/images/token-spider-ui-v3-dark.png) | +| ![TokenMeter 라이트 테마](docs/images/token-spider-ui-v3-light.png) | ![TokenMeter 다크 테마](docs/images/tokenmeter-v1.11.2-dark.png) | ## 시스템 요구 사항 @@ -129,7 +129,7 @@ TokenMeter/ ## 버전 및 Release -현재 버전: `1.11.1`. 변경 사항과 체크섬은 [GitHub Releases](https://github.com/zensoku142/TokenMeter/releases)에서 확인하세요. +현재 버전: `1.11.2`. 변경 사항과 체크섬은 [GitHub Releases](https://github.com/zensoku142/TokenMeter/releases)에서 확인하세요. ## License diff --git a/README.md b/README.md index 1033663..13c2786 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,8 @@ TokenMeter 是一款轻量级 Windows 桌面 AI 用量监控工具。它以类 - Codex 按接口返回的窗口时长展示当前周额度与重置时间,右侧显示近 7 天 Token 使用量;同时保留年度活动、累计/峰值 Token、按单个任务计算的最长聊天和连续使用天数。 - Codex 默认读取本机 CLI 目录;非默认位置通过只读目录选择器设置,并兼容旧版已保存的 `auth.json` 文件路径。 - DeepSeek 支持峰谷计价提示;MiMo Cookie 可通过专用 Chrome 会话获取和续期。 -- 网络异常时保留最近成功数据;历史数据缓存在本地 SQLite。 +- 网络异常时保留最近一次成功额度,并继续更新本地 Token 活动;本地统计不会覆盖远程额度更新时间。 +- 历史数据缓存在本地 SQLite;自动更新前备份 `usage.db`,分时数据按设置天数的 2 倍保护期清理并记录清理明细。 - API Key、Bearer Token 和 Cookie 保存到 Windows 凭据管理器。 - 支持迁移应用数据目录、自动更新及单实例运行。 @@ -45,7 +46,7 @@ TokenMeter 是一款轻量级 Windows 桌面 AI 用量监控工具。它以类 | 浅色主题 | 深色主题 | | --- | --- | -| ![TokenMeter 浅色主题](docs/images/token-spider-ui-v3-light.png) | ![TokenMeter 深色主题](docs/images/token-spider-ui-v3-dark.png) | +| ![TokenMeter 浅色主题](docs/images/token-spider-ui-v3-light.png) | ![TokenMeter 深色主题](docs/images/tokenmeter-v1.11.2-dark.png) | ## 系统要求 @@ -151,7 +152,7 @@ TokenMeter/ ## 版本与 Release -当前版本:`1.11.1`。更新记录及校验文件见 [GitHub Releases](https://github.com/zensoku142/TokenMeter/releases)。 +当前版本:`1.11.2`。更新记录及校验文件见 [GitHub Releases](https://github.com/zensoku142/TokenMeter/releases)。 2.0 的 Provider 能力边界、分批计划和已执行基础见 [TokenMeter 2.0 路线图](docs/V2_ROADMAP.md)。 diff --git a/README.zh-TW.md b/README.zh-TW.md index b8bfcf8..030547c 100644 --- a/README.zh-TW.md +++ b/README.zh-TW.md @@ -43,7 +43,7 @@ TokenMeter 是輕量級 Windows 桌面 AI Token 用量監控工具,用於查 | 淺色主題 | 深色主題 | | --- | --- | -| ![TokenMeter 淺色主題](docs/images/token-spider-ui-v3-light.png) | ![TokenMeter 深色主題](docs/images/token-spider-ui-v3-dark.png) | +| ![TokenMeter 淺色主題](docs/images/token-spider-ui-v3-light.png) | ![TokenMeter 深色主題](docs/images/tokenmeter-v1.11.2-dark.png) | ## 系統需求 @@ -129,7 +129,7 @@ TokenMeter/ ## 版本與 Release -目前版本:`1.11.1`。更新說明與校驗檔請見 [GitHub Releases](https://github.com/zensoku142/TokenMeter/releases)。 +目前版本:`1.11.2`。更新說明與校驗檔請見 [GitHub Releases](https://github.com/zensoku142/TokenMeter/releases)。 ## License diff --git a/app_identity.py b/app_identity.py index 32a38bd..6f48c48 100644 --- a/app_identity.py +++ b/app_identity.py @@ -4,7 +4,7 @@ APP_DISPLAY_NAME = "TokenMeter" APP_STORAGE_NAME = "TokenSpider" -APP_VERSION = "1.11.1" +APP_VERSION = "1.11.2" # Keep the legacy storage and mutex identities so upgrades retain user data, # credentials, and single-instance coordination across every public rename. diff --git a/app_update.py b/app_update.py index ca5e189..233ae80 100644 --- a/app_update.py +++ b/app_update.py @@ -564,6 +564,15 @@ def launch_installer(bundle: DownloadBundle) -> None: cleanup_paths = [str(cache_dir.relative_to(updates_root))] except ValueError as exc: raise UpdateError("更新缓存目录不在允许的清理范围内") from exc + try: + from data import history + + backup_path = history.backup_usage_database(bundle.release.version) + except Exception as exc: + config_manager.logger().exception("Pre-update usage database backup failed") + raise UpdateError("更新前备份本地 usage.db 失败,已取消更新") from exc + if backup_path is not None: + config_manager.logger().info("Pre-update usage database backup: %s", backup_path) config_manager.save_pending_update_cleanup( { "version": MANIFEST_VERSION, diff --git a/data/history.py b/data/history.py index 2fba2a7..d58bb5c 100644 --- a/data/history.py +++ b/data/history.py @@ -3,14 +3,16 @@ from __future__ import annotations import sqlite3 -from contextlib import contextmanager +from contextlib import closing, contextmanager from datetime import date, datetime, timedelta from decimal import Decimal, InvalidOperation +from pathlib import Path from typing import Any, Iterator import config_manager DB_PATH = config_manager.CONFIG_DIR / "usage.db" +MINUTE_USAGE_CLEANUP_GRACE_MULTIPLIER = 2 MINUTE_TOKEN_TYPES = ( "PROMPT_CACHE_HIT_TOKEN", @@ -129,6 +131,40 @@ def _connect() -> Iterator[sqlite3.Connection]: connection.close() +def backup_usage_database( + release_version: str, observed_at: datetime | None = None +) -> Path | None: + """Create a consistent pre-update SQLite snapshot outside the update cache.""" + + source_path = DB_PATH.resolve(strict=False) + if not source_path.is_file(): + return None + safe_version = "".join( + character if character.isalnum() or character in {".", "-", "_"} else "_" + for character in str(release_version).strip() + ) or "unknown" + timestamp = (observed_at or datetime.now()).strftime("%Y%m%d%H%M%S%f") + backup_dir = source_path.parent / "backups" + backup_dir.mkdir(parents=True, exist_ok=True) + backup_path = backup_dir / f"usage-before-update-v{safe_version}-{timestamp}.db" + temporary_path = backup_path.with_suffix(backup_path.suffix + ".tmp") + source_uri = source_path.as_uri() + "?mode=ro" + try: + with ( + closing(sqlite3.connect(source_uri, uri=True, timeout=5)) as source, + closing(sqlite3.connect(temporary_path, timeout=5)) as target, + ): + source.backup(target) + result = target.execute("PRAGMA quick_check").fetchone() + if not result or result[0] != "ok": + raise sqlite3.DatabaseError("usage.db backup integrity check failed") + temporary_path.replace(backup_path) + except Exception: + temporary_path.unlink(missing_ok=True) + raise + return backup_path + + def needs_initial_sync(provider: str = "deepseek") -> bool: with _connect() as connection: row = connection.execute( @@ -422,28 +458,63 @@ def _minute_usage_retention_threshold(current_day: date, retention_days: int) -> return (current_day - timedelta(days=retention_days - 1)).isoformat() +def _delete_expired_minute_usage( + connection: sqlite3.Connection, + provider: str, + current_day: date, + retention_days: int, +) -> tuple[str, dict[str, int]]: + effective_days = retention_days * MINUTE_USAGE_CLEANUP_GRACE_MULTIPLIER + threshold = _minute_usage_retention_threshold(current_day, effective_days) + deleted_rows: dict[str, int] = {} + for table in ( + "minute_usage", + "minute_usage_snapshot", + "minute_cost_usage", + "minute_cost_snapshot", + ): + cursor = connection.execute( + f"DELETE FROM {table} WHERE provider = ? AND usage_date < ?", + (provider, threshold), + ) + deleted_rows[table] = max(0, int(cursor.rowcount)) + return threshold, deleted_rows + + +def _log_minute_usage_cleanup( + provider: str, + retention_days: int, + threshold: str, + deleted_rows: dict[str, int], +) -> None: + total_deleted = sum(deleted_rows.values()) + if not total_deleted: + return + details = ", ".join( + f"{table}={count}" for table, count in deleted_rows.items() + ) + config_manager.logger().info( + "Minute usage cleanup: provider=%s cutoff=%s configured_days=%s " + "effective_days=%s deleted_rows=%s (%s)", + provider, + threshold, + retention_days, + retention_days * MINUTE_USAGE_CLEANUP_GRACE_MULTIPLIER, + total_deleted, + details, + ) + + def clear_expired_minute_usage( provider: str, current_day: date, retention_days: int = 3 -) -> None: - """删除指定提供商超过保留天数的临时分时缓存。""" - threshold = _minute_usage_retention_threshold(current_day, retention_days) +) -> int: + """超过配置天数的双倍宽限期后,删除指定提供商的分时缓存。""" with _connect() as connection: - connection.execute( - "DELETE FROM minute_usage WHERE provider = ? AND usage_date < ?", - (provider, threshold), - ) - connection.execute( - "DELETE FROM minute_usage_snapshot WHERE provider = ? AND usage_date < ?", - (provider, threshold), - ) - connection.execute( - "DELETE FROM minute_cost_usage WHERE provider = ? AND usage_date < ?", - (provider, threshold), - ) - connection.execute( - "DELETE FROM minute_cost_snapshot WHERE provider = ? AND usage_date < ?", - (provider, threshold), + threshold, deleted_rows = _delete_expired_minute_usage( + connection, provider, current_day, retention_days ) + _log_minute_usage_cleanup(provider, retention_days, threshold, deleted_rows) + return sum(deleted_rows.values()) def save_estimated_minute_usage( @@ -474,22 +545,8 @@ def save_estimated_minute_usage( if not cost_cny.is_finite(): cost_cny = None with _connect() as connection: - threshold = _minute_usage_retention_threshold(usage_day, retention_days) - connection.execute( - "DELETE FROM minute_usage WHERE provider = ? AND usage_date < ?", - (provider, threshold), - ) - connection.execute( - "DELETE FROM minute_usage_snapshot WHERE provider = ? AND usage_date < ?", - (provider, threshold), - ) - connection.execute( - "DELETE FROM minute_cost_usage WHERE provider = ? AND usage_date < ?", - (provider, threshold), - ) - connection.execute( - "DELETE FROM minute_cost_snapshot WHERE provider = ? AND usage_date < ?", - (provider, threshold), + cleanup_threshold, deleted_rows = _delete_expired_minute_usage( + connection, provider, usage_day, retention_days ) previous, previous_at = _snapshot_rows(connection, provider, usage_date) if previous_at is None: @@ -535,6 +592,9 @@ def save_estimated_minute_usage( _save_estimated_minute_cost_usage( connection, provider, usage_date, cost_cny, observed_at ) + _log_minute_usage_cleanup( + provider, retention_days, cleanup_threshold, deleted_rows + ) return status diff --git a/data/store.py b/data/store.py index 78dea94..d10de05 100644 --- a/data/store.py +++ b/data/store.py @@ -418,8 +418,27 @@ def _base_snapshot(cls, provider_id: str = "") -> "TokenData": return copy.deepcopy(snapshot) if snapshot else cls() @classmethod - def fetch(cls, today: date | None = None, lightweight: bool = False) -> "TokenData": - providers = list(active_providers()) + def cached_snapshot(cls, provider_id: str) -> "TokenData | None": + """Return an isolated successful snapshot for one provider, if available.""" + with cls._cache_lock: + snapshot = cls._provider_snapshots.get(provider_id) + return copy.deepcopy(snapshot) if snapshot else None + + @classmethod + def fetch( + cls, + today: date | None = None, + lightweight: bool = False, + config: Mapping[str, Any] | None = None, + ) -> "TokenData": + # Background workers must use the configuration captured when they were + # created. Otherwise a queued task can silently switch providers before + # it starts running. + providers = ( + list(active_providers(config)) + if config is not None + else list(active_providers()) + ) if not providers: return cls( status="error", @@ -466,6 +485,8 @@ def _fetch_with_provider( per.status = "loading" per.is_stale = False successes = 0 + kept_cached_quota = False + quota_refresh_failed = False minute_rows: list[dict[str, Any]] = [] minute_cost_rows: list[dict[str, Any]] = [] minute_status = "unavailable" @@ -520,19 +541,53 @@ def _fetch_with_provider( quota, quota_error = None, FetchError( "UNKNOWN_ERROR", "订阅额度", str(exc) ) + quota_refresh_failed = bool( + quota_error + and getattr(provider, "supports_subscription_quota", False) + ) + kept_cached_quota = bool( + quota_error + and quota_error.code in {"NETWORK_ERROR", "NETWORK_TIMEOUT"} + and previous_per + and ( + previous_per.quota_windows + or previous_per.quota_metrics + or previous_per.account_plan + ) + ) + if kept_cached_quota and previous_per is not None: + # Codex 的远程额度失败时仍会返回最新本地活动。保留上次成功 + # 的远程额度,避免瞬时网络波动把卡片清空。 + per.quota_windows = copy.deepcopy(previous_per.quota_windows) + per.quota_metrics = copy.deepcopy(previous_per.quota_metrics) + per.account_label = previous_per.account_label + per.account_plan = previous_per.account_plan if quota is not None: - per.quota_windows = list(quota.windows) - per.quota_metrics = list(quota.metrics) + if not kept_cached_quota: + per.quota_windows = list(quota.windows) + per.quota_metrics = list(quota.metrics) + per.account_label = quota.account_label + per.account_plan = quota.plan per.quota_statistics = list(quota.statistics) - per.account_label = quota.account_label - per.account_plan = quota.plan data.daily_usage = [ {"date": usage_day, "tokens": tokens, "cost_cny": 0} for usage_day, tokens in quota.activity ] successes += 1 + elif kept_cached_quota: + # 没有本地活动时也继续展示上一份完整额度。 + successes += 1 if quota_error: - per.errors.append(quota_error) + if kept_cached_quota: + # 静默降级只影响界面;日志仍保留失败证据用于诊断。 + config_manager.logger().warning( + "Fetch failed: provider=%s source=%s code=%s; retained cached quota", + provider.id, + quota_error.source, + quota_error.code, + ) + else: + per.errors.append(quota_error) try: balance, balance_error = provider.fetch_balance() @@ -741,8 +796,9 @@ def _fetch_with_provider( data.minute_cost_usage_history = minute_cost_history if successes: - data.last_success_at = datetime.now() - data.last_updated = data.last_success_at.strftime("%H:%M:%S") + if not quota_refresh_failed: + data.last_success_at = datetime.now() + data.last_updated = data.last_success_at.strftime("%H:%M:%S") data.status = "partial" if per.errors else "ok" data.is_stale = bool(per.errors) with cls._cache_lock: diff --git a/docs/images/tokenmeter-v1.11.2-dark.png b/docs/images/tokenmeter-v1.11.2-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..f8d195404adb0683deb86ba11d05773ddc3d4f6c GIT binary patch literal 78115 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 vR2mKAM@JP613b>)8NjAf None: self._annual_activity_summary = summary self.activity_summary.setText(summary) - def update_data(self, data: TokenData, loading: bool = False) -> None: + def update_data( + self, + data: TokenData, + loading: bool = False, + refreshing: bool = False, + ) -> None: self._currency = str(data.currency or "CNY").upper() money = lambda value: "--" if loading else format_money(value, self._currency) tokens = lambda value: "--" if loading or value is None else compact_tokens(int(value)) @@ -2666,9 +2671,9 @@ def update_data(self, data: TokenData, loading: bool = False) -> None: self.statistics.set_quota_data(data) self.setFixedHeight(ANNUAL_PANEL_HEIGHT) self.activity_height_changed.emit(ANNUAL_PANEL_HEIGHT) - status, _color = self.status_summary(data, loading) + status, _color = self.status_summary(data, loading or refreshing) self.status_text.setText(status) - self.status_dot.set_role(self.status_role(data, loading)) + self.status_dot.set_role(self.status_role(data, loading or refreshing)) self.updated_text.setText(self.relative_update_time(data)) return @@ -2706,9 +2711,9 @@ def update_data(self, data: TokenData, loading: bool = False) -> None: self.trend.set_rows(data.daily_usage, currency=self._currency) self.statistics.set_data(data) - status, _color = self.status_summary(data, loading) + status, _color = self.status_summary(data, loading or refreshing) self.status_text.setText(status) - self.status_dot.set_role(self.status_role(data, loading)) + self.status_dot.set_role(self.status_role(data, loading or refreshing)) self.updated_text.setText(self.relative_update_time(data)) @staticmethod diff --git a/ui/qt_settings.py b/ui/qt_settings.py index dcd3ed9..115ad76 100644 --- a/ui/qt_settings.py +++ b/ui/qt_settings.py @@ -270,7 +270,9 @@ def __init__( self.minute_usage_retention_days = QSpinBox() self.minute_usage_retention_days.setRange(1, 365) self.minute_usage_retention_days.setSuffix(" 天") - self.minute_usage_retention_days.setToolTip("保留最近 N 天分时估算数据,包含当天;程序启动后自动清理更早数据") + self.minute_usage_retention_days.setToolTip( + "界面展示最近 N 天分时估算数据;本地数据保留双倍宽限期,超过 2N 天后才自动清理" + ) runtime_form.addRow("分时数据保存天数", self.minute_usage_retention_days) self.theme_combo = QComboBox() self.theme_combo.addItem("跟随系统", "system") diff --git a/ui/qt_widget.py b/ui/qt_widget.py index d9a598e..2b61b4f 100644 --- a/ui/qt_widget.py +++ b/ui/qt_widget.py @@ -54,15 +54,21 @@ class FetchSignals(QObject): class FetchTask(QRunnable): - def __init__(self, request_id: int, lightweight: bool = False): + def __init__( + self, + request_id: int, + config: dict[str, object], + lightweight: bool = False, + ): super().__init__() self.request_id = request_id + self._config = dict(config) self._lightweight = lightweight self.signals = FetchSignals() @Slot() def run(self) -> None: - result = _fetch_tokens_safely(self._lightweight) + result = _fetch_tokens_safely(self._config, self._lightweight) self.signals.finished.emit(self.request_id, result) @@ -121,15 +127,33 @@ def run(self) -> None: ) -def _fetch_tokens_safely(lightweight: bool = False) -> TokenData: - """Fetch token data from the active provider and keep the worker thread +def _fetch_tokens_safely( + config: dict[str, object], lightweight: bool = False +) -> TokenData: + """Fetch token data from a captured provider and keep the worker thread from dying if a provider or config error is raised.""" try: - return TokenData.fetch(lightweight=lightweight) + return TokenData.fetch(lightweight=lightweight, config=config) except Exception: config_manager.logger().exception("Background refresh failed") - data = TokenData(status="error") + provider_id = str(config.get("ACTIVE_PROVIDER", "")).strip().lower() + provider_cls = PROVIDERS.get(provider_id) + per_provider = [] + if provider_cls is not None: + per_provider.append( + PerProviderData( + provider_id, + provider_cls.name, + currency=provider_cls.default_currency, + status="error", + ) + ) + data = TokenData( + currency=provider_cls.default_currency if provider_cls is not None else "CNY", + per_provider=per_provider, + status="error", + ) data.last_attempt_at = __import__("datetime").datetime.now() data.errors.append( FetchError("UNKNOWN_ERROR", "后台刷新", "刷新数据时发生未知错误") @@ -379,7 +403,8 @@ def expand_panel(self) -> None: self.raise_() self.activateWindow() self.panel.setFocus(Qt.FocusReason.OtherFocusReason) - self.panel.update_data(self._data, self._refreshing) + loading = self._refreshing and self._data.last_success_at is None + self.panel.update_data(self._data, loading, self._refreshing) self.refresh() finally: self._transitioning = False @@ -760,15 +785,18 @@ def _switch_provider(self, provider_id: str) -> None: if not provider_id or provider_id == config_manager.get("ACTIVE_PROVIDER", ""): return try: - config_manager.save_config({"ACTIVE_PROVIDER": provider_id}) + config_snapshot = config_manager.save_config({"ACTIVE_PROVIDER": provider_id}) except Exception: config_manager.logger().exception("Quick provider switch failed") - self.panel.update_data(self._data, self._refreshing) + loading = self._refreshing and self._data.last_success_at is None + self.panel.update_data(self._data, loading, self._refreshing) return self._sync_pricing_state(notify_transition=False) provider_cls = PROVIDERS[provider_id] + cached = TokenData.cached_snapshot(provider_id) self._prepare_scope_switch( - TokenData( + cached + or TokenData( currency=provider_cls.default_currency, per_provider=[ PerProviderData( @@ -779,31 +807,49 @@ def _switch_provider(self, provider_id: str) -> None: ) ], status="loading", - ) + ), + config_snapshot, ) - def _prepare_scope_switch(self, data: TokenData) -> None: - with self._refresh_lock: - if self._refreshing: - # The in-flight result belongs to the previous provider. - # Invalidate its request id so it cannot briefly relabel stale data. - self._request_id += 1 + def _prepare_scope_switch( + self, data: TokenData, config_snapshot: dict[str, object] + ) -> None: self._data = data - self._apply_update() - self.refresh() + # A provider switch is allowed to supersede an in-flight refresh. The + # older worker can finish in the background, but its request id prevents + # it from changing either the data or the new loading state. + self.refresh(force=True, config_snapshot=config_snapshot) - def refresh(self) -> None: + def refresh( + self, + *, + force: bool = False, + config_snapshot: dict[str, object] | None = None, + ) -> None: + captured_config = dict( + config_snapshot + if config_snapshot is not None + else config_manager.all_config() + ) + provider_id = str(captured_config.get("ACTIVE_PROVIDER", "")).strip().lower() with self._refresh_lock: if self._closed: return - if self._refreshing: + if self._refreshing and not force: self._pending_refresh = True return + if force: + # Pending work belongs to the provider scope being replaced. + self._pending_refresh = False self._refreshing = True self._request_id += 1 request_id = self._request_id self._apply_update() - task = FetchTask(request_id, lightweight=self._uses_lightweight_mimo_refresh()) + task = FetchTask( + request_id, + captured_config, + lightweight=self._uses_lightweight_mimo_refresh(provider_id), + ) task.signals.finished.connect(self._finish_refresh) self._thread_pool.start(task) @@ -813,9 +859,10 @@ def _finish_refresh(self, request_id: int, result: TokenData) -> None: with self._refresh_lock: if self._closed: return - if request_id == self._request_id: - self._data = result - has_current_result = True + if request_id != self._request_id: + return + self._data = result + has_current_result = True self._refreshing = False pending = self._pending_refresh self._pending_refresh = False @@ -969,7 +1016,7 @@ def _apply_update(self) -> None: ) self.panel.set_refreshing(self._refreshing) if self._expanded: - self.panel.update_data(self._data, loading) + self.panel.update_data(self._data, loading, self._refreshing) def _periodic_refresh(self) -> None: self.refresh() @@ -1019,11 +1066,11 @@ def _sync_pricing_state(self, notify_transition: bool) -> None: ) self._pricing_timer.start(delay_ms) - def _uses_lightweight_mimo_refresh(self) -> bool: - return ( - not self._expanded - and str(config_manager.get("ACTIVE_PROVIDER", "")).strip().lower() == "mimo" - ) + def _uses_lightweight_mimo_refresh(self, provider_id: str | None = None) -> bool: + selected = provider_id or str( + config_manager.get("ACTIVE_PROVIDER", "") + ).strip().lower() + return not self._expanded and selected == "mimo" def _reschedule_refresh(self) -> None: configured = int(config_manager.get("REFRESH_INTERVAL", 60_000)) diff --git a/updater_version_info.txt b/updater_version_info.txt index 688e11f..791cd86 100644 --- a/updater_version_info.txt +++ b/updater_version_info.txt @@ -1,7 +1,7 @@ VSVersionInfo( ffi=FixedFileInfo( - filevers=(1, 11, 1, 0), - prodvers=(1, 11, 1, 0), + filevers=(1, 11, 2, 0), + prodvers=(1, 11, 2, 0), mask=0x3f, flags=0x0, OS=0x40004, @@ -15,11 +15,11 @@ VSVersionInfo( '040904B0', [ StringStruct('FileDescription', 'TokenMeter standalone updater'), - StringStruct('FileVersion', '1.11.1'), + StringStruct('FileVersion', '1.11.2'), StringStruct('InternalName', 'TokenMeterUpdater'), StringStruct('OriginalFilename', 'TokenMeterUpdater.exe'), StringStruct('ProductName', 'TokenMeterUpdater'), - StringStruct('ProductVersion', '1.11.1') + StringStruct('ProductVersion', '1.11.2') ] ) ]), diff --git a/version_info.txt b/version_info.txt index c9f5105..ccc253d 100644 --- a/version_info.txt +++ b/version_info.txt @@ -1,7 +1,7 @@ VSVersionInfo( ffi=FixedFileInfo( - filevers=(1, 11, 1, 0), - prodvers=(1, 11, 1, 0), + filevers=(1, 11, 2, 0), + prodvers=(1, 11, 2, 0), mask=0x3f, flags=0x0, OS=0x40004, @@ -15,11 +15,11 @@ VSVersionInfo( '040904B0', [ StringStruct('FileDescription', 'TokenMeter API usage monitor'), - StringStruct('FileVersion', '1.11.1'), + StringStruct('FileVersion', '1.11.2'), StringStruct('InternalName', 'TokenMeter'), StringStruct('OriginalFilename', 'TokenMeter.exe'), StringStruct('ProductName', 'TokenMeter'), - StringStruct('ProductVersion', '1.11.1') + StringStruct('ProductVersion', '1.11.2') ] ) ]),