From f2199f2bec9bbe3224e48792ad2698d3c19591b8 Mon Sep 17 00:00:00 2001 From: user Date: Tue, 17 Feb 2026 10:45:25 +0100 Subject: [PATCH] perf: seed alert seen IDs in background on add Reply immediately with empty seen, run a silent _poll_once in a background task to populate seen IDs, then start the poller. Eliminates the 30-120s blocking wait from 27 sequential backend queries. Co-Authored-By: Claude Opus 4.6 --- plugins/alert.py | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/plugins/alert.py b/plugins/alert.py index bf6f7a4..7d686ac 100644 --- a/plugins/alert.py +++ b/plugins/alert.py @@ -2054,19 +2054,6 @@ async def cmd_alert(bot, message): await bot.reply(message, f"Alert limit reached ({_MAX_SUBS})") return - # Seed: query all backends to populate seen lists (prevents flood) - loop = asyncio.get_running_loop() - seen: dict[str, list[str]] = {} - for tag, backend in _BACKENDS.items(): - try: - items = await loop.run_in_executor(None, backend, keyword) - ids = [item["id"] for item in items] - if len(ids) > _MAX_SEEN: - ids = ids[-_MAX_SEEN:] - seen[tag] = ids - except Exception: - seen[tag] = [] - now = datetime.now(timezone.utc).isoformat() data = { "keyword": keyword, @@ -2077,16 +2064,21 @@ async def cmd_alert(bot, message): "added_at": now, "last_poll": now, "last_error": "", - "seen": seen, + "seen": {}, } _save(bot, key, data) _subscriptions[key] = data - _start_poller(bot, key) - counts = ", ".join(f"{len(seen.get(t, []))} {t}" for t in _BACKENDS) + # Seed seen IDs in background (silent poll), then start the poller + async def _seed(): + await _poll_once(bot, key, announce=False) + _start_poller(bot, key) + + asyncio.create_task(_seed()) + await bot.reply( message, - f"Alert '{name}' added for: {keyword} ({counts} existing)", + f"Alert '{name}' added for: {keyword} (seeding in background)", ) return