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 )
register_versus_handlers =
None
直接対戦メニュー