나는 이렇게 논다/글또 슬랙 봇 개발기

슬랙 봇으로 '채널 초대' 모달 띄우기

daco2020 2024. 8. 30. 23:41
반응형

이전 글에서 /관리자 명령어를 통해 관리자만 접근할 수 있는 메뉴를 만드는 방법에 대해 설명했었습니다.

 

 

슬랙 봇으로 나만 보이는 '관리자' 메뉴 만들기

Slack 봇을 개발할 때, 관리자만 사용할 수 있는 기능이 필요한 경우가 종종 있습니다. 예를 들어, 데이터 동기화나 특정 채널에 멤버를 초대하는 작업 등이죠. 이번 글에서는 /관리자 명령어를

daco2020.tistory.com

 

이번에는 해당 메뉴에서 '채널 초대' 버튼을 눌렀을 때 실행되는 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 액션을 처리하고, 사용자가 초대할 멤버와 채널을 선택할 수 있는 모달을 띄우는 작업을 완료했습니다. 해당 이벤트를 실행해본다면 아래 이미지처럼 슬랙에서 모달이 열리게 됩니다. 참 쉽죠?😉

 

 

다음 단계에서는 사용자가 모달에서 제출한 정보를 바탕으로 실제 채널 초대 작업을 수행하는 로직을 구현해야 합니다. 이 부분은 다음 글에서 다루어 보겠습니다.

 

 

슬랙 봇으로 '채널 초대' 기능 구현하기

앞서 우리는 슬랙 봇에서 사용자가 특정 멤버를 여러 채널에 초대할 수 있도록 모달을 띄우는 기능을 구현했습니다.  슬랙 봇으로 '채널 초대' 모달 띄우기이전 글에서 /관리자 명령어를 통해

daco2020.tistory.com

 

반응형