From f6c5fe425d3ea8218f41c37ee10d564f7c53e363 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Freitas?= Date: Wed, 15 Oct 2025 10:27:18 +0100 Subject: [PATCH] Add interactive message support --- slackbot/base.py | 7 +++++++ slackbot/management/commands/run_bot.py | 21 +++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/slackbot/base.py b/slackbot/base.py index 2c6a72f..41d47aa 100644 --- a/slackbot/base.py +++ b/slackbot/base.py @@ -70,6 +70,13 @@ def handle(self, message, user=None, channel=None, ts=None, raw=None) -> Optiona """ raise NotImplementedError("abstract method") + def process_interactive(self, **payload): + return self.handle_interactive(**payload) + + def handle_interactive(self, **payload) -> Optional[Union[int, tuple[int, int]]]: + # This method is currently a placeholder. + pass + class NoMatchSlackCommand(Exception): pass diff --git a/slackbot/management/commands/run_bot.py b/slackbot/management/commands/run_bot.py index c0d569a..ab8309e 100644 --- a/slackbot/management/commands/run_bot.py +++ b/slackbot/management/commands/run_bot.py @@ -40,6 +40,22 @@ def handle_message(self, **payload): close_old_connections() self.handle_message_really(**payload) + def handle_interactive(self, **payload): + processed_at_least_one = False + for p in self.processors: + try: + r = p.process_interactive(**payload) + if r: + if not isinstance(r, tuple): + r = (r,) + if MessageProcessor.PROCESSED in r: + processed_at_least_one = True + if MessageProcessor.STOP in r: + break + except Exception as e: + self.log_exception("Processor failed for interactive event: %s %s", payload, str(e)) + return processed_at_least_one + def handle_reaction(self, **payload): event = payload.get("event", {}) processed_at_least_one = False @@ -147,6 +163,10 @@ def process_reaction(self, client: SocketModeClient, req: SocketModeRequest): event = req.payload["event"] if event["type"] in ("reaction_added", "reaction_removed"): return self.handle_reaction(**req.payload) + + def process_interactive(self, client: SocketModeClient, req: SocketModeRequest): + if req.type == "interactive": + return self.handle_interactive(**req.payload) def handle(self, *args, **options): # faster cold boot @@ -161,6 +181,7 @@ def handle(self, *args, **options): self.set_up() self.client.socket_mode_request_listeners.append(self.process) self.client.socket_mode_request_listeners.append(self.process_reaction) + self.client.socket_mode_request_listeners.append(self.process_interactive) self.stdout.write("Connecting...\n") self.client.connect()