libs.commands.home_tab.ranking
libs/commands/home_tab/ranking.py
1""" 2libs/commands/home_tab/ranking.py 3""" 4 5import logging 6 7import libs.global_value as g 8from cls.timekit import ExtendedDatetime as ExtDt 9from libs.commands import ranking 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_ranking_menu(): 17 """ランキングメニュー生成""" 18 g.app_var["screen"] = "RankingMenu" 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 49 ui_parts.input_ranked(block_id="bid-ranked") 50 51 ui_parts.divider() 52 ui_parts.button(text="集計", action_id="ranking_aggregation", style="primary") 53 ui_parts.button(text="戻る", action_id="actionId-back", style="danger") 54 55 56@register 57def register_ranking_handlers(app): 58 """ランキングメニュー""" 59 @app.action("ranking_menu") 60 def handle_menu_action(ack, body, client): 61 """メニュー項目生成 62 63 Args: 64 ack (_type_): ack 65 body (dict): イベント内容 66 client (slack_bolt.App.client): slack_boltオブジェクト 67 """ 68 69 ack() 70 logging.trace(body) # type: ignore 71 72 g.app_var["user_id"] = body["user"]["id"] 73 g.app_var["view_id"] = body["view"]["id"] 74 logging.info("[ranking_menu] %s", g.app_var) 75 76 build_ranking_menu() 77 client.views_publish( 78 user_id=g.app_var["user_id"], 79 view=g.app_var["view"], 80 ) 81 82 @app.action("ranking_aggregation") 83 def handle_aggregation_action(ack, body, client): 84 """メニュー項目生成 85 86 Args: 87 ack (_type_): ack 88 body (dict): イベント内容 89 client (slack_bolt.App.client): slack_boltオブジェクト 90 """ 91 92 ack() 93 logging.trace(body) # type: ignore 94 g.msg.parser(body) 95 g.msg.client = client 96 97 g.msg.argument, app_msg, update_flag = ui_parts.set_command_option(body) 98 g.params = dictutil.placeholder(g.cfg.ranking) 99 g.params.update(update_flag) 100 101 client.views_update( 102 view_id=g.app_var["view_id"], 103 view=ui_parts.plain_text(f"{chr(10).join(app_msg)}"), 104 ) 105 106 search_options = body["view"]["state"]["values"] 107 if "bid-ranked" in search_options: 108 if "value" in search_options["bid-ranked"]["aid-ranked"]: 109 ranked = int(search_options["bid-ranked"]["aid-ranked"]["value"]) 110 if ranked > 0: 111 g.params.update(ranked=ranked) 112 113 app_msg.pop() 114 app_msg.append("集計完了") 115 msg1 = message.reply(message="no_hits") 116 117 msg1, msg2 = ranking.ranking.aggregation() 118 if msg2: 119 res = slack_api.post_message(msg1) 120 slack_api.post_multi_message(msg2, res["ts"]) 121 122 client.views_update( 123 view_id=g.app_var["view_id"], 124 view=ui_parts.plain_text(f"{chr(10).join(app_msg)}\n\n{msg1}"), 125 ) 126 127 @app.view("RankingMenu_ModalPeriodSelection") 128 def handle_view_submission(ack, view, client): 129 """view更新 130 131 Args: 132 ack (_type_): ack 133 view (dict): 描写内容 134 client (slack_bolt.App.client): slack_boltオブジェクト 135 """ 136 137 ack() 138 for i in view["state"]["values"].keys(): 139 if "aid-sday" in view["state"]["values"][i]: 140 g.app_var["sday"] = view["state"]["values"][i]["aid-sday"]["selected_date"] 141 if "aid-eday" in view["state"]["values"][i]: 142 g.app_var["eday"] = view["state"]["values"][i]["aid-eday"]["selected_date"] 143 144 client.views_update( 145 view_id=g.app_var["view_id"], 146 view=build_ranking_menu(), 147 )
register_ranking_handlers =
None
ランキングメニュー