libs.commands.home_tab.summary

libs/commands/home_tab/summary.py

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

サマリメニュー生成

register_summary_handlers = None

サマリメニュー