integrations.slack.events.home_tab.ranking

integrations/slack/events/home_tab/ranking.py

  1"""
  2integrations/slack/events/home_tab/ranking.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 ranking
 13from libs.utils import dictutil
 14
 15
 16def build_ranking_menu(adapter: ServiceAdapter):
 17    """ランキングメニュー生成
 18
 19    Args:
 20        adapter (ServiceAdapter): インターフェースアダプタ
 21    """
 22
 23    adapter.conf.tab_var["screen"] = "RankingMenu"
 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    date_dict = {x: ExtDt(hours=-g.cfg.setting.time_adjust).range(x).dict_format("ymd", "-") for x in ["今月", "先月", "全部"]}
 32    ui_parts.divider(adapter)
 33    ui_parts.radio_buttons(
 34        adapter=adapter,
 35        id_suffix="search_range",
 36        title="検索範囲",
 37        flag={
 38            "今月": f"今月:{date_dict["今月"]["start"]}{date_dict["今月"]["end"]}",
 39            "先月": f"先月:{date_dict["先月"]["start"]}{date_dict["先月"]["end"]}",
 40            "全部": f"全部:{date_dict["全部"]["start"]}{date_dict["全部"]["end"]}",
 41            "指定": f"範囲指定:{adapter.conf.tab_var["sday"]}{adapter.conf.tab_var["eday"]}",
 42        }
 43    )
 44    ui_parts.button(adapter, text="検索範囲設定", action_id="modal-open-period")
 45
 46    # 検索オプション
 47    ui_parts.divider(adapter)
 48    ui_parts.checkboxes(
 49        adapter=adapter,
 50        id_suffix="search_option",
 51        title="検索オプション",
 52        flag={
 53            "unregistered_replace": "ゲスト無効",
 54        },
 55        initial=["unregistered_replace"],
 56    )
 57
 58    ui_parts.input_ranked(adapter, block_id="bid-ranked")
 59
 60    ui_parts.divider(adapter)
 61    ui_parts.button(adapter, text="集計", action_id="ranking_aggregation", style="primary")
 62    ui_parts.button(adapter, text="戻る", action_id="actionId-back", style="danger")
 63
 64
 65@register
 66def register_ranking_handlers(app, adapter: ServiceAdapter):
 67    """ランキングメニュー"""
 68
 69    @app.action("ranking_menu")
 70    def handle_menu_action(ack, body):
 71        """メニュー項目生成
 72
 73        Args:
 74            ack (_type_): ack
 75            body (dict): イベント内容
 76        """
 77
 78        ack()
 79        logging.trace(body)  # type: ignore
 80
 81        adapter.conf.tab_var["user_id"] = body["user"]["id"]
 82        adapter.conf.tab_var["view_id"] = body["view"]["id"]
 83        logging.debug("[ranking_menu] %s", adapter.conf.tab_var)
 84
 85        build_ranking_menu(adapter)
 86        adapter.api.appclient.views_publish(
 87            user_id=adapter.conf.tab_var["user_id"],
 88            view=adapter.conf.tab_var["view"],
 89        )
 90
 91    @app.action("ranking_aggregation")
 92    def handle_aggregation_action(ack, body):
 93        """メニュー項目生成
 94
 95        Args:
 96            ack (_type_): ack
 97            body (dict): イベント内容
 98        """
 99
100        ack()
101        logging.trace(body)  # type: ignore
102
103        m = adapter.parser()
104
105        m.parser(body)
106        add_argument, app_msg, update_flag = ui_parts.set_command_option(adapter, body)
107        m.data.text = f"dummy {" ".join(add_argument)}"
108        g.params = dictutil.placeholder(g.cfg.ranking, m)
109        g.params.update(update_flag)
110
111        adapter.api.appclient.views_update(
112            view_id=adapter.conf.tab_var["view_id"],
113            view=ui_parts.plain_text(f"{chr(10).join(app_msg)}"),
114        )
115
116        search_options = body["view"]["state"]["values"]
117        if "bid-ranked" in search_options:
118            if "value" in search_options["bid-ranked"]["aid-ranked"]:
119                ranked = int(search_options["bid-ranked"]["aid-ranked"]["value"])
120                if ranked > 0:
121                    g.params.update(ranked=ranked)
122
123        app_msg.pop()
124        app_msg.append("集計完了")
125
126        m.status.command_type = "ranking"
127        ranking.ranking.aggregation(m)
128        adapter.api.post(m)
129
130        ui_parts.update_view(adapter, m, app_msg)
131
132    @app.view("RankingMenu_ModalPeriodSelection")
133    def handle_view_submission(ack, view):
134        """view更新
135
136        Args:
137            ack (_type_): ack
138            view (dict): 描写内容
139        """
140
141        ack()
142
143        for i in view["state"]["values"].keys():
144            if "aid-sday" in view["state"]["values"][i]:
145                adapter.conf.tab_var["sday"] = view["state"]["values"][i]["aid-sday"]["selected_date"]
146            if "aid-eday" in view["state"]["values"][i]:
147                adapter.conf.tab_var["eday"] = view["state"]["values"][i]["aid-eday"]["selected_date"]
148
149        logging.debug("[global var] %s", adapter.conf.tab_var)
150
151        adapter.api.appclient.views_update(
152            view_id=adapter.conf.tab_var["view_id"],
153            view=build_ranking_menu(adapter),
154        )
def build_ranking_menu(adapter: integrations.slack.adapter.ServiceAdapter):
17def build_ranking_menu(adapter: ServiceAdapter):
18    """ランキングメニュー生成
19
20    Args:
21        adapter (ServiceAdapter): インターフェースアダプタ
22    """
23
24    adapter.conf.tab_var["screen"] = "RankingMenu"
25    adapter.conf.tab_var["no"] = 0
26    adapter.conf.tab_var["view"] = {"type": "home", "blocks": []}
27    adapter.conf.tab_var.setdefault("sday", ExtDt().format("ymd", "-"))
28    adapter.conf.tab_var.setdefault("eday", ExtDt().format("ymd", "-"))
29    ui_parts.header(adapter, text="【ランキング】")
30
31    # 検索範囲設定
32    date_dict = {x: ExtDt(hours=-g.cfg.setting.time_adjust).range(x).dict_format("ymd", "-") for x in ["今月", "先月", "全部"]}
33    ui_parts.divider(adapter)
34    ui_parts.radio_buttons(
35        adapter=adapter,
36        id_suffix="search_range",
37        title="検索範囲",
38        flag={
39            "今月": f"今月:{date_dict["今月"]["start"]}{date_dict["今月"]["end"]}",
40            "先月": f"先月:{date_dict["先月"]["start"]}{date_dict["先月"]["end"]}",
41            "全部": f"全部:{date_dict["全部"]["start"]}{date_dict["全部"]["end"]}",
42            "指定": f"範囲指定:{adapter.conf.tab_var["sday"]}{adapter.conf.tab_var["eday"]}",
43        }
44    )
45    ui_parts.button(adapter, text="検索範囲設定", action_id="modal-open-period")
46
47    # 検索オプション
48    ui_parts.divider(adapter)
49    ui_parts.checkboxes(
50        adapter=adapter,
51        id_suffix="search_option",
52        title="検索オプション",
53        flag={
54            "unregistered_replace": "ゲスト無効",
55        },
56        initial=["unregistered_replace"],
57    )
58
59    ui_parts.input_ranked(adapter, block_id="bid-ranked")
60
61    ui_parts.divider(adapter)
62    ui_parts.button(adapter, text="集計", action_id="ranking_aggregation", style="primary")
63    ui_parts.button(adapter, text="戻る", action_id="actionId-back", style="danger")

ランキングメニュー生成

Arguments:
  • adapter (ServiceAdapter): インターフェースアダプタ
register_ranking_handlers = None

ランキングメニュー