사용자:Senouis/SectionRatings: 두 판 사이의 차이

리버티게임, 모두가 만들어가는 자유로운 게임
23번째 줄: 23번째 줄:
=== 백엔드 개발 공통 명세 ===
=== 백엔드 개발 공통 명세 ===
* [[mw:API:REST API/Extensions]]의 내용에 따라 REST API를 작성하여 다음과 같은 URL로 평가 요청(첫 평가는 PUT, 변경 시 POST)하도록 할 것
* [[mw:API:REST API/Extensions]]의 내용에 따라 REST API를 작성하여 다음과 같은 URL로 평가 요청(첫 평가는 PUT, 변경 시 POST)하도록 할 것
** 예: dev.libertygame.work/rest.php/sectionratings/v0/rategame/(게임 이름)/(별점)
** 예: dev.libertygame.work/rest.php/sectionratings/v0/rategame/(게임 이름)/(별점)/(평가자)/(CSRF 토큰)
** 평가 요청을 받으면 RatePage에 있는 ratepage_vote 항목에 정보를 사용해 평가 횟수 및 별점을 추가
** 이 평가 요청은 사무관만 가능함
** 반환 결과인 JSON 객체는 "Success"/"Fail" 같은 값으로 표시한 평가 성공 여부를 포함해야 함
** 반환 결과인 JSON 객체는 "Success"/"Fail" 같은 값으로 표시한 평가 성공 여부를 포함해야 함
** 잘못 데이터를 추가할 경우를 대비해 DELETE 구문으로 ratepage_vote 초기화하는 작업을 할 것
* 평가 취합은 GET 요청으로 다음 REST API 작성
* 평가 취합은 GET 요청으로 다음 REST API 작성
** 예: dev.libertygame.work/rest.php/sectionratings/v0/getgameratings/(게임 이름)
** 예: dev.libertygame.work/rest.php/sectionratings/v0/getgameratings/(게임 이름)
** 반환값은 현재 게임 순위, 평가자 수, 평점을 포함
** 반환값은 현재 게임 순위, 평가자 수, 평점을 포함
*** 현재 게임 순위는 평점이 소수점 아래 한 자리까지 동일할 경우 평가자 수가 많을 수록 작은 숫자의 순위(높은 순위)를 가짐
*** 현재 게임 순위는 평점이 소수점 아래 한 자리까지 동일할 경우 평가자 수가 많을 수록 작은 숫자의 순위(높은 순위)를 가짐
=== 프론트엔드 측 스크립트 ===
* 토론에서 평가 문단을 찾아 정보 파싱 후 REST API를 순서대로 요청
** 정규 표현식으로 index.php?action=raw 한 결과물에서 찾는 것을 권장


=== 방법 1: 자체적으로 바닥에서부터 개발 ===
=== 방법 1: 자체적으로 바닥에서부터 개발 ===

2024년 6월 28일 (금) 11:38 판

게임별 토론 문서의 게임 평가용 문단 내용을 바탕으로 SQL 쿼리를 사용해 이 게임의 평점이 리버티게임 전체에서 상위 몇 퍼센트인지 알려주는 SectionRatings(가칭)의 설계에 관한 문서입니다.

요구 사항

== h-게임 평가하기-(id) ==
h-(사용자1)-(id)
=== h-(문단)-게임 평가하기-(id) ===
c-(사용자2)-(id)-게임 평가하기
c-(사용자2)-(id)
:c-(사용자3)-(id)-(사용자2)-(id)
:c-(사용자3)-(id)
  • 현재 틀:평론은 백괴게임 시절과 문단 제목이 다른 부분(이 게임 평가하기, 평가, 게임 평가하기 등등)도 있고, 토론 문서가 없는 게임들이 아직 있어 요구 사항처럼 대량 편집을 넣기 쉽지 않은 부분이 있음
    • 다만 5단계의 하위 평가 문단은 문단 제목 문구가 전부 같은 것으로 추정되므로, 이에 따라 키워드를 뽑아 파싱하는 것은 가능 -> action=raw&section=1로 API 호출 or REST API 사용
      • REST API로 대문 정보 가져오기: 이곳의 대문 가져오는 예시 -> "source" 키에 페이지 내용 있음
      • '== 평가 =='나 '== 이 게임 평가하기 =='를 '== 게임 평가하기 =='로 먼저 대량 편집으로 통일
    • 코멘트 편집의 경우 서명을 안 넣은 평가들이 가끔 발견되어, 정확히 파싱하기 어려움, 평론 틀을 사용하지 않고 토론 양식을 만든 게임도 고려해야 함(RPG in City, 투표 게임의 사례)
  • 클라이언트 측에서 토론 문서를 보았을 때 평론 틀이 풀기 처리된 토론 문서의 HTML element 계층 구조는 같은 level을 가지고 있어 클라이언트 측 파싱은 매우 복잡하거나 불가능할 가능성이 큼(h2, h3, ol 태그가 전부 같은 부모를 가짐)
  • 자체 개발이 좋으나 PHP 확장 기능 개발의 어려움으로 인해 실패할 가능성이 크므로 두 가지 방법을 고려새삼 조사 확장 기능을 개발한 *devunt님이 대단해지는 순간

백엔드 개발 공통 명세

  • mw:API:REST API/Extensions의 내용에 따라 REST API를 작성하여 다음과 같은 URL로 평가 요청(첫 평가는 PUT, 변경 시 POST)하도록 할 것
    • 예: dev.libertygame.work/rest.php/sectionratings/v0/rategame/(게임 이름)/(별점)/(평가자)/(CSRF 토큰)
    • 평가 요청을 받으면 RatePage에 있는 ratepage_vote 항목에 정보를 사용해 평가 횟수 및 별점을 추가
    • 이 평가 요청은 사무관만 가능함
    • 반환 결과인 JSON 객체는 "Success"/"Fail" 같은 값으로 표시한 평가 성공 여부를 포함해야 함
    • 잘못 데이터를 추가할 경우를 대비해 DELETE 구문으로 ratepage_vote 초기화하는 작업을 할 것
  • 평가 취합은 GET 요청으로 다음 REST API 작성
    • 예: dev.libertygame.work/rest.php/sectionratings/v0/getgameratings/(게임 이름)
    • 반환값은 현재 게임 순위, 평가자 수, 평점을 포함
      • 현재 게임 순위는 평점이 소수점 아래 한 자리까지 동일할 경우 평가자 수가 많을 수록 작은 숫자의 순위(높은 순위)를 가짐

프론트엔드 측 스크립트

  • 토론에서 평가 문단을 찾아 정보 파싱 후 REST API를 순서대로 요청
    • 정규 표현식으로 index.php?action=raw 한 결과물에서 찾는 것을 권장

방법 1: 자체적으로 바닥에서부터 개발

  • 자체적으로 SQL 파일을 만들어 libertygame.sectionratings 데이터베이스 테이블을 생성
  • 서버에서 php update.php를 돌리면 SQL 파일의 내용대로 쿼리 전송
  • 문제점1: 중복 투표를 어떻게 걸러낼 것인가? -> 미리 결과값을 보내고, 서버 단에서 쿼리로 이미 값이 있는지
  • 문제점2: Widget을 어떻게 설계할 것인가?
  • 다음 sectionratings 테이블을 libertygame 데이터베이스에 추가: primary 키 지정 필요 없음(모든 게임이 공통적으로 이 테이블을 사용 예정이라 값이 고유할 필요 없음)
CREATE TABLE IF NOT EXISTS sectionratings(
    'sr_date' date NOT NULL,
    'sr_gamename' varchar(63) NOT NULL,
    'sr_user' varbinary(255) NOT NULL,
    'sr_ip' varbinary(255) DEFAULT NULL,
    'sr_rate' int NOT NULL
);

방법 2: RatePage 확장 기능에 의존(권장)

리버티책에서 사용 중인 RatePage 확장 기능을 사용하는 방법이 존재: MultimediaViewer -> RatePage -> SectionRatings(가칭) 순으로 의존성 발생

  • extension.json의 "requires"에 ["extensions"]["RatePage"]의 값을 추가할 것
  • 다만 이럴 경우 기본적으로 기존 평가를 반영하지 못함
    • 이 RatePage에 기존 평가 문단을 파싱하여 ratepage_vote 데이터베이스 테이블 편집으로 점수를 초기화하는 업데이트 스크립트 파일(단일 php 파일)를 추가하는 방법도 가능(SectionRatings 확장 기능의 maintenance 폴더를 만들어 거기 넣을 것)
    • 기존 평가는 자세한 평론을 위해 위해 그대로 두고, SectionRatings는 RatePage가 만드는 데이터베이스 테이블인 ratepage_contest -> (특정한 "rpc_id")의 값을 사용해 ratepage_vote의 행을 선택하고 정렬하여 상위 k개의 값을 배열로 반환하여 특정 미디어위키 태그에 붙이는 작업을 수행
    • 해결해야 하는 문제: 유저와 IP를 동시에 ratepage_vote 데이터베이스 테이블에 기록해야 하는데, 이전 유저의 투표를 파싱해 수동 추가할 때 IP는 0.0.0.0으로 해도 먹힐 것 같지만, 익명 유저의 투표를 어떻게 웹 페이지에서 파싱해 걸러낼 것인가?
      • 그냥 'anonUserN'(마지막 N은 임의의 숫자)로 계정 이름을 정할 수 있긴 함
      • 정규표현식 사용 대량 편집 시 다음 구문을 찾아야 IP 주소 투표를 찾을 수 있지만, 아예 서명을 안 한 평가도 존재하여 정규 표현식 파싱은 사용하는 것을 권장하지 않음, 그냥 번호를 포함하는 1단계 들여쓰기 된 평가 갯수만 문단 별로 구하면 될 것임.
        • /#([\s0-9A-Za-zㄱ-ㅎ가-핳])+([0-9]){1,3}\.([0-9]){1,3}\.([0-9]){1,3}\.([0-9]){1,3}/
      • 아니면 따로 평가 문단만 게임 토론 페이지 별로 action=raw 쿼리를 보내 긁어와 텍스트 파일로 받는 자바스크립트 코드를 만들 수도 있음(테스트 서버에서 먼저 시행)

참고 자료