Add configurable minimum refresh interval setting

Added user-configurable minimum refresh interval for inventory reloads, allowing users to control how frequently the maintenance service triggers updates (default: 30 minutes, range: 1-1440 minutes).

- Add minimum_refresh_interval_minutes to settings system with default of 30 minutes
- Update maintenance service to use configurable interval instead of hardcoded 1-minute value
- Add GUI input field in General Settings with auto-save functionality
- Include field in API settings endpoint and settings manager

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Fengqing Liu
2025-10-19 10:56:40 +11:00
parent f62ec26b5d
commit 472e6d73bd
6 changed files with 17 additions and 3 deletions

View File

@@ -20,6 +20,7 @@ class SettingsFile(TypedDict):
autostart_tray: bool
connection_quality: int
tray_notifications: bool
minimum_refresh_interval_minutes: int
default_settings: SettingsFile = {
@@ -30,6 +31,7 @@ default_settings: SettingsFile = {
"connection_quality": 1,
"language": DEFAULT_LANG,
"tray_notifications": True,
"minimum_refresh_interval_minutes": 30,
}
@@ -50,6 +52,7 @@ class Settings:
autostart_tray: bool
connection_quality: int
tray_notifications: bool
minimum_refresh_interval_minutes: int
PASSTHROUGH = ("_settings", "_args", "_altered")

View File

@@ -57,7 +57,7 @@ class MaintenanceService:
3. After reaching the next hour boundary, request inventory reload
"""
now = datetime.now(timezone.utc)
next_period = now + timedelta(minutes=1)
next_period = now + timedelta(minutes=self._twitch.settings.minimum_refresh_interval_minutes)
while True:
# exit if there's no need to repeat the loop
@@ -89,6 +89,6 @@ class MaintenanceService:
logger.log(CALL, "Maintenance task requests channels cleanup")
self._twitch.change_state(State.CHANNELS_CLEANUP)
# this triggers a restart of this task every (up to) 60 minutes
# this triggers a restart of this task every (up to) <timedelta> minutes
logger.log(CALL, "Maintenance task requests a reload")
self._twitch.change_state(State.INVENTORY_FETCH)

View File

@@ -76,6 +76,7 @@ class SettingsUpdate(BaseModel):
proxy: str | None = None
tray_notifications: bool | None = None
connection_quality: int | None = None
minimum_refresh_interval_minutes: int | None = None
# ==================== REST API Endpoints ====================

View File

@@ -38,7 +38,8 @@ class SettingsManager:
"games_available": self._available_games,
"proxy": str(self._settings.proxy),
"tray_notifications": self._settings.tray_notifications,
"connection_quality": self._settings.connection_quality
"connection_quality": self._settings.connection_quality,
"minimum_refresh_interval_minutes": self._settings.minimum_refresh_interval_minutes
}
def update_settings(self, settings_data: dict[str, Any]):
@@ -57,6 +58,8 @@ class SettingsManager:
self._settings.proxy = settings_data["proxy"]
if "tray_notifications" in settings_data:
self._settings.tray_notifications = settings_data["tray_notifications"]
if "minimum_refresh_interval_minutes" in settings_data:
self._settings.minimum_refresh_interval_minutes = settings_data["minimum_refresh_interval_minutes"]
self._settings.alter()
asyncio.create_task(
self._broadcaster.emit("settings_updated", self.get_settings())

View File

@@ -112,6 +112,10 @@
Connection Quality:
<input type="number" id="connection-quality" min="1" max="6" value="1">
</label>
<label>
Minimum Refresh Interval (minutes):
<input type="number" id="minimum-refresh-interval" min="1" max="1440" value="30">
</label>
</section>
<section class="settings-section">

View File

@@ -540,6 +540,7 @@ function updateSettingsUI(settings) {
state.settings = settings;
document.getElementById('dark-mode').checked = settings.dark_mode || false;
document.getElementById('connection-quality').value = settings.connection_quality || 1;
document.getElementById('minimum-refresh-interval').value = settings.minimum_refresh_interval_minutes || 30;
if (settings.dark_mode) {
document.body.classList.add('dark-mode');
@@ -861,6 +862,7 @@ async function saveSettings() {
const settings = {
dark_mode: document.getElementById('dark-mode').checked,
connection_quality: parseInt(document.getElementById('connection-quality').value),
minimum_refresh_interval_minutes: parseInt(document.getElementById('minimum-refresh-interval').value),
games_to_watch: state.settings.games_to_watch || []
};
@@ -928,6 +930,7 @@ document.addEventListener('DOMContentLoaded', () => {
saveSettings();
});
document.getElementById('connection-quality').addEventListener('change', saveSettings);
document.getElementById('minimum-refresh-interval').addEventListener('change', saveSettings);
document.getElementById('reload-btn').addEventListener('click', reloadCampaigns);
// Games to watch management