using RainOpsMini.Helpers;
using RainOpsMini.Services;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;
using System.Text.RegularExpressions;
namespace RainOpsMini.Plugins
{
public class CdkRedeemConfig
{
///
/// 是否启用插件
///
public bool Enabled { get; set; } = false;
///
/// 消息通知方式(AdminWarn=警告弹窗,AdminBroadcast=全服广播)
///
public string Method { get; set; } = "AdminWarn";
}
public class CdkRedeemPlugin : IPlugin, IDisposable
{
public string Name => "CDK兑换插件";
public string Description => "玩家在游戏内直接发送 CDK 即可激活";
public PluginCategory Category => PluginCategory.AdvancedFunction;
public bool IsEnabled => _config.Enabled;
private CdkRedeemConfig _config = new CdkRedeemConfig();
///
/// 构造函数,订阅RCON消息
///
public CdkRedeemPlugin()
{
Program.OnRconMessageReceived += OnRconMessage;
}
///
/// 获取当前配置
///
/// 配置对象
public object GetConfig() => _config;
///
/// 更新配置
///
/// JSON配置元素
public void UpdateConfig(JsonElement config)
{
try
{
var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
_config = JsonSerializer.Deserialize(config.GetRawText(), options) ?? new CdkRedeemConfig();
}
catch (Exception ex)
{
RainOpsLog.Log($"[{Name}] UpdateConfig Error: {ex.Message}");
}
}
///
/// 重置配置为默认值
///
public void ResetConfig()
{
_config = new CdkRedeemConfig();
}
///
/// 释放资源,取消订阅
///
public void Dispose()
{
Program.OnRconMessageReceived -= OnRconMessage;
}
///
/// 处理RCON消息回调
///
/// 消息内容
private async void OnRconMessage(string msg)
{
if (!_config.Enabled) return;
try
{
// 格式 1: ChatMessage: [SteamID] Name : message (旧版/标准 RCON)
var match = Regex.Match(msg, @"ChatMessage: \[(?\d+)\] (?.+) : (?.+)");
// 格式 2: [ChatChannel] [Online IDs:EOS: ... steam: SteamID] Name : message (新版/详细 RCON)
if (!match.Success)
{
match = Regex.Match(msg, @"\[Chat.+?\] \[Online IDs:EOS: .+? steam: (?\d+)\]\s+(?.+?) : (?.+)");
}
if (!match.Success) return;
string steamId = match.Groups["steamId"].Value;
string content = match.Groups["content"].Value.Trim();
// 逻辑: 检查内容是否符合 CDK 格式 (以 CDK 开头, 长度 16)
if (content.Length == 16 && content.StartsWith("CDK", StringComparison.OrdinalIgnoreCase))
{
// 调用服务进行兑换
var (success, message) = await CdkService.RedeemCdkAsync(content, steamId);
// 发送响应
SendResponse(steamId, message);
}
}
catch (Exception ex)
{
RainOpsLog.Log($"[{Name}] Error: {ex.Message}");
}
}
///
/// 发送响应消息给玩家
///
/// 玩家SteamID
/// 消息内容
private void SendResponse(string steamId, string message)
{
string cmd = _config.Method switch
{
"AdminBroadcast" => $"AdminBroadcast {message}",
_ => $"AdminWarn {steamId} {message}"
};
// 发送命令到 RCON
_ = SendRconCommand(cmd);
}
///
/// 发送RCON命令
///
/// 命令内容
private async Task SendRconCommand(string cmd)
{
if (Program.Client != null)
{
await Program.Client.SendCommandAsync(cmd);
}
}
}
}