libs.commands.home_tab.summary
libs/commands/home_tab/summary.py
1""" 2libs/commands/home_tab/summary.py 3""" 4 5import logging 6 7import libs.global_value as g 8from cls.timekit import ExtendedDatetime as ExtDt 9from libs.commands import graph, ranking, 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_summary_menu(): 17 """サマリメニュー生成""" 18 g.app_var["screen"] = "SummaryMenu" 19 g.app_var["no"] = 0 20 g.app_var["view"] = {"type": "home", "blocks": []} 21 ui_parts.header("【成績サマリ】") 22 23 # 検索範囲設定 24 date_dict = {x: ExtDt(hours=-g.cfg.setting.time_adjust).range(x).dict_format("ymd", "-") for x in ["今月", "先月", "全部"]} 25 ui_parts.divider() 26 ui_parts.radio_buttons( 27 id_suffix="search_range", 28 title="検索範囲", 29 flag={ 30 "今月": f"今月:{date_dict["今月"]["start"]} ~ {date_dict["今月"]["end"]}", 31 "先月": f"先月:{date_dict["先月"]["start"]} ~ {date_dict["先月"]["end"]}", 32 "全部": f"全部:{date_dict["全部"]["start"]} ~ {date_dict["全部"]["end"]}", 33 "指定": f"範囲指定:{g.app_var["sday"]} ~ {g.app_var["eday"]}", 34 }, 35 ) 36 ui_parts.button(text="検索範囲設定", action_id="modal-open-period") 37 38 # オプション 39 ui_parts.divider() 40 ui_parts.checkboxes( 41 id_suffix="search_option", 42 title="検索オプション", 43 flag={ 44 "unregistered_replace": "ゲスト無効", 45 }, 46 initial=["unregistered_replace"], 47 ) 48 ui_parts.radio_buttons( 49 id_suffix="output_option", 50 title="出力オプション", 51 flag={ 52 "normal": "通算ポイント", 53 "score_comparisons": "通算ポイント比較", 54 "point": "ポイント推移グラフ", 55 "rank": "順位推移グラフ", 56 "rating": "レーティング", 57 }, 58 ) 59 60 ui_parts.divider() 61 ui_parts.button(text="集計", action_id="summary_aggregation", style="primary") 62 ui_parts.button(text="戻る", action_id="actionId-back", style="danger") 63 64 65@register 66def register_summary_handlers(app): 67 """サマリメニュー""" 68 @app.action("summary_menu") 69 def handle_menu_action(ack, body, client): 70 """メニュー項目生成 71 72 Args: 73 ack (_type_): ack 74 body (dict): イベント内容 75 client (slack_bolt.App.client): slack_boltオブジェクト 76 """ 77 78 ack() 79 logging.trace(body) # type: ignore 80 81 g.app_var["user_id"] = body["user"]["id"] 82 g.app_var["view_id"] = body["view"]["id"] 83 logging.info("[summary_menu] %s", g.app_var) 84 85 build_summary_menu() 86 client.views_publish( 87 user_id=g.app_var["user_id"], 88 view=g.app_var["view"], 89 ) 90 91 @app.action("summary_aggregation") 92 def handle_aggregation_action(ack, body, client): 93 """成績サマリ集計 94 95 Args: 96 ack (_type_): ack 97 body (dict): イベント内容 98 client (slack_bolt.App.client): slack_boltオブジェクト 99 """ 100 101 ack() 102 logging.trace(body) # type: ignore 103 g.msg.parser(body) 104 g.msg.client = client 105 106 g.msg.argument, app_msg, update_flag = ui_parts.set_command_option(body) 107 g.params = dictutil.placeholder(g.cfg.results) 108 g.params.update(update_flag) 109 110 client.views_update( 111 view_id=g.app_var["view_id"], 112 view=ui_parts.plain_text(f"{chr(10).join(app_msg)}"), 113 ) 114 115 app_msg.pop() 116 app_msg.append("集計完了") 117 msg1: str = "" 118 msg2: str | dict = message.reply(message="no_hits") 119 120 match g.app_var.get("operation"): 121 case "point": 122 count, ret = graph.summary.point_plot() 123 if count: 124 slack_api.post_fileupload("ポイント推移", ret) 125 else: 126 slack_api.post_message(ret) 127 case "rank": 128 count, ret = graph.summary.rank_plot() 129 if count: 130 slack_api.post_fileupload("順位変動", ret) 131 else: 132 slack_api.post_message(ret) 133 case "rating": 134 g.params["command"] = "ranking" 135 msg1, msg2, file_list = ranking.rating.aggregation() 136 slack_api.slack_post( 137 headline=msg1, 138 message=msg2, 139 summarize=False, 140 file_list=file_list, 141 ) 142 case _: 143 msg1, msg2, file_list = results.summary.aggregation() 144 slack_api.slack_post( 145 headline=msg1, 146 message=msg2, 147 summarize=False, 148 file_list=file_list, 149 ) 150 151 client.views_update( 152 view_id=g.app_var["view_id"], 153 view=ui_parts.plain_text(f"{chr(10).join(app_msg)}\n\n{msg1}".strip()), 154 ) 155 156 @app.view("SummaryMenu_ModalPeriodSelection") 157 def handle_view_submission(ack, view, client): 158 """view更新 159 160 Args: 161 ack (_type_): ack 162 view (dict): 描写内容 163 client (slack_bolt.App.client): slack_boltオブジェクト 164 """ 165 166 ack() 167 for i in view["state"]["values"].keys(): 168 if "aid-sday" in view["state"]["values"][i]: 169 g.app_var["sday"] = view["state"]["values"][i]["aid-sday"]["selected_date"] 170 if "aid-eday" in view["state"]["values"][i]: 171 g.app_var["eday"] = view["state"]["values"][i]["aid-eday"]["selected_date"] 172 173 logging.info("[global var] %s", g.app_var) 174 175 client.views_update( 176 view_id=g.app_var["view_id"], 177 view=build_summary_menu(), 178 )
register_summary_handlers =
None
サマリメニュー