integrations.slack.events.home_tab.versus

integrations/slack/events/home_tab/versus.py

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

対戦結果メニュー生成

register_versus_handlers = None

直接対戦メニュー