이전 글에서 /관리자
명령어를 통해 관리자만 접근할 수 있는 메뉴를 만드는 방법에 대해 설명했었습니다.
이번에는 해당 메뉴에서 '채널 초대' 버튼을 눌렀을 때 실행되는 invite_channel
액션을 처리하고, 사용자가 멤버를 초대할 수 있는 모달을 띄우는 방법을 알아보겠습니다.
액션 이벤트 핸들링
먼저, invite_channel
액션이 발생했을 때 이를 처리할 핸들러 함수를 작성해줘야 합니다. `invite_channel`은 이전 관리자 메뉴를 구현할 때 지정한 `action_id` 의 값입니다. 이 함수는 채널 초대 작업을 수행하기 위한 모달을 띄우는 역할을 하게됩니다.
@app.action("invite_channel")
async def handle_invite_channel(
ack: AsyncAck,
body: ActionBodyType,
say: AsyncSay,
client: AsyncWebClient,
user: User,
service: SlackService,
) -> None:
"""채널 초대를 수행합니다."""
await ack()
ack()
함수는 이벤트를 처리할 때 언제나 호출해주어야 합니다. 이는 슬랙에게 요청을 잘 받았다는 것을 알리는 역할입니다.
모달 뷰 열기
이제 client.views_open
메서드를 사용해서 사용자가 멤버를 선택하고 초대할 채널을 지정할 수 있는 모달을 띄우겠습니다.
await client.views_open(
trigger_id=body["trigger_id"],
view=View(
type="modal",
title="채널 초대",
submit="채널 초대하기",
callback_id="invite_channel_view",
close="닫기",
blocks=[
SectionBlock(
text="초대하고 싶은 멤버와 채널을 선택해주세요.",
),
InputBlock(
block_id="user",
label="멤버",
optional=False,
element=UserSelectElement(
action_id="select_user",
placeholder="멤버를 선택해주세요.",
),
),
InputBlock(
block_id="channel",
label="채널",
optional=True,
element=ChannelMultiSelectElement(
action_id="select_channels",
placeholder="채널을 선택하지 않으면 모든 공개 채널에 초대합니다.",
),
),
],
),
)
여기서 몇 가지 중요한 포인트를 짚어보자면
trigger_id
: 슬랙에서 모달을 열기 위해 필요한 식별자입니다. 액션 이벤트에서 제공되는body
딕셔너리 안에 들어있습니다.view
: 모달의 구성을 정의하는 부분입니다. 모달의 제목, 제출 버튼, 취소 버튼, 그리고 모달 안의 블록들을 정의할 수 있습니다.
모달 안에는 UserSelectElement
를 사용해 초대할 멤버를 선택할 수 있고, ChannelMultiSelectElement
를 통해 초대할 채널을 선택할 수 있습니다. `UserSelectElement` 과 `ChannelMultiSelectElement` 는 `slack_sdk.models.blocks` 에서 제공하는 block 객체입니다. 구현하실 때 참고해주세요.
`optional` 파라미터도 `False`, `True` 로 각기 다르게 설정했습니다. 멤버 선택은 단일 선택이자 필수지만, 채널 선택은 복수 선택이자 선택사항으로 두었죠. 그 이유는 만약 사용자가 채널을 선택하지 않은 경우, 모든 채널을 초대하도록 처리할 예정이기 때문입니다.
결과물
이제 invite_channel
액션을 처리하고, 사용자가 초대할 멤버와 채널을 선택할 수 있는 모달을 띄우는 작업을 완료했습니다. 해당 이벤트를 실행해본다면 아래 이미지처럼 슬랙에서 모달이 열리게 됩니다. 참 쉽죠?😉
다음 단계에서는 사용자가 모달에서 제출한 정보를 바탕으로 실제 채널 초대 작업을 수행하는 로직을 구현해야 합니다. 이 부분은 다음 글에서 다루어 보겠습니다.
'나는 이렇게 논다 > 글또 슬랙 봇 개발기' 카테고리의 다른 글
Python aiocache 로 비동기 Slack API 요청 캐싱하기 (6) | 2024.10.03 |
---|---|
슬랙 봇으로 '채널 초대' 기능 구현하기 (0) | 2024.08.31 |
슬랙 봇으로 나만 보이는 '관리자' 메뉴 만들기 (0) | 2024.08.29 |
Slack Bolt에서 view Dict를 View 객체로 변경해보자 (0) | 2024.08.20 |
Slack Block Kit 주요 블록 유형별 차이점 정리 (0) | 2024.08.17 |