사이퍼즈 타입
사이퍼즈 API에서 사용하는 TypeScript 타입 정의 및 인터페이스
사이퍼즈 타입 정의
사이퍼즈 API에서 사용하는 TypeScript 타입 정의와 인터페이스에 대한 상세한 설명입니다.
플레이어 타입
CyphersPlayerBasic
플레이어 검색 결과의 기본 정보 타입입니다.
interface CyphersPlayerBasic {
playerId: string;
nickname: string;
grade: number;
clanName?: string;
represent?: CyphersCharacterInfo;
}
- playerId (string): 플레이어 고유 식별자
- nickname (string): 플레이어 닉네임
- grade (number): 플레이어 등급
- clanName (string, 선택사항): 소속 클랜 이름
- represent (CyphersCharacterInfo, 선택사항): 대표 캐릭터 정보
CyphersPlayerDetail
상세 플레이어 정보 타입입니다.
interface CyphersPlayerDetail {
playerId: string;
nickname: string;
grade: number;
clanName?: string;
ratingPoint: number;
maxRatingPoint: number;
tierName: string;
records: CyphersPlayerRecord[];
}
- ratingPoint (number): 현재 레이팅 점수
- maxRatingPoint (number): 최고 레이팅 점수
- tierName (string): 티어명
- records (CyphersPlayerRecord[]): 게임 모드별 기록
CyphersPlayerRecord
플레이어 게임 기록 타입입니다.
interface CyphersPlayerRecord {
gameTypeId: string;
winCount: number;
loseCount: number;
stopCount: number;
}
- gameTypeId (string): 게임 타입 식별자
- winCount (number): 승리 횟수
- loseCount (number): 패배 횟수
- stopCount (number): 정지 횟수
랭킹 타입
CyphersPlayerRanking
플레이어 랭킹 정보 타입입니다.
interface CyphersPlayerRanking {
playerId: string;
nickname: string;
ratingPoint: number;
rank: number;
tierName: string;
records: CyphersRankingRecord[];
}
- rank (number): 순위
- records (CyphersRankingRecord[]): 랭킹 기록 상세 정보
CyphersRankingRecord
랭킹 기록 상세 정보 타입입니다.
interface CyphersRankingRecord {
gameTypeId: string;
rank: number;
ratingPoint: number;
playCount: number;
winCount: number;
loseCount: number;
stopCount: number;
}
- playCount (number): 총 게임 수
- rank (number): 해당 게임 타입에서의 순위
- ratingPoint (number): 해당 게임 타입에서의 레이팅
CyphersRanking
전체 랭킹 정보 타입입니다.
interface CyphersRanking {
playerId: string;
nickname: string;
ratingPoint: number;
rank: number;
tierName: string;
grade: number;
playCount: number;
winCount: number;
loseCount: number;
stopCount: number;
}
경기 타입
CyphersMatch
경기 정보 타입입니다.
interface CyphersMatch {
matchId: string;
gameTypeId: string;
gameResult: string;
playTime: string;
playTimeSeconds: number;
teams: CyphersTeam[];
players: CyphersMatchPlayer[];
}
- matchId (string): 경기 고유 식별자
- gameTypeId (string): 게임 타입 식별자
- gameResult (string): 경기 결과
- playTime (string): 경기 시간 (문자열 형태)
- playTimeSeconds (number): 경기 시간 (초 단위)
- teams (CyphersTeam[]): 팀 정보 배열
- players (CyphersMatchPlayer[]): 플레이어 정보 배열
CyphersTeam
팀 정보 타입입니다.
interface CyphersTeam {
teamId: string;
result: 'win' | 'lose';
players: CyphersMatchPlayer[];
}
- teamId (string): 팀 식별자
- result ('win' | 'lose'): 팀 결과
- players (CyphersMatchPlayer[]): 팀 소속 플레이어들
CyphersMatchPlayer
경기에서의 플레이어 정보 타입입니다.
interface CyphersMatchPlayer {
playerId: string;
nickname: string;
characterId: string;
characterName: string;
level: number;
killCount: number;
deathCount: number;
assistCount: number;
attackPoint: number;
damagePoint: number;
battlePoint: number;
sightPoint: number;
towerAttackPoint: number;
backAttackCount: number;
comboCount: number;
spellCount: number;
healAmount: number;
sentinelKillCount: number;
demolisherKillCount: number;
trooperKillCount: number;
guardianKillCount: number;
guardTowerKillCount: number;
getCoin: number;
spendCoin: number;
items: CyphersMatchItem[];
}
- characterId (string): 사용한 캐릭터 식별자
- characterName (string): 사용한 캐릭터 이름
- level (number): 캐릭터 레벨
- killCount (number): 킬 수
- deathCount (number): 데스 수
- assistCount (number): 어시스트 수
- attackPoint (number): 공격 포인트
- damagePoint (number): 데미지 포인트
- battlePoint (number): 전투 포인트
- sightPoint (number): 시야 포인트
- towerAttackPoint (number): 타워 공격 포인트
- backAttackCount (number): 백어택 횟수
- comboCount (number): 콤보 횟수
- spellCount (number): 스펠 사용 횟수
- healAmount (number): 힐량
- sentinelKillCount (number): 센티넬 킬 수
- demolisherKillCount (number): 데몰리셔 킬 수
- trooperKillCount (number): 트루퍼 킬 수
- guardianKillCount (number): 가디언 킬 수
- guardTowerKillCount (number): 가드타워 킬 수
- getCoin (number): 획득 코인
- spendCoin (number): 소모 코인
- items (CyphersMatchItem[]): 사용한 아이템 목록
캐릭터 타입
CyphersCharacter
캐릭터 정보 타입입니다.
interface CyphersCharacter {
characterId: string;
characterName: string;
school: string;
species: string;
mastery: string;
weapon: string[];
position: string[];
attribute: string[];
}
- characterId (string): 캐릭터 식별자
- characterName (string): 캐릭터 이름
- school (string): 소속 학교
- species (string): 종족
- mastery (string): 특기
- weapon (string[]): 사용 무기 목록
- position (string[]): 포지션 목록
- attribute (string[]): 속성 목록
CyphersCharacterInfo
캐릭터 기본 정보 타입입니다.
interface CyphersCharacterInfo {
characterId: string;
characterName: string;
level?: number;
killCount?: number;
deathCount?: number;
assistCount?: number;
}
- level (number, 선택사항): 캐릭터 레벨
- killCount (number, 선택사항): 킬 수
- deathCount (number, 선택사항): 데스 수
- assistCount (number, 선택사항): 어시스트 수
아이템 타입
CyphersItem
아이템 정보 타입입니다.
interface CyphersItem {
itemId: string;
itemName: string;
itemType: string;
itemTypeId: string;
slotCode: string;
rarityCode: string;
rarityName: string;
needLevel: number;
explainText: string;
explainDetail: string;
itemActiveSkill?: CyphersItemSkill;
itemPassiveSkill?: CyphersItemSkill[];
}
- itemId (string): 아이템 식별자
- itemName (string): 아이템 이름
- itemType (string): 아이템 타입명
- itemTypeId (string): 아이템 타입 식별자
- slotCode (string): 슬롯 코드
- rarityCode (string): 희귀도 코드
- rarityName (string): 희귀도 이름
- needLevel (number): 필요 레벨
- explainText (string): 아이템 설명
- explainDetail (string): 상세 아이템 설명
- itemActiveSkill (CyphersItemSkill, 선택사항): 액티브 스킬
- itemPassiveSkill (CyphersItemSkill[], 선택사항): 패시브 스킬 목록
CyphersItemSkill
아이템 스킬 정보 타입입니다.
interface CyphersItemSkill {
skillId: string;
skillName: string;
skillType: string;
skillTypeId: string;
skillExplain: string;
skillExplainDetail: string;
}
- skillId (string): 스킬 식별자
- skillName (string): 스킬 이름
- skillType (string): 스킬 타입명
- skillTypeId (string): 스킬 타입 식별자
- skillExplain (string): 스킬 설명
- skillExplainDetail (string): 상세 스킬 설명
CyphersMatchItem
경기에서 사용된 아이템 정보 타입입니다.
interface CyphersMatchItem {
itemId: string;
itemName: string;
slotCode: string;
rarityCode: string;
equipSlotCode: string;
}
- equipSlotCode (string): 장착 슬롯 코드
포지션 및 속성 타입
CyphersPosition
포지션 정보 타입입니다.
interface CyphersPosition {
positionId: string;
positionName: string;
positionExplain: string;
}
- positionId (string): 포지션 식별자
- positionName (string): 포지션 이름
- positionExplain (string): 포지션 설명
CyphersAttribute
속성 정보 타입입니다.
interface CyphersAttribute {
attributeId: string;
attributeName: string;
attributeExplain: string;
}
- attributeId (string): 속성 식별자
- attributeName (string): 속성 이름
- attributeExplain (string): 속성 설명
검색 매개변수 타입
CyphersMatchSearchParams
경기 검색 매개변수 타입입니다.
interface CyphersMatchSearchParams {
playerId: string;
gameTypeId?: string;
startDate?: string;
endDate?: string;
limit?: number;
next?: string;
}
- playerId (string): 플레이어 식별자
- gameTypeId (string, 선택사항): 게임 타입 필터
- startDate (string, 선택사항): 시작 날짜 (YYYY-MM-DD)
- endDate (string, 선택사항): 종료 날짜 (YYYY-MM-DD)
- limit (number, 선택사항): 결과 제한 수
- next (string, 선택사항): 다음 페이지 토큰
CyphersRankingSearchParams
랭킹 검색 매개변수 타입입니다.
interface CyphersRankingSearchParams {
rankingType: 'ratingpoint' | 'battlepoint';
offset?: number;
limit?: number;
}
- rankingType ('ratingpoint' | 'battlepoint'): 랭킹 타입
- offset (number, 선택사항): 결과 오프셋
- limit (number, 선택사항): 결과 제한 수
유니언 타입
CyphersGameType
게임 타입 유니언입니다.
type CyphersGameType =
| 'normal' // 일반전
| 'rating'; // 공식전
CyphersTier
티어 유니언 타입입니다.
type CyphersTier =
| 'Bronze'
| 'Silver'
| 'Gold'
| 'Platinum'
| 'Diamond'
| 'Joker'
| 'Ace';
CyphersItemRarity
아이템 희귀도 유니언 타입입니다.
type CyphersItemRarity =
| 'common' // 일반 (101)
| 'uncommon' // 고급 (102)
| 'rare' // 희귀 (103)
| 'unique'; // 유니크 (104)
CyphersPosition
포지션 유니언 타입입니다.
type CyphersPositionType =
| 'tanker' // 탱커
| 'melee' // 근거리
| 'ranged' // 원거리
| 'support'; // 서포터
CyphersAttribute
속성 유니언 타입입니다.
type CyphersAttributeType =
| 'fire' // 화염
| 'water' // 물
| 'wind' // 바람
| 'earth'; // 대지
CyphersItemSlotCode
아이템 슬롯 코드 유니언 타입입니다.
type CyphersItemSlotCode =
// 장비 슬롯
| '101' // 손 (hand)
| '102' // 머리 (head)
| '103' // 가슴 (chest)
| '104' // 허리 (waist)
| '105' // 다리 (legs)
| '106' // 발 (feet)
// 액세서리 슬롯
| '201' // 액세서리 1
| '202' // 액세서리 2
| '203' // 액세서리 3
| '204' // 액세서리 4
| '205' // 액세서리 5
// 킷 슬롯
| '301' // 회복킷
| '302' // 가속킷
| '303' // 공격킷
| '304' // 방어킷
| '305'; // 특수킷
계산된 타입
CyphersPlayerStats
플레이어 통계 계산 타입입니다.
interface CyphersPlayerStats {
totalGames: number;
winRate: number;
averageKDA: number;
favoriteCharacters: Array<{
characterId: string;
characterName: string;
playCount: number;
winRate: number;
}>;
}
CyphersMatchAnalysis
경기 분석 타입입니다.
interface CyphersMatchAnalysis {
matchDuration: number;
teamBalance: number;
mvpPlayer: CyphersMatchPlayer;
totalKills: number;
averageLevel: number;
mostUsedCharacters: Array<{
characterId: string;
characterName: string;
pickCount: number;
}>;
}
타입 가드
사이퍼즈 타입 검증 함수
런타임에서 사이퍼즈 타입을 안전하게 확인하는 함수들입니다.
// 플레이어 기본 정보 타입 가드
function isCyphersPlayerBasic(obj: any): obj is CyphersPlayerBasic {
return (
obj &&
typeof obj.playerId === 'string' &&
typeof obj.nickname === 'string' &&
typeof obj.grade === 'number'
);
}
// 플레이어 상세 정보 타입 가드
function isCyphersPlayerDetail(obj: any): obj is CyphersPlayerDetail {
return (
isCyphersPlayerBasic(obj) &&
typeof obj.ratingPoint === 'number' &&
typeof obj.maxRatingPoint === 'number' &&
typeof obj.tierName === 'string' &&
Array.isArray(obj.records)
);
}
// 경기 정보 타입 가드
function isCyphersMatch(obj: any): obj is CyphersMatch {
return (
obj &&
typeof obj.matchId === 'string' &&
typeof obj.gameTypeId === 'string' &&
typeof obj.playTimeSeconds === 'number' &&
Array.isArray(obj.teams) &&
Array.isArray(obj.players)
);
}
// 캐릭터 정보 타입 가드
function isCyphersCharacter(obj: any): obj is CyphersCharacter {
return (
obj &&
typeof obj.characterId === 'string' &&
typeof obj.characterName === 'string' &&
typeof obj.school === 'string' &&
Array.isArray(obj.weapon) &&
Array.isArray(obj.position) &&
Array.isArray(obj.attribute)
);
}
// 아이템 정보 타입 가드
function isCyphersItem(obj: any): obj is CyphersItem {
return (
obj &&
typeof obj.itemId === 'string' &&
typeof obj.itemName === 'string' &&
typeof obj.itemType === 'string' &&
typeof obj.needLevel === 'number'
);
}
// 게임 타입 검증
function isValidGameType(gameType: string): gameType is CyphersGameType {
const validTypes: CyphersGameType[] = ['normal', 'rating'];
return validTypes.includes(gameType as CyphersGameType);
}
사용 예제
타입 안전한 플레이어 정보 처리
import { NeopleCyphersClient } from 'neople-sdk-js';
import type {
CyphersPlayerDetail,
CyphersPlayerBasic,
} from 'neople-openapi-types';
async function processPlayerData(
playerName: string
): Promise<CyphersPlayerDetail | null> {
const client = new NeopleCyphersClient(process.env.NEOPLE_CYPHERS_API_KEY!);
try {
const searchResult = await client.searchPlayer(playerName);
if (searchResult.rows.length === 0) {
return null;
}
const playerBasic: CyphersPlayerBasic = searchResult.rows[0];
// 타입 가드를 사용한 안전한 타입 확인
if (!isCyphersPlayerBasic(playerBasic)) {
throw new Error('Invalid player data format');
}
const playerDetail = await client.getPlayer(playerBasic.playerId);
return playerDetail;
} catch (error) {
console.error('Error processing player data:', error);
return null;
}
}
경기 통계 분석
async function analyzeMatches(
playerId: string,
gameType?: CyphersGameType
): Promise<CyphersPlayerStats> {
const client = new NeopleCyphersClient(process.env.NEOPLE_CYPHERS_API_KEY!);
// 타입 import 추가 필요:
// import type { CyphersGameType, CyphersPlayerStats } from 'neople-openapi-types';
// 게임 타입 검증
if (gameType && !isValidGameType(gameType)) {
throw new Error(`Invalid game type: ${gameType}`);
}
const matches = await client.getMatches(playerId, gameType);
// 통계 계산
const totalGames = matches.rows.length;
const wins = matches.rows.filter(match => {
const player = match.players.find(p => p.playerId === playerId);
const playerTeam = match.teams.find(team =>
team.players.some(p => p.playerId === playerId)
);
return playerTeam?.result === 'win';
}).length;
const winRate = totalGames > 0 ? (wins / totalGames) * 100 : 0;
// KDA 계산
const totalKills = matches.rows.reduce((sum, match) => {
const player = match.players.find(p => p.playerId === playerId);
return sum + (player?.killCount || 0);
}, 0);
const totalDeaths = matches.rows.reduce((sum, match) => {
const player = match.players.find(p => p.playerId === playerId);
return sum + (player?.deathCount || 0);
}, 0);
const totalAssists = matches.rows.reduce((sum, match) => {
const player = match.players.find(p => p.playerId === playerId);
return sum + (player?.assistCount || 0);
}, 0);
const averageKDA =
totalDeaths > 0
? (totalKills + totalAssists) / totalDeaths
: totalKills + totalAssists;
return {
totalGames,
winRate,
averageKDA: Math.round(averageKDA * 100) / 100,
favoriteCharacters: [], // 캐릭터별 통계 계산 로직
};
}