# 채널

## 채널

Game Chat에서 채널은 사용자들이 그룹으로 소통할 수 있는 가상의 공간입니다. \
채널을 통해 사용자는 특정 주제나 목적에 맞게 정보를 공유하고, 팀워크를 강화하며, 커뮤니케이션을 조직화할 수 있습니다. \
채널은 업무 효율을 높이고, 특정 그룹 내 커뮤니케이션을 중앙집중화하여 관리할 수 있는 유용한 도구입니다. \
아래는 Game Chat의 채널 기능에 대한 자세한 설명입니다.

### 채널의 주요 기능 <a href="#undefined" id="undefined"></a>

1. **그룹 커뮤니케이션**: 채널을 생성하여 특정 그룹의 멤버들과 소통할 수 있습니다. 이는 프로젝트 팀, 부서, 클럽 등 다양한 형태의 그룹에 적합합니다.
2. **메시지 및 파일 공유**: 채널 내에서는 텍스트 메시지, 이미지, 동영상, 문서 등 다양한 형태의 파일을 쉽게 공유할 수 있습니다.
3. **실시간 업데이트**: 채널 내의 모든 활동은 실시간으로 업데이트되어, 모든 참여자가 최신의 정보를 접할 수 있습니다.
4. **관리자 제어**: 채널의 생성자 또는 관리자는 채널 설정을 변경하거나 사용자를 추가/제거할 권한을 가집니다.
5. **통화 및 화상회의 기능**: 일부 채널에서는 음성 통화나 화상 회의를 지원하여, 멤버 간의 대화를 더욱 효과적으로 할 수 있습니다.
6. **알림 설정**: 사용자는 채널별로 알림을 설정하여 중요한 메시지를 놓치지 않도록 할 수 있습니다.
7. **검색 기능**: 채널 내의 대화나 파일을 쉽게 검색할 수 있어, 필요한 정보를 빠르게 찾을 수 있습니다.

### 채널 관리 <a href="#undefined" id="undefined"></a>

* **채널 생성**: 사용자는 목적에 맞는 채널을 새로 생성할 수 있으며, 채널명, 설명, 멤버 등의 정보를 설정할 수 있습니다.
* **채널 초대**: 채널의 관리자는 다른 사용자를 채널에 초대할 수 있습니다. 초대받은 사용자는 초대를 수락하거나 거절할 수 있습니다.
* **멤버 관리**: 관리자는 채널 멤버의 권한을 설정하거나 멤버를 채널에서 제거할 수 있습니다.

### 보안 <a href="#undefined" id="undefined"></a>

* **데이터 보안**: 채널 내의 모든 데이터는 암호화되어 전송되며, 서버에 안전하게 저장됩니다.
* **개인 정보 보호**: 채널 내에서 공유되는 정보는 채널 멤버들 사이에서만 접근 가능하며, 외부에 유출되지 않도록 보호됩니다.

Game Chat의 채널 기능을 활용하면 조직 내 또는 개인적인 소통을 원활하게 하고, 정보를 효과적으로 관리할 수 있습니다. 이러한 특성은 특히 대규모 조직이나 다양한 프로젝트를 관리할 때 매우 유용합니다.

### 채널 생성 <a href="#undefined" id="undefined"></a>

모든 대화는 채널을 생성해야 하며 채널에 참여해야 정상적으로 채팅을 할 수 있습니다. \
아래는 채널을 생성하고 구독하는 방법을 안내합니다.

```csharp
await nc.createChannel(new NBaseSDK.Channel
{
    name = "New Channel",
    type =[TYPE],    // PUBLIC or PRIVATE
    customField = [CustomField]
});
```

<table><thead><tr><th width="175">ID</th><th width="128">Type</th><th width="350">Description</th><th>Required</th></tr></thead><tbody><tr><td>NAME</td><td>string</td><td>채널 이름</td><td>O</td></tr><tr><td>TYPE</td><td>string</td><td>채널 종류 ( PUBLIC or PRIVATE )</td><td>O</td></tr><tr><td>UniqueID</td><td>string</td><td>고유한 ID</td><td>X</td></tr><tr><td>push</td><td>boolean</td><td>푸시 알림 여부</td><td>X</td></tr><tr><td>linkUrl</td><td>string</td><td>링크 여부</td><td>X</td></tr><tr><td>imageUrl</td><td>string</td><td>링크 여부</td><td>X</td></tr><tr><td>integrationId</td><td>string</td><td>연동 기능 (번역, 보이스 등)</td><td>X</td></tr><tr><td>disabled</td><td>string</td><td>채널 사용여부</td><td>X</td></tr><tr><td>members</td><td>array</td><td>PRIVATE 일 경우 참여 가능한 아이디</td><td>X</td></tr><tr><td>CustomField</td><td>string</td><td>사용자 정의 필드, JSON String으로 넣으면 다양하게 활용 가능</td><td>X</td></tr></tbody></table>

> 참고
>
> 보안을 위해서 클라이언트에서 채널을 생성하는 것보다는 서버를 통한 채널을 생성을 추천해 드립니다.

### 채널 구독 <a href="#undefined" id="undefined"></a>

원하는 채널에 가입(방 참여)합니다. 참여된 채널에는 구독 해제할 때까지 재접속 시에도 자동으로 참여하게 됩니다.

```csharp
Hashtable option = new Hashtable
{
    { "language", "en" }    // 자동 번역시 필요한 옵션 이외에도 다양한 옵션 추가 가능합니다.
};
await nc.subscribe([CHANNEL_ID], option);
```

### 채널 구독 해제 <a href="#undefined" id="undefined"></a>

해당 채널에 대한 가입을 해지합니다. 해당 채널에서 더 이상 메시지를 받을 수 없습니다.

```csharp
await nc.unsubscribe([CHANNEL_ID]);
```

### 참여자 리스트 <a href="#undefined" id="undefined"></a>

(특정 채널에 대해) 참여자 리스트를 가져올 수 있습니다.

```csharp
Hashtable filter = new Hashtable
{
    { "channel_id", channelId }
};
Hashtable sort = new Hashtable
{
    { "created_at", -1 }
};
Hashtable option = new Hashtable
{
    { "offset", 0 },
    { "per_page", 10 }
};
var subscriptions = await nc.getSubscriptions(filter, sort, option);
foreach (var subscription in subscriptions.edges)
{
    string id = subscription.node.id.ToString();
    Console.WriteLine("[CloudChatSample] id={0}", id);
}
```

* Parameters

<table><thead><tr><th width="147">ID</th><th width="125">Type</th><th>Description</th></tr></thead><tbody><tr><td>filter</td><td>object</td><td>쿼리를 필터 모든 필드에 대해서 검색 가능</td></tr><tr><td>sort</td><td>object</td><td>소트하고자 하는 필드의 필터 정의 (오름차순 "1", 내림차순 "-1")</td></tr><tr><td>option</td><td>object</td><td>옵션이 존재할 경우 아래 참고</td></tr></tbody></table>

* Options

<table><thead><tr><th width="152">ID</th><th width="124">Type</th><th>Description</th></tr></thead><tbody><tr><td>offset</td><td>number</td><td>시작 offset</td></tr><tr><td>per_page</td><td>number</td><td>리턴하는 개수(최대 100개)</td></tr></tbody></table>

#### **응용편**

특정 채널에 온라인 접속 상태인 접속자 목록만 가져오려면 filter에 online을 true로 추가해 주십시오.

```csharp
Hashtable filter = new Hashtable
{
    { "channel_id", [CHANNEL_ID] },
    { "online" , true}
};
Hashtable sort = new Hashtable
{
    { "created_at", -1 }
};
Hashtable option = new Hashtable
{
    { "offset", 0 },
    { "per_page", 10 }
};

var subscriptions = await nc.getSubscriptions(filter, sort, option);

```

#### **채널 구독**

* Subscription Data Class

  <table><thead><tr><th width="215">ID</th><th width="153">Type</th><th>Description</th></tr></thead><tbody><tr><td>id</td><td>string</td><td>유니크 아이디</td></tr><tr><td>channel_id</td><td>string</td><td>채널 아이디</td></tr><tr><td>user_id</td><td>string</td><td>유저 고유 아이디</td></tr><tr><td>created_at</td><td>string</td><td>생성 일자</td></tr><tr><td>online</td><td>boolean</td><td>온라인 여부</td></tr><tr><td>push</td><td>boolean</td><td>푸시 참여 여부</td></tr><tr><td>language</td><td>string</td><td>접속 언어</td></tr><tr><td>channel</td><td>string</td><td>채널 정보</td></tr><tr><td>mark.user_id</td><td>string</td><td>마지막 메시지 보낸 사용자</td></tr><tr><td>mark.message_id</td><td>string</td><td>마지막 메시지 아이디</td></tr><tr><td>mark.sort_id</td><td>string</td><td>마지막 메시지 정렬 ID</td></tr><tr><td>mark.unread</td><td>string</td><td>마지막 메시지 이후 안읽은 메시지 갯수</td></tr></tbody></table>

### 채널 정보 <a href="#undefined" id="undefined"></a>

* Channel Data Class

<table><thead><tr><th width="243">ID</th><th width="148">Type</th><th>Description</th></tr></thead><tbody><tr><td>id</td><td>string</td><td>채널 아이디 (unique)</td></tr><tr><td>project_id</td><td>string</td><td>프로젝트 아이디</td></tr><tr><td>unique_id</td><td>string</td><td>개발사에서 설정 가능한 채널 아이디 (unique)</td></tr><tr><td>name</td><td>string</td><td>채널 이름</td></tr><tr><td>user_id</td><td>string</td><td>(채널을 생성한) 유저 아이디</td></tr><tr><td>unique_id</td><td>string</td><td>채널 고유 ID</td></tr><tr><td>default_lang</td><td>string</td><td>기본 언어</td></tr><tr><td>lang</td><td>string</td><td>현재 접속 중인 이용자의 언어</td></tr><tr><td>members</td><td>string</td><td>Private일 경우 참여된 사용자 목록</td></tr><tr><td>last_message</td><td>array</td><td>마지막 메시지 정보 [MessageType] 참고</td></tr><tr><td>push</td><td>boolean</td><td>푸시 메시지 지원 여부 (Private 채널일 경우)</td></tr><tr><td>state</td><td>boolean</td><td>채널 상태</td></tr><tr><td>customField</td><td>string</td><td>사용자 정의 데이터</td></tr><tr><td>created_at</td><td>string</td><td>생성 일자</td></tr><tr><td>updated_at</td><td>string</td><td>갱신 일자</td></tr></tbody></table>

#### **채널 데이터 가져오기**

프로젝트의 채널 데이터를 목록 형태로 가져오려면 아래 코드를 사용해 주십시오.

```csharp
Hashtable filter = new Hashtable
{
    { "state", true }
};
Hashtable sort = new Hashtable
{
    { "created_at", -1 }
};
Hashtable option = new Hashtable
{
    { "offset", 0 },
    { "per_page", 10 }
};
var channels = await nc.getChannels(filter,sort,option);
foreach (var channel in channels.edges)
{
    string id = channel.node.id.ToString();
    Console.WriteLine("[CloudChatSample] id={0}", id);
}
```

* Parameters

<table><thead><tr><th width="123">ID</th><th width="90">Type</th><th width="393">Description</th><th>Required</th></tr></thead><tbody><tr><td>filter</td><td>object</td><td>쿼리를 필터 모든 필드에 대해서 검색 가능</td><td>O</td></tr><tr><td>sort</td><td>object</td><td>소트하고자 하는 필드의 필터 정의</td><td>X</td></tr><tr><td>option</td><td>object</td><td>옵션이 존재할 경우 아래를 참고</td><td>X</td></tr></tbody></table>

* Options

<table><thead><tr><th width="170">ID</th><th width="167">Type</th><th>Description</th></tr></thead><tbody><tr><td>offset</td><td>number</td><td>시작 offset</td></tr><tr><td>per_page</td><td>number</td><td>리턴하는 개수(최대 100개)</td></tr></tbody></table>

### 개별 채널

개별 채널에 대한 정보를 가져올 수 있습니다.

```csharp
Channel channel = await nc.getChannel(id);
```

### 채널 내 사용자 초대 <a href="#undefined" id="undefined"></a>

PRIVATE 채널의 경우 참여하고자 하는 사용자를 초대합니다.

```csharp
await nc.addUsers(newChannelId, new string[] { "ID", "ID" });
```

### 채널 내 사용자 삭제 <a href="#undefined" id="undefined"></a>

PRIVATE 채널의 경우 참여된 사용자를 삭제합니다.

```csharp
await nc.removeUsers(channelId, new string[] { "ID", "ID" });
```

### 채널 내 사용자 차단 <a href="#undefined" id="undefined"></a>

채널 내에 사용자를 차단합니다. 채널을 생성한 권한을 가지고 있는 유저나 전체 관리자만 사용이 가능합니다.

```csharp
Hashtable option = new Hashtable
{
    { "timeout", [종료시간(초)] },
    { "reason", [차단사유] }
};
await nc.banUser(channelId, userId, options);
```

* Options Data Class

<table><thead><tr><th width="195">ID</th><th width="186">Type</th><th>Description</th></tr></thead><tbody><tr><td>timeout</td><td>string</td><td>차단 시간 (seconds)</td></tr><tr><td>reason</td><td>string</td><td>차단 사유</td></tr></tbody></table>

### 채널 내 사용자 차단 해제 <a href="#undefined" id="undefined"></a>

채널 내에 차단한 사용자의 차단을 해제합니다. 채널을 생성한 권한을 가지고 있는 유저나 전체 관리자만 사용이 가능합니다.

```csharp
await nc.unbanUser(channelId, userId);
```

### 채널 삭제 <a href="#undefined" id="undefined"></a>

해당 채널을 삭제합니다 (한 개 또는 여러 개를 삭제할 수 있습니다).

```csharp
Channel channel = await nc.deleteChannel([CHANNEL_ID]);
```

### 채널 수정 <a href="#undefined" id="undefined"></a>

채널 정보를 업데이트합니다.

```csharp
Channel channel = await nc.updateChannel([CHANNEL_ID],new NBaseSDK.Channel
{
    name = "Update Channel",
    type =[TYPE],    // PUBLIC or PRIVATE
    customField = [CustomField]
});
```
