integrations.slack.events.home_tab.personal

integrations/slack/events/home_tab/personal.py

  1"""
  2integrations/slack/events/home_tab/personal.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_personal_menu(adapter: ServiceAdapter):
 17    """個人成績メニュー作成
 18
 19    Args:
 20        adapter (ServiceAdapter): インターフェースアダプタ
 21    """
 22
 23    adapter.conf.tab_var["screen"] = "PersonalMenu"
 24    adapter.conf.tab_var["no"] = 0
 25    adapter.conf.tab_var["view"] = {"type": "home", "blocks": []}
 26    adapter.conf.tab_var.setdefault("sday", ExtDt().format("ymd", "-"))
 27    adapter.conf.tab_var.setdefault("eday", ExtDt().format("ymd", "-"))
 28    ui_parts.header(adapter, text="【個人成績】")
 29
 30    # プレイヤー選択リスト
 31    ui_parts.user_select_pulldown(adapter, text="対象プレイヤー")
 32
 33    # 検索範囲設定
 34    date_dict = {x: ExtDt(hours=-g.cfg.setting.time_adjust).range(x).dict_format("ymd", "-") for x in ["今月", "先月", "全部"]}
 35    ui_parts.divider(adapter)
 36    ui_parts.radio_buttons(
 37        adapter=adapter,
 38        id_suffix="search_range",
 39        title="検索範囲",
 40        flag={
 41            "今月": f"今月:{date_dict["今月"]["start"]}{date_dict["今月"]["end"]}",
 42            "先月": f"先月:{date_dict["先月"]["start"]}{date_dict["先月"]["end"]}",
 43            "全部": f"全部:{date_dict["全部"]["start"]}{date_dict["全部"]["end"]}",
 44            "指定": f"範囲指定:{adapter.conf.tab_var["sday"]}{adapter.conf.tab_var["eday"]}",
 45        }
 46    )
 47    ui_parts.button(adapter, text="検索範囲設定", action_id="modal-open-period")
 48
 49    # オプション
 50    ui_parts.divider(adapter)
 51    ui_parts.checkboxes(
 52        adapter=adapter,
 53        id_suffix="search_option",
 54        title="検索オプション",
 55        flag={
 56            "unregistered_replace": "ゲスト無効",
 57        },
 58        initial=["unregistered_replace"],
 59    )
 60    ui_parts.checkboxes(
 61        adapter=adapter,
 62        id_suffix="display_option",
 63        title="表示オプション",
 64        flag={
 65            "versus_matrix": "対戦結果",
 66            "game_results": "戦績(簡易)",
 67            "verbose": "戦績(詳細)",
 68        },
 69    )
 70
 71    ui_parts.divider(adapter)
 72    ui_parts.button(adapter, text="集計", action_id="personal_aggregation", style="primary")
 73    ui_parts.button(adapter, text="戻る", action_id="actionId-back", style="danger")
 74
 75
 76@register
 77def register_personal_handlers(app, adapter: ServiceAdapter):
 78    """個人成績メニュー"""
 79
 80    @app.action("personal_menu")
 81    def handle_menu_action(ack, body):
 82        """メニュー項目生成
 83
 84        Args:
 85            ack (_type_): ack
 86            body (dict): イベント内容
 87        """
 88
 89        ack()
 90        logging.trace(body)  # type: ignore
 91
 92        adapter.conf.tab_var["user_id"] = body["user"]["id"]
 93        adapter.conf.tab_var["view_id"] = body["view"]["id"]
 94        logging.debug("[personal_menu] %s", adapter.conf.tab_var)
 95
 96        build_personal_menu(adapter)
 97        adapter.api.appclient.views_publish(
 98            user_id=adapter.conf.tab_var["user_id"],
 99            view=adapter.conf.tab_var["view"],
100        )
101
102    @app.action("personal_aggregation")
103    def handle_aggregation_action(ack, body):
104        """メニュー項目生成
105
106        Args:
107            ack (_type_): ack
108            body (dict): イベント内容
109        """
110
111        ack()
112        logging.trace(body)  # type: ignore
113
114        m = adapter.parser()
115
116        m.parser(body)
117        add_argument, app_msg, update_flag = ui_parts.set_command_option(adapter, body)
118        m.data.text = f"dummy {" ".join(add_argument)}"
119        g.params = dictutil.placeholder(g.cfg.results, m)
120        g.params.update(update_flag)
121
122        search_options = body["view"]["state"]["values"]
123        if "bid-user_select" in search_options:
124            user_select = search_options["bid-user_select"]["player"]["selected_option"]
125            if user_select is None:
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.detail.aggregation(m)
138        adapter.api.post(m)
139
140        ui_parts.update_view(adapter, m, app_msg)
141
142    @app.view("PersonalMenu_ModalPeriodSelection")
143    def handle_view_submission(ack, view):
144        """view更新
145
146        Args:
147            ack (_type_): ack
148            view (dict): 描写内容
149        """
150
151        ack()
152
153        for i in view["state"]["values"].keys():
154            if "aid-sday" in view["state"]["values"][i]:
155                adapter.conf.tab_var["sday"] = view["state"]["values"][i]["aid-sday"]["selected_date"]
156            if "aid-eday" in view["state"]["values"][i]:
157                adapter.conf.tab_var["eday"] = view["state"]["values"][i]["aid-eday"]["selected_date"]
158
159        logging.debug("[global var] %s", adapter.conf.tab_var)
160
161        adapter.api.appclient.views_update(
162            view_id=adapter.conf.tab_var["view_id"],
163            view=build_personal_menu(adapter),
164        )
def build_personal_menu(adapter: integrations.slack.adapter.ServiceAdapter):
17def build_personal_menu(adapter: ServiceAdapter):
18    """個人成績メニュー作成
19
20    Args:
21        adapter (ServiceAdapter): インターフェースアダプタ
22    """
23
24    adapter.conf.tab_var["screen"] = "PersonalMenu"
25    adapter.conf.tab_var["no"] = 0
26    adapter.conf.tab_var["view"] = {"type": "home", "blocks": []}
27    adapter.conf.tab_var.setdefault("sday", ExtDt().format("ymd", "-"))
28    adapter.conf.tab_var.setdefault("eday", ExtDt().format("ymd", "-"))
29    ui_parts.header(adapter, text="【個人成績】")
30
31    # プレイヤー選択リスト
32    ui_parts.user_select_pulldown(adapter, text="対象プレイヤー")
33
34    # 検索範囲設定
35    date_dict = {x: ExtDt(hours=-g.cfg.setting.time_adjust).range(x).dict_format("ymd", "-") for x in ["今月", "先月", "全部"]}
36    ui_parts.divider(adapter)
37    ui_parts.radio_buttons(
38        adapter=adapter,
39        id_suffix="search_range",
40        title="検索範囲",
41        flag={
42            "今月": f"今月:{date_dict["今月"]["start"]}{date_dict["今月"]["end"]}",
43            "先月": f"先月:{date_dict["先月"]["start"]}{date_dict["先月"]["end"]}",
44            "全部": f"全部:{date_dict["全部"]["start"]}{date_dict["全部"]["end"]}",
45            "指定": f"範囲指定:{adapter.conf.tab_var["sday"]}{adapter.conf.tab_var["eday"]}",
46        }
47    )
48    ui_parts.button(adapter, text="検索範囲設定", action_id="modal-open-period")
49
50    # オプション
51    ui_parts.divider(adapter)
52    ui_parts.checkboxes(
53        adapter=adapter,
54        id_suffix="search_option",
55        title="検索オプション",
56        flag={
57            "unregistered_replace": "ゲスト無効",
58        },
59        initial=["unregistered_replace"],
60    )
61    ui_parts.checkboxes(
62        adapter=adapter,
63        id_suffix="display_option",
64        title="表示オプション",
65        flag={
66            "versus_matrix": "対戦結果",
67            "game_results": "戦績(簡易)",
68            "verbose": "戦績(詳細)",
69        },
70    )
71
72    ui_parts.divider(adapter)
73    ui_parts.button(adapter, text="集計", action_id="personal_aggregation", style="primary")
74    ui_parts.button(adapter, text="戻る", action_id="actionId-back", style="danger")

個人成績メニュー作成

Arguments:
  • adapter (ServiceAdapter): インターフェースアダプタ
register_personal_handlers = None

個人成績メニュー