이 문서는 BlueTalk(블루톡)가 WebSocket을 통해 주고받는
주요 이벤트 타입과 JSON 포맷을 설명합니다.
여기서 설명하는 포맷은 클라이언트(JS SDK)와 서버 간 통신 규격을 이해하는 용도이며,
실제 내부 필드는 서비스 발전에 따라 일부 확장될 수 있습니다.
wss://server.bluetalk.krbluetalk.js가 자동으로 WebSocket 연결을 관리합니다.
로우 레벨 WebSocket 클라이언트를 직접 구현할 수도 있지만,
공식적으로는 bluetalk.js 사용을 권장합니다.
BlueTalk WebSocket 메시지는 기본적으로 다음과 같은 공통 포맷을 가집니다.
{
"type": "이벤트_타입",
"data": {
...이벤트별_데이터...
}
}
"chat:message", "dm:message")
이 외에, 필요에 따라 request_id, timestamp 등
공통 필드가 추가될 수 있습니다.
{
"type": "system:welcome",
"data": {
"message": "welcome",
"user_id": "testuser",
"connected_at": "2025-11-24T10:00:00Z"
}
}
{
"type": "system:error",
"data": {
"code": "INVALID_USER_KEY",
"message": "user_key validation failed"
}
}
실제 에러 코드/메시지 목록은 에러 코드 · 응답 포맷 문서를 참고하세요.
채널(방) 내에서 오가는 일반 채팅 메시지는
chat:message 타입으로 주고받습니다.
{
"type": "chat:message",
"data": {
"channel_id": "global",
"content": "안녕하세요, 블루톡입니다!",
"temp_id": "c_1732420000000"
}
}
"global", "board_free" 등)
{
"type": "chat:message",
"data": {
"message_id": "m_1234567890",
"channel_id": "global",
"user_id": "testuser",
"nickname": "테스트유저",
"avatar_url": "https://example.com/avatar/testuser.png",
"content": "안녕하세요, 블루톡입니다!",
"created_at": "2025-11-24T10:00:10Z",
"is_me": true
}
}
실제로는 첨부파일, 스타일 정보 등 추가 필드가 포함될 수 있습니다.
특정 사용자와 1:1로 대화하는 DM은 dm:message 타입으로 주고받습니다.
{
"type": "dm:message",
"data": {
"dm_key": "u_testuser:u_admin",
"content": "관리자님, 문의 드릴게 있습니다.",
"temp_id": "d_1732420001000"
}
}
"u_보내는유저:u_받는유저" 형태 등)
{
"type": "dm:message",
"data": {
"message_id": "dm_987654321",
"dm_key": "u_testuser:u_admin",
"from_user_id": "u_admin",
"from_nickname": "관리자",
"to_user_id": "u_testuser",
"content": "네, 어떤 부분이 궁금하신가요?",
"created_at": "2025-11-24T10:01:00Z",
"is_me": false
}
}
DM UI에서는 dm_key를 기준으로 대화를 묶어서 표시할 수 있으며,
실제 키 규칙은 서비스 구현에 따라 달라질 수 있습니다.
채널(방)에 입장/퇴장할 때는 channel:join,
channel:leave 이벤트가 사용됩니다.
{
"type": "channel:join",
"data": {
"channel_id": "global"
}
}
{
"type": "channel:join",
"data": {
"channel_id": "global",
"user_id": "testuser",
"nickname": "테스트유저",
"joined_at": "2025-11-24T10:02:00Z"
}
}
{
"type": "channel:leave",
"data": {
"channel_id": "global",
"user_id": "testuser",
"nickname": "테스트유저",
"left_at": "2025-11-24T10:05:00Z"
}
}
채널 입장/퇴장 이벤트를 통해 우측 참여자 목록이나 “누가 방에 들어왔는지/나갔는지” 알림을 구현할 수 있습니다.
Presence(프레즌스)는 현재 접속자 수, 온라인 상태 등에 대한 정보를 나타냅니다. 구현 방식에 따라 여러 형태가 있을 수 있지만, 예시는 다음과 같습니다.
{
"type": "presence:update",
"data": {
"channel_id": "global",
"online_count": 12,
"users": [
{ "user_id": "u_1", "nickname": "유저1" },
{ "user_id": "u_2", "nickname": "유저2" }
// ... 생략
]
}
}
Presence 정보는 주기적으로 또는 이벤트 기반으로 업데이트될 수 있으며,
실제 서비스에서는 성능/프라이버시 정책에 따라 users 상세 목록은 제한될 수 있습니다.
운영자/관리자가 특정 사용자에게 제재를 가할 경우,
관련 이벤트는 admin: prefix를 사용합니다.
실제 타입명/필드는 서비스 정책에 따라 달라질 수 있습니다.
{
"type": "admin:ban",
"data": {
"target_user_id": "baduser",
"scope": "chat", // chat / channel_create / all 등
"duration_sec": 3600,
"reason": "욕설 및 도배",
"until": "2025-11-24T11:00:00Z"
}
}
{
"type": "admin:kick",
"data": {
"target_user_id": "baduser",
"channel_id": "global",
"reason": "불건전한 내용"
}
}
클라이언트는 admin:ban, admin:kick 이벤트를 수신했을 때
UI에서 해당 사용자에게 채팅 입력창 비활성화, 토스트 알림, 방에서 내보내기 등의 처리를 하면 됩니다.
위에서 소개한 이벤트 외에도, 서비스 정책/구현에 따라
custom: prefix를 가진 이벤트나 추가 필드가
도입될 수 있습니다.
custom:typing – “상대방 입력 중” 표시custom:reaction – 메시지에 이모지 리액션 등custom:notice – 운영자 공지/시스템 안내새로운 이벤트가 추가되면, 관련 문서와 예제가 별도로 제공될 예정입니다.
WebSocket 이벤트 흐름을 이해했다면, 이제 HTTP 기반 API와 에러 구조를 함께 보는 것이 좋습니다.
실제 연동 예제 코드(PHP/Node/Python, 그누보드/아미나)는 예제 · 자료실 게시판에서 순차적으로 제공될 예정입니다.