ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [뉴스검색봇] 7. 왜 안되지? 왜 되지?!
    DEVELOP/discord-bot 2022. 5. 17. 20:45

    나름 순조롭게 기능을 구현하고 있던 중에 에러는 조용히 찾아왔고,

    여느 때와 마찬가지로 해결하는데 그리 오래 걸리지 않을 것이라 생각했으나,

    그게 무려 10일 가까이 나를 괴롭힐 것이라곤 상상하지 못했다...

     

    에러의 내용은 다음과 같다.

    내 봇은 처음 명령어를 실행하면 메뉴와 버튼이 나타나고, 검색이 종료되기 전까지 클릭하는 대로 계속 메시지의 내용이 수정된다.

     

    처음 명령어를 실행하면 아주 정상적으로 작동했다. 그래서 외형 다듬고 서버에 올릴 생각 하고 있었다.

    그러나 문제는 그 후부터 발생했다.

     

    명령어를 두번째 실행 후 버튼이나 메뉴를 클릭하면 첫번째 실행했던 명령어에 영향을 받아 봇이 다운되고 작동하지 않았다.

     

    이렇게 첫 번째엔 '새우'를 검색하고 두 번째에 '커피'를 입력 후 버튼을 누르면,

     

    두번 째 명령어가 '새우'로 바뀌고 콘솔창엔 에러가 주르륵 뜨면서 봇이 다운됐다.

     

    "interaction has already been acknowledged."

    대충 상호작용이 이미 수행돼서 못하겠단 뜻이다.

    망할 오류는 구글에 열심히 검색해봐도 원하는 답변도 안나왔다.

     

    물어본 사람도 적었지만, 저 오류가 나는 상황이 모두 달라서 내 봇한테는 해결책으로 작용하지 않았다.

     

    로그를 살펴보면 데이터를 가져오고 출력하는 것엔 문제가 없다.

    이 에러는 메시지를 수정하는 과정에서 발생했다.

     

    너무 치명적인 오류였기 때문에 이걸 해결하지 않고서는 진행을 할 수 없었다. 딱 한번만 완벽하게 작동하는 봇이라니 말도 안된다. 온갖 방법을 다 시도해본듯하다.

     

    1. 메시지를 수정하는 과정에서 오류가 나니 기존 메시지를 수정하는 방식 말고 새로운 메시지를 보내도록 수정
    2. 봇이 죽어버리는걸 일단 방지하기 위해 try-catch 블록으로 감싸주기
    3. 종료버튼을 만들어서 검색창을 종료 후 시작하도록 하기
    4. collector.on 부분을 collector.once로 수정
    5. 메시지 send 형식을 reply-editReply / channel.send / deferReply-deferUpdate 등등 모든 조합으로 시도
    6. 나만보이게 하기 옵션을 설정하면 혹시 되지 않을까 하는 마음에 ephemeral 설정. 당연히 될 리가 없다.

    등등

     

    이 시도들은 모두 실패했다.

    1, 5, 6번은 동일한 오류를 발생시켰고,

    2번은 봇이 강제종료되는 것만 막아줄 뿐이었다.

    3번은 종료버튼을 누른다면야 제대로 동작하긴 하지만, 사용자 입장에서 이를 지킬 리가 없다. "다음 검색을 하려면 꼭 종료하고 실행해주세요"같이 구구절절 설명해야하는 것도 굉장히 별로고, 만약 안지키고 실행했을 경우 저렇게 검색창이 이상하게 나타나는 것을 그대로 보여줘야 한다.

    4번은 아예 상호작용 수집을 딱 한번만 하고 종료되는 옵션인데, 내 봇은 지속적으로 메시지를 수정해야 하기 때문에 안될 것이라는걸 예상했다. 오류는 안나지만 원하는 결과가 아니다.

     


    뭘 해도 해결이 안돼서 한동안은 건드리지도 않았다.

    그러다가 어느날 다시 해봐야겠다 생각하고 코드를 처음부터 살펴봤다.

    latest.js

    이 부분이 이상하게 보였다.

    해당 코드는 처음 메시지를 보내면, components에 대한 상호작용을 밑부분 collector에서 수집하는 코드이다.

    그렇다면 해당 메시지에 대한 상호작용만 수집하면 되는거 아닌가? interaction.channel을 쓰는 이유가 뭐지?라는 생각이 들었다.

     

    처음에 가이드대로 코드를 작성해서 눈에 안들어온 부분이었다.

     

    latest.js

    상수를 하나 만들어서 메시지를 담고, 해당 메시지에 대한 수집을 하도록 코드를 수정해봤다.

     

    결과는 성공이었다!!

     

    각각의 메시지가 제대로 작동했고, 몇 번을 실행하든 정상적으로 출력되었다.

    그리고 다른 사용자가 내 검색창을 맘대로 변경하면 안되니 필터에 유저아이디를 거르는 조건도 추가했다.

     

    막상 해결하고 나니 방법이 너무 간단해서 허무했다. 이거 때문에.....1주일을?😑

    그래도 누구의 도움도 받지 않고 해결했기 때문에 뿌듯하긴 하다.

     

    디스코드 동작 방식에 대한 이해가 더 있었으면 빨리 찾지 않았을까하는 생각도 들지만, 원래 봇 개발하던 사람 아니고서야 이거에 익숙한 사람은...없지 않을까?

     

    아무튼 이제 남은건 자잘한 수정과 서버에 호스팅하는 것이다.

    서버 호스팅도 큰 관문이긴 한데....뭐 일주일보단 덜 걸리지 않을까.....

    이상한 깨달음도 함께 얻은 듯 하다.

    댓글

Designed by Tistory.