220815 공통 프로젝트 개발일지

·2022년 8월 23일
0

개발일지 & 회고

목록 보기
18/72
post-thumbnail

타이머 이벤트 추가 : 시간 연장

HelloWorld 프로젝트에서는 vip 유저가 존재한다. 일반 유저와 다르게 vip 유저의 경우 다양한 기능을 사용하는 것이 가능한데, 그 가운데 하나가 시간 연장 기능이다.

로직 추가 : 시간연장
1. 생성자가 vip로써 시간 연장을 하는 경우 : 생성자 시간이 기준이므로 본인이 가진 시간을 연장시키면 자연스럽게 입장자의 시간도 연장된다.
2. 입장자가 vip로써 시간 연장을 하는 경우 : openvidu signal 이벤트를 활용하여 생성자의 시간을 연장한다.
const restoreTimeHandler = () => {
    if (room.isCreatedRoom) {
      if (user.subscribe) {
        setMinutes(5)
        setSeconds(0)
      } else if (user.heart >= 5) {
        const heartData = {
          cnt: -5,
          fromUser: user.id,
          name: 'extention',
          route: 'extention',
          toUser: 1,
        }
        dispatch(heartEvent({ accessToken: auth.token, heartData }))
        dispatch(getMyHeart(auth.token))
        setMinutes(5)
        setSeconds(0)
      }
    } else {
      if (user.subscribe) {
        openvidu.publisher.session.signal({
          type: 'restore',
        })
      } else if (user.heart >= 5) {
        const heartData = {
          cnt: -5,
          fromUser: user.id,
          name: 'extention',
          route: 'extention',
          toUser: 1,
        }
        dispatch(heartEvent({ accessToken: auth.token, heartData }))
        dispatch(getMyHeart(auth.token))
        openvidu.publisher.session.signal({
          type: 'restore',
        })
      }
    }
  }

예상 이슈 제어 : 비정상적 접근 제어하기

유저 가운데, 어떠한 경로로 roomID를 획득하여 세션에 접근하려는 시도가 있을 수 있다. 랜덤 매칭 이벤트를 통해 정상적으로 접근하는 것이 아니라면 대부분이, openvidu 인스턴스가 생성되지 않은 체 접근을 할 테고, 따라서 미팅 페이지 접근 시, openvidu 인스턴스를 확인하여, 해당 값이 존재하지 않는다면, 이를 비정상적 접근으로 판단한다.

해당 조건에 만족하는 경우, 미팅 페이지로 강제 리다이렉트 되도록 설정하였다.

 useEffect(() => {
    if (room.isCreatedRoom) {
      openvidu.session.on('signal:restore', () => {
        setMinutes(5)
        setSeconds(0)
      })
    }
    if (openvidu.session) {
      openvidu.session.on('signal:rematching', event => {
        const timeEvent = setTimeout(() => {
          dispatch(leaveRoom({ roomId: room.roomId }))
          dispatch(ovActions.leaveSession())
          window.location.replace('/meeting?rematching=true')
        }, 2000)
        return () => clearInterval(timeEvent)
      })
    } else {
      // 세션 없이 여기까지 오는 것은 비정상적 접근으로 판단 강제 페이지 이동
      navigate('/meeting', { replace: true })
    }
  }, [])

신규 로직 : rematching

해당 대화가 자동으로 종료되면, 자동으로 랜덤 매칭이 이루어지도록 적용했다. 다음 매칭 버튼을 눌러, 대화 중간 나가는 것도 가능하며, 행여 세션에 홀로 남게 되는 경우 역시, 특별한 종료를 하지 않는다면 5초 후 다음 매칭이 이루어지도록 했다.

// 신규 로직 : rematching
상대방이 정상적으로 현재 세션을 종료하는 경우 (나가거나, 다음 매칭을 시도하거나) 세션 남은 사람에게 자동으로 다음 매칭이 이루어진다.
- 상대방이 다음 매칭을 한 경우
  상대방 : 메인 페이지로 이동, 다음 매칭이 이루어진다.
     나 : 메인 페이지로 이동, 다음 매칭이 이루어진다.
- 상대방이 나가기를 한 경우
  상대방 : 메인 페이지로 이동, 다음 매칭x
     나 : 메인 페이지로 이동, 다음 매칭이 이루어진다.
profile
새로운 것에 관심이 많고, 프로젝트 설계 및 최적화를 좋아합니다.

0개의 댓글