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