코드로 우주평화

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

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

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

daco2020 2024. 8. 29. 01:30
반응형

Slack 봇을 개발할 때, 관리자만 사용할 수 있는 기능이 필요한 경우가 종종 있습니다.

 

예를 들어, 데이터 동기화나 특정 채널에 멤버를 초대하는 작업 등이죠. 이번 글에서는 /관리자 명령어를 통해 두 개의 버튼을 제공하여, 관리자에게 필요한 메뉴를 호출할 수 있도록 해보겠습니다. 사용한 프레임워크는 Slack Bolt 입니다.

 

 

 

핸들러 함수 정의

먼저, 슬랙에서 관리자 명령어를 처리하는 admin_command 함수를 정의해 보겠습니다. 이 함수는 사용자가 /관리자 명령어를 입력했을 때 호출됩니다. 참고로, 명령어는 사전에 slack api 웹사이트에서 Slash Commands 를 설정해주셔야 합니다.

async def admin_command(
    ack: AsyncAck,
    body: CommandBodyType,
    say: AsyncSay,
    client: AsyncWebClient,
    user: User, # 사용자 정의로 주입한 user 객체입니다.
) -> None:
    """관리자 메뉴를 조회합니다."""
    await ack()

 

일단 사용자가 명령어를 입력했을 때 즉시 응답을 보내기 위해 ack()를 호출합니다. 이 작업은 슬랙이 요청을 제대로 받았다는 것을 확인시켜 주는 용도입니다.

 

 

 

관리자 권한 확인

이후, 사용자의 권한을 체크하는 로직을 구현하겠습니다. 관리자 권한이 없으면 PermissionError를 발생시켜서 접근을 차단할 수 있습니다. 에러는 각자 상황에 맞게 핸들링 해주시면 됩니다.

    if user.user_id not in settings.ADMIN_IDS: # 환경변수로 관리자 IDs 를 관리합니다.
        raise PermissionError("`/관리자` 명령어는 관리자만 호출할 수 있어요. 🤭")

 

 

 

관리자 메뉴 구현

다음으로, 관리자 메뉴를 보여주기 위해 슬랙 메시지를 구성할 건데요. 두 개의 버튼을 포함한 블록들을 추가해 줍시다.

    text = "관리자 메뉴입니다."
    await client.chat_postEphemeral(
        channel=body["channel_id"],
        user=user.user_id,
        text=text,
        blocks=[
            SectionBlock(text=text),
            ActionsBlock(
                elements=[
                    ButtonElement(
                        text="데이터 동기화",
                        action_id="sync_store",
                        value="sync_store",
                    ),
                    ButtonElement(
                        text="채널 초대",
                        action_id="invite_channel",
                        value="invite_channel",
                    ),
                ],
            ),
        ],
    )

 

여기서 chat_postEphemeral을 사용해 메시지를 관리자 본인에게만 보이도록 설정했습니다. 이렇게 하면 어디서 명령어를 입력해도 관리자 본인만 볼 수 있겠죠.

 

SectionBlockActionsBlock을 사용해 메시지에 본문과 버튼을 추가했습니다. 각각의 버튼에는 action_idvalue가 설정돼 있어서, 나중에 버튼이 클릭될 때 이를 식별하고 처리할 수 있습니다. 첫 번째 버튼은 "데이터 동기화", 두 번째 버튼은 "채널 초대" 로 지정합니다.

 

 

마지막으로, 우리가 구현한 핸들러 함수를 슬랙 app 에서 사용할 수 있도록 등록해줘야 합니다. 

app.command("/관리자")(admin_command)

 

 

 

 

자 이제, 슬랙에서 /관리자 명령어를 사용할 수 있습니다. 

실제 관리자 메뉴를 호출한 모습

 

 

이렇게 관리자만 접근할 수 있는 메뉴가 완성되었습니다.

 

관리자는 각 버튼을 눌러 action event 를 추가로 발생시킬 수 있는데요. 이때, 각 action_id 에 맞게 핸들러 함수를 추가로 구현하여 원하는 작업들을 수행할 수 있습니다.

 

다음 글에서는 채널 초대 기능을 구현해 보도록 하겠습니다. 

 

 

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

이전 글에서 /관리자 명령어를 통해 관리자만 접근할 수 있는 메뉴를 만드는 방법에 대해 설명했었습니다. 2024.08.29 - [나는 이렇게 논다/글또 슬랙 봇 개발기] - 슬랙 봇으로 나만 보이는 '관리자

daco2020.tistory.com

 

반응형