Implement reconnect, idle reporting, and security hardening

This commit is contained in:
2026-02-16 23:03:02 +09:00
parent 582c19bb50
commit ebe7902362
8 changed files with 165 additions and 6 deletions

View File

@@ -3,6 +3,7 @@
from __future__ import annotations
import logging
import time
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler
@@ -19,7 +20,8 @@ class SlackHandler:
def __init__(self, config: Config) -> None:
self.config = config
self.app = App(token=config.slack_bot_token)
self._handler = SocketModeHandler(self.app, config.slack_app_token)
self._handler: SocketModeHandler | None = None
self._stop_requested = False
self._on_message_callback: callable | None = None
self._on_command_callback: callable | None = None
@@ -98,11 +100,31 @@ class SlackHandler:
)
def start(self) -> None:
"""Socket Mode 핸들러를 시작한다."""
"""Socket Mode 핸들러를 시작한다. 연결이 끊기면 재연결한다."""
self._stop_requested = False
logger.info("Slack Socket Mode 시작")
self._handler.start()
while not self._stop_requested:
try:
self._handler = SocketModeHandler(self.app, self.config.slack_app_token)
self._handler.start()
except Exception:
if self._stop_requested:
break
logger.exception("Socket Mode 연결이 종료되었습니다.")
if self._stop_requested:
break
logger.warning(
"Socket Mode 재연결 시도 (%s초 후)",
self.config.reconnect_delay_seconds,
)
time.sleep(self.config.reconnect_delay_seconds)
def stop(self) -> None:
"""Socket Mode 핸들러를 종료한다."""
logger.info("Slack Socket Mode 종료")
self._handler.close()
self._stop_requested = True
if self._handler is not None:
self._handler.close()