libs.commands.home_tab.ui_parts

libs/commands/home_tab/ui_parts.py

  1"""
  2libs/commands/home_tab/ui_parts.py
  3"""
  4
  5import logging
  6
  7import libs.global_value as g
  8
  9
 10def plain_text(msg: str) -> dict:
 11    """プレーンテキストの埋め込み
 12
 13    Args:
 14        msg (str): テキスト
 15
 16    Returns:
 17        dict: ブロック要素
 18    """
 19
 20    view: dict = {"type": "home", "blocks": []}
 21    view["blocks"].append({"type": "section", "text": {}})
 22    view["blocks"][0]["text"] = {"type": "mrkdwn", "text": msg}
 23
 24    return view
 25
 26
 27def divider() -> None:
 28    """境界線を引く"""
 29    g.app_var["view"]["blocks"].append({"type": "divider", })
 30    g.app_var["no"] += 1
 31
 32
 33def header(text: str = "dummy") -> None:
 34    """ヘッダ生成
 35
 36    Args:
 37        text (str, optional): ヘッダテキスト. Defaults to "dummy".
 38    """
 39
 40    g.app_var["view"]["blocks"].append({"type": "header", "text": {}})
 41    g.app_var["view"]["blocks"][g.app_var["no"]]["text"] = {"type": "plain_text", "text": text}
 42    g.app_var["no"] += 1
 43
 44
 45def button(text: str, action_id: str, style: str | bool = False) -> None:
 46    """ボタン配置
 47
 48    Args:
 49        text (str, optional): 表示テキスト
 50        action_id (str): action_id
 51        style (str | bool, optional): 表示スタイル. Defaults to False.
 52    """
 53
 54    g.app_var["view"]["blocks"].append({"type": "actions", "elements": [{}]})
 55    g.app_var["view"]["blocks"][g.app_var["no"]]["elements"][0] = {"type": "button", "text": {}, "action_id": action_id}
 56    g.app_var["view"]["blocks"][g.app_var["no"]]["elements"][0]["text"] = {"type": "plain_text", "text": text}
 57    if style:
 58        g.app_var["view"]["blocks"][g.app_var["no"]]["elements"][0].update({"style": style})
 59
 60    g.app_var["no"] += 1
 61
 62
 63def radio_buttons(id_suffix: str, title: str, flag: dict) -> None:
 64    """オプション選択メニュー
 65
 66    Args:
 67        id_suffix (str): block_id, action_id
 68        title (str): 表示タイトル
 69        flag (dict, optional): 表示する選択項目
 70    """
 71
 72    g.app_var["view"]["blocks"].append({"type": "input", "block_id": f"bid-{id_suffix}", "element": {}})
 73    g.app_var["view"]["blocks"][g.app_var["no"]]["label"] = {"type": "plain_text", "text": title}
 74    g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["type"] = "radio_buttons"
 75    g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["action_id"] = f"aid-{id_suffix}"
 76    g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["initial_option"] = {  # 先頭の選択肢はチェック済みにする
 77        "text": {"type": "plain_text", "text": flag[next(iter(flag))]}, "value": next(iter(flag))
 78    }
 79    g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["options"] = []
 80    for k, v in flag.items():
 81        g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["options"].append(
 82            {"text": {"type": "plain_text", "text": v}, "value": k}
 83        )
 84    g.app_var["no"] += 1
 85
 86
 87def checkboxes(id_suffix: str, title: str, flag: dict | None = None, initial: list | None = None) -> None:
 88    """チェックボックス選択メニュー
 89
 90    Args:
 91        id_suffix (str): block_id, action_id
 92        title (str): 表示タイトル
 93        flag (dict, optional): 表示する選択項目
 94        initial (list, optional): チェック済み項目. Defaults to None.
 95    """
 96
 97    if flag is None:
 98        flag = {}
 99
100    g.app_var["view"]["blocks"].append({"type": "input", "block_id": f"bid-{id_suffix}", "element": {}})
101    g.app_var["view"]["blocks"][g.app_var["no"]]["label"] = {"type": "plain_text", "text": title}
102    g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["type"] = "checkboxes"
103    g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["action_id"] = f"aid-{id_suffix}"
104    g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["options"] = []
105    if initial:
106        g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["initial_options"] = []
107    else:
108        initial = []  # None -> list
109
110    for k, v in flag.items():
111        g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["options"].append(
112            {"text": {"type": "plain_text", "text": v}, "value": k}
113        )
114        if k in initial:
115            g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["initial_options"].append(
116                {"text": {"type": "plain_text", "text": v}, "value": k}
117            )
118
119    g.app_var["no"] += 1
120
121
122def user_select_pulldown(text: str = "dummy", add_list: list | None = None) -> None:
123    """プレイヤー選択プルダウンメニュー
124
125    Args:
126        text (str, optional): 表示テキスト. Defaults to "dummy".
127        add_list (list | None, optional): プレイヤーリスト. Defaults to None.
128    """
129
130    g.app_var["view"]["blocks"].append({"type": "input", "block_id": "bid-user_select", "element": {}})
131    g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["type"] = "static_select"
132    g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["action_id"] = "player"
133    g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["placeholder"] = {"type": "plain_text", "text": "Select an item"}
134    g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["options"] = []
135
136    if add_list:
137        for val in add_list:
138            g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["options"].append(
139                {"text": {"type": "plain_text", "text": val}, "value": val}
140            )
141
142    for name in set(g.member_list.values()):
143        g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["options"].append(
144            {"text": {"type": "plain_text", "text": name}, "value": name}
145        )
146
147    g.app_var["view"]["blocks"][g.app_var["no"]]["label"] = {"type": "plain_text", "text": text}
148
149    g.app_var["no"] += 1
150
151
152def multi_select_pulldown(text: str = "dummy", add_list: list | None = None) -> None:
153    """複数プレイヤー選択プルダウンメニュー
154
155    Args:
156        text (str, optional): 表示テキスト. Defaults to "dummy".
157        add_list (list | None, optional): プレイヤーリスト. Defaults to None.
158    """
159    g.app_var["view"]["blocks"].append({"type": "input", "block_id": "bid-multi_select", "element": {}})
160    g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["type"] = "multi_static_select"
161    g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["action_id"] = "player"
162    g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["placeholder"] = {"type": "plain_text", "text": "Select an item"}
163    g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["options"] = []
164
165    if add_list:
166        for val in add_list:
167            g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["options"].append(
168                {"text": {"type": "plain_text", "text": val}, "value": val}
169            )
170
171    for name in set(g.member_list.values()):
172        g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["options"].append(
173            {"text": {"type": "plain_text", "text": name}, "value": name}
174        )
175
176    g.app_var["view"]["blocks"][g.app_var["no"]]["label"] = {"type": "plain_text", "text": text}
177
178    g.app_var["no"] += 1
179
180
181def input_ranked(block_id: str | bool = False) -> None:
182    """ランキング上限入力テキストボックス
183
184    Args:
185        block_id (str | bool, optional): block_id. Defaults to False.
186    """
187
188    if block_id:
189        g.app_var["view"]["blocks"].append({"type": "input", "block_id": block_id, "element": {}, "label": {}})
190    else:
191        g.app_var["view"]["blocks"].append({"type": "input", "element": {}, "label": {}})
192
193    g.app_var["view"]["blocks"][g.app_var["no"]]["element"].update({"type": "number_input"})
194    g.app_var["view"]["blocks"][g.app_var["no"]]["element"].update({"is_decimal_allowed": True})
195    g.app_var["view"]["blocks"][g.app_var["no"]]["element"].update({"initial_value": str(g.cfg.ranking.ranked)})
196    g.app_var["view"]["blocks"][g.app_var["no"]]["element"].update({"min_value": "1"})
197    g.app_var["view"]["blocks"][g.app_var["no"]]["element"].update({"action_id": "aid-ranked"})
198    g.app_var["view"]["blocks"][g.app_var["no"]]["label"].update({"type": "plain_text", "text": "出力順位上限"})
199
200    g.app_var["no"] += 1
201
202
203def modalperiod_selection() -> dict:
204    """日付選択
205
206    Returns:
207        dict: ブロック要素
208    """
209
210    view: dict = {"type": "modal", "callback_id": f"{g.app_var["screen"]}_ModalPeriodSelection"}
211    view["title"] = {"type": "plain_text", "text": "検索範囲指定"}
212    view["submit"] = {"type": "plain_text", "text": "決定"}
213    view["close"] = {"type": "plain_text", "text": "取消"}
214
215    view["blocks"] = []
216    view["blocks"].append({"type": "input", "element": {}, "label": {}})
217    view["blocks"][0]["element"].update({"type": "datepicker"})
218    view["blocks"][0]["element"].update({"initial_date": g.app_var["sday"]})
219    view["blocks"][0]["element"].update({"placeholder": {"type": "plain_text", "text": "Select a date"}})
220    view["blocks"][0]["element"].update({"action_id": "aid-sday"})
221    view["blocks"][0]["label"].update({"type": "plain_text", "text": "開始日"})
222    view["blocks"].append({"type": "input", "element": {}, "label": {}})
223    view["blocks"][1]["element"].update({"type": "datepicker"})
224    view["blocks"][1]["element"].update({"initial_date": g.app_var["eday"]})
225    view["blocks"][1]["element"].update({"placeholder": {"type": "plain_text", "text": "Select a date"}})
226    view["blocks"][1]["element"].update({"action_id": "aid-eday"})
227    view["blocks"][1]["label"].update({"type": "plain_text", "text": "終了日"})
228
229    return view
230
231
232def set_command_option(body) -> tuple[list, list, dict]:
233    """選択オプションの内容のフラグをセット
234
235    Args:
236        body (dict): イベント内容
237
238    Returns:
239        tuple[list, list, dict]:
240        - list: コマンドに追加する文字列
241        - list: viewに表示するメッセージ
242        - dict: 変更されるフラグ
243    """
244
245    update_flag: dict = {}
246
247    # 検索設定
248    argument: list = []
249    search_options = body["view"]["state"]["values"]
250    logging.info("search options: %s", search_options)
251
252    app_msg: list = []
253    g.app_var.update(operation=None)
254
255    if "bid-user_select" in search_options:
256        user_select = search_options["bid-user_select"]["player"]["selected_option"]
257        if user_select is not None:
258            if "value" in user_select:
259                player = user_select["value"]
260                app_msg.append(f"対象プレイヤー:{player}")
261                argument.append(player)
262
263    if "bid-multi_select" in search_options:
264        user_list = search_options["bid-multi_select"]["player"]["selected_options"]
265        for _, val in enumerate(user_list):
266            argument.append(val["value"])
267
268    if "bid-search_range" in search_options:
269        match search_options["bid-search_range"]["aid-search_range"]["selected_option"]["value"]:
270            case "指定":
271                app_msg.append(f"集計範囲:{g.app_var["sday"]}{g.app_var["eday"]}")
272                argument.extend([g.app_var["sday"], g.app_var["eday"]])
273            case "全部":
274                app_msg.append("集計範囲:全部")
275                argument.append("全部")
276            case _ as select_item:
277                app_msg.append(f"集計範囲:{select_item}")
278                argument.append(select_item)
279
280    for id_suffix in ("search_option", "display_option", "output_option"):
281        if f"bid-{id_suffix}" in search_options:
282            match search_options[f"bid-{id_suffix}"][f"aid-{id_suffix}"].get("type"):
283                case "checkboxes":
284                    selected_options = search_options[f"bid-{id_suffix}"][f"aid-{id_suffix}"].get("selected_options")
285                case "radio_buttons":
286                    selected_options = [search_options[f"bid-{id_suffix}"][f"aid-{id_suffix}"].get("selected_option")]
287                case _:
288                    continue
289
290            for _, val in enumerate(selected_options):
291                match val["value"]:
292                    case "unregistered_replace":
293                        update_flag.update(unregistered_replace=False)
294                    case "versus_matrix":
295                        update_flag.update(versus_matrix=True)
296                    case "game_results":
297                        update_flag.update(game_results=True)
298                    case "verbose":
299                        update_flag.update(game_results=True)
300                        update_flag.update(verbose=True)
301                    case "score_comparisons":
302                        update_flag.update(score_comparisons=True)
303                        g.app_var.update(operation=None)
304                    case _ as option:
305                        g.app_var.update(operation=option)
306
307    app_msg.append("集計中…")
308    return (argument, app_msg, update_flag)
def plain_text(msg: str) -> dict:
11def plain_text(msg: str) -> dict:
12    """プレーンテキストの埋め込み
13
14    Args:
15        msg (str): テキスト
16
17    Returns:
18        dict: ブロック要素
19    """
20
21    view: dict = {"type": "home", "blocks": []}
22    view["blocks"].append({"type": "section", "text": {}})
23    view["blocks"][0]["text"] = {"type": "mrkdwn", "text": msg}
24
25    return view

プレーンテキストの埋め込み

Arguments:
  • msg (str): テキスト
Returns:

dict: ブロック要素

def divider() -> None:
28def divider() -> None:
29    """境界線を引く"""
30    g.app_var["view"]["blocks"].append({"type": "divider", })
31    g.app_var["no"] += 1

境界線を引く

def button(text: str, action_id: str, style: str | bool = False) -> None:
46def button(text: str, action_id: str, style: str | bool = False) -> None:
47    """ボタン配置
48
49    Args:
50        text (str, optional): 表示テキスト
51        action_id (str): action_id
52        style (str | bool, optional): 表示スタイル. Defaults to False.
53    """
54
55    g.app_var["view"]["blocks"].append({"type": "actions", "elements": [{}]})
56    g.app_var["view"]["blocks"][g.app_var["no"]]["elements"][0] = {"type": "button", "text": {}, "action_id": action_id}
57    g.app_var["view"]["blocks"][g.app_var["no"]]["elements"][0]["text"] = {"type": "plain_text", "text": text}
58    if style:
59        g.app_var["view"]["blocks"][g.app_var["no"]]["elements"][0].update({"style": style})
60
61    g.app_var["no"] += 1

ボタン配置

Arguments:
  • text (str, optional): 表示テキスト
  • action_id (str): action_id
  • style (str | bool, optional): 表示スタイル. Defaults to False.
def radio_buttons(id_suffix: str, title: str, flag: dict) -> None:
64def radio_buttons(id_suffix: str, title: str, flag: dict) -> None:
65    """オプション選択メニュー
66
67    Args:
68        id_suffix (str): block_id, action_id
69        title (str): 表示タイトル
70        flag (dict, optional): 表示する選択項目
71    """
72
73    g.app_var["view"]["blocks"].append({"type": "input", "block_id": f"bid-{id_suffix}", "element": {}})
74    g.app_var["view"]["blocks"][g.app_var["no"]]["label"] = {"type": "plain_text", "text": title}
75    g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["type"] = "radio_buttons"
76    g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["action_id"] = f"aid-{id_suffix}"
77    g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["initial_option"] = {  # 先頭の選択肢はチェック済みにする
78        "text": {"type": "plain_text", "text": flag[next(iter(flag))]}, "value": next(iter(flag))
79    }
80    g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["options"] = []
81    for k, v in flag.items():
82        g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["options"].append(
83            {"text": {"type": "plain_text", "text": v}, "value": k}
84        )
85    g.app_var["no"] += 1

オプション選択メニュー

Arguments:
  • id_suffix (str): block_id, action_id
  • title (str): 表示タイトル
  • flag (dict, optional): 表示する選択項目
def checkboxes( id_suffix: str, title: str, flag: dict | None = None, initial: list | None = None) -> None:
 88def checkboxes(id_suffix: str, title: str, flag: dict | None = None, initial: list | None = None) -> None:
 89    """チェックボックス選択メニュー
 90
 91    Args:
 92        id_suffix (str): block_id, action_id
 93        title (str): 表示タイトル
 94        flag (dict, optional): 表示する選択項目
 95        initial (list, optional): チェック済み項目. Defaults to None.
 96    """
 97
 98    if flag is None:
 99        flag = {}
100
101    g.app_var["view"]["blocks"].append({"type": "input", "block_id": f"bid-{id_suffix}", "element": {}})
102    g.app_var["view"]["blocks"][g.app_var["no"]]["label"] = {"type": "plain_text", "text": title}
103    g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["type"] = "checkboxes"
104    g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["action_id"] = f"aid-{id_suffix}"
105    g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["options"] = []
106    if initial:
107        g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["initial_options"] = []
108    else:
109        initial = []  # None -> list
110
111    for k, v in flag.items():
112        g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["options"].append(
113            {"text": {"type": "plain_text", "text": v}, "value": k}
114        )
115        if k in initial:
116            g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["initial_options"].append(
117                {"text": {"type": "plain_text", "text": v}, "value": k}
118            )
119
120    g.app_var["no"] += 1

チェックボックス選択メニュー

Arguments:
  • id_suffix (str): block_id, action_id
  • title (str): 表示タイトル
  • flag (dict, optional): 表示する選択項目
  • initial (list, optional): チェック済み項目. Defaults to None.
def user_select_pulldown(text: str = 'dummy', add_list: list | None = None) -> None:
123def user_select_pulldown(text: str = "dummy", add_list: list | None = None) -> None:
124    """プレイヤー選択プルダウンメニュー
125
126    Args:
127        text (str, optional): 表示テキスト. Defaults to "dummy".
128        add_list (list | None, optional): プレイヤーリスト. Defaults to None.
129    """
130
131    g.app_var["view"]["blocks"].append({"type": "input", "block_id": "bid-user_select", "element": {}})
132    g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["type"] = "static_select"
133    g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["action_id"] = "player"
134    g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["placeholder"] = {"type": "plain_text", "text": "Select an item"}
135    g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["options"] = []
136
137    if add_list:
138        for val in add_list:
139            g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["options"].append(
140                {"text": {"type": "plain_text", "text": val}, "value": val}
141            )
142
143    for name in set(g.member_list.values()):
144        g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["options"].append(
145            {"text": {"type": "plain_text", "text": name}, "value": name}
146        )
147
148    g.app_var["view"]["blocks"][g.app_var["no"]]["label"] = {"type": "plain_text", "text": text}
149
150    g.app_var["no"] += 1

プレイヤー選択プルダウンメニュー

Arguments:
  • text (str, optional): 表示テキスト. Defaults to "dummy".
  • add_list (list | None, optional): プレイヤーリスト. Defaults to None.
def multi_select_pulldown(text: str = 'dummy', add_list: list | None = None) -> None:
153def multi_select_pulldown(text: str = "dummy", add_list: list | None = None) -> None:
154    """複数プレイヤー選択プルダウンメニュー
155
156    Args:
157        text (str, optional): 表示テキスト. Defaults to "dummy".
158        add_list (list | None, optional): プレイヤーリスト. Defaults to None.
159    """
160    g.app_var["view"]["blocks"].append({"type": "input", "block_id": "bid-multi_select", "element": {}})
161    g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["type"] = "multi_static_select"
162    g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["action_id"] = "player"
163    g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["placeholder"] = {"type": "plain_text", "text": "Select an item"}
164    g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["options"] = []
165
166    if add_list:
167        for val in add_list:
168            g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["options"].append(
169                {"text": {"type": "plain_text", "text": val}, "value": val}
170            )
171
172    for name in set(g.member_list.values()):
173        g.app_var["view"]["blocks"][g.app_var["no"]]["element"]["options"].append(
174            {"text": {"type": "plain_text", "text": name}, "value": name}
175        )
176
177    g.app_var["view"]["blocks"][g.app_var["no"]]["label"] = {"type": "plain_text", "text": text}
178
179    g.app_var["no"] += 1

複数プレイヤー選択プルダウンメニュー

Arguments:
  • text (str, optional): 表示テキスト. Defaults to "dummy".
  • add_list (list | None, optional): プレイヤーリスト. Defaults to None.
def input_ranked(block_id: str | bool = False) -> None:
182def input_ranked(block_id: str | bool = False) -> None:
183    """ランキング上限入力テキストボックス
184
185    Args:
186        block_id (str | bool, optional): block_id. Defaults to False.
187    """
188
189    if block_id:
190        g.app_var["view"]["blocks"].append({"type": "input", "block_id": block_id, "element": {}, "label": {}})
191    else:
192        g.app_var["view"]["blocks"].append({"type": "input", "element": {}, "label": {}})
193
194    g.app_var["view"]["blocks"][g.app_var["no"]]["element"].update({"type": "number_input"})
195    g.app_var["view"]["blocks"][g.app_var["no"]]["element"].update({"is_decimal_allowed": True})
196    g.app_var["view"]["blocks"][g.app_var["no"]]["element"].update({"initial_value": str(g.cfg.ranking.ranked)})
197    g.app_var["view"]["blocks"][g.app_var["no"]]["element"].update({"min_value": "1"})
198    g.app_var["view"]["blocks"][g.app_var["no"]]["element"].update({"action_id": "aid-ranked"})
199    g.app_var["view"]["blocks"][g.app_var["no"]]["label"].update({"type": "plain_text", "text": "出力順位上限"})
200
201    g.app_var["no"] += 1

ランキング上限入力テキストボックス

Arguments:
  • block_id (str | bool, optional): block_id. Defaults to False.
def modalperiod_selection() -> dict:
204def modalperiod_selection() -> dict:
205    """日付選択
206
207    Returns:
208        dict: ブロック要素
209    """
210
211    view: dict = {"type": "modal", "callback_id": f"{g.app_var["screen"]}_ModalPeriodSelection"}
212    view["title"] = {"type": "plain_text", "text": "検索範囲指定"}
213    view["submit"] = {"type": "plain_text", "text": "決定"}
214    view["close"] = {"type": "plain_text", "text": "取消"}
215
216    view["blocks"] = []
217    view["blocks"].append({"type": "input", "element": {}, "label": {}})
218    view["blocks"][0]["element"].update({"type": "datepicker"})
219    view["blocks"][0]["element"].update({"initial_date": g.app_var["sday"]})
220    view["blocks"][0]["element"].update({"placeholder": {"type": "plain_text", "text": "Select a date"}})
221    view["blocks"][0]["element"].update({"action_id": "aid-sday"})
222    view["blocks"][0]["label"].update({"type": "plain_text", "text": "開始日"})
223    view["blocks"].append({"type": "input", "element": {}, "label": {}})
224    view["blocks"][1]["element"].update({"type": "datepicker"})
225    view["blocks"][1]["element"].update({"initial_date": g.app_var["eday"]})
226    view["blocks"][1]["element"].update({"placeholder": {"type": "plain_text", "text": "Select a date"}})
227    view["blocks"][1]["element"].update({"action_id": "aid-eday"})
228    view["blocks"][1]["label"].update({"type": "plain_text", "text": "終了日"})
229
230    return view

日付選択

Returns:

dict: ブロック要素

def set_command_option(body) -> tuple[list, list, dict]:
233def set_command_option(body) -> tuple[list, list, dict]:
234    """選択オプションの内容のフラグをセット
235
236    Args:
237        body (dict): イベント内容
238
239    Returns:
240        tuple[list, list, dict]:
241        - list: コマンドに追加する文字列
242        - list: viewに表示するメッセージ
243        - dict: 変更されるフラグ
244    """
245
246    update_flag: dict = {}
247
248    # 検索設定
249    argument: list = []
250    search_options = body["view"]["state"]["values"]
251    logging.info("search options: %s", search_options)
252
253    app_msg: list = []
254    g.app_var.update(operation=None)
255
256    if "bid-user_select" in search_options:
257        user_select = search_options["bid-user_select"]["player"]["selected_option"]
258        if user_select is not None:
259            if "value" in user_select:
260                player = user_select["value"]
261                app_msg.append(f"対象プレイヤー:{player}")
262                argument.append(player)
263
264    if "bid-multi_select" in search_options:
265        user_list = search_options["bid-multi_select"]["player"]["selected_options"]
266        for _, val in enumerate(user_list):
267            argument.append(val["value"])
268
269    if "bid-search_range" in search_options:
270        match search_options["bid-search_range"]["aid-search_range"]["selected_option"]["value"]:
271            case "指定":
272                app_msg.append(f"集計範囲:{g.app_var["sday"]}{g.app_var["eday"]}")
273                argument.extend([g.app_var["sday"], g.app_var["eday"]])
274            case "全部":
275                app_msg.append("集計範囲:全部")
276                argument.append("全部")
277            case _ as select_item:
278                app_msg.append(f"集計範囲:{select_item}")
279                argument.append(select_item)
280
281    for id_suffix in ("search_option", "display_option", "output_option"):
282        if f"bid-{id_suffix}" in search_options:
283            match search_options[f"bid-{id_suffix}"][f"aid-{id_suffix}"].get("type"):
284                case "checkboxes":
285                    selected_options = search_options[f"bid-{id_suffix}"][f"aid-{id_suffix}"].get("selected_options")
286                case "radio_buttons":
287                    selected_options = [search_options[f"bid-{id_suffix}"][f"aid-{id_suffix}"].get("selected_option")]
288                case _:
289                    continue
290
291            for _, val in enumerate(selected_options):
292                match val["value"]:
293                    case "unregistered_replace":
294                        update_flag.update(unregistered_replace=False)
295                    case "versus_matrix":
296                        update_flag.update(versus_matrix=True)
297                    case "game_results":
298                        update_flag.update(game_results=True)
299                    case "verbose":
300                        update_flag.update(game_results=True)
301                        update_flag.update(verbose=True)
302                    case "score_comparisons":
303                        update_flag.update(score_comparisons=True)
304                        g.app_var.update(operation=None)
305                    case _ as option:
306                        g.app_var.update(operation=option)
307
308    app_msg.append("集計中…")
309    return (argument, app_msg, update_flag)

選択オプションの内容のフラグをセット

Arguments:
  • body (dict): イベント内容
Returns:

tuple[list, list, dict]:

  • list: コマンドに追加する文字列
  • list: viewに表示するメッセージ
  • dict: 変更されるフラグ