integrations.slack.events.handler

integrations/slack/events/handler.py

  1"""
  2integrations/slack/events/handler.py
  3"""
  4
  5import logging
  6import os
  7import sys
  8from typing import TYPE_CHECKING, Any, cast
  9
 10import libs.dispatcher
 11from integrations.slack.events.handler_registry import register, register_all
 12from integrations.slack.events.home_tab import home
 13from libs.utils.timekit import Delimiter, Format
 14from libs.utils.timekit import ExtendedDatetime as ExtDt
 15
 16if TYPE_CHECKING:
 17    from slack_bolt import App
 18
 19    from integrations.protocols import MessageParserProtocol
 20    from integrations.slack.adapter import ServiceAdapter
 21
 22
 23def main(adapter: "ServiceAdapter") -> None:
 24    """
 25    メイン処理
 26
 27    Args:
 28        adapter (ServiceAdapter): アダプタインターフェース
 29
 30    Raises:
 31        ModuleNotFoundError: ライブラリ未インストール
 32
 33    """
 34    try:
 35        from slack_bolt import App
 36        from slack_bolt.adapter.socket_mode import SocketModeHandler
 37        from slack_sdk import WebClient
 38        from slack_sdk.errors import SlackApiError
 39    except ModuleNotFoundError as err:
 40        raise ModuleNotFoundError(err.msg) from None
 41
 42    def log_filter() -> None:
 43        """ログレベル変更"""
 44        for name in logging.Logger.manager.loggerDict:
 45            if name.startswith(("slack_", "slack")) or "socket_mode" in name:
 46                logging.getLogger(name).setLevel(logging.WARNING)
 47
 48    try:
 49        log_filter()
 50        app = App(token=os.environ["SLACK_BOT_TOKEN"])
 51        adapter.api.webclient = WebClient(token=os.environ["SLACK_WEB_TOKEN"])
 52        adapter.api.appclient = app.client
 53        log_filter()
 54        adapter.conf.bot_id = app.client.auth_test()["user_id"]
 55    except SlackApiError as err:
 56        logging.critical(err)
 57        sys.exit()
 58
 59    register_all(app, adapter)  # イベント遅延登録
 60    SocketModeHandler(app, os.environ["SLACK_APP_TOKEN"]).start()  # type: ignore[no-untyped-call]
 61
 62
 63@register
 64def register_event_handlers(app: "App", adapter: "ServiceAdapter") -> None:
 65    """イベントAPI"""
 66    m = cast("MessageParserProtocol", adapter.parser())
 67
 68    @app.event("message")
 69    def handle_message_events(body: Any) -> None:
 70        """
 71        メッセージイベント
 72
 73        Args:
 74            body (Any): ポストされたデータ
 75
 76        """
 77        m.reset()
 78        m.parser(body)
 79        libs.dispatcher.by_keyword(m)
 80
 81    @app.command(adapter.conf.slash_command)
 82    def slash_command(ack: Any, body: Any) -> None:
 83        """
 84        スラッシュコマンド
 85
 86        Args:
 87            ack (Any): ack
 88            body (Any): ポストされたデータ
 89
 90        """
 91        ack()
 92        m.reset()
 93        m.parser(body)
 94        libs.dispatcher.by_keyword(m)
 95
 96    @app.event("app_home_opened")
 97    def handle_home_events(event: Any) -> None:
 98        """
 99        ホームタブオープン
100
101        Args:
102            event (Any): イベント内容
103
104        """
105        adapter.conf.tab_var = {
106            "view": {},
107            "no": 0,
108            "user_id": None,
109            "view_id": None,
110            "screen": None,
111            "operation": None,
112            "sday": adapter.conf.tab_var.get("sday", ExtDt().format(Format.YMD, Delimiter.HYPHEN)),
113            "eday": adapter.conf.tab_var.get("eday", ExtDt().format(Format.YMD, Delimiter.HYPHEN)),
114        }
115
116        adapter.conf.tab_var["user_id"] = event["user"]
117        if "view" in event:
118            adapter.conf.tab_var["view_id"] = event["view"]["id"]
119
120        logging.trace(adapter.conf.tab_var)  # type: ignore
121
122        home.build_main_menu(adapter)
123        result = adapter.api.appclient.views_publish(
124            user_id=adapter.conf.tab_var["user_id"],
125            view=adapter.conf.tab_var["view"],
126        )
127        logging.trace(result)  # type: ignore
def main(adapter: integrations.slack.adapter.ServiceAdapter) -> None:
24def main(adapter: "ServiceAdapter") -> None:
25    """
26    メイン処理
27
28    Args:
29        adapter (ServiceAdapter): アダプタインターフェース
30
31    Raises:
32        ModuleNotFoundError: ライブラリ未インストール
33
34    """
35    try:
36        from slack_bolt import App
37        from slack_bolt.adapter.socket_mode import SocketModeHandler
38        from slack_sdk import WebClient
39        from slack_sdk.errors import SlackApiError
40    except ModuleNotFoundError as err:
41        raise ModuleNotFoundError(err.msg) from None
42
43    def log_filter() -> None:
44        """ログレベル変更"""
45        for name in logging.Logger.manager.loggerDict:
46            if name.startswith(("slack_", "slack")) or "socket_mode" in name:
47                logging.getLogger(name).setLevel(logging.WARNING)
48
49    try:
50        log_filter()
51        app = App(token=os.environ["SLACK_BOT_TOKEN"])
52        adapter.api.webclient = WebClient(token=os.environ["SLACK_WEB_TOKEN"])
53        adapter.api.appclient = app.client
54        log_filter()
55        adapter.conf.bot_id = app.client.auth_test()["user_id"]
56    except SlackApiError as err:
57        logging.critical(err)
58        sys.exit()
59
60    register_all(app, adapter)  # イベント遅延登録
61    SocketModeHandler(app, os.environ["SLACK_APP_TOKEN"]).start()  # type: ignore[no-untyped-call]

メイン処理

Arguments:
  • adapter (ServiceAdapter): アダプタインターフェース
Raises:
  • ModuleNotFoundError: ライブラリ未インストール
register_event_handlers = None

イベントAPI