Spaces:
Runtime error
Runtime error
| from asyncio import all_tasks, CancelledError, create_task, current_task, get_running_loop, run | |
| from loguru import logger | |
| from signal import SIGINT, SIGTERM | |
| from typing import Any, Callable | |
| from ctp_slack_bot.containers import Container | |
| from ctp_slack_bot.core.logging import setup_logging | |
| async def handle_shutdown_signal() -> None: | |
| logger.info("Received shutdown signal.") | |
| for task in all_tasks(): | |
| if task is not current_task() and not task.done(): | |
| task.cancel() | |
| logger.trace("Cancelled task {}.", task.get_name()) | |
| logger.info("Cancelled all tasks.") | |
| def create_shutdown_signal_handler() -> Callable[[], None]: | |
| def shutdown_signal_handler() -> None: | |
| create_task(handle_shutdown_signal()) | |
| return shutdown_signal_handler | |
| async def main() -> None: | |
| # Setup logging. | |
| setup_logging() | |
| logger.info("Starting application…") | |
| # Set up dependency injection container. | |
| container = Container() | |
| container.wire(packages=['ctp_slack_bot']) | |
| # Kick off services which should be active from the start. | |
| container.content_ingestion_service() | |
| container.question_dispatch_service() | |
| container.schedule_service() | |
| # Start the Slack socket mode handler in the background. | |
| socket_mode_handler = container.socket_mode_handler() | |
| slack_bolt_task = create_task(socket_mode_handler.start_async()) | |
| shutdown_signal_handler = create_shutdown_signal_handler() | |
| loop = get_running_loop() | |
| loop.add_signal_handler(SIGINT, shutdown_signal_handler) | |
| loop.add_signal_handler(SIGTERM, shutdown_signal_handler) | |
| try: | |
| logger.info("Starting Slack Socket Mode handler…") | |
| await slack_bolt_task | |
| except CancelledError: | |
| logger.info("Shutting down application…") | |
| finally: | |
| await socket_mode_handler.close_async() | |
| await container.shutdown_resources() | |
| if __name__ == "__main__": | |
| run(main()) | |