storycraft / node-kakao

Loco protocol compatible library
MIT License
409 stars 115 forks source link

채팅방에서 내보내진 후 다시 참가 시 userInfo가 undefined #250

Closed cjh980402 closed 3 years ago

cjh980402 commented 3 years ago

Describe the bug "채팅방에 새로 참여한 유저(들)의 userInfo가 제대로 추가되지 않는 버그" 완전히 수정됐나요? 4.1.3 인데 2명있는 채팅방에서 내보내기 후 다시 참가하면 userInfo가 undefined가 뜹니다.

To Reproduce Steps to reproduce the behavior. Ex)

  1. 봇을 내보냄
  2. 내보내기 해제
  3. 봇이 다시 참가
  4. 이 때부터 봇의 userInfo가 undefined

Expected behavior 봇의 userInfo가 나와야함

storycraft commented 3 years ago

해당 버그가 1대1 채팅방 에서만 발생하나요?

cjh980402 commented 3 years ago

일단 제가 있던 채팅방은 그룹 오픈 채팅방(봇 제외 인원 1명, 봇 포함 2명)이었습니다.

ha1fstack commented 3 years ago

client ..talkChannelList ....talkNormalChannelList ......talkNormalChannel ........talkChannelHandler << userLeft ........talkNormalChannelHandler << userJoin ......talkChannelListHandler ....talkOpenChannelList ......talkOpenChannel ........talkChannelHandler << userLeft ........talkOpenChannelHandler ......talkChannelListHandler ......talkOpenChannelListHandler ......talkOpenLinkHandler

userLeft 푸시는 talkChannelList, talkChannelHandler 에 모두 전달되어서 정상적으로 처리되는데 userJoin 푸시는 talkNormalChannelHandler 에만 전달되어서 openChannel의 경우 아예 푸시를 처리하지 않습니다

talkOpenChannelHandler 에도 똑같이 푸시 처리를 해주니 정상적으로 동작하네요

storycraft commented 3 years ago

client ..talkChannelList ....talkNormalChannelList ......talkNormalChannel ........talkChannelHandler << userLeft ........talkNormalChannelHandler << userJoin ......talkChannelListHandler ....talkOpenChannelList ......talkOpenChannel ........talkChannelHandler << userLeft ........talkOpenChannelHandler ......talkChannelListHandler ......talkOpenChannelListHandler ......talkOpenLinkHandler

userLeft 푸시는 talkChannelList, talkChannelHandler 에 모두 전달되어서 정상적으로 처리되는데 userJoin 푸시는 talkNormalChannelHandler 에만 전달되어서 openChannel의 경우 아예 푸시를 처리하지 않습니다

talkOpenChannelHandler 에도 똑같이 푸시 처리를 해주니 정상적으로 동작하네요

https://github.com/storycraft/node-kakao/commit/f36df9f92904758c444e8bc48f5f654d328ace67

해당 버그는 4.1.3 업데이트에서 픽스한 것으로 알고 있습니다. 여전히 오픈채팅방에서 user_join이벤트가 동작하지 않나요?

ha1fstack commented 3 years ago

최신 릴리즈(4.1) 를 사용중이라 4.1.3 버전에서는 해결된거 같습니다

ha1fstack commented 3 years ago

4.1.3 버전을 사용중인데 입장 관련 문제는 해결되었지만 아직도 data.getSenderInfo 가 undefined를 리턴하는 경우가 있습니다

정확한 조건은 모르겠지만 몆백명 이상인 대형 방에서 문제가 생기는 것 같은데 getSenderInfo가 store map 에서 해당 유저를 찾는데 실패했을 경우 자동으로 getLatestUserInfo 로 갱신해야되지 않나 싶습니다

또 의도한 부분이 아닌것 같은 코드를 발견했는데

  async getLatestUserInfo(...users: ChannelUser[]): AsyncCommandResult<OpenChannelUserInfo[]> {
    const infoRes = await this._channelSession.getLatestUserInfo(...users);

    if (infoRes.success) {
      const result = infoRes.result as OpenChannelUserInfo[];

      this._store.clearUserList();
      result.forEach((info) => this._store.updateUserInfo(info, info));
    }

    return infoRes;
  }
this._store.clearUserList();

요청한 유저 정보만을 갱신해야 되는데 맵 전체를 날려버리는거 같은데 버그가 맞나요?

storycraft commented 3 years ago

해당부분은 의도하지 않은 코드로 확인됩니다. 유저 참가시 해당 메서드를 통해 유저 정보를 가져오게 되는데 몇몇 유저정보가 소실되는 것으로 보입니다.

storycraft commented 3 years ago

944c154f168d9722a8c89eac5a2ef403c8615c66 서 픽스