ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TypeError: Cannot read properties of undefined (reading '_add')
    아리스봇/삽질로그 2022. 5. 28. 13:35

    ※ 맨 밑에 세 줄 요약 있음.

     

    TypeError: Cannot read properties of undefined (reading '_add')
        at InteractionWebhook.fetchMessage (/home/dunamis/arisbot/node_modules/discord.js/src/structures/Webhook.js:305:70)
        at runMicrotasks (<anonymous>)
        at processTicksAndRejections (node:internal/process/task_queues:96:5)
        at async Object.execute (/home/dunamis/arisbot/src/commands/slash/blackjack.js:352:9)
        at async Client.<anonymous> (/home/dunamis/arisbot/index.js:29:9)

    최근 봇을 작살낸 에러입니다.

    최근 딱히 건드린 게 없는데 에러가 떠 있어서 디스코드 기능 추가로 문제가 발생한 건가 싶기는 했는데, 금요일에 좀 바빠서 예외 처리를 못 했더니 봇을 재부팅 시킬 때마다 어딘가에서 해당 에러로 봇을 자꾸 죽였습니다. 거의 금요일 하루 동안 봇이 죽어있었던 점은 이 자리를 빌려 사과드립니다.

    잠시 삼천포로 빠지자면 한 서버에서 그런 건 아닌 것 같고, 디스코드에서 새 기능을 추가해서 그런지 사용하시는 분들이 여기저기 계신 것 같았습니다. 디스코드에서 딱히 공지도 안 한 베타 기능을 어떻게 찾아서 다들 사용하는 건지는 조금 신기하네요.

    아무튼 본론으로 돌아가서, 관련해서 찾아보니 원인을 알 수 있었는데, 최근 디스코드 커뮤니티 서버에 아래와 같이 음성 채팅 내의 채팅 기능이 추가되었고, 이 기능이 문제를 일으키고 있었습니다.

    음성 채팅 내의 채팅 채널.. 이라고 부르자니 직관성도 떨어지고 적기도 귀찮으니까 이하 '음성채팅채팅'이라고 부르겠습니다.

    음성채팅채팅은 이런 식으로 표시된다.
    음성채팅채팅은 스레드와 같은 형식으로 표시된다. 이모지는 외부 이모지 권한을 해당 채널에 할당하지 않았기 때문에 :ar8:과 같이 깨져서 나온다.

    문제는 이 음성채팅채팅에 대한 프로퍼티가 현재 제대로 할당되어 있지 않다는 점입니다.

    단적인 예로 맨 위의 에러 로그를 보면 프로퍼티가 undefined되어 타입에러가 발생하는 것을 볼 수 있습니다.

    TypeError: interaction.channel.createMessageComponentCollector is not a function

    메시지 콜렉터도 할당되어 있지 않기에 반응 수집기를 사용할 수 없으며,[각주:1][각주:2]

    TypeError: Cannot read properties of undefined (reading 'fetch')

    fetch도 할당되지 않아 bulkDelete 기능을 사용할 수가 없습니다.[각주:3]

    bulkDelete 대신 단순 삭제 기능을 응용하려고 해도 messages.foreach(m => fetch(m.id).delete()); 와 같이 fetch를 사용해야 하므로 현재 음성채팅채팅에서 메시지 일괄 삭제 기능을 사용하기에는 무리가 있지 않나 싶습니다.

    게다가 더 골 때리는 점은 channel.type로 음성채팅채팅의 타입을 보니 GUILD_VOICE로 나온다는 점입니다.[각주:4] 노래 봇을 운영하시는 분들은 아마 타입 문제로 인해 장기적으로 애로사항을 겪게 되지 않을까 싶습니다.

    아무튼 일단은 interaction.channel.type !== 'GUILD_TEXT' 면 return을 주는 식으로 대응하는 게 맞는 것 같습니다.

    아리스 봇은 우선 위와 같이 예외 처리하기로 했습니다.

    예외 처리 대상은 블랙잭, 발할라와 같은 메시지 기반 명령어와 메시지 일괄 삭제 명령어입니다.

    + 쓸데없는 이야기인데, 음성채팅채팅에서는 메시지를 특정 이용자에게만 보여주는 ephemeral 옵션도 지원하지 않는 것 같음.

     

    세 줄 요약

    1. 음성 채팅 내의 채팅 기능이 추가됨.

    2. 문제는 이 기능이 기존 채팅 채널에서 사용되던 프로퍼티를 제대로 지원하지 않음.

    3. 아리스 봇은 우선 해당 신규 채팅 채널에서 일부 명령어 사용을 지원하지 않는 식으로 대응함.


    1. 단순 메시지 수집기, 버튼 수집기 둘 다 [본문으로]
    2. 예를 들어 아리스봇의 /블랙잭, /발할라, /가위바위보 기능 [본문으로]
    3. 예를 들어 아리스봇의 /삭제 기능 [본문으로]
    4. 기존 서버 내의 일반 채팅은 GUILD_TEXT [본문으로]

    '아리스봇 > 삽질로그' 카테고리의 다른 글

    봇 인증 진행 중  (0) 2022.08.06
    예정  (0) 2022.07.08
    0430 삽질로그  (0) 2022.04.30
    for / indexOf  (0) 2022.04.29
    twit 에러 핸들링  (0) 2022.04.13

    댓글

Designed by Dunamis

Contact : admin@duna.me

업무용 연락처 : 010-9069-1045 (카카오톡)