채팅 시스템 (Chat)
TCP 소켓 기반 실시간 메시징 시스템입니다. 글로벌/채널, 길드, 귓속말, 시스템 메시지를 지원하며 아이템 링크, 좌표 링크, 이모티콘, @멘션, 스레드 답글 등 다양한 기능을 제공합니다.
채팅 채널
글로벌/채널 채팅
길드 전용 채팅
귓속말 (1:1 DM)
전체 채널 방송
상호작용
아이템/장비/좌표 링크
@멘션 시스템
스레드 답글
이모지 리액션
이모티콘
Spine 애니메이션 6종
해금 조건으로 획득
채팅에 직접 전송 가능
채팅 타입
| 타입 | 설명 | 대상 ID | 범위 |
|---|---|---|---|
| 채널 | 글로벌/채널 채팅 | channelIndex | 같은 채널 플레이어 |
| 길드 | 길드 전용 채팅 | guildId | 같은 길드원 |
| 귓속말 | 1:1 다이렉트 메시지 | accountId | 지정 플레이어 |
| 전체 | 전체 채널 방송 | - | 모든 채널 플레이어 |
| 시스템 | 시스템 알림 | - | 서버 전체 |
* 채널 채팅: 같은 채널에 접속한 플레이어끼리 대화
* 길드 채팅: 길드 태그(Initial)가 메시지에 표시됨
* 귓속말: 닉네임 또는 accountId로 대상 지정
메시지 기능
메시지 구성 요소
발신자 정보
- 닉네임 + 길드 태그
- VIP 레벨
- 캐릭터 레벨
- 메인 캐릭터 아이콘
- 성별
메시지 본문
- 텍스트 메시지 (최대 255자)
- 링크 첨부 (1종)
- @멘션 (다수 가능)
- 스레드 답글 (부모 메시지 참조)
@멘션 시스템
메시지에 @닉네임을 입력하면 해당 플레이어를 언급합니다.
내부적으로 @\0 플레이스홀더와 accountId 배열로 변환되어 전송됩니다.
수신 측에서 accountId를 닉네임으로 역변환하여 표시합니다.
스레드 답글
parentChatId 필드로 부모 메시지를 참조하여 대화 스레드를 구성합니다.
특정 메시지에 대한 답글로 컨텍스트를 유지하며 대화할 수 있습니다.
이모지 리액션
메시지에 이모지 리액션을 추가/제거(토글)할 수 있습니다.
한 메시지에 여러 이모지를 동시에 리액션 가능하며, 유저별로 개별 관리됩니다.
링크 시스템
채팅 메시지에 게임 내 오브젝트를 링크로 첨부할 수 있습니다. 메시지당 1개의 링크를 포함할 수 있습니다.
| 링크 타입 | 설명 | 표시 예시 |
|---|---|---|
| 아이템 | 인벤토리 아이템 공유 | [엘릭서 회복약] |
| 장비 | 장비 상세 정보 공유 | [장비: Legendary 장갑] |
| 좌표 | 월드맵 위치 공유 | [좌표 (X:15 Y:23) PlayerNick] |
| 이모티콘 | Spine 애니메이션 이모티콘 | [이모티콘 Hello] |
| 전투 보고서 | 전투 결과 링크 | [전투 보고서] |
| 신비유적 | 신비유적 위치 공유 | [미스터리 Lv.3 Epic (X:10 Y:5)] |
| 랜드마크 | 랜드마크 위치 공유 | [고대 분수대 (X:8 Y:12)] |
이모티콘
Spine 애니메이션 기반의 이모티콘을 채팅에 전송할 수 있습니다. 해금 조건을 충족하면 사용 가능합니다.
| Key | 이름 | 타입 |
|---|---|---|
| #80001 | Hello | Spine |
| #80002 | Thanks | Spine |
| #80003 | Good | Spine |
| #80004 | Sorry | Spine |
| #80005 | GoodNight | Spine |
| #80006 | LoveYou | Spine |
금칙어 필터
필터 구조
- 총 4,465개 금칙어 등록
- Trie 자료구조 기반 고속 매칭
- 한국어 + 영어 혼합
매칭 모드
- Include — 문자열 포함 여부 검사
- Word — 정확한 단어 일치
적용 범위
| 범위 | 설명 |
|---|---|
| All | 모든 곳에 적용 |
| Chat | 채팅 메시지 전용 |
| AccountName | 닉네임 생성/변경 시 |
| GuildName | 길드명 생성/변경 시 |
통신 프로토콜
채팅은 TCP 소켓 기반 바이너리 프로토콜을 사용합니다. 각 패킷은 8바이트 헤더(명령 ID + 크기)와 가변 페이로드로 구성됩니다.
연결 흐름
패킷 종류
| 방향 | 패킷 | 설명 |
|---|---|---|
| C→S | CHAT_LOGIN_REQ | 채팅 서버 로그인 |
| C→S | CHAT_REQ | 채팅 메시지 전송 |
| C→S | CHATTING_LIST_REQ | 채팅 기록 요청 |
| C→S | REFRESH_PLAYER_INFO | Heartbeat (30초 주기) |
| S→C | CHAT_LOGIN_ACK | 로그인 성공 |
| S→C | CHAT_ACK | 메시지 수신 |
| S→C | CHAT_EMOTION_REACT_ACK | 이모지 리액션 결과 |
| S→C | CHAT_FAIL_ACK | 전송 실패 |
메시지 구조
상세 가이드
채팅 타입별 특징
- 채널 채팅: 같은 월드 채널에 접속한 플레이어끼리 대화. 가장 활발한 채널.
- 길드 채팅: 길드원 전용. 길드 태그(Initial)가 닉네임 옆에 표시됨.
- 귓속말: 1:1 비공개 메시지. 닉네임으로 대상 지정.
- 전체 방송: 모든 채널에 동시 전송. 특별한 조건 필요.
- 시스템: 서버에서 자동 발송하는 알림 메시지.
링크 활용법
- 아이템/장비를 채팅에 공유하면 다른 플레이어가 클릭하여 상세 정보 확인 가능
- 월드맵 좌표를 공유하면 클릭 시 해당 위치로 이동 가능
- 전투 보고서 링크로 전투 결과를 길드원과 공유
- 신비유적/랜드마크 위치를 공유하여 협동 플레이 유도
금칙어 시스템
- 4,465개의 금칙어가 Trie 자료구조로 관리되어 실시간 필터링
- 채팅뿐 아니라 닉네임, 길드명 생성/변경 시에도 적용
- Include 모드: 문자열에 금칙어가 포함되면 차단
- Word 모드: 정확히 해당 단어와 일치하는 경우만 차단
신고 시스템
- 부적절한 채팅 메시지를 신고할 수 있음
- 신고 유형: 선정적 발언, 악성 발언 등
- 신고 내용은 관리자 도구에서 확인 및 처리