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.
This commit is contained in:
머니페니 2026-03-20 18:21:59 +09:00
parent da9caca791
commit 7e95aeb8ce

View File

@ -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)