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        )
def build_ranking_menu():
17def build_ranking_menu():
18    """ランキングメニュー生成"""
19    g.app_var["screen"] = "RankingMenu"
20    g.app_var["no"] = 0
21    g.app_var["view"] = {"type": "home", "blocks": []}
22    ui_parts.header("【ランキング】")
23
24    # 検索範囲設定
25    date_dict = {x: ExtDt(hours=-g.cfg.setting.time_adjust).range(x).dict_format("ymd", "-") for x in ["今月", "先月", "全部"]}
26    ui_parts.divider()
27    ui_parts.radio_buttons(
28        id_suffix="search_range",
29        title="検索範囲",
30        flag={
31            "今月": f"今月:{date_dict["今月"]["start"]}{date_dict["今月"]["end"]}",
32            "先月": f"先月:{date_dict["先月"]["start"]}{date_dict["先月"]["end"]}",
33            "全部": f"全部:{date_dict["全部"]["start"]}{date_dict["全部"]["end"]}",
34            "指定": f"範囲指定:{g.app_var["sday"]}{g.app_var["eday"]}",
35        }
36    )
37    ui_parts.button(text="検索範囲設定", action_id="modal-open-period")
38
39    # 検索オプション
40    ui_parts.divider()
41    ui_parts.checkboxes(
42        id_suffix="search_option",
43        title="検索オプション",
44        flag={
45            "unregistered_replace": "ゲスト無効",
46        },
47        initial=["unregistered_replace"],
48    )
49
50    ui_parts.input_ranked(block_id="bid-ranked")
51
52    ui_parts.divider()
53    ui_parts.button(text="集計", action_id="ranking_aggregation", style="primary")
54    ui_parts.button(text="戻る", action_id="actionId-back", style="danger")

ランキングメニュー生成

register_ranking_handlers = None

ランキングメニュー