integrations.slack.events.home_tab.summary

integrations/slack/events/home_tab/summary.py

  1"""
  2integrations/slack/events/home_tab/summary.py
  3"""
  4
  5import logging
  6
  7import libs.global_value as g
  8from cls.timekit import ExtendedDatetime as ExtDt
  9from integrations.slack.adapter import ServiceAdapter
 10from integrations.slack.events.handler_registry import register
 11from integrations.slack.events.home_tab import ui_parts
 12from libs.commands import graph, ranking, results
 13from libs.utils import dictutil
 14
 15
 16def build_summary_menu(adapter: ServiceAdapter):
 17    """サマリメニュー生成"""
 18
 19    adapter.conf.tab_var["screen"] = "SummaryMenu"
 20    adapter.conf.tab_var["no"] = 0
 21    adapter.conf.tab_var["view"] = {"type": "home", "blocks": []}
 22    adapter.conf.tab_var.setdefault("sday", ExtDt().format("ymd", "-"))
 23    adapter.conf.tab_var.setdefault("eday", ExtDt().format("ymd", "-"))
 24    ui_parts.header(adapter, text="【成績サマリ】")
 25
 26    # 検索範囲設定
 27    date_dict = {x: ExtDt(hours=-g.cfg.setting.time_adjust).range(x).dict_format("ymd", "-") for x in ["今月", "先月", "全部"]}
 28    ui_parts.divider(adapter)
 29    ui_parts.radio_buttons(
 30        adapter=adapter,
 31        id_suffix="search_range",
 32        title="検索範囲",
 33        flag={
 34            "今月": f"今月:{date_dict["今月"]["start"]}{date_dict["今月"]["end"]}",
 35            "先月": f"先月:{date_dict["先月"]["start"]}{date_dict["先月"]["end"]}",
 36            "全部": f"全部:{date_dict["全部"]["start"]}{date_dict["全部"]["end"]}",
 37            "指定": f"範囲指定:{adapter.conf.tab_var["sday"]}{adapter.conf.tab_var["eday"]}",
 38        },
 39    )
 40    ui_parts.button(adapter, text="検索範囲設定", action_id="modal-open-period")
 41
 42    # オプション
 43    ui_parts.divider(adapter)
 44    ui_parts.checkboxes(
 45        adapter=adapter,
 46        id_suffix="search_option",
 47        title="検索オプション",
 48        flag={
 49            "unregistered_replace": "ゲスト無効",
 50        },
 51        initial=["unregistered_replace"],
 52    )
 53    ui_parts.radio_buttons(
 54        adapter=adapter,
 55        id_suffix="output_option",
 56        title="出力オプション",
 57        flag={
 58            "normal": "通算ポイント",
 59            "score_comparisons": "通算ポイント比較",
 60            "point": "ポイント推移グラフ",
 61            "rank": "順位変動グラフ",
 62            "rating": "レーティング",
 63        },
 64    )
 65
 66    ui_parts.divider(adapter)
 67    ui_parts.button(adapter, text="集計", action_id="summary_aggregation", style="primary")
 68    ui_parts.button(adapter, text="戻る", action_id="actionId-back", style="danger")
 69
 70
 71@register
 72def register_summary_handlers(app, adapter: ServiceAdapter):
 73    """サマリメニュー"""
 74
 75    @app.action("summary_menu")
 76    def handle_menu_action(ack, body):
 77        """メニュー項目生成
 78
 79        Args:
 80            ack (_type_): ack
 81            body (dict): イベント内容
 82        """
 83
 84        ack()
 85        logging.trace(body)  # type: ignore
 86
 87        adapter.conf.tab_var["user_id"] = body["user"]["id"]
 88        adapter.conf.tab_var["view_id"] = body["view"]["id"]
 89        logging.debug("[summary_menu] %s", adapter.conf.tab_var)
 90
 91        build_summary_menu(adapter)
 92        adapter.api.appclient.views_publish(
 93            user_id=adapter.conf.tab_var["user_id"],
 94            view=adapter.conf.tab_var["view"],
 95        )
 96
 97    @app.action("summary_aggregation")
 98    def handle_aggregation_action(ack, body):
 99        """成績サマリ集計
100
101        Args:
102            ack (_type_): ack
103            body (dict): イベント内容
104            client (slack_bolt.App.client): slack_boltオブジェクト
105        """
106
107        ack()
108        logging.trace(body)  # type: ignore
109
110        m = adapter.parser()
111
112        m.parser(body)
113        add_argument, app_msg, update_flag = ui_parts.set_command_option(adapter, body)
114        m.data.text = f"dummy {" ".join(add_argument)}"  # 引数の位置を調整
115        g.params = dictutil.placeholder(g.cfg.results, m)
116        g.params.update(update_flag)
117
118        adapter.api.appclient.views_update(
119            view_id=adapter.conf.tab_var["view_id"],
120            view=ui_parts.plain_text(f"{chr(10).join(app_msg)}"),
121        )
122
123        app_msg.pop()
124        app_msg.append("集計完了")
125
126        match adapter.conf.tab_var.get("operation"):
127            case "point":
128                m.status.command_type = "graph"
129                graph.summary.point_plot(m)
130                adapter.api.post(m)
131            case "rank":
132                m.status.command_type = "graph"
133                graph.summary.rank_plot(m)
134                adapter.api.post(m)
135            case "rating":
136                m.status.command_type = "rating"
137                g.params["command"] = "ranking"
138                ranking.rating.aggregation(m)
139                adapter.api.post(m)
140            case _:
141                m.status.command_type = "results"
142                results.summary.aggregation(m)
143                adapter.api.post(m)
144
145        ui_parts.update_view(adapter, m, app_msg)
146
147    @app.view("SummaryMenu_ModalPeriodSelection")
148    def handle_view_submission(ack, view):
149        """view更新
150
151        Args:
152            ack (_type_): ack
153            view (dict): 描写内容
154            client (slack_bolt.App.client): slack_boltオブジェクト
155        """
156
157        ack()
158
159        for i in view["state"]["values"].keys():
160            if "aid-sday" in view["state"]["values"][i]:
161                adapter.conf.tab_var["sday"] = view["state"]["values"][i]["aid-sday"]["selected_date"]
162            if "aid-eday" in view["state"]["values"][i]:
163                adapter.conf.tab_var["eday"] = view["state"]["values"][i]["aid-eday"]["selected_date"]
164
165        logging.debug("[global var] %s", adapter.conf.tab_var)
166
167        adapter.api.appclient.views_update(
168            view_id=adapter.conf.tab_var["view_id"],
169            view=build_summary_menu(adapter),
170        )
def build_summary_menu(adapter: integrations.slack.adapter.ServiceAdapter):
17def build_summary_menu(adapter: ServiceAdapter):
18    """サマリメニュー生成"""
19
20    adapter.conf.tab_var["screen"] = "SummaryMenu"
21    adapter.conf.tab_var["no"] = 0
22    adapter.conf.tab_var["view"] = {"type": "home", "blocks": []}
23    adapter.conf.tab_var.setdefault("sday", ExtDt().format("ymd", "-"))
24    adapter.conf.tab_var.setdefault("eday", ExtDt().format("ymd", "-"))
25    ui_parts.header(adapter, text="【成績サマリ】")
26
27    # 検索範囲設定
28    date_dict = {x: ExtDt(hours=-g.cfg.setting.time_adjust).range(x).dict_format("ymd", "-") for x in ["今月", "先月", "全部"]}
29    ui_parts.divider(adapter)
30    ui_parts.radio_buttons(
31        adapter=adapter,
32        id_suffix="search_range",
33        title="検索範囲",
34        flag={
35            "今月": f"今月:{date_dict["今月"]["start"]}{date_dict["今月"]["end"]}",
36            "先月": f"先月:{date_dict["先月"]["start"]}{date_dict["先月"]["end"]}",
37            "全部": f"全部:{date_dict["全部"]["start"]}{date_dict["全部"]["end"]}",
38            "指定": f"範囲指定:{adapter.conf.tab_var["sday"]}{adapter.conf.tab_var["eday"]}",
39        },
40    )
41    ui_parts.button(adapter, text="検索範囲設定", action_id="modal-open-period")
42
43    # オプション
44    ui_parts.divider(adapter)
45    ui_parts.checkboxes(
46        adapter=adapter,
47        id_suffix="search_option",
48        title="検索オプション",
49        flag={
50            "unregistered_replace": "ゲスト無効",
51        },
52        initial=["unregistered_replace"],
53    )
54    ui_parts.radio_buttons(
55        adapter=adapter,
56        id_suffix="output_option",
57        title="出力オプション",
58        flag={
59            "normal": "通算ポイント",
60            "score_comparisons": "通算ポイント比較",
61            "point": "ポイント推移グラフ",
62            "rank": "順位変動グラフ",
63            "rating": "レーティング",
64        },
65    )
66
67    ui_parts.divider(adapter)
68    ui_parts.button(adapter, text="集計", action_id="summary_aggregation", style="primary")
69    ui_parts.button(adapter, text="戻る", action_id="actionId-back", style="danger")

サマリメニュー生成

register_summary_handlers = None

サマリメニュー