채팅 시스템 (Chat)

TCP 소켓 기반 실시간 메시징 시스템입니다. 글로벌/채널, 길드, 귓속말, 시스템 메시지를 지원하며 아이템 링크, 좌표 링크, 이모티콘, @멘션, 스레드 답글 등 다양한 기능을 제공합니다.

채팅 채널

글로벌/채널 채팅

길드 전용 채팅

귓속말 (1:1 DM)

전체 채널 방송

상호작용

아이템/장비/좌표 링크

@멘션 시스템

스레드 답글

이모지 리액션

이모티콘

Spine 애니메이션 6종

해금 조건으로 획득

채팅에 직접 전송 가능

채팅 타입

타입 설명 대상 ID 범위
채널 글로벌/채널 채팅 channelIndex 같은 채널 플레이어
길드 길드 전용 채팅 guildId 같은 길드원
귓속말 1:1 다이렉트 메시지 accountId 지정 플레이어
전체 전체 채널 방송 - 모든 채널 플레이어
시스템 시스템 알림 - 서버 전체

* 채널 채팅: 같은 채널에 접속한 플레이어끼리 대화

* 길드 채팅: 길드 태그(Initial)가 메시지에 표시됨

* 귓속말: 닉네임 또는 accountId로 대상 지정

메시지 기능

메시지 구성 요소

발신자 정보
  • 닉네임 + 길드 태그
  • VIP 레벨
  • 캐릭터 레벨
  • 메인 캐릭터 아이콘
  • 성별
메시지 본문
  • 텍스트 메시지 (최대 255자)
  • 링크 첨부 (1종)
  • @멘션 (다수 가능)
  • 스레드 답글 (부모 메시지 참조)

@멘션 시스템

메시지에 @닉네임을 입력하면 해당 플레이어를 언급합니다.

내부적으로 @\0 플레이스홀더와 accountId 배열로 변환되어 전송됩니다.

수신 측에서 accountId를 닉네임으로 역변환하여 표시합니다.

스레드 답글

parentChatId 필드로 부모 메시지를 참조하여 대화 스레드를 구성합니다.

특정 메시지에 대한 답글로 컨텍스트를 유지하며 대화할 수 있습니다.

이모지 리액션

메시지에 이모지 리액션을 추가/제거(토글)할 수 있습니다.

한 메시지에 여러 이모지를 동시에 리액션 가능하며, 유저별로 개별 관리됩니다.

이모티콘

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 + 크기)와 가변 페이로드로 구성됩니다.

연결 흐름

1단계
TCP 연결
2단계
핸드셰이크
2048B 제로
3단계
로그인 요청
accountId + sessionKey
완료
메시지 송수신

패킷 종류

방향 패킷 설명
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 전송 실패

메시지 구조

chatTypeint32 — 채팅 타입
toIdint64 — 대상 ID (채널/길드/계정)
messagestring — 메시지 본문 (255자)
vipLevelint32 — VIP 레벨
mainLevelint32 — 캐릭터 레벨
mainCharacterKeyint32 — 메인 캐릭터
genderint32 — 성별
linkTypeint32 — 링크 타입
linkDatastring — 링크 데이터 (2000자)
mentionAccountIdsint64[] — @멘션 대상
parentChatIdint64 — 스레드 부모 ID

상세 가이드

채팅 타입별 특징

  • 채널 채팅: 같은 월드 채널에 접속한 플레이어끼리 대화. 가장 활발한 채널.
  • 길드 채팅: 길드원 전용. 길드 태그(Initial)가 닉네임 옆에 표시됨.
  • 귓속말: 1:1 비공개 메시지. 닉네임으로 대상 지정.
  • 전체 방송: 모든 채널에 동시 전송. 특별한 조건 필요.
  • 시스템: 서버에서 자동 발송하는 알림 메시지.

링크 활용법

  • 아이템/장비를 채팅에 공유하면 다른 플레이어가 클릭하여 상세 정보 확인 가능
  • 월드맵 좌표를 공유하면 클릭 시 해당 위치로 이동 가능
  • 전투 보고서 링크로 전투 결과를 길드원과 공유
  • 신비유적/랜드마크 위치를 공유하여 협동 플레이 유도

금칙어 시스템

  • 4,465개의 금칙어가 Trie 자료구조로 관리되어 실시간 필터링
  • 채팅뿐 아니라 닉네임, 길드명 생성/변경 시에도 적용
  • Include 모드: 문자열에 금칙어가 포함되면 차단
  • Word 모드: 정확히 해당 단어와 일치하는 경우만 차단

신고 시스템

  • 부적절한 채팅 메시지를 신고할 수 있음
  • 신고 유형: 선정적 발언, 악성 발언 등
  • 신고 내용은 관리자 도구에서 확인 및 처리