integrations.slack.events.home_tab.summary
integrations/slack/events/home_tab/summary.py
1""" 2integrations/slack/events/home_tab/summary.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 graph, ranking, results 13from libs.utils import dictutil 14 15 16def build_summary_menu(adapter: ServiceAdapter): 17 """サマリメニュー生成""" 18 19 adapter.conf.tab_var["screen"] = "SummaryMenu" 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 date_dict = {x: ExtDt(hours=-g.cfg.setting.time_adjust).range(x).dict_format("ymd", "-") for x in ["今月", "先月", "全部"]} 28 ui_parts.divider(adapter) 29 ui_parts.radio_buttons( 30 adapter=adapter, 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"範囲指定:{adapter.conf.tab_var["sday"]} ~ {adapter.conf.tab_var["eday"]}", 38 }, 39 ) 40 ui_parts.button(adapter, text="検索範囲設定", action_id="modal-open-period") 41 42 # オプション 43 ui_parts.divider(adapter) 44 ui_parts.checkboxes( 45 adapter=adapter, 46 id_suffix="search_option", 47 title="検索オプション", 48 flag={ 49 "unregistered_replace": "ゲスト無効", 50 }, 51 initial=["unregistered_replace"], 52 ) 53 ui_parts.radio_buttons( 54 adapter=adapter, 55 id_suffix="output_option", 56 title="出力オプション", 57 flag={ 58 "normal": "通算ポイント", 59 "score_comparisons": "通算ポイント比較", 60 "point": "ポイント推移グラフ", 61 "rank": "順位変動グラフ", 62 "rating": "レーティング", 63 }, 64 ) 65 66 ui_parts.divider(adapter) 67 ui_parts.button(adapter, text="集計", action_id="summary_aggregation", style="primary") 68 ui_parts.button(adapter, text="戻る", action_id="actionId-back", style="danger") 69 70 71@register 72def register_summary_handlers(app, adapter: ServiceAdapter): 73 """サマリメニュー""" 74 75 @app.action("summary_menu") 76 def handle_menu_action(ack, body): 77 """メニュー項目生成 78 79 Args: 80 ack (_type_): ack 81 body (dict): イベント内容 82 """ 83 84 ack() 85 logging.trace(body) # type: ignore 86 87 adapter.conf.tab_var["user_id"] = body["user"]["id"] 88 adapter.conf.tab_var["view_id"] = body["view"]["id"] 89 logging.debug("[summary_menu] %s", adapter.conf.tab_var) 90 91 build_summary_menu(adapter) 92 adapter.api.appclient.views_publish( 93 user_id=adapter.conf.tab_var["user_id"], 94 view=adapter.conf.tab_var["view"], 95 ) 96 97 @app.action("summary_aggregation") 98 def handle_aggregation_action(ack, body): 99 """成績サマリ集計 100 101 Args: 102 ack (_type_): ack 103 body (dict): イベント内容 104 client (slack_bolt.App.client): slack_boltオブジェクト 105 """ 106 107 ack() 108 logging.trace(body) # type: ignore 109 110 m = adapter.parser() 111 112 m.parser(body) 113 add_argument, app_msg, update_flag = ui_parts.set_command_option(adapter, body) 114 m.data.text = f"dummy {" ".join(add_argument)}" # 引数の位置を調整 115 g.params = dictutil.placeholder(g.cfg.results, m) 116 g.params.update(update_flag) 117 118 adapter.api.appclient.views_update( 119 view_id=adapter.conf.tab_var["view_id"], 120 view=ui_parts.plain_text(f"{chr(10).join(app_msg)}"), 121 ) 122 123 app_msg.pop() 124 app_msg.append("集計完了") 125 126 match adapter.conf.tab_var.get("operation"): 127 case "point": 128 m.status.command_type = "graph" 129 graph.summary.point_plot(m) 130 adapter.api.post(m) 131 case "rank": 132 m.status.command_type = "graph" 133 graph.summary.rank_plot(m) 134 adapter.api.post(m) 135 case "rating": 136 m.status.command_type = "rating" 137 g.params["command"] = "ranking" 138 ranking.rating.aggregation(m) 139 adapter.api.post(m) 140 case _: 141 m.status.command_type = "results" 142 results.summary.aggregation(m) 143 adapter.api.post(m) 144 145 ui_parts.update_view(adapter, m, app_msg) 146 147 @app.view("SummaryMenu_ModalPeriodSelection") 148 def handle_view_submission(ack, view): 149 """view更新 150 151 Args: 152 ack (_type_): ack 153 view (dict): 描写内容 154 client (slack_bolt.App.client): slack_boltオブジェクト 155 """ 156 157 ack() 158 159 for i in view["state"]["values"].keys(): 160 if "aid-sday" in view["state"]["values"][i]: 161 adapter.conf.tab_var["sday"] = view["state"]["values"][i]["aid-sday"]["selected_date"] 162 if "aid-eday" in view["state"]["values"][i]: 163 adapter.conf.tab_var["eday"] = view["state"]["values"][i]["aid-eday"]["selected_date"] 164 165 logging.debug("[global var] %s", adapter.conf.tab_var) 166 167 adapter.api.appclient.views_update( 168 view_id=adapter.conf.tab_var["view_id"], 169 view=build_summary_menu(adapter), 170 )
register_summary_handlers =
None
サマリメニュー