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: ブロック要素
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): アダプタインターフェース
44def header(adapter: "ServiceAdapter", text: str = "dummy") -> None: 45 """ヘッダ生成 46 47 Args: 48 adapter (ServiceAdapter): アダプタインターフェース 49 text (str, optional): ヘッダテキスト. Defaults to "dummy". 50 """ 51 52 adapter.conf.tab_var["view"]["blocks"].append({"type": "header", "text": {}}) 53 adapter.conf.tab_var["view"]["blocks"][adapter.conf.tab_var["no"]]["text"] = {"type": "plain_text", "text": text} 54 adapter.conf.tab_var["no"] += 1
ヘッダ生成
Arguments:
- adapter (ServiceAdapter): アダプタインターフェース
- text (str, optional): ヘッダテキスト. Defaults to "dummy".
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.
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): 表示テキスト