integrations.slack.events.home_tab.ui_parts

integrations/slack/events/home_tab/ui_parts.py

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

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

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

dict: ブロック要素

def divider(adapter: integrations.slack.adapter.ServiceAdapter) -> None:
33def divider(adapter: "ServiceAdapter") -> None:
34    """境界線を引く
35
36    Args:
37        adapter (ServiceAdapter): アダプタインターフェース
38    """
39
40    adapter.conf.tab_var["view"]["blocks"].append({"type": "divider", })
41    adapter.conf.tab_var["no"] += 1

境界線を引く

Arguments:
  • adapter (ServiceAdapter): アダプタインターフェース
def button( adapter: integrations.slack.adapter.ServiceAdapter, text: str, action_id: str, style: str | bool = False) -> None:
57def button(adapter: "ServiceAdapter", text: str, action_id: str, style: str | bool = False) -> None:
58    """ボタン配置
59
60    Args:
61        adapter (ServiceAdapter): アダプタインターフェース
62        text (str, optional): 表示テキスト
63        action_id (str): action_id
64        style (str | bool, optional): 表示スタイル. Defaults to False.
65    """
66
67    adapter.conf.tab_var["view"]["blocks"].append({"type": "actions", "elements": [{}]})
68    adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["elements"][0] = {"type": "button", "text": {}, "action_id": action_id}
69    adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["elements"][0]["text"] = {"type": "plain_text", "text": text}
70    if style:
71        adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["elements"][0].update({"style": style})
72
73    adapter.conf.tab_var["no"] += 1

ボタン配置

Arguments:
  • adapter (ServiceAdapter): アダプタインターフェース
  • text (str, optional): 表示テキスト
  • action_id (str): action_id
  • style (str | bool, optional): 表示スタイル. Defaults to False.
def radio_buttons( adapter: integrations.slack.adapter.ServiceAdapter, id_suffix: str, title: str, flag: dict) -> None:
76def radio_buttons(adapter: "ServiceAdapter", id_suffix: str, title: str, flag: dict) -> None:
77    """オプション選択メニュー
78
79    Args:
80        adapter (ServiceAdapter): アダプタインターフェース
81        id_suffix (str): block_id, action_id
82        title (str): 表示タイトル
83        flag (dict, optional): 表示する選択項目
84    """
85
86    adapter.conf.tab_var["view"]["blocks"].append({"type": "input", "block_id": f"bid-{id_suffix}", "element": {}})
87    adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["label"] = {"type": "plain_text", "text": title}
88    adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["element"]["type"] = "radio_buttons"
89    adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["element"]["action_id"] = f"aid-{id_suffix}"
90    adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["element"]["initial_option"] = {  # 先頭の選択肢はチェック済みにする
91        "text": {"type": "plain_text", "text": flag[next(iter(flag))]}, "value": next(iter(flag))
92    }
93    adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["element"]["options"] = []
94    for k, v in flag.items():
95        adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["element"]["options"].append(
96            {"text": {"type": "plain_text", "text": v}, "value": k}
97        )
98    adapter.conf.tab_var["no"] += 1

オプション選択メニュー

Arguments:
  • adapter (ServiceAdapter): アダプタインターフェース
  • id_suffix (str): block_id, action_id
  • title (str): 表示タイトル
  • flag (dict, optional): 表示する選択項目
def checkboxes( adapter: integrations.slack.adapter.ServiceAdapter, id_suffix: str, title: str, flag: Optional[dict] = None, initial: Optional[list] = None) -> None:
101def checkboxes(
102    adapter: "ServiceAdapter",
103    id_suffix: str,
104    title: str,
105    flag: Optional[dict] = None,
106    initial: Optional[list] = None,
107) -> None:
108    """チェックボックス選択メニュー
109
110    Args:
111        adapter (ServiceAdapter): アダプタインターフェース
112        id_suffix (str): block_id, action_id
113        title (str): 表示タイトル
114        flag (Optional[dict], optional): 表示する選択項目. Defaults to None.
115        initial (Optional[list], optional): チェック済み項目. Defaults to None.
116    """
117
118    if flag is None:
119        flag = {}
120
121    adapter.conf.tab_var["view"]["blocks"].append({"type": "input", "block_id": f"bid-{id_suffix}", "element": {}})
122    adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["label"] = {"type": "plain_text", "text": title}
123    adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["element"]["type"] = "checkboxes"
124    adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["element"]["action_id"] = f"aid-{id_suffix}"
125    adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["element"]["options"] = []
126    if initial:
127        adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["element"]["initial_options"] = []
128    else:
129        initial = []  # None -> list
130
131    for k, v in flag.items():
132        adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["element"]["options"].append(
133            {"text": {"type": "plain_text", "text": v}, "value": k}
134        )
135        if k in initial:
136            adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["element"]["initial_options"].append(
137                {"text": {"type": "plain_text", "text": v}, "value": k}
138            )
139
140    adapter.conf.tab_var["no"] += 1

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

Arguments:
  • adapter (ServiceAdapter): アダプタインターフェース
  • id_suffix (str): block_id, action_id
  • title (str): 表示タイトル
  • flag (Optional[dict], optional): 表示する選択項目. Defaults to None.
  • initial (Optional[list], optional): チェック済み項目. Defaults to None.
def user_select_pulldown( adapter: integrations.slack.adapter.ServiceAdapter, text: str = 'dummy', add_list: Optional[list] = None) -> None:
143def user_select_pulldown(
144    adapter: "ServiceAdapter",
145    text: str = "dummy",
146    add_list: Optional[list] = None,
147) -> None:
148    """プレイヤー選択プルダウンメニュー
149
150    Args:
151        adapter (ServiceAdapter): アダプタインターフェース
152        text (str, optional): 表示テキスト. Defaults to "dummy".
153        add_list (Optional[list], optional): プレイヤーリスト. Defaults to None.
154    """
155
156    adapter.conf.tab_var["view"]["blocks"].append({"type": "input", "block_id": "bid-user_select", "element": {}})
157    adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["element"]["type"] = "static_select"
158    adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["element"]["action_id"] = "player"
159    adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["element"]["placeholder"] = {"type": "plain_text", "text": "Select an item"}
160    adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["element"]["options"] = []
161
162    if add_list:
163        for val in add_list:
164            adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["element"]["options"].append(
165                {"text": {"type": "plain_text", "text": val}, "value": val}
166            )
167
168    for name in set(g.member_list.values()):
169        adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["element"]["options"].append(
170            {"text": {"type": "plain_text", "text": name}, "value": name}
171        )
172
173    adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["label"] = {"type": "plain_text", "text": text}
174
175    adapter.conf.tab_var["no"] += 1

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

Arguments:
  • adapter (ServiceAdapter): アダプタインターフェース
  • text (str, optional): 表示テキスト. Defaults to "dummy".
  • add_list (Optional[list], optional): プレイヤーリスト. Defaults to None.
def multi_select_pulldown( adapter: integrations.slack.adapter.ServiceAdapter, text: str = 'dummy', add_list: Optional[list] = None) -> None:
178def multi_select_pulldown(
179    adapter: "ServiceAdapter",
180    text: str = "dummy",
181    add_list: Optional[list] = None,
182) -> None:
183    """複数プレイヤー選択プルダウンメニュー
184
185    Args:
186        adapter (ServiceAdapter): アダプタインターフェース
187        text (str, optional): 表示テキスト. Defaults to "dummy".
188        add_list (Optional[list], optional): プレイヤーリスト. Defaults to None.
189    """
190
191    adapter.conf.tab_var["view"]["blocks"].append({"type": "input", "block_id": "bid-multi_select", "element": {}})
192    adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["element"]["type"] = "multi_static_select"
193    adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["element"]["action_id"] = "player"
194    adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["element"]["placeholder"] = {"type": "plain_text", "text": "Select an item"}
195    adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["element"]["options"] = []
196
197    if add_list:
198        for val in add_list:
199            adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["element"]["options"].append(
200                {"text": {"type": "plain_text", "text": val}, "value": val}
201            )
202
203    for name in set(g.member_list.values()):
204        adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["element"]["options"].append(
205            {"text": {"type": "plain_text", "text": name}, "value": name}
206        )
207
208    adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["label"] = {"type": "plain_text", "text": text}
209
210    adapter.conf.tab_var["no"] += 1

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

Arguments:
  • adapter (ServiceAdapter): アダプタインターフェース
  • text (str, optional): 表示テキスト. Defaults to "dummy".
  • add_list (Optional[list], optional): プレイヤーリスト. Defaults to None.
def input_ranked( adapter: integrations.slack.adapter.ServiceAdapter, block_id: str | bool = False) -> None:
213def input_ranked(adapter: "ServiceAdapter", block_id: str | bool = False) -> None:
214    """ランキング上限入力テキストボックス
215
216    Args:
217        adapter (ServiceAdapter): アダプタインターフェース
218        block_id (str | bool, optional): block_id. Defaults to False.
219    """
220
221    if block_id:
222        adapter.conf.tab_var["view"]["blocks"].append({"type": "input", "block_id": block_id, "element": {}, "label": {}})
223    else:
224        adapter.conf.tab_var["view"]["blocks"].append({"type": "input", "element": {}, "label": {}})
225
226    adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["element"].update({"type": "number_input"})
227    adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["element"].update({"is_decimal_allowed": True})
228    adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["element"].update({"initial_value": str(g.cfg.ranking.ranked)})
229    adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["element"].update({"min_value": "1"})
230    adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["element"].update({"action_id": "aid-ranked"})
231    adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["label"].update({"type": "plain_text", "text": "出力順位上限"})
232
233    adapter.conf.tab_var["no"] += 1

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

Arguments:
  • adapter (ServiceAdapter): アダプタインターフェース
  • block_id (str | bool, optional): block_id. Defaults to False.
def modalperiod_selection(adapter: integrations.slack.adapter.ServiceAdapter) -> dict:
236def modalperiod_selection(adapter: "ServiceAdapter") -> dict:
237    """日付選択
238
239    Args:
240        adapter (ServiceAdapter): アダプタインターフェース
241
242    Returns:
243        dict: ブロック要素
244    """
245
246    view: dict = {"type": "modal", "callback_id": f"{adapter.conf.tab_var["screen"]}_ModalPeriodSelection"}
247    view["title"] = {"type": "plain_text", "text": "検索範囲指定"}
248    view["submit"] = {"type": "plain_text", "text": "決定"}
249    view["close"] = {"type": "plain_text", "text": "取消"}
250
251    view["blocks"] = []
252    view["blocks"].append({"type": "input", "element": {}, "label": {}})
253    view["blocks"][0]["element"].update({"type": "datepicker"})
254    view["blocks"][0]["element"].update({"initial_date": adapter.conf.tab_var["sday"]})
255    view["blocks"][0]["element"].update({"placeholder": {"type": "plain_text", "text": "Select a date"}})
256    view["blocks"][0]["element"].update({"action_id": "aid-sday"})
257    view["blocks"][0]["label"].update({"type": "plain_text", "text": "開始日"})
258    view["blocks"].append({"type": "input", "element": {}, "label": {}})
259    view["blocks"][1]["element"].update({"type": "datepicker"})
260    view["blocks"][1]["element"].update({"initial_date": adapter.conf.tab_var["eday"]})
261    view["blocks"][1]["element"].update({"placeholder": {"type": "plain_text", "text": "Select a date"}})
262    view["blocks"][1]["element"].update({"action_id": "aid-eday"})
263    view["blocks"][1]["label"].update({"type": "plain_text", "text": "終了日"})
264
265    return view

日付選択

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

dict: ブロック要素

def set_command_option( adapter: integrations.slack.adapter.ServiceAdapter, body: dict) -> tuple[list, list, dict]:
268def set_command_option(adapter: "ServiceAdapter", body: dict) -> tuple[list, list, dict]:
269    """選択オプションの内容のフラグをセット
270
271    Args:
272        adapter (ServiceAdapter): アダプタインターフェース
273        body (dict): イベント内容
274
275    Returns:
276        tuple[list, list, dict]:
277        - list: コマンドに追加する文字列
278        - list: viewに表示するメッセージ
279        - dict: 変更されるフラグ
280    """
281
282    update_flag: dict = {}
283
284    # 検索設定
285    argument: list = []
286    search_options = body["view"]["state"]["values"]
287    logging.info("search options: %s", search_options)
288
289    app_msg: list = []
290    adapter.conf.tab_var.update(operation=None)
291
292    if "bid-user_select" in search_options:
293        user_select = search_options["bid-user_select"]["player"]["selected_option"]
294        if user_select is not None:
295            if "value" in user_select:
296                player = user_select["value"]
297                app_msg.append(f"対象プレイヤー:{player}")
298                argument.append(player)
299
300    if "bid-multi_select" in search_options:
301        user_list = search_options["bid-multi_select"]["player"]["selected_options"]
302        for _, val in enumerate(user_list):
303            argument.append(val["value"])
304
305    if "bid-search_range" in search_options:
306        match search_options["bid-search_range"]["aid-search_range"]["selected_option"]["value"]:
307            case "指定":
308                app_msg.append(f"集計範囲:{adapter.conf.tab_var["sday"]}{adapter.conf.tab_var["eday"]}")
309                argument.extend([adapter.conf.tab_var["sday"], adapter.conf.tab_var["eday"]])
310            case "全部":
311                app_msg.append("集計範囲:全部")
312                argument.append("全部")
313            case _ as select_item:
314                app_msg.append(f"集計範囲:{select_item}")
315                argument.append(select_item)
316
317    for id_suffix in ("search_option", "display_option", "output_option"):
318        if f"bid-{id_suffix}" in search_options:
319            match search_options[f"bid-{id_suffix}"][f"aid-{id_suffix}"].get("type"):
320                case "checkboxes":
321                    selected_options = search_options[f"bid-{id_suffix}"][f"aid-{id_suffix}"].get("selected_options")
322                case "radio_buttons":
323                    selected_options = [search_options[f"bid-{id_suffix}"][f"aid-{id_suffix}"].get("selected_option")]
324                case _:
325                    continue
326
327            for _, val in enumerate(selected_options):
328                match val["value"]:
329                    case "unregistered_replace":
330                        update_flag.update(unregistered_replace=False)
331                    case "versus_matrix":
332                        update_flag.update(versus_matrix=True)
333                    case "game_results":
334                        update_flag.update(game_results=True)
335                    case "verbose":
336                        update_flag.update(game_results=True)
337                        update_flag.update(verbose=True)
338                    case "score_comparisons":
339                        update_flag.update(score_comparisons=True)
340                        adapter.conf.tab_var.update(operation=None)
341                    case _ as option:
342                        adapter.conf.tab_var.update(operation=option)
343
344    app_msg.append("集計中…")
345    return (argument, app_msg, update_flag)

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

Arguments:
  • adapter (ServiceAdapter): アダプタインターフェース
  • body (dict): イベント内容
Returns:

tuple[list, list, dict]:

  • list: コマンドに追加する文字列
  • list: viewに表示するメッセージ
  • dict: 変更されるフラグ
def update_view( adapter: integrations.slack.adapter.ServiceAdapter, m: integrations.protocols.MessageParserProtocol, msg: list):
348def update_view(adapter: "ServiceAdapter", m: "MessageParserProtocol", msg: list):
349    """viewを更新する
350
351    Args:
352        m (MessageParserProtocol): メッセージデータ
353        msg (list): 表示テキスト
354    """
355
356    if m.post.headline:
357        if isinstance(m.post.headline, dict):
358            k, v = next(iter(m.post.headline.items()))
359            text = f"\n{k}\n{v}"
360        else:
361            text = m.post.headline
362    else:
363        text = ""
364
365    adapter.api.appclient.views_update(
366        view_id=adapter.conf.tab_var["view_id"],
367        view=plain_text(f"{chr(10).join(msg)}\n\n{text}".strip()),
368    )

viewを更新する

Arguments:
  • m (MessageParserProtocol): メッセージデータ
  • msg (list): 表示テキスト