libs.commands.home_tab.personal

libs/commands/home_tab/personal.py

  1"""
  2libs/commands/home_tab/personal.py
  3"""
  4
  5import logging
  6
  7import libs.global_value as g
  8from cls.timekit import ExtendedDatetime as ExtDt
  9from libs.commands import 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_personal_menu():
 17    """個人成績メニュー作成"""
 18    g.app_var["screen"] = "PersonalMenu"
 19    g.app_var["no"] = 0
 20    g.app_var["view"] = {"type": "home", "blocks": []}
 21    ui_parts.header(text="【個人成績】")
 22
 23    # プレイヤー選択リスト
 24    ui_parts.user_select_pulldown(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()
 29    ui_parts.radio_buttons(
 30        id_suffix="search_range",
 31        title="検索範囲",
 32        flag={
 33            "今月": f"今月:{date_dict["今月"]["start"]}{date_dict["今月"]["end"]}",
 34            "先月": f"先月:{date_dict["先月"]["start"]}{date_dict["先月"]["end"]}",
 35            "全部": f"全部:{date_dict["全部"]["start"]}{date_dict["全部"]["end"]}",
 36            "指定": f"範囲指定:{g.app_var["sday"]}{g.app_var["eday"]}",
 37        }
 38    )
 39    ui_parts.button(text="検索範囲設定", action_id="modal-open-period")
 40
 41    # オプション
 42    ui_parts.divider()
 43    ui_parts.checkboxes(
 44        id_suffix="search_option",
 45        title="検索オプション",
 46        flag={
 47            "unregistered_replace": "ゲスト無効",
 48        },
 49        initial=["unregistered_replace"],
 50    )
 51    ui_parts.checkboxes(
 52        id_suffix="display_option",
 53        title="表示オプション",
 54        flag={
 55            "versus_matrix": "対戦結果",
 56            "game_results": "戦績(簡易)",
 57            "verbose": "戦績(詳細)",
 58        },
 59    )
 60
 61    ui_parts.divider()
 62    ui_parts.button(text="集計", action_id="personal_aggregation", style="primary")
 63    ui_parts.button(text="戻る", action_id="actionId-back", style="danger")
 64
 65
 66@register
 67def register_personal_handlers(app):
 68    """個人成績メニュー"""
 69    @app.action("personal_menu")
 70    def handle_menu_action(ack, body, client):
 71        """メニュー項目生成
 72
 73        Args:
 74            ack (_type_): ack
 75            body (dict): イベント内容
 76            client (slack_bolt.App.client): slack_boltオブジェクト
 77        """
 78
 79        ack()
 80        logging.trace(body)  # type: ignore
 81
 82        g.app_var["user_id"] = body["user"]["id"]
 83        g.app_var["view_id"] = body["view"]["id"]
 84        logging.info("[personal_menu] %s", g.app_var)
 85
 86        build_personal_menu()
 87        client.views_publish(
 88            user_id=g.app_var["user_id"],
 89            view=g.app_var["view"],
 90        )
 91
 92    @app.action("personal_aggregation")
 93    def handle_aggregation_action(ack, body, client):
 94        """メニュー項目生成
 95
 96        Args:
 97            ack (_type_): ack
 98            body (dict): イベント内容
 99            client (slack_bolt.App.client): slack_boltオブジェクト
100        """
101
102        ack()
103        logging.trace(body)  # type: ignore
104        g.msg.parser(body)
105        g.msg.client = client
106
107        g.msg.argument, app_msg, update_flag = ui_parts.set_command_option(body)
108        g.params = dictutil.placeholder(g.cfg.results)
109        g.params.update(update_flag)
110
111        search_options = body["view"]["state"]["values"]
112        if "bid-user_select" in search_options:
113            user_select = search_options["bid-user_select"]["player"]["selected_option"]
114            if user_select is None:
115                return
116
117        client.views_update(
118            view_id=g.app_var["view_id"],
119            view=ui_parts.plain_text(f"{chr(10).join(app_msg)}")
120        )
121
122        app_msg.pop()
123        app_msg.append("集計完了")
124        msg1 = message.reply(message="no_hits")
125
126        msg1, msg2 = results.detail.aggregation()
127        res = slack_api.post_message(msg1)
128        for _, val in msg2.items():
129            slack_api.post_message(str(val + "\n"), res["ts"])
130
131        client.views_update(
132            view_id=g.app_var["view_id"],
133            view=ui_parts.plain_text(f"{chr(10).join(app_msg)}\n\n{msg1}"),
134        )
135
136    @app.view("PersonalMenu_ModalPeriodSelection")
137    def handle_view_submission(ack, view, client):
138        """view更新
139
140        Args:
141            ack (_type_): ack
142            view (dict): 描写内容
143            client (slack_bolt.App.client): slack_boltオブジェクト
144        """
145
146        ack()
147        for i in view["state"]["values"].keys():
148            if "aid-sday" in view["state"]["values"][i]:
149                g.app_var["sday"] = view["state"]["values"][i]["aid-sday"]["selected_date"]
150            if "aid-eday" in view["state"]["values"][i]:
151                g.app_var["eday"] = view["state"]["values"][i]["aid-eday"]["selected_date"]
152
153        logging.info("[global var] %s", g.app_var)
154
155        client.views_update(
156            view_id=g.app_var["view_id"],
157            view=build_personal_menu(),
158        )
def build_personal_menu():
17def build_personal_menu():
18    """個人成績メニュー作成"""
19    g.app_var["screen"] = "PersonalMenu"
20    g.app_var["no"] = 0
21    g.app_var["view"] = {"type": "home", "blocks": []}
22    ui_parts.header(text="【個人成績】")
23
24    # プレイヤー選択リスト
25    ui_parts.user_select_pulldown(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()
30    ui_parts.radio_buttons(
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"範囲指定:{g.app_var["sday"]}{g.app_var["eday"]}",
38        }
39    )
40    ui_parts.button(text="検索範囲設定", action_id="modal-open-period")
41
42    # オプション
43    ui_parts.divider()
44    ui_parts.checkboxes(
45        id_suffix="search_option",
46        title="検索オプション",
47        flag={
48            "unregistered_replace": "ゲスト無効",
49        },
50        initial=["unregistered_replace"],
51    )
52    ui_parts.checkboxes(
53        id_suffix="display_option",
54        title="表示オプション",
55        flag={
56            "versus_matrix": "対戦結果",
57            "game_results": "戦績(簡易)",
58            "verbose": "戦績(詳細)",
59        },
60    )
61
62    ui_parts.divider()
63    ui_parts.button(text="集計", action_id="personal_aggregation", style="primary")
64    ui_parts.button(text="戻る", action_id="actionId-back", style="danger")

個人成績メニュー作成

register_personal_handlers = None

個人成績メニュー