디스코드 봇 - 커맨드 파라미터에 문장 전달하려면? (feat 파이썬)

     

    디스코드 봇 커맨드 파라미터에 공백문자가 포함된 단어/ 문장을 전달하려면?

    디스코드 봇 커맨드에 파라미터를 전달할 때 커맨드가 파라미터를 받지 않는 경우도 있지만, 사용자로부터 파라미터를 받아야 하는 경우도 있다.

    게다가 파라미터에 공백 문자가 들어간 경우 혹은 문장 전체가 파라미터로 쓰이는 경우도 있다.

    만약, 별다른 조치를 하지 않는다면, 입력값이 의도한 대로 전달되지 않는 것을 확인할 수 있다.

    본 포스트에서는 이러한 현상을 확인하고, 어떻게 개선할 수 있는지에 대해 정리해 본다.


     



     

    테스트 코드

    @bot.command()
    async def echo(ctx, parameter):
      await ctx.reply(f'echo {parameter}')

    위와 같이 명령어를 작성했다고 하자.

    이 명령어는 커맨드 뒤에 사용자로부터 임의의 파라미터를 받아서, 그대로 다시 응답하는 단순한 커맨드이다.

     

    기본 현상

    그러면, 이 명령어를 파라미터로 한글 띄어쓰기 테스트라고 전달해 보자.

    디스코드 봇 커맨드

    한글 띄어쓰기 테스트 라고 파라미터를 전달했는데, 봇에서 받아들인 문자는 앞의 첫 단어에 해당하는 '한글'만 파라미터로 인식되었다.

     

    원인

    왜 이런 현상이 발생할까?

    커맨드라인에서 파라미터를 받아 들이면 기본적으로 띄어쓰기를 구분자로 사용하여, 여러 개의 파라미터로 해석한다.

    따라서, 한글/띄어쓰기/테스트가 각각의 파라미터로 인식이 된다.

    반응형

     

    별도의 변경 없이 사용하려면?

    가장 손쉬운 해결책은 쌍따옴표를 사용하는 것이다.

    공백 문자가 포함된 문자열이 하나의 문장으로 인식되게 하려면 쌍따옴표로 감싸주면 된다.

    디스코드 봇 커맨드 파라미터

     

    코드에서 지원하도록 변경하려면?

    그런데, 커맨드 파라미터를 매번 따옴표로 감싸주는 것도 불편하다.

    따라서, 파라미터 문장을 있는 그대로 받아들이고, 코드 상에서 처리를 해주는 방안을 적용해 보자.

    @bot.command()
    async def echo2(ctx, *args):
      parameter = ' '.join(args)
      await ctx.reply(f'echo {parameter}')

    위와 같이 새로 echo2라는 명령어를 만들고, 테스트 해보자.

    디스코드 봇 커맨드 파라미터

    위의 결과에서 보는 것처럼, 파라미터에 별도 쌍따옴표를 씌우지 않아도 문자열을 모두 전달해줬다.

    그리고, 유실되는 단어가 없이 문장 전체가 디스코드 봇 커맨드 파라미터로 사용되었다.

    댓글

    Designed by JB FACTORY