launcher.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. from __future__ import annotations
  2. import argparse
  3. import asyncio
  4. import os
  5. import runpy
  6. import signal
  7. from pathlib import Path
  8. PROJECT_ROOT = Path(__file__).resolve().parent
  9. def _arguments() -> argparse.Namespace:
  10. parser = argparse.ArgumentParser(description="Telegram manager launcher")
  11. parser.add_argument("--worker", default="")
  12. parser.add_argument("--port", type=int, default=0)
  13. return parser.parse_args()
  14. async def _run_supervisor() -> None:
  15. os.environ["WBB_ADMIN_BOOTSTRAP"] = "1"
  16. os.environ["WBB_SUPERVISOR_MODE"] = "1"
  17. import wbb
  18. from wbb.admin.supervisor import BotSupervisor
  19. from wbb.web_admin import start_admin_web, stop_admin_web
  20. supervisor = BotSupervisor(wbb.BOT_PROFILES_PATH, project_root=PROJECT_ROOT)
  21. wbb.BOT_SUPERVISOR = supervisor
  22. await supervisor.start_enabled()
  23. await start_admin_web()
  24. stopped = asyncio.Event()
  25. loop = asyncio.get_running_loop()
  26. for name in (signal.SIGINT, signal.SIGTERM):
  27. try:
  28. loop.add_signal_handler(name, stopped.set)
  29. except NotImplementedError:
  30. pass
  31. try:
  32. await stopped.wait()
  33. finally:
  34. await supervisor.close()
  35. await stop_admin_web()
  36. def main() -> None:
  37. args = _arguments()
  38. if args.worker:
  39. if args.port:
  40. os.environ["ADMIN_WEB_PORT"] = str(args.port)
  41. runpy.run_module("wbb", run_name="__main__")
  42. return
  43. asyncio.run(_run_supervisor())
  44. if __name__ == "__main__":
  45. main()