From 7e95aeb8ce8241cbd053a08bc4a79f1b096ec9fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A8=B8=EB=8B=88=ED=8E=98=EB=8B=88?= Date: Fri, 20 Mar 2026 18:21:59 +0900 Subject: [PATCH] feat: integrate Discord bot and Dispatcher in FastAPI lifespan Adds asynccontextmanager lifespan to webapp.py that: - Initializes task_queue and message_store on startup - Starts Dispatcher as background task - Starts Discord bot gateway if DISCORD_TOKEN is set - Properly shuts down all resources on application exit This completes Phase 3 Task 6, enabling the webapp to run Discord bot and dispatcher concurrently with the webhook server. --- agent/webapp.py | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/agent/webapp.py b/agent/webapp.py index ebcc316..5f6e646 100644 --- a/agent/webapp.py +++ b/agent/webapp.py @@ -1,10 +1,12 @@ """galaxis-agent webhook server.""" +import asyncio import hashlib import hmac import json import logging import os import re +from contextlib import asynccontextmanager from fastapi import FastAPI, Request, HTTPException from slowapi import Limiter @@ -14,7 +16,41 @@ from slowapi.middleware import SlowAPIMiddleware logger = logging.getLogger(__name__) -app = FastAPI(title="galaxis-agent") + +@asynccontextmanager +async def lifespan(app: FastAPI): + """애플리케이션 시작/종료 시 리소스를 관리한다.""" + from agent.task_queue import get_task_queue + from agent.message_store import get_message_store + from agent.dispatcher import Dispatcher + from agent.integrations.discord_handler import DiscordHandler + + task_queue = await get_task_queue() + message_store = await get_message_store() + + dispatcher = Dispatcher(task_queue=task_queue) + await dispatcher.start() + app.state.dispatcher = dispatcher + + discord_token = os.environ.get("DISCORD_TOKEN", "") + discord_handler = None + if discord_token: + discord_handler = DiscordHandler() + discord_task = asyncio.create_task(discord_handler.start(discord_token)) + app.state.discord_handler = discord_handler + logger.info("Discord bot starting...") + + yield + + await dispatcher.stop() + if discord_handler: + await discord_handler.close() + await task_queue.close() + await message_store.close() + logger.info("Application shutdown complete") + + +app = FastAPI(title="galaxis-agent", lifespan=lifespan) limiter = Limiter(key_func=get_remote_address) app.state.limiter = limiter app.add_middleware(SlowAPIMiddleware)