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 )
register_personal_handlers =
None
個人成績メニュー