개발

디스코드 봇 만들기 #2

wafla 2024. 8. 29. 23:37

역할 부여하는 명령어 만들기

디스코드 봇을 사용하여 특정 시간에 알림을 받는 기능을 설정하려면, 먼저 사용자가 원하는 시간을 선택할 수 있도록 역할을 부여하는 명령어를 만들어야 합니다. 이 기능은 디스코드 서버에서 사용자가 원하는 시간에 맞춰 알림을 받도록 설정할 수 있게 해줍니다. 이를 위해 슬래시 명령어를 사용하여 사용자가 자신에게 알림을 받을 시간을 추가할 수 있게 만드는 과정이 필요합니다.

 

우선, '/시간'이라는 슬래시 명령어를 추가합니다. 이 명령어 뒤에 사용자가 원하는 시간대를 입력할 수 있도록 설계합니다. 시간대는 00시부터 23시까지 한 시간 단위로 이루어져 있습니다. 사용자가 명령어를 통해 입력하는 시간에 따라 해당 시간대에 맞는 역할이 부여됩니다.

 

1. 역할 생성 및 설정

먼저, 역할을 생성하여 시간을 의미하는 역할을 만듭니다. 디스코드 서버에서 역할을 추가하려면, 서버 설정 메뉴로 들어가야 합니다. 채널 목록에서 서버 이름을 클릭하고, '서버 설정'을 선택합니다.

서버 설정

 

설정 메뉴에서 '역할' 탭으로 이동하여 역할을 추가할 수 있습니다. 24개의 역할을 각각 생성할 수도 있지만, 예시에서는 두 개의 역할만 추가합니다. 이 역할들은 각 시간을 나타내기 위해 생성된 것입니다.

 

역할을 생성할 때 중요한 점은 역할의 순서입니다. 역할 목록에서 위쪽에 위치한 역할일수록 권한이 높습니다. 따라서, 봇이 역할을 부여할 수 있도록 봇의 역할이 새로 만드는 시간 역할보다 위에 위치하도록 설정해야 합니다. 만약 새로 만든 역할이 봇의 역할보다 위에 위치한다면, 나중에 코드에서 권한 문제로 인해 에러가 발생할 수 있습니다.

봇이 시간보다 위에 위치하게 설정

 

추가적으로, 봇이 역할을 관리하고 멘션을 사용할 수 있도록 'Manage Roles'와 'Mention Everyone' 권한을 부여해야 합니다. 이를 위해서는 봇에게 Send Messages 권한뿐만 아니라, 역할 관리와 모든 사람을 멘션할 수 있는 권한을 추가로 설정해야 합니다. 만약 서버에 이미 봇이 설치되어 있다면, 이러한 권한을 추가한 후 봇을 추방하고 다시 설치해야 제대로 적용됩니다.

discord.com/developers/applications

 

2. 코드 작성

역할을 설정한 후, 봇이 실제로 역할을 부여할 수 있도록 코드를 작성합니다. 이전 포스트에서 작성한 hello 메서드를 수정하여 '/시간' 명령어를 처리하는 새로운 명령어를 만듭니다. 이 명령어는 사용자가 입력한 시간을 기준으로 역할을 부여합니다.

@bot.slash_command(name='시간', description="자신의 역할에 여러 시간을 추가합니다")
async def 시간(ctx, 시간들 : str):

 

이 명령어는 '/시간'이라는 명령어를 사용자가 입력했을 때 실행되며, 시간대 정보를 받아 처리합니다. 여기서 'ctx'는 컨텍스트로, 명령어가 호출될 때의 정보를 담고 있습니다. 사용자가 '/시간 00 01 02 09 10 11' 등의 형식으로 시간을 입력하면, 띄어쓰기를 기준으로 각 시간을 구분하여 처리합니다.

name, description 예시

 

코드에서는 사용자가 입력한 시간을 set에 저장하고, 각 시간을 숫자로 변환하여 올바른 형식인지 확인합니다. 올바른 형식의 시간대는 서버의 역할 목록에서 찾아 roles_to_add 리스트에 추가합니다. 이후, 이 역할들을 member.add_roles 명령어를 통해 사용자가 속한 서버에서 역할을 부여합니다. 역할 부여가 완료되면, 사용자가 추가된 역할을 확인할 수 있도록 메시지를 보내줍니다.

 

역할을 한 번에 많이 신청해서 처리하는 데 3초 이상 걸리면 respond 함수만 사용했을 때 사용자에게 오류 메시지가 전송될 수 있습니다. 이를 방지하기 위해, defer 함수를 사용하여 응답이 지연될 수 있음을 미리 알려주는 것이 좋습니다.

@bot.slash_command(name='시간', description="자신의 역할에 여러 시간을 추가합니다. 00부터 23까지 띄어쓰기로 구분해서 작성해주세요.")
async def 시간(ctx, 시간들 : str):
    await ctx.defer()  # 응답을 지연시킴

    시간들_set = set(시간들.split(" "))
    
    guild = ctx.guild
    member = ctx.author
    roles_to_add = []

    for 시간 in 시간들_set:
        if 시간.isdigit() and 0 <= int(시간) <= 23:
            role_name = 시간.zfill(2)  # '00', '01', ..., '23' 형식으로 맞춤
            role = discord.utils.get(guild.roles, name=role_name)
            if role is not None:
                roles_to_add.append(role)
            else:
                await ctx.respond(f"역할 '{role_name}'이(가) 존재하지 않습니다.")
        else:
            await ctx.respond(f"잘못된 입력: '{시간}'. 올바른 범위는 00부터 23까지입니다.")

    if roles_to_add:
        roles_to_add.sort(key=lambda role: role.name) # 역할.이름을 기준으로 정렬
        added_roles = ", ".join([role.name for role in roles_to_add]) # 정렬된 역할 이름 삽입
        await member.add_roles(*roles_to_add) # 사용자에게 역할 추가
        await ctx.followup.send(f"{member.name}님에게 '{added_roles}' 역할이 추가되었습니다.")
    else:
        await ctx.followup.send("추가할 역할이 없습니다.")

 

3. 역할 부여 테스트

이제 코드를 실행하여 명령어가 제대로 동작하는지 확인합니다. '/시간' 명령어를 사용하여 역할을 부여할 시간을 입력하면, 봇이 해당 역할을 자동으로 추가해줍니다. 만약 입력한 시간에 해당하는 역할이 서버에 존재하지 않거나, 올바르지 않은 형식의 시간이 입력되었다면, 봇이 이를 인식하고 오류 메시지를 출력합니다.

 

명령어 입력
형식에 어긋나는 텍스트에 대해 오류 메시지를 보내줍니다

 

추가된 모습

 

4. 향후 계획

이 과정에서는 봇을 통해 역할을 부여하는 기능을 구현했습니다. 다음 단계로는 사용자가 등록한 시간에 맞춰 알림을 보내는 기능을 추가할 계획입니다. 사용자가 선택한 시간에 맞춰 봇이 자동으로 메시지를 보내도록 하여, 사용자가 특정 시간에 중요한 알림을 받을 수 있게 만드는 기능입니다.

 

 

목차 -

 

디스코드 봇 만들기 #0
https://wafla.tistory.com/12
디스코드 봇 만들기 #1
https://wafla.tistory.com/13
디스코드 봇 만들기 #2
https://wafla.tistory.com/15
디스코드 봇 만들기 #3
https://wafla.tistory.com/16

디스코드 봇 만들기 #4

https://wafla.tistory.com/17