from slack_sdk.web.async_client import AsyncWebClient
from slack_sdk.socket_mode.aiohttp import SocketModeClient
from slack_sdk.socket_mode.request import SocketModeRequest
from slack_sdk.socket_mode.response import SocketModeResponse
import structlog
from src.config import get_settings
from src.integrations.slack.events import handle_message_event
from src.integrations.slack.commands import handle_slash_command
logger = structlog.get_logger()
settings = get_settings()
class SlackBot:
"""Slack bot for claim verification."""
def __init__(self):
self.web_client = AsyncWebClient(token=settings.SLACK_BOT_TOKEN)
self.socket_client = None
self.running = False
async def start(self):
"""Start the Slack bot."""
self.socket_client = SocketModeClient(
app_token=settings.SLACK_APP_TOKEN,
web_client=self.web_client
)
self.socket_client.socket_mode_request_listeners.append(self.handle_request)
await self.socket_client.connect()
self.running = True
logger.info("slack_bot_started")
async def stop(self):
"""Stop the Slack bot."""
if self.socket_client:
await self.socket_client.close()
self.running = False
logger.info("slack_bot_stopped")
async def handle_request(self, client: SocketModeClient, req: SocketModeRequest):
"""Handle incoming Slack requests."""
if req.type == "events_api":
# Acknowledge the request
response = SocketModeResponse(envelope_id=req.envelope_id)
await client.send_socket_mode_response(response)
# Handle the event
event = req.payload.get("event", {})
await handle_message_event(self.web_client, event)
elif req.type == "slash_commands":
# Acknowledge the request
response = SocketModeResponse(envelope_id=req.envelope_id)
await client.send_socket_mode_response(response)
# Handle the command
await handle_slash_command(self.web_client, req.payload)
async def send_message(
self,
channel: str,
text: str = None,
blocks: list = None
):
"""Send a message to a Slack channel."""
try:
await self.web_client.chat_postMessage(
channel=channel,
text=text,
blocks=blocks
)
except Exception as e:
logger.error("slack_send_error", error=str(e))