1b9aa47 · Slack and Discord adapters, dry-run first · 5 days ago

python29 lines · 1008 B
1"""Slack adapter. Dry-run needs no SDK. Live import is deferred."""
2
3from __future__ import annotations
4
5from typing import TextIO
6
7from mapping import Mapping
8from scope import ScopeGuard
9
10
11class SlackAdapter:
12 def __init__(self, mapping: Mapping, guard: ScopeGuard) -> None:
13 self.mapping = mapping
14 self.guard = guard
15
16 def describe(self, out: TextIO) -> None:
17 m = self.mapping
18 out.write(f"axiom {m.agent} scope={m.scope} platform=slack\n")
19 for ch in m.channels:
20 out.write(f" {ch.role:12} {ch.direction:4} {ch.id} {ch.name}\n")
21 rooms = m.by_role("room")
22 out.write(f"fan-out: {len(rooms)} room(s) wall: {len(self.guard._ids)} id(s)\n")
23
24 def run(self, collect_seconds: int) -> None:
25 for ch in self.mapping.channels:
26 self.guard.require(ch.id, "listen")
27 # Live path: slack_sdk WebClient + Socket Mode, filtered by guard.
28 raise SystemExit("live Slack requires SLACK_BOT_TOKEN and slack-sdk")
29