Files

69 lines
2.0 KiB
Django/Jinja

import asyncio
import contextlib
import signal
import anyio
import uvloop
{% if use_dishka %}from dependencies.container import container
{% endif %}from userbot.modules.client import PyroClient
{% if database != 'none' %}from utils.db import init_db
{% endif %}from utils.logging import logger, setup_logging
setup_logging()
SCAN_INTERVAL = 10
async def runner() -> None:
stop = asyncio.Event()
loop = asyncio.get_running_loop()
for sig in (signal.SIGINT, signal.SIGTERM):
loop.add_signal_handler(sig, stop.set)
{% if database != 'none' %} await init_db()
{% endif %} sessions_dir = anyio.Path("sessions")
await sessions_dir.mkdir(parents=True, exist_ok=True)
started: set[str] = set()
clients: dict[int, PyroClient] = {}
try:
while not stop.is_set():
current = {path.name async for path in sessions_dir.glob("*.session")}
for session_file in current - started:
started.add(session_file)
name = session_file.removesuffix(".session")
try:
client = PyroClient(name)
await client.start()
except Exception as e:
logger.warning(f"[red]Client {name} failed to start: {e}[/]")
continue
me = client.me
logger.info(
f"[green]Client started as[/] "
f"{me.full_name if me else 'unknown'} ({me.id if me else '?'})"
)
if me:
clients[me.id] = client
with contextlib.suppress(TimeoutError):
await asyncio.wait_for(stop.wait(), SCAN_INTERVAL)
finally:
for client in clients.values():
with contextlib.suppress(Exception):
await client.stop()
{% if use_dishka %} await container.close()
{% endif %}
def main() -> None:
uvloop.install()
logger.info("Starting...")
asyncio.run(runner())
logger.info("[red]Stopped.[/]")