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