"""زمان‌بند/اسکنر: پیدا کردن موارد سررسیدشده و قرار دادن آن‌ها در صف پیامک.""" import logging import signal import time from django.core.management.base import BaseCommand from admin_panel.sms.scanner import run_all logger = logging.getLogger(__name__) class Command(BaseCommand): help = "اسکن یادآوری‌های پیامک و قرار دادن آن‌ها در صف." def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self._stop = False def add_arguments(self, parser): parser.add_argument("--loop", action="store_true", help="اجرای پیوسته") parser.add_argument("--interval", type=float, default=300.0, help="فاصلهٔ بین اجراها (ثانیه)") def handle(self, *args, **options): signal.signal(signal.SIGTERM, self._handle_signal) signal.signal(signal.SIGINT, self._handle_signal) loop = options["loop"] interval = options["interval"] while not self._stop: results = run_all() summary = ", ".join(f"{name}={count}" for name, count in results.items()) self._emit(f"اسکن پیامک: {summary}") if not loop: break # خواب قابل‌قطع slept = 0.0 while slept < interval and not self._stop: time.sleep(min(1.0, interval - slept)) slept += 1.0 def _handle_signal(self, signum, frame): self._stop = True def _emit(self, text): """نوشتن خروجی با تحمل کدگذاری محدود کنسول (مثلاً cp1252 در ویندوز).""" try: self.stdout.write(text) except UnicodeEncodeError: self.stdout.write(text.encode("ascii", "replace").decode("ascii"))