텐센트 RTC 채팅으로 디스코드와 유사한 플랫폼 구축

10 분 읽기
Feb 18, 2025

시나리오 개요

Discord는 커뮤니티를 위해 설계된 무료 온라인 실시간 메시징 앱 및 디지털 배급 플랫폼입니다. 사용자는 게임, 교육 및 비즈니스 분야에서 소프트웨어의 채팅 채널을 통해 서로 메시지, 사진, 비디오 및 오디오로 소통할 수 있습니다.

실시간 커뮤니케이션, 이벤트 세부정보 및 사용자 참여를 특징으로 하는 Discord 채팅 인터페이스.

Discord 개념

  • 서버: Discord에는 일반 커뮤니케이션 소프트웨어 그룹과 다른 일종의 그룹 채팅인 서버가 있습니다(커뮤니티와 유사). 서버 소유자는 서버 내에서 자신의 커뮤니티를 만들 수 있습니다.
  • 채널: 서버 내에서 음성 및 텍스트 채널을 포함한 채팅 채널을 생성할 수 있습니다. 음성 채널은 게임 방송, 채팅 등에 사용됩니다. 채널은 신원 그룹에 따라 다양한 권한을 통합하도록 설정할 수 있어 Discord 커뮤니티 시스템이 더욱 다양해집니다.
  • 스레드: 사용자는 스레드에서 특정 주제에 대해 논의할 수 있습니다.

적용된 제품

Tencent RTC Chat

기본 통합 가이드라인

채팅 앱 만들기

이 튜토리얼은 채팅을 기반으로 합니다. 따라서 콘솔에서 앱을 생성해야 합니다.

Tencent RTC 콘솔에서 앱 만들기

앱 이름 만들기
제품 선택
지역 선택
무료 체험 시작



앱이 성공적으로 생성된 후, 채팅 콘솔의 기본 정보 페이지에서 앱의 기본 정보를 볼 수 있습니다.

관련 구성 및 기능 이해하기

Chat을 사용하여 Discord 기능을 구현하려면 사전에 Chat과 관련된 기본 개념과 이 튜토리얼에서 언급될 몇 가지 적절한 용어를 이해해야 합니다. 여기에는 다음이 포함되지만 이에 국한되지는 않습니다:

  • SDKAppID: Chat은 각 앱에 대한 SDKAppID를 할당합니다. 앱이 콘솔에서 생성된 후 앱 세부정보 페이지에서 앱의 SDKAppID를 확인할 수 있으며, 이를 사용하여 Chat SDK를 초기화하고 사용자 로그인 티켓을 계산합니다. 자세한 내용은 UI SDK 초기화로그인.
  • 키: 앱의 키는 Chat 콘솔 앱 세부정보 페이지에서 확인할 수 있으며, 사용자의 SDK 로그인 티켓을 계산하는 데 사용됩니다.
  • 사용자 계정: Chat 계정이 있는 사용자만 Chat에 로그인할 수 있습니다. 사용자가 클라이언트 SDK를 통해 성공적으로 로그인하면 Chat 백엔드는 자동으로 사용자에 대한 Chat 계정을 생성합니다. 또한 Chat에서 제공하는 서버 API를 사용하여 사용자를 Chat의 사용자 시스템으로 가져올 수 있습니다.
  • 그룹: 현재까지 Chat은 사용자가 메시지를 보내고 받을 수 있는 다섯 가지 유형의 그룹 을 제공합니다.
  • Webhook 구성: Chat에서 제공하는 클라이언트 및 서버 API를 적극적으로 통합할 수 있으며, 특정 비즈니스 로직이 트리거될 때 Chat이 필요한 정보를 귀하의 서버에 자동으로 반환합니다. 해야 할 일은 단순히 Webhook 구성 모듈에서 관련 구성을 완료하는 것입니다. Chat은 다양한 웹훅 구성을 제공하며 웹훅 이벤트에 대한 높은 신뢰성을 보장합니다. 웹훅을 사용하여 다양한 사용자 요구 사항을 구현할 수 있습니다.
  • 사용자 정의 필드: 기본적으로 Chat은 개발자의 대부분의 요구를 충족하는 필드를 제공합니다. 또한 사용자 확장 필드에 대한 요구를 충족하기 위해 각 모듈에 대해 다음과 같은 사용자 정의 필드를 제공합니다:

참고:

사용자 정의 필드를 사용하려면 콘솔에서 구성한 후 SDK/API를 통해 읽기/쓰기를 수행할 수 있습니다.

클라이언트 및 서버 SDK 통합



Discord 관련 기능을 구현하려면 Chat SDK를 통합해야 합니다. Chat은 다양한 사용하기 쉬운 SDK 및 서버 API를 제공합니다. 동일한 SDKAppID로 앱에 로그인하면 메시지가 클라이언트 간에 동기화됩니다. 비즈니스 요구 시나리오 및 기술 스택에 따라 적절한 SDK를 선택하십시오.

시나리오별 구현

위 그림에서 볼 수 있듯이 Discord 기능에는 서버, 채널 및 스레드가 포함됩니다. 서로 다른 서버는 서로 다른 콘텐츠에 사용됩니다. 예를 들어, 우리는 왕의 영광 서버와 평화 게임 서버가 있습니다. 서버 내에서 텍스트 채널, 음성 채널 및 공지 채널과 같은 다양한 유형의 채널을 만들 수 있습니다. 사용자는 채널 내에서 서로 소통합니다. 특정 주제에 대한 추가 아이디어가 있는 경우 스레드를 만들어 더 많은 논의를 할 수 있습니다. 다음은 Chat을 통해 이러한 주요 Discord 기능을 하나씩 구현하는 방법을 소개합니다.

참고:

코드 데모는 Android 클라이언트(Java SDK)를 예제로 사용합니다. 다른 SDK 버전의 API 호출에 대한 내용은 통합 솔루션 (UI 없음).

서버

서버 만들기

분석 결과 Discord 서버 목록에서 다음과 같은 특성이 발견되었습니다:

  1. 서버는 대량의 사용자를 가질 수 있습니다.
  2. 사용자는 실제로 서버 내에서 서로 소통하지 않습니다. 대신 서버 내의 채널 또는 스레드에서만 채팅합니다.
  3. 서버의 과거 채팅 메시지는 로밍 서버에 저장되어야 합니다.
  4. 사용자는 서버에 자유롭게 접근할 수 있습니다.
  5. 서버 내에서 채널을 만들 수 있습니다.

Chat은 다섯 가지 유형의 그룹을 제공하지만, 커뮤니티 그룹만이 Discord 서버의 특성을 충족합니다. Chat 커뮤니티 그룹은 사용자가 자유롭게 가입하고 탈퇴할 수 있으며, 최대 100,000명의 회원을 지원하고 메시지 기록을 저장합니다. 그룹에 가입하려면 사용자는 그룹 ID를 검색하고 신청서를 제출해야 하며, 관리자의 승인이 필요하지 않습니다.

createGroup API를 사용하여 서버(그룹)를 생성할 수 있습니다. 이때 그룹 유형은 Community여야 하며 setSupportTopictrue로 설정해야 채널을 만들 수 있습니다. 다음은 샘플 코드입니다:

V2TIMGroupInfo groupinfo = new V2TIMGroupInfo();
groupinfo.setGroupName("테스트 서버");
groupinfo.setSupportTopic(true);
// 초기 그룹 멤버
List<V2TIMCreateGroupMemberInfo> memberList = new LinkedList<V2TIMCreateGroupMemberInfo>();
// 서버 프로필 사진 등의 기타 설정
V2TIMManager.getGroupManager().createGroup(groupinfo, memberList, new V2TIMValueCallback<String>() {
            @Override
            public void onError(int i, String s) {
                // 생성 실패
            }

            @Override
            public void onSuccess(String s) {
                // 서버가 성공적으로 생성되었으며, 서버 ID가 반환됩니다.
            }
});

API가 성공적으로 호출된 후 onSuccess 콜백에서 서버 ID가 반환되며, 이는 나중에 서버에 채널을 생성할 때 사용됩니다.

참고: Chat에서 제공하는 서버 생성 API도 사용할 수 있습니다. 주요 매개변수는 다음과 같습니다:

{
    "Type": "Community", // 그룹 유형 (필수)
    "Name": "TestCommunityGroup", // 그룹 이름 (필수)
    "SupportTopic": 1// 주제 옵션 지원 여부. 유효 값: `1`: 예; `0`: 아니오.
}

###### Server list

There is a list of servers that the current user has joined on the far left of Discord. For the community scenario, Chat provides a dedicated API for querying the server list.

```java
V2TIMManager.getGroupManager().getJoinedCommunityList(new V2TIMValueCallback<List<V2TIMGroupInfo>>() {
            @Override
            public void onSuccess(List<V2TIMGroupInfo> v2TIMGroupInfos) {
                // The server list is got successfully, and the basic information of the server list is provided in the returned `List<V2TIMGroupInfo>`.
            }

            @Override
            public void onError(int i, String s) {
              // Failed to get the service list.
            }
});

반환된 V2TIMGroupInfo 는 기본 서버 정보를 제공합니다. 그러나 반환된 서버 정보에는 읽지 않은 메시지 수 및 사용자 정의 상태와 같은 정보가 포함되어 있지 않습니다. Discord에서와 동일한 효과를 얻기 위해서는 다른 API를 사용하여 서버 목록의 읽지 않은 메시지 수를 구현해야 하며, 이 내용은 문서 후반부에서 논의될 것입니다.

서버 카테고리

서버가 생성될 때 기본 카테고리가 생성됩니다. 서버가 생성된 후에는 새 카테고리를 생성할 수 있습니다. 채팅에서 서버는 본질적으로 커뮤니티입니다. 따라서 커뮤니티 그룹에 대한 사용자 정의 필드를 설정하여 서버 유형 기능을 구현할 수 있습니다. 사용자 정의 그룹 필드를 사용하려면 아래 단계를 수행하십시오:

1. 콘솔에서 사용자 정의 필드 key를 활성화합니다.

2. 클라이언트 SDK 또는 서버 API를 사용하여 사용자 정의 필드를 읽거나 씁니다.

사용자 정의 그룹 필드를 설정하려면 서버 API 클라이언트 SDK.

주의:

커뮤니티 그룹 기능은 궁극적인 에디션에서만 사용할 수 있습니다. 커뮤니티 그룹에 대한 사용자 정의 필드를 설정하기 전에 궁극적인 에디션을 구매해야 합니다.

서버의 읽지 않은 메시지 수 및 사용자 정의 상태 표시



앞서 언급했듯이, 참여한 서버 목록을 가져오는 API는 읽지 않은 메시지 수 및 서버 상태와 같은 정보를 반환하지 않습니다. 우리는 이 데이터를 획득할 뿐만 아니라, 데이터 변경을 듣고 클라이언트 UI를 적시에 업데이트해야 합니다. 서버는 채팅 커뮤니티 그룹으로 구현되므로, 커뮤니티 그룹에서는 채팅에서 대화를 생성하지 않으므로 모든 공개 및 비공식 채널 대화의 읽지 않은 메시지를 합산해야 합니다. 우리는 getUnreadCount API를 사용하여 공개 채널의 읽지 않은 메시지 수를 가져오고, getConversation API를 사용하여 비공식 채널의 읽지 않은 메시지 수를 가져올 수 있습니다 (비공식 채널은 작업 그룹으로 구현됩니다).

// 공개 채널
List<String> conversationIDList = new LinkedList();
conversationIDList.add("GROUP_$GROUPID");
V2TIMManager.getConversationManager().getConversationList(conversationIDList, new V2TIMValueCallback<List<V2TIMConversation>>() {
            @Override
            public void onError(int i, String s) {
                // 서버의 대화 정보 가져오기 실패
            }

            @Override
            public void onSuccess(V2TIMConversationList List<V2TIMConversation>) {
               // 서버의 대화 정보 가져오기 성공
            }
});
// 비공식 채널
V2TIMManager.getGroupManager().getTopicInfoList(groupID, topicIDList, new V2TIMValueCallback<List<V2TIMTopicInfoResult>>() {
                @Override
                public void onSuccess(List<V2TIMTopicInfoResult> v2TIMTopicInfoResults) {

                }

                @Override
                public void onError(int i, String s) {
                }
});

서버의 사용자 정의 상태 기능을 구현하기 위해서는 setConversationCustomData API를 사용하여 사용자 정의 서버 대화 데이터를 설정할 수 있습니다.

List<String> conversationIDList = new LinkedList();
String customData = "바쁨"
V2TIMManager.getConversationManager().setConversationCustomData(conversationIDList, customData, new V2TIMValueCallback<List<V2TIMConversationOperationResult>>() {
            @Override
            public void onSuccess(List<V2TIMConversationOperationResult> v2TIMConversationOperationResults) {
                // 사용자 정의 그룹 대화 데이터 설정 성공
            }

            @Override
            public void onError(int i, String s) {
                // 사용자 정의 그룹 대화 데이터 설정 실패
            }
});

서버 대화와 관련된 데이터가 변경될 때, 클라이언트는 UI 표시를 업데이트해야 합니다. 서버 대화 변경을 듣기 위해서는 채팅에서 제공하는 이벤트 리스너 기능인 addConversationListener. 이 콜백 함수는 다음과 같은 경우에 호출됩니다:

1. 서버 메시지가 추가, 삭제 또는 수정됩니다.

2. 서버 메시지의 읽지 않은 수가 변경됩니다.

3. 사용자 정의 서버 정보가 수정됩니다.

4. 서버가 상단에 고정됩니다.

5. 서버의 메시지 수신 구성 변경됩니다.

6. 서버 마크가 수정됩니다.

7. 서버 그룹이 수정됩니다.

8. ...

V2TIMConversationListener conversationLister = new V2TIMConversationListener() {
            @Override
            public void onSyncServerStart() {
            }

            @Override
            public void onSyncServerFinish() {
            }

            @Override
            public void onSyncServerFailed() {
            }

            @Override
            public void onNewConversation(List<V2TIMConversation> conversationList) {
            }

            @Override
            public void onConversationChanged(List<V2TIMConversation> conversationList) {
            }
            @Override
            public void onTotalUnreadMessageCountChanged(long totalUnreadCount) {
            }

            @Override
            public void onConversationGroupCreated(String groupName, List<V2TIMConversation> conversationList) {
            }

            @Override
            public void onConversationGroupDeleted(String groupName) {
            }

            @Override
            public void onConversationGroupNameChanged(String oldName, String newName) {
            }

            @Override
            public void onConversationsAddedToGroup(String groupName, List<V2TIMConversation> conversationList) {、
            }

            @Override
            public void onConversationsDeletedFromGroup(String groupName, List<V2TIMConversation> conversationList) {
            }
}
V2TIMManager.getConversationManager().addConversationListener(conversationLister);

결론적으로, 우리는 getJoinedCommunityListgetConversationList API와 addConversationListener 콜백을 사용하여 서버 목록을 표시하는 Discord 기능을 구현할 수 있습니다.

채널

서버 내에 여러 채널을 생성할 수 있습니다. 아래 그림과 같이 채널은 서버 아래에 생성되며, 채널은 서로 다른 카테고리에 배치될 수 있습니다.



사용자는 다른 사용자를 초대하여 채널에 가입할 수 있으며 채널의 기본 설정을 수정할 수 있습니다. 사용자는 대부분 채널 내에서 대화를 나누므로 Discord에서의 채널 기능은 매우 중요합니다. Discord의 채널 기능은 채팅의 주제 기능에 해당합니다. 채팅의 커뮤니티 그룹은 그룹 내에서 주제를 생성하는 기능을 제공합니다.

기본 채널

서버가 생성될 때, Discord는 서버에 대해 네 개의 기본 채널을 생성합니다. 채팅에서도 이러한 기능을 구현할 수 있습니다. 프로세스는 다음과 같습니다:

1. 그룹 생성 후 웹훅을 통해 비즈니스 서버에 서버가 성공적으로 생성되었음을 알립니다.

2. 비즈니스 측에서 생성된 그룹이 커뮤니티 그룹인지 여부를 결정하여 다른 그룹과 관련된 비즈니스를 방해하지 않도록 합니다.

3. 서버에서 주제 생성를 서버 속성에 따라 수행합니다.

서버에서 주제를 생성하기 위한 매개변수는 다음과 같습니다:

{
    "GroupId": "@TGS#_@TGS#cQVLVHIM62CJ", // 주제의 그룹 ID, 필수
    "TopicId": "@TGS#_@TGS#cQVLVHIM62CJ@TOPIC#_TestTopic", // 사용자 정의 주제 ID, 선택 사항
    "TopicName": "TestTopic", // 주제 이름, 필수
    "From_Account": "1400187352", // 주제를 생성한 구성원
    "CustomString": "이것은 사용자 정의 문자열입니다.",// 사용자 정의 문자열
    "FaceUrl": "http://this.is.face.url", // (선택 사항) 주제 프로필 사진 URL
    "Notification": "이것은 주제 알림입니다.", // (선택 사항) 주제 공지
    "Introduction": "이것은 주제 소개입니다." // (선택 사항) 주제 소개
}

채널 생성

Discord 클라이언트에서 사용자는 서로 다른 채널 카테고리 아래에 채널을 생성할 수 있습니다. 아래 그림과 같이:

Discord에서 채널을 생성하는 것은 채팅의 커뮤니티 그룹에서 주제를 생성하는 것과 같습니다. 채팅에서 주제를 생성할 때 카테고리 및 주제의 기본 정보를 설정할 수 있습니다.



createTopicInCommunity API를 사용하여 관련 기능을 구현할 수 있습니다.

String groupID = "서버 ID"
V2TIMTopicInfo info = new V2TIMTopicInfo();
info.setCustomString("{'categray':'게임','type':'텍스트'}") // 채널 카테고리 및 유형 설정
// `V2TIMTopicInfo`의 기본 정보 설정
V2TIMManager.getGroupManager().createTopicInCommunity(groupID, info, new V2TIMValueCallback<String>() {
            @Override
            public void onSuccess(String s) {
                // 채널 생성 성공
            }

            @Override
            public void onError(int i, String s) {
                // 채널 생성 실패
            }
});

채널을 생성할 때, V2TIMTopicInfo 메서드를 호출하여 채널 정보를 설정하고 setCustomString API를 호출하여 채널 카테고리 및 유형을 설정할 수 있습니다.



채널을 생성할 때, 비공식 채널인지 여부를 지정할 수 있습니다. 비공식 채널은 일반 채널과 다릅니다:

1. 사용자는 서버에 가입한 후 비공식 채널에 자동으로 가입하지 않습니다.

2. 사용자는 서버 관리자에게 초대를 받아야만 비공식 채널에 가입할 수 있습니다.

따라서 작업 그룹을 사용하여 비공식 채널 기능을 구현할 수 있습니다. 그러나 서버와 연결된 비공식 채널에 대한 정보는 비즈니스 측에 저장해야 합니다.

채널 유형

Discord에서 채널을 생성할 때, 채널 유형을 음성 또는 텍스트로 설정할 수 있습니다. 텍스트 채널은 텍스트, 이모지 및 이미지 기반의 대화를 가능하게 하며, 음성 채널은 오디오/비디오 대화를 허용합니다. 사용자는 한 번에 하나의 음성 채널에만 있을 수 있습니다. 새로운 음성 채널에 가입하려면 현재 가입된 음성 채널을 떠나야 합니다.

다음 사항에 유의하십시오:

1. 채널을 생성할 때 채널 유형을 설정해야 합니다. 채널 생성 섹션에서 설정 방법을 찾으십시오.

2. 사용자가 음성 채널에 가입할 때, 시스템은 사용자가 이미 다른 음성 채널에 있는지 여부를 결정해야 합니다.

3. 사용자는 애플리케이션 내에서 하나의 음성 채널에만 가입할 수 있습니다.

4. 채팅은 현재 사용자가 음성 채널에 있는지 여부 및 어떤 음성 채널에 있는지를 쿼리하는 API를 제공하지 않습니다. 이 부분의 데이터는 비즈니스 측에서 유지해야 합니다.

위의 마지막 사항에 대해, 개발자는 채팅에서 제공하는 그룹 가입 및 퇴장 콜백을 사용하여 사용자의 음성 채널 상태를 유지하고 비즈니스 측에 저장할 수 있습니다. 채팅에서 제공하는 콜백은 지연이 있을 수 있으므로 사용자가 한 음성 채널을 떠난 후 잠시 동안 다른 음성 채널에 가입할 수 없을 수 있습니다. 따라서 이 문제를 해결하기 위해 클라이언트를 사용하여 사용자의 음성 채널 가입 또는 퇴장 상태를 비즈니스 서버에 실시간으로 보고하는 것도 가능합니다.

사용자를 채널에 초대하기

사용자가 채널에 가입하는 방법은 세 가지가 있습니다:

1. 다른 사용자에 의해 서버에 초대받습니다. 사용자가 서버에 가입하면 사용자는 서버의 모든 공개 채널에 가입합니다.

2. 서버를 검색한 후 서버에 가입합니다.

3. 서버 관리자로부터 비공식 채널에 가입하라는 초대를 받습니다.

커뮤니티의 특성에 따라 사용자는 서버에 가입하기만 하면 공개 채널에 가입할 수 있습니다.

1. 정확한 그룹 ID 검색을 통해 서버에 가입할 수 있습니다.

2. 초대를 통해 서버에 가입할 수 있습니다.

3. 서버에 가입 신청을 사전적으로 할 수 있으며, 승인 필요 없습니다.

채널 설정

채널을 음소거하거나 음소거 해제하고 채널에 대한 알림을 구성할 수 있습니다. 해당 API는 setAllMutesetGroupReceiveMessageOpt입니다.

// 기본 채널 정보 설정
V2TIMManager.getGroupManager().setTopicInfo(topicInfo, new V2TIMCallback() {
    @Override
    public void onSuccess() {
        // 성공적으로 구성됨
    }

    @Override
    public void onError(int i, String s) {
        // 구성 실패
    }
});
// 채널의 메시지 수신 옵션 설정
String groupID = "topicid"
int opt = 0; 
V2TIMManager.getMessageManager().setGroupReceiveMessageOpt(groupID, opt, new V2TIMCallback() {
    @Override
    public void onSuccess() {

    }

    @Override
    public void onError(int i, String s) {

    }
});

채널 메시지 목록

채널의 이전 메시지를 가져오기 위해 getHistoryMessageList API를 사용할 수 있습니다.

final V2TIMMessageListGetOption option = new V2TIMMessageListGetOption();
option.setGroupID("채널 ID");
option.setCount(20);
// 기타 설정
V2TIMManager.getMessageManager().getHistoryMessageList(option, new V2TIMValueCallback<List<V2TIMMessage>>() {
    @Override
    public void onSuccess(List<V2TIMMessage> v2TIMMessages) {
        // 채널의 이전 메시지를 성공적으로 가져옴
    }

    @Override
    public void onError(int code, String desc) {
        // 채널의 이전 메시지 가져오기 실패
    }
});

채널의 읽지 않은 메시지 수

채널의 읽지 않은 메시지 수는 서버의 읽지 않은 메시지 수와 다릅니다. 서버의 읽지 않은 메시지 수는 대화 정보에 있고, 채널의 읽지 않은 메시지 수는 채널 기본 정보에 있습니다. 우리는 채팅에서 제공하는 그룹 콜백 onTopicInfoChanged를 사용하여 실시간으로 읽지 않은 메시지 수를 가져올 수 있습니다.

String groupID = "서버 ID";
List< String > topicIDList= new LinkedList(); // 채널 메시지 목록
V2TIMManager.getGroupManager().getTopicInfoList(groupID, topicIDList, new V2TIMValueCallback<List<V2TIMTopicInfoResult>>() {
    @Override
    public void onSuccess(List<V2TIMTopicInfoResult> v2TIMTopicInfoResults) {
        // 채널 정보, 예: 채널 ID, 이름 및 읽지 않은 메시지 수 가져오기
    }

    @Override
    public void onError(int i, String s) {

    }
});

채널 멤버 목록

서버에 가입한 사용자는 기본적으로 서버의 모든 공개 채널에 가입합니다. 따라서 공개 채널 멤버 목록을 가져오려면 서버의 그룹 멤버 목록만 가져오면 됩니다. 아래는 공개 채널 멤버 목록을 가져오는 방법입니다:

String groupID = "서버 ID";
int filter = 0; // 그룹 멤버 역할: 관리자, 일반 멤버...
long nextSeq = 0;// 페이지 매김 매개변수
V2TIMManager.getGroupManager().getGroupMemberList(groupID, filter, nextSeq , new V2TIMValueCallback<V2TIMGroupMemberInfoResult>() {
    @Override
    public void onError(int i, String s) {
        CommonUtil.returnError(result,i,s);
    }

    @Override
    public void onSuccess(V2TIMGroupMemberInfoResult v2TIMGroupMemberInfoResult) {

    }
});

비공식 채널의 멤버 목록을 가져오려면 getGroupMemberList API를 호출하되 비공식 채널의 그룹 ID를 전달하면 됩니다.

신분증 권한

권한 그룹의 경우, 사용자는 필요에 따라 그룹에 대한 권한을 정의하고 서로 다른 권한 및 멤버를 서로 다른 권한 그룹에 구성하여 사용자가 권한에 따라 그룹을 관리할 수 있도록 합니다. 커뮤니티 그룹은 권한 그룹으로 관리할 수 있습니다. 권한 그룹 관리가 고정 역할의 관리자보다 더 유연하며, 많은 구성원과 주제가 있는 커뮤니티에 적합합니다.

클라이언트 측에서 권한 그룹 통합 예제는 다음을 참조하십시오: UI 통합 없음 > 커뮤니티 주제 > 권한 그룹.

서버 측에서 권한 그룹 통합 예제는 다음을 참조하십시오: 서버 측 API > REST API > 권한 그룹 관리 > 권한 그룹 생성.

스레드

스레드는 채널 내 특정 주제에 대한 논의 그룹입니다. 사용자는 스레드 내에서 특정 주제에 대한 메시지를 탐색할 수 있으며, 스레드의 요약도 채널의 메시지 목록에서 볼 수 있습니다. 스레드는 채팅에서 그룹으로 간주됩니다.

스레드 생성

스레드는 별도로 생성하거나 채널의 메시지와 바인딩하여 생성할 수 있습니다. 채팅에서 제공하는 createGroup API를 사용하여 스레드를 생성할 수 있습니다. 다음 사항에 유의하십시오:

1. 스레드가 생성되면 현재 서버의 모든 멤버가 기본적으로 스레드에 포함됩니다.

2. 스레드가 생성된 후 서버에 가입하는 멤버도 스레드에 추가됩니다.

3. 나중에 스레드에 가입하는 사용자는 스레드 생성 이후의 스레드의 채팅 기록을 볼 수 있습니다.

결론적으로, 스레드/그룹이 생성될 때 서버의 그룹 멤버가 스레드에 추가되며, 사용자가 서버에 가입할 때 사용자의 그룹 가입 콜백에서 서버의 모든 스레드에 사용자를 추가해야 합니다. 이 두 단계를 비즈니스 서버 측에서 구현하는 것이 가장 좋습니다. 사용하는 API는 다음과 같습니다:

1. 그룹 내 멤버 조회

2. 그룹 생성 및 그룹 멤버 설정

3. 사용자 초대하여 그룹 가입

서버 측 웹훅은 웹훅 사용자가 그룹에 가입한 후.

스레드 수

채널 목록에서 채널의 스레드 목록을 가져올 수 있습니다. 따라서 스레드와 서버 간의 다대일 관계를 설정해야 합니다. 스레드에 이전 메시지가 있는 경우 스레드와 메시지 간의 일대일 관계도 설정해야 합니다. 채팅은 현재 이러한 관계를 설정할 수 있는 기능을 제공하지 않으므로 비즈니스 측에서 이러한 관계를 유지해야 합니다. 비즈니스 측에서 HTTP API를 사용하여 스레드 수 및 스레드 목록을 가져오고 실시간으로 스레드 목록을 업데이트하는 온라인 메시지를 보낼 수 있습니다.

스레드 요약

사용자가 메시지에 대한 스레드를 생성할 때, 사용자는 메시지 목록에서 다음 메시지 요약 정보를 볼 수 있습니다:

1. 스레드 내 메시지 수

2. 스레드의 lastMessage 관련 정보

3. 메시지 목록에서 실시간으로 표시해야 하는 기타 정보

스레드의 메시지 요약 기능을 구현하기 위해서는 그룹 메시지 전송 콜백 및 메시지 편집 기능을 사용해야 합니다. 사용자가 스레드에서 메시지를 보내면 채팅 서비스는 메시지 전송 콜백을 트리거하고 관련 정보를 비즈니스 측에 동기화합니다. 그런 다음 비즈니스 측에서 스레드의 메시지 수를 계산하고 lastMessage 정보를 유지하며 메시지 편집 API를 사용하여 정보를 저장합니다.

메시지

메시지 피드백

메시지 피드백은 사용자를 위한 메시지 확장입니다. 아래 그림과 같이:



모든 유형의 메시지는 편집 및 피드백을 지원하며 커뮤니티 그룹 지원이 필요하므로 데이터는 cloudCustomData 필드에 저장하는 것이 좋습니다. 참고용으로 자세한 데이터 저장 형식은 다음과 같습니다:

{
  "reaction": {
    "simle":["user1","user2"]
  }
}
V2TIMManager.getMessageManager().modifyMessage(modifiedMessage, new V2TIMCompleteCallback<V2TIMMessage>() {
    @Override
    public void onComplete(int i, String s, V2TIMMessage v2TIMMessage) {
        // 메시지 수정 완료
    }
});

메시지 편집



메시지 편집은 메시지 피드백과 동일하게 작동하지만, 구성된 사용자 정의 데이터에는 몇 가지 차이가 있습니다. 모든 메시지가 편집을 지원하도록 하려면, 데이터는 cloudCustomData 필드에서 편집하는 것이 좋습니다. 데이터 형식은 다음과 같습니다:

{
  "isEdited": true
}
V2TIMManager.getMessageManager().modifyMessage(modifiedMessage, new V2TIMCompleteCallback<V2TIMMessage>() {
    @Override
    public void onComplete(int i, String s, V2TIMMessage v2TIMMessage) {
        // 메시지 편집 완료
    }
});

메시지 스타팅

메시지 스타팅은 그룹 채팅에서 메시지에 별표를 달아 다른 사용자들이 별표가 달린 메시지를 볼 수 있도록 하는 것입니다. 커뮤니티 그룹은 그룹 속성을 지원하지 않으므로 사용자 정의 메시지를 사용하여 메시지 스타팅 기능을 구현합니다.

사용자 정의 그룹 메시지를 사용하려면, 먼저 아래 그림과 같은 구성을 채팅 콘솔에서 설정해야 합니다:



그런 다음 다음 구성을 수행합니다:

V2TIMGroupInfo info =  new V2TIMGroupInfo();
info.setCustomInfo("핀 데이터");
V2TIMManager.getGroupManager().setGroupInfo(info, new V2TIMCallback() {
    @Override
    public void onError(int i, String s) {
        // 구성 실패
    }

    @Override
    public void onSuccess() {
        // 성공적으로 구성됨
    }
});

그런 다음 그룹 구성원은 onMemberInfoChanged 이벤트를 수신하고, 오프라인 사용자도 그룹 프로필을 통해 별표가 달린 메시지 내용을 얻을 수 있습니다:

List< String > groupIDList = new LinkedList();
V2TIMManager.getGroupManager().getGroupsInfo(groupIDList, new V2TIMValueCallback<List<V2TIMGroupInfoResult>>() {
    @Override
    public void onError(int i, String s) {

    }

    @Override
    public void onSuccess(List<V2TIMGroupInfoResult> v2TIMGroupInfoResults) {

    }
});

현재 사용자 정의 필드는 서버에서만 구성할 수 있으며 채널에서는 구성할 수 없습니다.

"입력 중..." 상태

친구가 입력할 때, 다른 클라이언트에서 사용자는 사용자의 "입력 중..." 상태를 볼 수 있습니다. "입력 중..." 상태 메시지는:

1. 온라인 사용자만 받을 수 있습니다.

2. 로밍 서버에 저장되지 않습니다.

또한 성능 향상을 위해 다음 최적화를 수행했습니다:

  • "입력 중..." 상태 메시지 발송은 두 사용자가 서로에게 메시지를 보낸 후 20초 이내에만 트리거됩니다.
  • 같은 텍스트 메시지는 온라인 메시지 발송을 여러 번 트리거하지 않습니다.

개인 메시지

개인 메시지는 Discord 사용자들이 서로에게 보내는 메시지로, 친구 여부와 관계없이 전송됩니다.

관련 코드는 다음과 같습니다:

// 친구 추가
V2TIMManager.getFriendshipManager().addFriend(info, new V2TIMValueCallback<V2TIMFriendOperationResult>() {
            @Override
            public void onError(int i, String s) {
                // 친구 추가 실패
            }

            @Override
            public void onSuccess(V2TIMFriendOperationResult v2TIMFriendOperationResult) {
               // 친구 추가 성공
            }
});
// 연락처 얻기
V2TIMManager.getFriendshipManager().getFriendList(new V2TIMValueCallback<List<V2TIMFriendInfo>>() {
            @Override
            public void onError(int i, String s) {
               // 연락처 얻기 실패
            }

            @Override
            public void onSuccess(List<V2TIMFriendInfo> v2TIMFriendInfos) {
               // 연락처 얻기 성공
            }
});

개인 센터

온라인 상태

Discord 사용자 패널의 온라인 상태 기능은 채팅에서 제공하는 다음 온라인 상태 API를 통해 구현할 수 있습니다:

  • setSelfStatus: 자신의 사용자 정의 온라인 상태를 설정하는 API. 사용자의 온라인/오프라인 상태는 채팅에서 설정하며 개발자가 수정할 수 없습니다.
  • getUserStatus: 친구의 온라인 상태를 가져오는 API.
  • onUserStatusChanged: 친구의 온라인 상태 변경을 듣는 API.

관련 코드는 다음과 같습니다:

// 자신의 온라인 상태 설정
V2TIMUserStatus customStatus = new V2TIMUserStatus();
V2TIMManager.getInstance().setSelfStatus(customStatus, new V2TIMCallback() {
    @Override
    public void onSuccess() {

    }

    @Override
    public void onError(int i, String s) {

    }
});
// 친구의 온라인 상태 얻기
List<String> userIDList = new LinkerList();
V2TIMManager.getInstance().getUserStatus(userIDList, new V2TIMValueCallback<List<V2TIMUserStatus>>() {
    @Override
    public void onSuccess(List<V2TIMUserStatus> v2TIMUserStatuses) {

    }

    @Override
    public void onError(int i, String s) {

    }
});

개인 정보

개인 정보 관련 기능은 채팅에서 제공하는 다음 관계 체인 관련 API를 통해 구현할 수 있습니다:

// 사용자의 프로필 설정
final V2TIMUserFullInfo userFullInfo = new V2TIMUserFullInfo();
V2TIMManager.getInstance().setSelfInfo(userFullInfo, new V2TIMCallback() {
    @Override
    public void onError(int i, String s) {

    }

    @Override
    public void onSuccess() {

    }
});
// 사용자 프로필 얻기
List<String> userIDList = new LinkedList();
V2TIMManager.getInstance().getUsersInfo(userIDList, new V2TIMValueCallback<List<V2TIMUserFullInfo>>() {
    @Override
    public void onError(int i, String s) {

    }

    @Override
    public void onSuccess(List<V2TIMUserFullInfo> v2TIMUserFullInfos) {

    }
});

기타

검색



Discord는 다음과 같은 검색 기능을 제공합니다:

채팅은 풍부한 검색 기능을 제공하며, 다음을 포함합니다:

API 사용 방법은 공식 문서를 참조하십시오.

오프라인 푸시

채팅의 온라인 메시지는 오프라인 사용자에게 도달하지 못합니다. 이 문제를 해결하기 위해 장치 공급자가 제공하는 오프라인 푸시 기능을 채팅에 통합해야 합니다. 자세한 내용은 오프라인 푸시.

민감한 단어 검증

Discord에서 정보 및 구성을 전송할 때 콘텐츠를 필터링해야 합니다. 채팅은 사용자들이 준수를 위해 채팅을 사용할 수 있도록 돕기 위해 유사한 계획을 제공합니다.

지금 주문하기

구매 페이지로 빠르게 이동하려면 여기를 클릭하세요.