diff --git a/handlers/commands.py b/handlers/commands.py index fbfcdc2..8063704 100644 --- a/handlers/commands.py +++ b/handlers/commands.py @@ -1772,6 +1772,8 @@ class BotInterface: await asyncio.gather(*[_check_one(p) for p in proxies], return_exceptions=True) + await self.proxy_manager.apply_check_results(results) + ok_ids = [pid for pid, ok in results.items() if ok] fail_ids = [pid for pid, ok in results.items() if not ok] diff --git a/managers/proxy_manager.py b/managers/proxy_manager.py index 83c7387..12bb9e5 100644 --- a/managers/proxy_manager.py +++ b/managers/proxy_manager.py @@ -417,6 +417,25 @@ class ProxyManager: loop = asyncio.get_running_loop() await loop.run_in_executor(None, self._save_proxies_file) + async def apply_check_results(self, results: dict) -> None: + """Применяет результаты проверки: помечает нерабочие и сохраняет файл. + + results: {proxy.id: bool} — True=рабочий, False=нерабочий. + """ + changed = False + for proxy_id, ok in results.items(): + if not ok and self._working_status.get(proxy_id, True): + self._working_status[proxy_id] = False + changed = True + logger.warning(f"Proxy {proxy_id} marked as failed (tunnel check)") + elif ok and not self._working_status.get(proxy_id, True): + self._working_status[proxy_id] = True + changed = True + logger.info(f"Proxy {proxy_id} restored as working (tunnel check)") + if changed: + loop = asyncio.get_running_loop() + await loop.run_in_executor(None, self._save_proxies_file) + def reload(self) -> int: """Перезагружает прокси из файла. Возвращает количество загруженных.""" self._proxies.clear()