libs.commands.home_tab.versus

libs/commands/home_tab/versus.py

  1"""
  2libs/commands/home_tab/versus.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 slack_api
 12from libs.functions.events.handler_registry import register
 13from libs.utils import dictutil
 14
 15
 16def build_versus_menu():
 17    """対戦結果メニュー生成"""
 18    g.app_var["screen"] = "VersusMenu"
 19    g.app_var["no"] = 0
 20    g.app_var["view"] = {"type": "home", "blocks": []}
 21    ui_parts.header("【直接対戦】")
 22
 23    # プレイヤー選択リスト
 24    ui_parts.user_select_pulldown(text="対象プレイヤー")
 25    ui_parts.multi_select_pulldown(text="対戦相手", add_list=["全員"])
 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="versus_aggregation", style="primary")
 64    ui_parts.button(text="戻る", action_id="actionId-back", style="danger")
 65
 66
 67@register
 68def register_versus_handlers(app):
 69    """直接対戦メニュー"""
 70    @app.action("versus_menu")
 71    def handle_menu_action(ack, body, client):
 72        """メニュー項目生成
 73
 74        Args:
 75            ack (_type_): ack
 76            body (dict): イベント内容
 77            client (slack_bolt.App.client): slack_boltオブジェクト
 78        """
 79
 80        ack()
 81        logging.trace(body)  # type: ignore
 82
 83        g.app_var["user_id"] = body["user"]["id"]
 84        g.app_var["view_id"] = body["view"]["id"]
 85        logging.info("[versus_menu] %s", g.app_var)
 86
 87        build_versus_menu()
 88        client.views_publish(
 89            user_id=g.app_var["user_id"],
 90            view=g.app_var["view"],
 91        )
 92
 93    @app.action("versus_aggregation")
 94    def handle_aggregation_action(ack, body, client):
 95        """メニュー項目生成
 96
 97        Args:
 98            ack (_type_): ack
 99            body (dict): イベント内容
100            client (slack_bolt.App.client): slack_boltオブジェクト
101        """
102
103        ack()
104        logging.trace(body)  # type: ignore
105        g.msg.parser(body)
106        g.msg.client = client
107
108        g.msg.argument, app_msg, update_flag = ui_parts.set_command_option(body)
109        g.params = dictutil.placeholder(g.cfg.results)
110        g.params.update(update_flag)
111
112        search_options = body["view"]["state"]["values"]
113        if "bid-user_select" in search_options:
114            user_select = search_options["bid-user_select"]["player"]["selected_option"]
115            if user_select is None:
116                return
117        if "bid-multi_select" in search_options:
118            if len(search_options["bid-multi_select"]["player"]["selected_options"]) == 0:
119                return
120
121        client.views_update(
122            view_id=g.app_var["view_id"],
123            view=ui_parts.plain_text(f"{chr(10).join(app_msg)}")
124        )
125
126        app_msg.pop()
127        app_msg.append("集計完了")
128
129        msg1, msg2, file_list = results.versus.aggregation()
130        slack_api.slack_post(
131            headline=msg1,
132            message=msg2,
133            file_list=file_list,
134        )
135
136        client.views_update(
137            view_id=g.app_var["view_id"],
138            view=ui_parts.plain_text(f"{chr(10).join(app_msg)}\n\n{msg1}"),
139        )
140
141    @app.view("VersusMenu_ModalPeriodSelection")
142    def handle_view_submission(ack, view, client):
143        """view更新
144
145        Args:
146            ack (_type_): ack
147            view (dict): 描写内容
148            client (slack_bolt.App.client): slack_boltオブジェクト
149        """
150
151        ack()
152        for i in view["state"]["values"].keys():
153            if "aid-sday" in view["state"]["values"][i]:
154                g.app_var["sday"] = view["state"]["values"][i]["aid-sday"]["selected_date"]
155            if "aid-eday" in view["state"]["values"][i]:
156                g.app_var["eday"] = view["state"]["values"][i]["aid-eday"]["selected_date"]
157
158        logging.info("[global var] %s", g.app_var)
159
160        client.views_update(
161            view_id=g.app_var["view_id"],
162            view=build_versus_menu(),
163        )
def build_versus_menu():
17def build_versus_menu():
18    """対戦結果メニュー生成"""
19    g.app_var["screen"] = "VersusMenu"
20    g.app_var["no"] = 0
21    g.app_var["view"] = {"type": "home", "blocks": []}
22    ui_parts.header("【直接対戦】")
23
24    # プレイヤー選択リスト
25    ui_parts.user_select_pulldown(text="対象プレイヤー")
26    ui_parts.multi_select_pulldown(text="対戦相手", add_list=["全員"])
27
28    # 検索範囲設定
29    date_dict = {x: ExtDt(hours=-g.cfg.setting.time_adjust).range(x).dict_format("ymd", "-") for x in ["今月", "先月", "全部"]}
30    ui_parts.divider()
31    ui_parts.radio_buttons(
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"範囲指定:{g.app_var["sday"]}{g.app_var["eday"]}",
39        }
40    )
41    ui_parts.button(text="検索範囲設定", action_id="modal-open-period")
42
43    # オプション
44    ui_parts.divider()
45    ui_parts.checkboxes(
46        id_suffix="search_option",
47        title="検索オプション",
48        flag={
49            "unregistered_replace": "ゲスト無効",
50        },
51        initial=["unregistered_replace"],
52    )
53    ui_parts.checkboxes(
54        id_suffix="display_option",
55        title="表示オプション",
56        flag={
57            "versus_matrix": "対戦結果",
58            "game_results": "戦績(簡易)",
59            "verbose": "戦績(詳細)",
60        },
61    )
62
63    ui_parts.divider()
64    ui_parts.button(text="集計", action_id="versus_aggregation", style="primary")
65    ui_parts.button(text="戻る", action_id="actionId-back", style="danger")

対戦結果メニュー生成

register_versus_handlers = None

直接対戦メニュー