from apscheduler.schedulers.asyncio import AsyncIOScheduler from asyncio import run as run_async from contextlib import asynccontextmanager from dependency_injector.wiring import inject, Provide from fastapi import FastAPI, HTTPException, Depends from loguru import logger from typing import Any, AsyncGenerator from slack_bolt.async_app import AsyncApp from slack_bolt.adapter.socket_mode.async_handler import AsyncSocketModeHandler from starlette.requests import Request from starlette.responses import Response from threading import Thread from typing import Any, Dict, Self from ctp_slack_bot.containers import Container from ctp_slack_bot.core.config import Settings from ctp_slack_bot.core.logging import setup_logging from ctp_slack_bot.core.response_rendering import PrettyJSONResponse from ctp_slack_bot.tasks import start_scheduler, stop_scheduler async def main() -> None: container = Container() container.wire(packages=['ctp_slack_bot']) # Setup logging. setup_logging(container) logger.info("Starting application") # Start the scheduler. scheduler = start_scheduler(container) logger.info("Started scheduler") # Initialize primordial dependencies in container. container.primordial_services() # Start Slack socket mode in a background thread and set up an event handler for the Bolt app. bolt_app = container.slack_bolt_app() slack_service = container.slack_service() @bolt_app.event("message") async def handle_message(body: Dict[str, Any]) -> None: logger.debug("Ignored regular message: {}", body.get("event").get("text")) #await slack_service.process_message(body) @bolt_app.event("app_mention") async def handle_app_mention(body: Dict[str, Any]) -> None: #logger.debug("Ignored app mention: {}", body.get("event").get("text")) await slack_service.process_message(body) # Start Socket Mode handler in a background thread socket_mode_handler = AsyncSocketModeHandler( app=bolt_app, app_token=container.settings().SLACK_APP_TOKEN.get_secret_value() ) logger.info("Starting Slack Socket Mode handler…") await socket_mode_handler.start_async() # Shutdown. logger.info("Shutting down application") stop_scheduler(scheduler) logger.info("Stopped scheduler") if __name__ == "__main__": # run() run_async(main())