> For the complete documentation index, see [llms.txt](https://simian114.gitbook.io/blog/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://simian114.gitbook.io/blog/42seoul-1/ft_transcendence/undefined/5..md).

# 5. 채널 설계

## channel

라이브, 채팅룸 리스트, 랭킹, 토너먼트 페이지는 실시간이 아닌 페이지 새로고침을 따로 만들어서 동기화를 하자.

* 패시브 - 항상 구독중
* 액티브 - 이벤트에 따라 구독, 취소

### notification - 패시브

* 다이렉트 메시지가 온 것을 수신하여 appearance가 업데이트되도록 한다.
* 상대가 대전 신청을 받지 않거나 거절한 것을 수신하여 하단 게임 신청 뷰를 제거하도록 한다.
* 상대가 대전 신청을 받은 것을 수신하여 게임뷰로 이동하도록 한다.

### appearance - 패시브

* 친구목록과 친구들의 로그인 상황을 표시하고 추적한다.
* 온라인 접속 중인 유저들의 목록을 표시하고 추적한다.

### directChat - 액티브

* directMessage가 켜지면 구독한다.
* message를 수신하면 업데이트한다.
* message 입력시 웹소켓으로 발송한다.
* directMessage가 꺼지면 구독을 해제한다.

### groupChat - 액티브

* groupChatRoom에 입장하면 구독한다.
* message를 수신하면 업데이트한다.
* message 입력시 웹소켓으로 발송한다.
* groupChatRoom에서 다른 페이지로 이동하거나, 나갈 때 구독을 해제한다.
* ban 당했음을 통보 받으면 구독을 해제하고 채팅 리스트로 이동한다.
* 승급/강등 사실을 통보받으면 자신의 멤버십 상태(front)를 업데이트한다.

### game - 액티브

* 게임이 진행중인 동안 플레이어와 게스트가 구독한다.
* 게임이 시작되면 시작 알림을 받는다. 시작 알림에는 사용할 룰, 양쪽 플레이어의 정보와 사이드(L/R)가 포함되어 있다.
* me의 패들과 공이 충돌할 때 서버에 변화된 공의 성질이 담긴 메시지를 웹소켓으로 발송한다.
* me의 패들을 움직일 때마다 패들의 위치가 담긴 메시지를 웹소켓으로 발송한다.
* 실점시마다 웹소켓으로 메시지를 발송한다.
* 서버에서 전송되어오는 메시지에 담긴 패들, 공, 점수의 정보를 프론트 모델에 업데이트한다.
* 중계를 보고 있는 게스트들은 메시지로 수신되는 패들과 공의 정보를 지속적으로 갱신하며, 패들에 부딪히기 전까지의 공 변화만 엔진으로 돌린다.
* 상대 플레이어가 게임중에 나갔음을 me가 수신하면 현재 게임 상황을 서버에 API로 보고한 후 구독을 해제, 이전 페이지로 돌아간다.
* 게임이 정상적으로 종료되었다면 승리한 유저가 게임 상황을 API로 보고한다.
* 한쪽 플레이어가 게임중에 나가거나 정상적으로 게임이 종료되었음을 수신하면, 승자가 보고한 최종 종료 상태를 뷰에 업데이트한 후 구독을 해제, 이전 페이지로 돌아간다.

### War - 액티브

* *War가 progress 상태인 동안 양 진영 길드원 모두가 같은 `room`을 구독한다.*
* Status
  * 게임이 끝날 때 마다 `war point` 가 갱신된다.
  * 우리 길드가 `war match`를 미응답하면 미응답 수를 업데이트한다.
* Battle
  * `war time` 이 아님
    * 대충 아무거나 뜬다.
  * `war time` 인데 대전신청이 이뤄지지 않고 있음
    * `대전 하기` 버튼이 뜬다.
  * `war time` 인데 상대방 길드가 대전신청함
    * `대전 수락` 버튼로 업데이트 된다.
    * 수락 가능 시간이 얼마나 남았는지 표시된다.
  * `war time` 인데 우리 길드원이 대전 신청함 (아직 상대 길드가 받아들이지 않음)
    * `우리 길드의 누군가가 전투를 준비하고 있습니다` 가 뜬다.
  * `war time` 이고 대전중임
    * `중계 참여` 버튼이 뜬다.
  * 상태가 변경됨을 수신하면 그에 맞게 뷰를 업데이트한다.
* 대전 기록
  * 게임이 끝날 때마다 `대전기록`이 갱신된다.
* 전쟁 종료시
  * 페이지를 보고 있는 상태에서 전쟁 종료를 수신할 경우 그에 맞게 뷰를 업데이트하고 구독을 해제한다.

###

###
