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
을 사용해 메시지를 관리자 본인에게만 보이도록 설정했습니다. 이렇게 하면 어디서 명령어를 입력해도 관리자 본인만 볼 수 있겠죠.
SectionBlock
과 ActionsBlock
을 사용해 메시지에 본문과 버튼을 추가했습니다. 각각의 버튼에는 action_id
와 value
가 설정돼 있어서, 나중에 버튼이 클릭될 때 이를 식별하고 처리할 수 있습니다. 첫 번째 버튼은 "데이터 동기화", 두 번째 버튼은 "채널 초대" 로 지정합니다.
마지막으로, 우리가 구현한 핸들러 함수를 슬랙 app 에서 사용할 수 있도록 등록해줘야 합니다.
app.command("/관리자")(admin_command)
자 이제, 슬랙에서 /관리자 명령어를 사용할 수 있습니다.
이렇게 관리자만 접근할 수 있는 메뉴가 완성되었습니다.
관리자는 각 버튼을 눌러 action event 를 추가로 발생시킬 수 있는데요. 이때, 각 action_id 에 맞게 핸들러 함수를 추가로 구현하여 원하는 작업들을 수행할 수 있습니다.
다음 글에서는 채널 초대 기능을 구현해 보도록 하겠습니다.
'나는 이렇게 논다 > 글또 슬랙 봇 개발기' 카테고리의 다른 글
슬랙 봇으로 '채널 초대' 기능 구현하기 (0) | 2024.08.31 |
---|---|
슬랙 봇으로 '채널 초대' 모달 띄우기 (0) | 2024.08.30 |
Slack Bolt에서 view Dict를 View 객체로 변경해보자 (0) | 2024.08.20 |
Slack Block Kit 주요 블록 유형별 차이점 정리 (0) | 2024.08.17 |
개발자 글쓰기 커뮤니티는 '슬랙 봇'을 어떻게 사용하고 있을까? (0) | 2024.02.17 |