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); } } } }