> For the complete documentation index, see [llms.txt](https://docs.ggwp.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.ggwp.com/chinese-simplified/ggwp-ke-hu-duan-sdk/chu-li-zhi-cai.md).

# 处理制裁

客户端 SDK 可在所有频道中处理警告和制裁—— `聊天`, `游戏` 和 `语音` 。这些可以通过以下方式发放给用户： [由仪表板手动](/chinese-simplified/kong-zhi-tai-yong-hu-zhi-nan/wan-jia-lie-biao.md#sanctioning-a-player) 或者通过 [自动审核](https://docs.ggwp.com/chinese-simplified/ggwp-ke-hu-duan-sdk/pages/7c63e5fa896d75ed1453d3cd54d0269ed4379aad#id-4.2-ggwp-automod).&#x20;

制裁功能在 SDK 初始化后可用：

```csharp
GGWPSDK.Instance?.InitializeSDK("user_id", "username");

if (GGWPSDK.Instance?.SanctionsAPI != null)
{
    // 制裁回调已准备就绪
}
```

#### 订阅制裁

```csharp
using GGWP.Sanctions;
using GGWP.Utils.Async;

// 你可以在认证前创建订阅
var subscriber = new Subscriber<ChannelSanctionsState>(
    GGWPSDK.Instance?.SanctionsAPI.SubscribeSanctionsState()
);

// 但实时更新只有在代码交换认证后才会开始
string authCode = GetAuthCodeFromYourBackend();
await GGWPSDK.Instance?.AuthManager.ExchangeAuthCode(authCode);

// 现在连接已建立，你将收到实时更新
await foreach (var state in subscriber.GetStream())
{
    Debug.Log($"聊天状态：{state.chat.status}");
    Debug.Log($"游戏状态：{state.game.status}");
    Debug.Log($"语音状态：{state.voice.status}");
}
```

#### 监控制裁状态

订阅所有频道的制裁状态变更。请记住，实时更新只有在你完成认证后才会开始传入：

```csharp
using GGWP.Sanctions;
using GGWP.Utils.Async;

var subscriber = new Subscriber<ChannelSanctionsState>(
    GGWPSDK.Instance?.SanctionsAPI.SubscribeSanctionsState()
);

await foreach (var state in subscriber.GetStream())
{
    // 检查聊天频道
    Debug.Log($"聊天状态：{state.chat.status}");
    
    // 检查游戏频道
    Debug.Log($"游戏状态：{state.game.status}");
    
    // 检查语音频道
    Debug.Log($"语音状态：{state.voice.status}");
}
```

#### 了解频道状态

每个频道都有以下属性：

```csharp
// 获取特定频道状态
SanctionState chatState = state.chat;

// 状态（Active 或 Muted）
GGWP.Sanctions.Impl.MuteStatus status = chatState.status;

// 到期时间（如果被静音）
DateTime? expiryAt = chatState.expiryAt;

// 警告信息（如果已警告）
var warning = chatState.warning;

// 制裁详情（如果已被制裁）
var sanction = chatState.sanction;
```

#### 初始状态

当用户没有任何制裁时，所有频道都将处于 Active 状态。认证后建立连接时，你会收到这个初始状态：

```csharp
await foreach (var state in subscriber.GetStream())
{
    // 所有频道都以 Active 开始
    Assert.AreEqual(state.chat.status, GGWP.Sanctions.Impl.MuteStatus.Active);
    Assert.AreEqual(state.game.status, GGWP.Sanctions.Impl.MuteStatus.Active);
    Assert.AreEqual(state.voice.status, GGWP.Sanctions.Impl.MuteStatus.Active);
    
    // 无到期时间、警告或制裁
    Assert.Null(state.chat.expiryAt);
    Assert.Null(state.chat.warning);
    Assert.Null(state.chat.sanction);
    
    break;
}
```

#### 处理已应用的制裁

当制裁被应用时，监控状态变更。

```csharp
using System.Threading;

var subscriber = new Subscriber<ChannelSanctionsState>(
    GGWPSDK.Instance?.SanctionsAPI.SubscribeSanctionsState()
);

using var cts = new CancellationTokenSource();

await foreach (var state in subscriber.GetStream(cts.Token))
{
    if (state.game.status == GGWP.Sanctions.Impl.MuteStatus.Muted)
    {
        Debug.Log("用户在游戏频道中被静音");
        
        // 检查到期时间，看看静音何时解除
        if (state.game.expiryAt != null)
        {
            Debug.Log($"静音到期时间：{state.game.expiryAt}");
        }
        
        // 获取制裁详情以了解状态转换
        if (state.game.sanction != null)
        {
            var sanction = state.game.sanction.Value;
            Debug.Log($"先前状态：{sanction.previousStatus}");
            Debug.Log($"当前状态：{sanction.currentStatus}");
        }
        
        break;
    }
}
```

#### 推荐使用模式

推荐的模式是先认证，然后再订阅制裁。这可以确保连接立即建立，并且你不会错过任何初始状态信息：

```csharp
// 第 1 步：认证用户
string authCode = GetAuthCodeFromYourBackend();
var authResult = await GGWPSDK.Instance?.AuthManager.ExchangeAuthCode(authCode);

if (authResult == GGWP.Impl.Result.Success)
{
    // 第 2 步：现在订阅制裁
    var subscriber = new Subscriber<ChannelSanctionsState>(
        GGWPSDK.Instance?.SanctionsAPI.SubscribeSanctionsState()
    );

    // 第 3 步：实时处理制裁状态更新
    await foreach (var state in subscriber.GetStream())
    {
        // 按照发生时处理制裁状态变更
        Debug.Log($"聊天：{state.chat.status}");
    }
}
```

#### 使用取消令牌

使用取消令牌控制订阅生命周期。当你想停止监控制裁时，这很有用，例如当用户注销或关闭某个界面时：

```csharp
using System.Threading;

var cts = new CancellationTokenSource();

try
{
    await foreach (var state in subscriber.GetStream(cts.Token))
    {
        // 处理状态
        
        if (someCondition)
        {
            cts.Cancel(); // 停止监听
            break;
        }
    }
}
catch (OperationCanceledException)
{
    Debug.Log("制裁监控已取消");
}
```
