# Game Mailbox

Chức năng Game Mailbox giúp làm được các việc sau:

* Gửi các thông báo update, hoặc các thông tin sự kiện ... về cho người chơi trong game.
* Gửi các phần thưởng cho người chơi, để người chơi nhận thưởng.
* Gửi một link cho người chơi qua mail, và người chơi bấm vào link đó để xem thông tin, và có thể nhận một phần thưởng nào đó.
* Người chơi đến một mốc nào đó trong game, và gửi kích hoạt lên server, để server gửi 1 mail thưởng cho người chơi.

Có thể sử dụng Plugin MailBox thay vì phải thực thi từng API, [xem hướng dẫn tại đây](https://cscmobi-gsm.gitbook.io/csc-plugin/mail-box)

Trong Plugin MailBox **không** áp dụng cho API: [Kích hoạt mail tự động](#id-7.-kich-hoat-mail-tu-dong)

## 1. Lấy số lượng mail chưa đọc.

* Dùng để lấy số lượng các mail chưa đọc và hiển thị cho người chơi biết có bao nhiêu mail chưa đọc.

```csharp
void GetMailCount(Action<long> onComplete, Action<long, string> errorCallback = null)
```

**Các tham số**

* **`onComplete`**: Hàm xử lý với param là số lượng các mail chưa đọc
* **`errorCallback`**: Hàm xử lý khi có lỗi xảy ra

Code mẫu:

```csharp
GSMMailBox.GetMailCount((count) =>
{
    Debug.Log($"Mail Count: {count}");
});

```

## 2. Lấy số lượng mail chưa đọc theo từng loại mail.

* Dùng để lấy số lượng các mail chưa đọc theo từng loại.
* Ví dụ khi biết loại mail Reward có 3 mail chưa đọc, thì lúc này sẽ có tutorial bàn tay chỉ vào để khiến user mở ra, đọc mail và nhận thưởng, giúp tăng tương tác vào mailbox của user.

```csharp
void GetMailNumber(Action<MailNumnberInfo> onComplete, Action<long, string> errorCallback = null)
```

**Các tham số**

* **`onComplete`**: Hàm xử lý với param là thông tin số lượng các mail chưa đọc theo từng loại
* **`errorCallback`**: Hàm xử lý khi có lỗi xảy ra

Code mẫu:

```csharp
GSMMailBox.GetMailNumber((info) =>
{
    int normal=info.Normal; //Số lượng mail chưa đọc loại Normal
    int reward=info.Reward; //Số lượng mail chưa đọc loại Reward
    int openlink = info.OpenLink; //Số lượng mail chưa đọc loại OpenLink
    int input= info.Input; //Số lượng mail chưa đọc loại Input
    int total=info.Total; //Tổng số lượng mail chưa đọc
    Debug.Log($"Mail Reward: {reward}");
});

```

## 3. Lấy danh sách mail

* Lấy danh sách các mail về và xử lý logic tùy theo loại mail
* Server chỉ trả về tối đa 30 mail, nếu người chơi muốn nhận thêm, thì phải đọc và xóa các mail đã sử dụng.
* Mỗi mail nếu chưa đọc và chưa nhận thưởng, hoặc chưa sử dụng thì sẽ chỉ tồn tại tối đa trong 30 ngày.
* Nếu mail đã được sử dụng thì sẽ hiển thị trong vòng 3 ngày, sẽ tự động bị xóa.

```csharp
 void GetMails(Action<MailBoxItem[]> onComplete, string lang = "en", Action<long, string> errorCallback = null)
```

**Các tham số**

* **`onComplete`**: Hàm xử lý với param là danh sách các mail
* **`lang`** : Mã ngôn ngữ tiêu chuẩn theo từng quốc gia, và là mã ngôn ngữ mà người chơi đang sử dụng trong game.
* **`errorCallback`**: Hàm xử lý khi có lỗi xảy ra

Code mẫu:

```csharp
//Lấy chi tiết danh sách mail
GSMMailBox.GetMails(results =>
{
    foreach (var mail in results)
    {
        Debug.Log(JsonUtility.ToJson(mail));
        //Tiếp tục xử lý mail
    }
}, LanguageCode.vi);

```

<mark style="color:red;">**Xử lý logic theo từng loại mail**</mark>

* Nếu `type == Normal` thì hiển thị nội dung mail, và đánh đấu dọc mail đã đọc thì dùng `GSMMailBox.ReadMail(mailId);`
* Nếu `type == Reward` thì hiển thị nội dung mail, và [đánh đấu dọc mail đã đọc](#3.-danh-dau-da-doc-mail) thì dùng `GSMMailBox.ReadMail(mailId);`. Sau đó xử lý phần thưởng trả cho user từ trường `reward` và [đánh đấu đã sử dụng mail](#4.-danh-dau-da-su-dung-mail) dùng `GSMMailBox.UseMail(mailId);`
* Nếu `type == Openlink` thì hiển thị nội dung mail, và [đánh đấu dọc mail đã đọc](#3.-danh-dau-da-doc-mail) thì dùng `GSMMailBox.ReadMail(mailId);`. Sau đó xử lý redirect sang link từ trường `link` và [đánh đấu đã sử dụng mail](#4.-danh-dau-da-su-dung-mail) dùng `GSMMailBox.UseMail(mailId);`
* Nếu `type == Input` thì sẽ hiển thị 1 ô nhập, và có nút submit, khi nhấn nút submit thì sẽ gửi giá trị nhập lên server theo api ở mục [5. Gửi giá trị ô nhập](#5.-gui-gia-tri-o-nhap)

## 4. Đánh dấu đã đọc mail

* Dùng để khi mở mail ra đọc, thì đánh dấu lại.

```csharp
void ReadMail(string mailId, Action onSuccess = null, Action<long, string> errorCallback = null)
```

**Các tham số**

* **`mailId`**: Id của mail muốn đánh dấu đọc.
* **`onSuccess`**: Hàm xử lý khi đánh dấu đọc mail thành công.
* **`errorCallback`**: Hàm xử lý khi có lỗi xảy ra, và param là lý do, hoặc lỗi

Code mẫu:

```csharp
 GSMMailBox.ReadMail(mailId, () =>
{
    //xử lý khi thành công
}, (error) =>
{
    //xử lý khi lỗi

});
```

## 5. Đánh dấu đã sử dụng mail

* Dùng để khi mail đã claim phần thưởng, hoặc đã openlink thì đánh dấu mail đã được sử dụng.
* Mục đích để server sẽ không cho phép claim cho lần sau.
* Các mail đã sử dụng thì sau 3 ngày sẽ tự động bị xóa.

```csharp
void UseMail(string mailId, Action onSuccess = null, Action<long, string> errorCallback = null)
```

**Các tham số**

* **`mailId`**: Id của mail muốn đánh dấu sử dụng.
* **`onSuccess`**: Hàm xử lý khi đánh dấu sử dụng mail thành công.
* **`errorCallback`**: Hàm xử lý khi có lỗi xảy ra, và param là lý do, hoặc lỗi.

Code mẫu:

```csharp
 GSMMailBox.UseMail(mailId, () =>
{
    //xử lý khi thành công
}, (error) =>
{
    //xử lý khi lỗi

});
```

## 6. Gửi giá trị ô nhập

* Dùng để khi mail là loại ô nhập, thì gửi giá trị ô nhập lên server xử lý.
* Mail sẽ được đánh dấu là đã sử dụng khi submit thành công.
* Các mail đã sử dụng thì sau 3 ngày sẽ tự động bị xóa.
* Khi gửi thành công thì nếu mail có reward thì trả reward cho user.

```csharp
void SubmitInput(string mailId, string inputValue, Action onSuccess = null, Action<long, string> errorCallback = null)
```

**Các tham số**

* **`mailId`**: Id của mail đang chọn.
* **`inputValue`**: Giá trị của ô nhập
* **`onSuccess`**: Hàm xử lý khi submit giá trị inputValue thành công.
* **`errorCallback`**: Hàm xử lý khi có lỗi xảy ra, và param là lý do, hoặc lỗi.

Code mẫu:

```csharp
GSMMailBox.SubmitInput(mail.id, "tuyennv@cscmobi.com", () =>
{
    Debug.Log("Submit Email success");
}, (statusCode, error) =>
{
    //Hiển thị popup message lỗi
});
```

## 7. Kích hoạt mail tự động

* Tình huống kịch bản game muốn, khi user đến một level (ví dụ là: `level7`), hay 1 điểm nào đó thì sẽ nhận được mail có phần thưởng.

```csharp
void ActivatedTriggerPoint(string triggerPoint, Action onSuccess = null, Action<long, string> errorCallback = null)
```

**Các tham số**

* **`triggerPoint`**: Điểm kích hoạt mail.
* **`onSuccess`**: Hàm xử lý khi kích hoạt mail thành công.
* **`errorCallback`**: Hàm xử lý khi có lỗi xảy ra.

Code mẫu:

```csharp
GSMMailBox.ActivatedTriggerPoint("level7",
    ()=>{Debug.Log("ActivatedTriggerPoint Success")},
    ()=>{Debug.Log("ActivatedTriggerPoint fail")}
);
```

## 8. Xóa mail

* Chỉ nên xóa các mail đã đọc, và đã used

```csharp
void DeleteMails(string[] mailIds, Action onSuccess = null, Action<long, string> errorCallback = null)
```

**Các tham số**

* **`mailIds`**: Danh sách id của các mail muốn xóa.
* **`onSuccess`**: Hàm xử lý khi xóa mail thành công.
* **`errorCallback`**: Hàm xử lý khi có lỗi xảy ra.

Code mẫu:

```csharp
GSMMailBox.DeleteMails(new string[]{"64cb37d09d59cbc0f9b3d6e5"},
    ()=>{Debug.Log("Delete Mail Success")},
    ()=>{Debug.Log("Delete Mail fail")}
);
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://developer.cscmobicorp.com/gsm/gsm-sdk/iii.-gsm-api/game-mailbox.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
