SurfSense/surfsense_backend/app/gateway/slack/commands.py

65 lines
1.9 KiB
Python
Raw Normal View History

"""Slack command/onboarding handlers."""
from __future__ import annotations
from app.gateway.base.adapter import ParsedInboundEvent
from app.gateway.base.commands import BaseGatewayCommands
from app.gateway.ratelimit import acquire_token
from app.gateway.slack.adapter import SlackAdapter
HELP_TEXT = (
"SurfSense Slack commands:\n"
"`/new` - start a fresh SurfSense conversation in this thread\n"
"`/help` - show this help\n\n"
"Mention the SurfSense bot in a channel thread to ask your agent a question."
)
class SlackGatewayCommands(BaseGatewayCommands):
async def handle_help_command(
self,
*,
adapter: SlackAdapter,
event: ParsedInboundEvent,
) -> bool:
channel_id = event.metadata.get("channel_id")
thread_ts = event.metadata.get("thread_ts")
if not channel_id or not thread_ts:
return True
await adapter.send_message(
external_peer_id=channel_id,
text=HELP_TEXT,
reply_to_message_id=thread_ts,
)
return True
async def send_unbound_onboarding(
self,
*,
adapter: SlackAdapter,
event: ParsedInboundEvent,
dashboard_url: str,
) -> None:
channel_id = event.metadata.get("channel_id")
thread_ts = event.metadata.get("thread_ts")
slack_user_id = event.metadata.get("slack_user_id")
if not channel_id or not thread_ts:
return
wait_ms = await acquire_token(
f"slack:onboarded:{event.metadata.get('team_id')}:{slack_user_id}",
capacity=1,
refill_per_sec=1 / 3600,
)
if wait_ms > 0:
return
await adapter.send_message(
external_peer_id=channel_id,
reply_to_message_id=thread_ts,
text=(
"Hi! Connect your Slack user to SurfSense before using the bot here: "
f"{dashboard_url}"
),
)