launcher.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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(
  21. wbb.BOT_PROFILES_PATH,
  22. project_root=PROJECT_ROOT,
  23. control_port=wbb.ADMIN_WEB_PORT,
  24. )
  25. wbb.BOT_SUPERVISOR = supervisor
  26. await supervisor.start_enabled()
  27. await start_admin_web()
  28. stopped = asyncio.Event()
  29. loop = asyncio.get_running_loop()
  30. for name in (signal.SIGINT, signal.SIGTERM):
  31. try:
  32. loop.add_signal_handler(name, stopped.set)
  33. except NotImplementedError:
  34. pass
  35. try:
  36. await stopped.wait()
  37. finally:
  38. await supervisor.close()
  39. await stop_admin_web()
  40. def main() -> None:
  41. args = _arguments()
  42. if args.worker:
  43. if args.port:
  44. os.environ["ADMIN_WEB_PORT"] = str(args.port)
  45. runpy.run_module("wbb", run_name="__main__")
  46. return
  47. asyncio.run(_run_supervisor())
  48. if __name__ == "__main__":
  49. main()