diff --git a/OshimaWebAPI/Controllers/FunGameController.cs b/OshimaWebAPI/Controllers/FunGameController.cs index c33a124..6fd190f 100644 --- a/OshimaWebAPI/Controllers/FunGameController.cs +++ b/OshimaWebAPI/Controllers/FunGameController.cs @@ -19,7 +19,8 @@ namespace Oshima.FunGame.WebAPI.Controllers [Route("[controller]")] public class FunGameController(ILogger logger) : ControllerBase { - private readonly ILogger _logger = logger; + private ILogger Logger { get; set; } = logger; + private const int drawCardReduce = 2000; private const int drawCardReduce_Material = 10; private const string noSaved = "你还没有创建存档!请发送【创建存档】创建。"; diff --git a/OshimaWebAPI/Controllers/QQBotController.cs b/OshimaWebAPI/Controllers/QQBotController.cs index 2ef9de1..cb742e9 100644 --- a/OshimaWebAPI/Controllers/QQBotController.cs +++ b/OshimaWebAPI/Controllers/QQBotController.cs @@ -12,11 +12,12 @@ namespace Oshima.FunGame.WebAPI.Controllers { [ApiController] [Route("[controller]")] - public class QQBotController(IOptions botConfig, ILogger logger, QQBotService service) : ControllerBase + public class QQBotController(IOptions botConfig, ILogger logger, QQBotService service, RainBOTService fungameService) : ControllerBase { - private readonly BotConfig _botConfig = botConfig.Value; - private readonly ILogger _logger = logger; - private readonly QQBotService _service = service; + private BotConfig BotConfig { get; set; } = botConfig.Value; + private ILogger Logger { get; set; } = logger; + private QQBotService Service { get; set; } = service; + private RainBOTService FungameService { get; set; } = fungameService; [HttpPost] public async Task Post([FromBody] Payload? payload) @@ -26,7 +27,7 @@ namespace Oshima.FunGame.WebAPI.Controllers return BadRequest("Payload 格式无效"); } - _logger.LogDebug("收到 Webhook 请求:{payload.Op}", payload.Op); + Logger.LogDebug("收到 Webhook 请求:{payload.Op}", payload.Op); try { @@ -41,13 +42,13 @@ namespace Oshima.FunGame.WebAPI.Controllers } else { - _logger.LogWarning("未处理操作码:{payload.Op}", payload.Op); + Logger.LogWarning("未处理操作码:{payload.Op}", payload.Op); return Ok(); } } catch (Exception e) { - _logger.LogError("Error: {e}", e); + Logger.LogError("Error: {e}", e); return StatusCode(500, "服务器内部错误"); } } @@ -57,10 +58,10 @@ namespace Oshima.FunGame.WebAPI.Controllers ValidationRequest? validationPayload = JsonSerializer.Deserialize(payload.Data.ToString() ?? ""); if (validationPayload is null) { - _logger.LogError("反序列化验证 Payload 失败"); + Logger.LogError("反序列化验证 Payload 失败"); return BadRequest("无效的验证 Payload 格式"); } - string seed = _botConfig.Secret; + string seed = BotConfig.Secret; while (seed.Length < 32) { seed += seed; @@ -88,13 +89,13 @@ namespace Oshima.FunGame.WebAPI.Controllers Signature = signature }; string responseJson = JsonSerializer.Serialize(response); - _logger.LogDebug("验证相应:{responseJson}", responseJson); + Logger.LogDebug("验证相应:{responseJson}", responseJson); return Ok(response); } private async Task HandleEventAsync(Payload payload) { - _logger.LogDebug("处理事件:{EventType}, 数据:{Data}", payload.EventType, payload.Data); + Logger.LogDebug("处理事件:{EventType}, 数据:{Data}", payload.EventType, payload.Data); try { @@ -105,26 +106,27 @@ namespace Oshima.FunGame.WebAPI.Controllers if (c2cMessage != null) { // TODO - _logger.LogInformation("收到来自用户 {c2cMessage.Author.UserOpenId} 的消息:{c2cMessage.Content}", c2cMessage.Author.UserOpenId, c2cMessage.Content); - // 上传图片 - string url = $"{Request.Scheme}://{Request.Host}{Request.PathBase}/images/zi/dj1.png"; - var (fileUuid, fileInfo, ttl, error) = await _service.UploadC2CMediaAsync(c2cMessage.Author.UserOpenId, 1, url); - _logger.LogDebug("发送的图片地址:{url}", url); - if (string.IsNullOrEmpty(error)) - { - // 回复消息 - await _service.SendC2CMessageAsync(c2cMessage.Author.UserOpenId, $"你发送的消息是:{c2cMessage.Content}", msgId: c2cMessage.Id); - // 回复富媒体消息 - await _service.SendC2CMessageAsync(c2cMessage.Author.UserOpenId, "", msgType: 7, media: new { file_info = fileInfo }, msgId: c2cMessage.Id); - } - else - { - _logger.LogError("上传图片失败:{error}", error); - } + Logger.LogInformation("收到来自用户 {c2cMessage.Author.UserOpenId} 的消息:{c2cMessage.Content}", c2cMessage.Author.UserOpenId, c2cMessage.Content); + //// 上传图片 + //string url = $"{Request.Scheme}://{Request.Host}{Request.PathBase}/images/zi/dj1.png"; + //var (fileUuid, fileInfo, ttl, error) = await _service.UploadC2CMediaAsync(c2cMessage.Author.UserOpenId, 1, url); + //_logger.LogDebug("发送的图片地址:{url}", url); + //if (string.IsNullOrEmpty(error)) + //{ + // // 回复消息 + // await _service.SendC2CMessageAsync(c2cMessage.Author.UserOpenId, $"你发送的消息是:{c2cMessage.Content}", msgId: c2cMessage.Id); + // // 回复富媒体消息 + // await _service.SendC2CMessageAsync(c2cMessage.Author.UserOpenId, "", msgType: 7, media: new { file_info = fileInfo }, msgId: c2cMessage.Id); + //} + //else + //{ + // _logger.LogError("上传图片失败:{error}", error); + //} + await FungameService.Handler(c2c: c2cMessage); } else { - _logger.LogError("反序列化 C2C 消息数据失败"); + Logger.LogError("反序列化 C2C 消息数据失败"); return BadRequest("无效的 C2C 消息数据格式"); } break; @@ -132,31 +134,33 @@ namespace Oshima.FunGame.WebAPI.Controllers GroupAtMessage? groupAtMessage = JsonSerializer.Deserialize(payload.Data.ToString() ?? ""); if (groupAtMessage != null) { + groupAtMessage.Detail = groupAtMessage.Detail.Trim(); // TODO - _logger.LogInformation("收到来自群组 {groupAtMessage.GroupOpenId} 的消息:{groupAtMessage.Content}", groupAtMessage.GroupOpenId, groupAtMessage.Content); + Logger.LogInformation("收到来自群组 {groupAtMessage.GroupOpenId} 的消息:{groupAtMessage.Content}", groupAtMessage.GroupOpenId, groupAtMessage.Content); // 回复消息 - await _service.SendGroupMessageAsync(groupAtMessage.GroupOpenId, $"你发送的消息是:{groupAtMessage.Content}", msgId: groupAtMessage.Id); + //await _service.SendGroupMessageAsync(groupAtMessage.GroupOpenId, $"你发送的消息是:{groupAtMessage.Content}", msgId: groupAtMessage.Id); + await FungameService.Handler(groupAt: groupAtMessage); } else { - _logger.LogError("反序列化群聊消息数据失败"); + Logger.LogError("反序列化群聊消息数据失败"); return BadRequest("无效的群聊消息数据格式"); } break; default: - _logger.LogWarning("未定义事件:{EventType}", payload.EventType); + Logger.LogWarning("未定义事件:{EventType}", payload.EventType); break; } return Ok(); } catch (JsonException e) { - _logger.LogError("反序列化过程遇到错误:{e}", e); + Logger.LogError("反序列化过程遇到错误:{e}", e); return BadRequest("Invalid JSON format"); } catch (Exception e) { - _logger.LogError("Error: {e}", e); + Logger.LogError("Error: {e}", e); return StatusCode(500, "服务器内部错误"); } } diff --git a/OshimaWebAPI/Models/QQBot.cs b/OshimaWebAPI/Models/QQBot.cs index 731e6bf..d15e2a8 100644 --- a/OshimaWebAPI/Models/QQBot.cs +++ b/OshimaWebAPI/Models/QQBot.cs @@ -74,7 +74,17 @@ namespace Oshima.FunGame.WebAPI.Models public string Url { get; set; } = ""; } - public class C2CMessage + public interface IBotMessage + { + public string Id { get; } + public bool IsGroup { get; } + public string Detail { get; set; } + public string Timestamp { get; } + public string OpenId { get; } + public string AuthorOpenId { get; } + } + + public class C2CMessage : IBotMessage { [JsonPropertyName("id")] public string Id { get; set; } = ""; @@ -90,9 +100,18 @@ namespace Oshima.FunGame.WebAPI.Models [JsonPropertyName("attachments")] public Attachment[] Attachments { get; set; } = []; + + public string Detail + { + get => Content; + set => Content = value; + } + public string OpenId => Author.UserOpenId; + public bool IsGroup => false; + public string AuthorOpenId => Author.UserOpenId; } - public class GroupAtMessage + public class GroupAtMessage : IBotMessage { [JsonPropertyName("id")] public string Id { get; set; } = ""; @@ -111,6 +130,15 @@ namespace Oshima.FunGame.WebAPI.Models [JsonPropertyName("attachments")] public Attachment[] Attachments { get; set; } = []; + + public string Detail + { + get => Content; + set => Content = value; + } + public string OpenId => GroupOpenId; + public bool IsGroup => true; + public string AuthorOpenId => Author.MemberOpenId; } public class MediaResponse diff --git a/OshimaWebAPI/OshimaWebAPI.cs b/OshimaWebAPI/OshimaWebAPI.cs index 23864b3..db7d4b7 100644 --- a/OshimaWebAPI/OshimaWebAPI.cs +++ b/OshimaWebAPI/OshimaWebAPI.cs @@ -6,6 +6,7 @@ using Oshima.Core.Configs; using Oshima.Core.Constant; using Oshima.FunGame.OshimaServers.Service; using Oshima.FunGame.WebAPI.Constant; +using Oshima.FunGame.WebAPI.Controllers; using Oshima.FunGame.WebAPI.Models; using Oshima.FunGame.WebAPI.Services; @@ -44,6 +45,9 @@ namespace Oshima.FunGame.WebAPI { builder.Services.AddMemoryCache(); builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); // 使用 Configure 从配置源绑定 builder.Services.Configure(builder.Configuration.GetSection("Bot")); } diff --git a/OshimaWebAPI/Services/QQBotService.cs b/OshimaWebAPI/Services/QQBotService.cs index 1397ab1..a7c6dbe 100644 --- a/OshimaWebAPI/Services/QQBotService.cs +++ b/OshimaWebAPI/Services/QQBotService.cs @@ -9,10 +9,11 @@ namespace Oshima.FunGame.WebAPI.Services { public class QQBotService(IOptions botConfig, ILogger logger, IHttpClientFactory httpClientFactory, IMemoryCache memoryCache) { - private readonly BotConfig _botConfig = botConfig.Value; - private readonly ILogger _logger = logger; - private readonly HttpClient _httpClient = httpClientFactory.CreateClient(); - private readonly IMemoryCache _memoryCache = memoryCache; + private BotConfig BotConfig { get; set; } = botConfig.Value; + private ILogger Logger { get; set; } = logger; + private HttpClient HttpClient { get; set; } = httpClientFactory.CreateClient(); + private IMemoryCache MemoryCache { get; set; } = memoryCache; + private const string AccessTokenCacheKey = "QQBotAccessToken"; public async Task SendC2CMessageAsync(string openid, string content, int msgType = 0, object? media = null, string? msgId = null, int? msgSeq = null) @@ -30,7 +31,7 @@ namespace Oshima.FunGame.WebAPI.Services string accessToken = await GetAccessTokenAsync(); HttpRequestMessage request = new(HttpMethod.Post, $"https://api.sgroup.qq.com{url}"); request.Headers.Authorization = new AuthenticationHeaderValue("QQBot", accessToken); - _logger.LogDebug("使用的 Access Token:{accessToken}", accessToken); + Logger.LogDebug("使用的 Access Token:{accessToken}", accessToken); Dictionary requestBody = new() { { "content", content }, @@ -50,11 +51,11 @@ namespace Oshima.FunGame.WebAPI.Services } request.Content = new StringContent(JsonSerializer.Serialize(requestBody), System.Text.Encoding.UTF8, "application/json"); - HttpResponseMessage response = await _httpClient.SendAsync(request); + HttpResponseMessage response = await HttpClient.SendAsync(request); if (!response.IsSuccessStatusCode) { string errorBody = await response.Content.ReadAsStringAsync(); - _logger.LogError("状态码:{response.StatusCode},错误信息:{errorBody}", response.StatusCode, errorBody); + Logger.LogError("状态码:{response.StatusCode},错误信息:{errorBody}", response.StatusCode, errorBody); } } @@ -73,7 +74,7 @@ namespace Oshima.FunGame.WebAPI.Services string accessToken = await GetAccessTokenAsync(); HttpRequestMessage request = new(HttpMethod.Post, $"https://api.sgroup.qq.com{url}"); request.Headers.Authorization = new AuthenticationHeaderValue("QQBot", accessToken); - _logger.LogDebug("使用的 Access Token:{accessToken}", accessToken); + Logger.LogDebug("使用的 Access Token:{accessToken}", accessToken); Dictionary requestBody = new() { { "file_type", fileType }, @@ -82,7 +83,7 @@ namespace Oshima.FunGame.WebAPI.Services }; request.Content = new StringContent(JsonSerializer.Serialize(requestBody), System.Text.Encoding.UTF8, "application/json"); - HttpResponseMessage response = await _httpClient.SendAsync(request); + HttpResponseMessage response = await HttpClient.SendAsync(request); if (!response.IsSuccessStatusCode) { string errorBody = await response.Content.ReadAsStringAsync(); @@ -94,13 +95,13 @@ namespace Oshima.FunGame.WebAPI.Services { return (null, null, 0, "反序列化富媒体消息失败。"); } - _logger.LogDebug("接收到的富媒体消息:{mediaResponse.FileInfo},有效时间:{mediaResponse.Ttl}", mediaResponse.FileInfo, mediaResponse.Ttl); + Logger.LogDebug("接收到的富媒体消息:{mediaResponse.FileInfo},有效时间:{mediaResponse.Ttl}", mediaResponse.FileInfo, mediaResponse.Ttl); return (mediaResponse.FileUuid, mediaResponse.FileInfo, mediaResponse.Ttl, null); } public async Task GetAccessTokenAsync() { - if (_memoryCache.TryGetValue(AccessTokenCacheKey, out string? accessToken) && !string.IsNullOrEmpty(accessToken)) + if (MemoryCache.TryGetValue(AccessTokenCacheKey, out string? accessToken) && !string.IsNullOrEmpty(accessToken)) { return accessToken; } @@ -112,9 +113,9 @@ namespace Oshima.FunGame.WebAPI.Services { HttpRequestMessage request = new(HttpMethod.Post, "https://bots.qq.com/app/getAppAccessToken") { - Content = new StringContent(JsonSerializer.Serialize(new { appId = _botConfig.AppId, clientSecret = _botConfig.Secret }), System.Text.Encoding.UTF8, "application/json") + Content = new StringContent(JsonSerializer.Serialize(new { appId = BotConfig.AppId, clientSecret = BotConfig.Secret }), System.Text.Encoding.UTF8, "application/json") }; - HttpResponseMessage response = await _httpClient.SendAsync(request); + HttpResponseMessage response = await HttpClient.SendAsync(request); response.EnsureSuccessStatusCode(); string responseBody = await response.Content.ReadAsStringAsync(); AccessTokenResponse? tokenResponse = JsonSerializer.Deserialize(responseBody); @@ -122,8 +123,8 @@ namespace Oshima.FunGame.WebAPI.Services { throw new Exception("获取 Access Token 失败!"); } - _memoryCache.Set(AccessTokenCacheKey, tokenResponse.AccessToken, TimeSpan.FromSeconds(expiresIn - 60)); - _logger.LogDebug("获取到 Access Token:{tokenResponse.AccessToken}", tokenResponse.AccessToken); + MemoryCache.Set(AccessTokenCacheKey, tokenResponse.AccessToken, TimeSpan.FromSeconds(expiresIn - 60)); + Logger.LogDebug("获取到 Access Token:{tokenResponse.AccessToken}", tokenResponse.AccessToken); return tokenResponse.AccessToken; } } diff --git a/OshimaWebAPI/Services/RainBOTService.cs b/OshimaWebAPI/Services/RainBOTService.cs new file mode 100644 index 0000000..eb1e2c5 --- /dev/null +++ b/OshimaWebAPI/Services/RainBOTService.cs @@ -0,0 +1,1817 @@ +using System.Text.RegularExpressions; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.Extensions.Logging; +using Milimoe.FunGame.Core.Api.Utility; +using Oshima.Core.Configs; +using Oshima.FunGame.WebAPI.Constant; +using Oshima.FunGame.WebAPI.Controllers; +using Oshima.FunGame.WebAPI.Models; + +namespace Oshima.FunGame.WebAPI.Services +{ + public class RainBOTService(FunGameController controller, QQController qqcontroller, QQBotService service, ILogger logger) + { + private static List FunGameItemType { get; } = ["卡包", "武器", "防具", "鞋子", "饰品", "消耗品", "魔法卡", "收藏品", "特殊物品", "任务物品", "礼包", "其他"]; + private bool FunGameSimulation { get; set; } = false; + private FunGameController Controller { get; } = controller; + private QQController QQController { get; } = qqcontroller; + private QQBotService Service { get; } = service; + private ILogger Logger { get; } = logger; + + private async Task SendAsync(IBotMessage msg, string title, string content, int msgType = 0, object? media = null) + { + Statics.RunningPlugin?.Controller.WriteLine(title, Milimoe.FunGame.Core.Library.Constant.LogLevel.Debug); + if (msg.IsGroup) + { + await Service.SendGroupMessageAsync(msg.OpenId, content, msgType, media, msg.Id); + } + else + { + content = content.Trim(); + await Service.SendC2CMessageAsync(msg.OpenId, content, msgType, media, msg.Id); + } + } + + public async Task Handler(GroupAtMessage? groupAt = null, C2CMessage? c2c = null) + { + bool result = true; + try + { + IBotMessage? e = null; + string openid = ""; + long qq = 0; + if (groupAt != null) + { + e = groupAt; + } + else if (c2c != null) + { + e = c2c; + } + + if (e is null) + { + return false; + } + + string isGroup = e.IsGroup ? "群聊" : "私聊"; + + openid = e.AuthorOpenId; + if (QQOpenID.QQAndOpenID.TryGetValue(openid, out long temp_qq)) + { + qq = temp_qq; + } + + if (e.Detail.StartsWith("绑定")) + { + string detail = e.Detail.Replace("绑定", ""); + string msg = ""; + if (long.TryParse(detail, out temp_qq)) + { + msg = NetworkUtility.JsonDeserialize(QQController.Bind(new(openid, temp_qq))) ?? ""; + } + else + { + msg = "绑定失败,请提供一个正确的QQ号!"; + } + await SendAsync(e, "绑定", msg); + } + + if (e.Detail == "帮助" || e.Detail == "帮助1") + { + await SendAsync(e, "饭给木", @"《饭给木》游戏指令列表(第 1 / 5 页) +1、创建存档:创建存档,生成随机一个自建角色(序号固定为1) +2、我的库存/我的背包/查看库存 [页码]:显示所有角色、物品库存,每个角色和物品都有一个专属序号 +3、我的库存 <物品类型> [页码]:卡包/武器/防具/鞋子/饰品/消耗品/魔法卡等... +4、分类库存 <物品索引> [页码]:物品索引从0开始,同上... +5、物品库存 [页码]:显示所有角色 +* 上述三指令会将物品按品质倒序和数量倒序排序,整合物品序号和数量显示物品库存 +6、角色库存 [页码]:显示所有角色 +7、我角色 [角色序号]:查看指定序号角色的简略信息,缺省为1 +8、我的角色 [角色序号]:查看指定序号角色的详细信息,缺省为1 +9、角色重随:重新随机自建角色的属性,需要花材料 +10、我的物品 <物品序号>:查看指定序号物品的详细信息 +11、设置主战 <角色序号>:将指定序号角色设置为主战 +发送【帮助2】查看第 2 页"); + } + + if (e.Detail == "帮助2") + { + await SendAsync(e, "饭给木", @"《饭给木》游戏指令列表(第 2 / 5 页) +12、装备 <角色序号> <物品序号>:装备指定物品给指定角色 +13、取消装备 <角色序号> <装备槽序号>:卸下角色指定装备槽上的物品 +* 装备槽序号从1开始,卡包/武器/防具/鞋子/饰品1/饰品2 +14、角色改名:修改名字,需要金币 +15、抽卡/十连抽卡:2000金币一次,还有材料抽卡/材料十连抽卡,10材料1次 +16、开启练级 [角色序号]:让指定角色启动练级模式,缺省为1 +17、练级结算:收取奖励,最多累计24小时的收益 +18、练级信息:查看当前进度 +19、角色升级 [角色序号]:升到不能升为止 +20、角色突破 [角色序号]:每10/20/30/40/50/60级都要突破才可以继续升级 +21、突破信息 [角色序号]:查看下一次突破信息 +发送【帮助3】查看第 3 页"); + } + + if (e.Detail == "帮助3") + { + await SendAsync(e, "饭给木", @"《饭给木》游戏指令列表(第 3 / 5 页) +22、普攻升级 [角色序号]:升级普攻等级 +23、查看普攻升级 [角色序号]:查看下一次普攻升级信息 +23、技能升级 <角色序号> <技能名称>:升级技能等级 +24、查看技能升级 <角色序号> <技能名称>:查看下一次技能升级信息 +25、使用 <物品名称> <数量> [角色] [角色序号] +26、使用 <物品序号> [角色] [角色序号] +27、使用魔法卡 <魔法卡序号> <魔法卡包序号> +28、合成魔法卡 <{物品序号...}>:要3张魔法卡,空格隔开 +29、分解物品 <{物品序号...}> +30、分解 <物品名称> <数量> +31、品质分解 <品质索引>:从0开始,普通/优秀/稀有/史诗/传说/神话/不朽 +32、决斗/完整决斗 <@对方>//<昵称>:和对方切磋 +发送【帮助4】查看第 4 页"); + } + + if (e.Detail == "帮助4") + { + await SendAsync(e, "饭给木", @"《饭给木》游戏指令列表(第 4 / 5 页) +33、兑换金币 <材料数>:1材料=200金币 +34、还原存档:没有后悔药 +35、我的主战:查看当前主战角色 +36、我的小队:查看小队角色名单 +37、我的存档:查看账号/存档信息 +38、设置小队 <{角色序号...}>:设置小队角色(1-4个参数) +39、小队决斗/小队完整决斗 <@对方>//<昵称>:用小队和对方切磋 +40、查询boss [boss序号]:查看指定序号boss的详细信息,缺省为boss名称列表 +41、讨伐/小队讨伐boss +42、签到:每日签到 +发送【帮助5】查看第 5 页"); + } + + if (e.Detail == "帮助5") + { + await SendAsync(e, "饭给木", @"《饭给木》游戏指令列表(第 5 / 5 页) +43:任务列表:查看今日任务列表 +44:开始任务 <任务序号> +45、任务信息:查看进行中任务的详细信息 +46、任务结算:对进行中的任务进行结算 +47、我的状态:查看主战角色状态 +48、小队状态/我的小队状态:查看小队所有角色的状态"); + } + + if (e.Detail.StartsWith("FunGame模拟", StringComparison.CurrentCultureIgnoreCase)) + { + if (!FunGameSimulation) + { + FunGameSimulation = true; + List msgs = Controller.GetTest(false); + List real = []; + int remain = 7; + string merge = ""; + for (int i = 0; i < msgs.Count - 2; i++) + { + remain--; + merge += msgs[i] + "\r\n"; + if (remain == 0) + { + real.Add(merge); + merge = ""; + if ((msgs.Count - i - 3) < 7) + { + remain = msgs.Count - i - 3; + } + else remain = 7; + } + } + if (msgs.Count > 2) + { + real.Add(msgs[^2]); + real.Add(msgs[^1]); + } + if (real.Count >= 3) + { + real = real[^3..]; + } + foreach (string msg in real) + { + await SendAsync(e, "饭给木", msg.Trim()); + await Task.Delay(5500); + } + FunGameSimulation = false; + } + else + { + await SendAsync(e, "饭给木", "游戏正在模拟中,请勿重复请求!"); + } + return result; + } + + if (e.Detail.StartsWith("FunGame团队模拟", StringComparison.CurrentCultureIgnoreCase)) + { + if (!FunGameSimulation) + { + FunGameSimulation = true; + List msgs = Controller.GetTest(false, true); + List real = []; + if (msgs.Count > 0) + { + real.Add(msgs[0]); + } + int remain = 7; + string merge = ""; + for (int i = 1; i < msgs.Count - 2; i++) + { + remain--; + merge += msgs[i] + "\r\n"; + if (remain == 0) + { + real.Add(merge); + merge = ""; + if ((msgs.Count - i - 3) < 7) + { + remain = msgs.Count - i - 3; + } + else remain = 7; + } + } + if (msgs.Count > 2) + { + real.Add(msgs[^2]); + real.Add(msgs[^1]); + } + if (real.Count >= 3) + { + real = real[^3..]; + } + foreach (string msg in real) + { + await SendAsync(e, "饭给木", msg.Trim()); + await Task.Delay(5500); + } + FunGameSimulation = false; + } + else + { + await SendAsync(e, "饭给木", "游戏正在模拟中,请勿重复请求!"); + } + return result; + } + + if (e.Detail.StartsWith("查数据", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("查数据", "").Trim(); + if (int.TryParse(detail, out int id)) + { + string msg = NetworkUtility.JsonDeserialize(Controller.GetStats(id)) ?? ""; + if (msg != "") + { + await SendAsync(e, "查数据", msg); + } + } + return result; + } + + if (e.Detail.StartsWith("查团队数据", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("查团队数据", "").Trim(); + if (int.TryParse(detail, out int id)) + { + string msg = NetworkUtility.JsonDeserialize(Controller.GetTeamStats(id)) ?? ""; + if (msg != "") + { + await SendAsync(e, "查团队数据", msg); + } + } + return result; + } + + if (e.Detail.StartsWith("查个人胜率", StringComparison.CurrentCultureIgnoreCase)) + { + string msg = NetworkUtility.JsonDeserialize(Controller.GetWinrateRank(false)) ?? ""; + if (msg.Length > 0) + { + await SendAsync(e, "查个人胜率", string.Join("\r\n\r\n", msg)); + } + return result; + } + + if (e.Detail.StartsWith("查团队胜率", StringComparison.CurrentCultureIgnoreCase)) + { + string msg = NetworkUtility.JsonDeserialize(Controller.GetWinrateRank(true)) ?? ""; + if (msg.Length > 0) + { + await SendAsync(e, "查团队胜率", string.Join("\r\n\r\n", msg)); + } + return result; + } + + if (e.Detail.StartsWith("查角色", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("查角色", "").Trim(); + if (int.TryParse(detail, out int id)) + { + string msg = NetworkUtility.JsonDeserialize(Controller.GetCharacterInfo(id)) ?? ""; + if (msg != "") + { + await SendAsync(e, "查角色", msg); + } + } + return result; + } + + if (e.Detail.StartsWith("查技能", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("查技能", "").Trim(); + if (int.TryParse(detail, out int id)) + { + string msg = NetworkUtility.JsonDeserialize(Controller.GetSkillInfo(qq, id)) ?? ""; + if (msg != "") + { + await SendAsync(e, "查技能", msg); + } + } + else + { + string msg = NetworkUtility.JsonDeserialize(Controller.GetSkillInfo_Name(qq, detail)) ?? ""; + if (msg != "") + { + await SendAsync(e, "查技能", msg); + } + } + return result; + } + + if (e.Detail.StartsWith("查物品", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("查物品", "").Trim(); + if (int.TryParse(detail, out int id)) + { + string msg = NetworkUtility.JsonDeserialize(Controller.GetItemInfo(qq, id)) ?? ""; + if (msg != "") + { + await SendAsync(e, "查物品", msg); + } + } + else + { + string msg = NetworkUtility.JsonDeserialize(Controller.GetItemInfo_Name(qq, detail)) ?? ""; + if (msg != "") + { + await SendAsync(e, "查物品", msg); + } + } + return result; + } + + if (e.Detail.StartsWith("生成")) + { + string pattern = @"生成\s*(\d+)\s*个\s*([\s\S]+)(?:\s*给\s*(\d+))"; + Regex regex = new(pattern, RegexOptions.IgnoreCase); + Match match = regex.Match(e.Detail); + + if (match.Success) + { + int count = int.Parse(match.Groups[1].Value); + string name = match.Groups[2].Value.Trim(); + string target = match.Groups[3].Value; + long userid = qq; + + if (!string.IsNullOrEmpty(target)) + { + userid = long.Parse(target); + } + + if (count > 0) + { + string msg = NetworkUtility.JsonDeserialize(Controller.CreateItem(qq, name, count, userid)) ?? ""; + if (msg != "") + { + await SendAsync(e, "熟圣之力", msg); + } + } + else + { + await SendAsync(e, "熟圣之力", "数量不能为0,请重新输入。"); + } + return result; + } + } + + if (e.Detail == "生成魔法卡包") + { + string msg = NetworkUtility.JsonDeserialize(Controller.GenerateMagicCardPack()) ?? ""; + if (msg != "") + { + await SendAsync(e, "生成魔法卡包", msg); + } + return result; + } + else if (e.Detail == "生成魔法卡") + { + string msg = NetworkUtility.JsonDeserialize(Controller.GenerateMagicCard()) ?? ""; + if (msg != "") + { + await SendAsync(e, "生成魔法卡", msg); + } + return result; + } + + if (e.Detail == "创建存档") + { + string msg = NetworkUtility.JsonDeserialize(Controller.CreateSaved(qq)) ?? ""; + if (msg != "") + { + await SendAsync(e, "创建存档", "\r\n" + msg); + } + return result; + } + + if (e.Detail == "我的存档") + { + string msg = NetworkUtility.JsonDeserialize(Controller.ShowSaved(qq)) ?? ""; + if (msg != "") + { + await SendAsync(e, "我的存档", "\r\n" + msg); + } + return result; + } + + if (e.Detail == "我的主战") + { + string msg = NetworkUtility.JsonDeserialize(Controller.GetCharacterInfoFromInventory(qq, 0)) ?? ""; + if (msg != "") + { + await SendAsync(e, "我的主战", "\r\n" + msg); + } + return result; + } + + if (e.Detail == "我的状态") + { + string msg = NetworkUtility.JsonDeserialize(Controller.ShowMainCharacterOrSquadStatus(qq)) ?? ""; + if (msg != "") + { + await SendAsync(e, "我的状态", "\r\n" + msg); + } + return result; + } + + if (e.Detail == "小队状态" || e.Detail == "我的小队状态") + { + string msg = NetworkUtility.JsonDeserialize(Controller.ShowMainCharacterOrSquadStatus(qq, true)) ?? ""; + if (msg != "") + { + await SendAsync(e, "我的小队状态", "\r\n" + msg); + } + return result; + } + + if (e.Detail == "我的小队") + { + string msg = NetworkUtility.JsonDeserialize(Controller.ShowSquad(qq)) ?? ""; + if (msg != "") + { + await SendAsync(e, "我的小队", "\r\n" + msg); + } + return result; + } + + if (e.Detail == "清空小队") + { + string msg = NetworkUtility.JsonDeserialize(Controller.ClearSquad(qq)) ?? ""; + if (msg != "") + { + await SendAsync(e, "清空小队", "\r\n" + msg); + } + return result; + } + + if (e.Detail == "还原存档") + { + string msg = NetworkUtility.JsonDeserialize(Controller.RestoreSaved(qq)) ?? ""; + if (msg != "") + { + await SendAsync(e, "还原存档", "\r\n" + msg); + } + return result; + } + + if (e.Detail == "生成自建角色") + { + string msg = NetworkUtility.JsonDeserialize(Controller.NewCustomCharacter(qq)) ?? ""; + if (msg != "") + { + await SendAsync(e, "抽卡", "\r\n" + msg); + } + return result; + } + + if (e.Detail == "角色改名") + { + string msg = NetworkUtility.JsonDeserialize(Controller.ReName(qq)) ?? ""; + if (msg != "") + { + await SendAsync(e, "改名", "\r\n" + msg); + } + return result; + } + + if (e.Detail == "角色重随") + { + string msg = NetworkUtility.JsonDeserialize(Controller.RandomCustomCharacter(qq, false)) ?? ""; + if (msg != "") + { + await SendAsync(e, "角色重随", "\r\n" + msg); + } + return result; + } + + if (e.Detail == "确认角色重随") + { + string msg = NetworkUtility.JsonDeserialize(Controller.RandomCustomCharacter(qq, true)) ?? ""; + if (msg != "") + { + await SendAsync(e, "角色重随", "\r\n" + msg); + } + return result; + } + + if (e.Detail == "取消角色重随") + { + string msg = NetworkUtility.JsonDeserialize(Controller.CancelRandomCustomCharacter(qq)) ?? ""; + if (msg != "") + { + await SendAsync(e, "角色重随", "\r\n" + msg); + } + return result; + } + + if (e.Detail == "抽卡") + { + string msg = NetworkUtility.JsonDeserialize(Controller.DrawCard(qq)) ?? ""; + if (msg != "") + { + await SendAsync(e, "抽卡", "\r\n" + msg); + } + return result; + } + + if (e.Detail == "十连抽卡") + { + List msgs = Controller.DrawCards(qq); + if (msgs.Count > 0) + { + await SendAsync(e, "十连抽卡", "\r\n" + string.Join("\r\n", msgs)); + } + return result; + } + + if (e.Detail == "材料抽卡") + { + string msg = NetworkUtility.JsonDeserialize(Controller.DrawCard_Material(qq)) ?? ""; + if (msg != "") + { + await SendAsync(e, "材料抽卡", "\r\n" + msg); + } + return result; + } + + if (e.Detail == "材料十连抽卡") + { + List msgs = Controller.DrawCards_Material(qq); + if (msgs.Count > 0) + { + await SendAsync(e, "材料十连抽卡", "\r\n" + string.Join("\r\n", msgs)); + } + return result; + } + + if (e.Detail.StartsWith("查看库存") || e.Detail.StartsWith("我的库存") || e.Detail.StartsWith("我的背包")) + { + string detail = e.Detail.Replace("查看库存", "").Replace("我的库存", "").Replace("我的背包", "").Trim(); + List msgs = []; + if (int.TryParse(detail, out int page)) + { + msgs = Controller.GetInventoryInfo2(qq, page); + } + else if (FunGameItemType.FirstOrDefault(detail.Contains) is string matchedType) + { + int typeIndex = FunGameItemType.IndexOf(matchedType); + string remain = detail.Replace(matchedType, "").Trim(); + if (int.TryParse(remain, out page)) + { + msgs = Controller.GetInventoryInfo4(qq, page, typeIndex); + } + else + { + msgs = Controller.GetInventoryInfo4(qq, 1, typeIndex); + } + } + else + { + msgs = Controller.GetInventoryInfo2(qq, 1); + } + if (msgs.Count > 0) + { + await SendAsync(e, "查看库存", "\r\n" + string.Join("\r\n", msgs)); + } + return result; + } + + if (e.Detail.StartsWith("物品库存")) + { + string detail = e.Detail.Replace("物品库存", "").Trim(); + List msgs = []; + if (int.TryParse(detail, out int page)) + { + msgs = Controller.GetInventoryInfo3(qq, page, 2, 2); + } + else + { + msgs = Controller.GetInventoryInfo3(qq, 1, 2, 2); + } + if (msgs.Count > 0) + { + await SendAsync(e, "查看分类库存", "\r\n" + string.Join("\r\n", msgs)); + } + return result; + } + + if (e.Detail.StartsWith("角色库存")) + { + string detail = e.Detail.Replace("角色库存", "").Trim(); + List msgs = []; + if (int.TryParse(detail, out int page)) + { + msgs = Controller.GetInventoryInfo5(qq, page); + } + else + { + msgs = Controller.GetInventoryInfo5(qq, 1); + } + if (msgs.Count > 0) + { + await SendAsync(e, "查看角色库存", "\r\n" + string.Join("\r\n", msgs)); + } + return result; + } + + if (e.Detail.StartsWith("分类库存")) + { + string detail = e.Detail.Replace("分类库存", "").Trim(); + string[] strings = detail.Split(" "); + int t = -1; + if (strings.Length > 0 && int.TryParse(strings[0].Trim(), out t)) + { + List msgs = []; + if (strings.Length > 1 && int.TryParse(strings[1].Trim(), out int page)) + { + msgs = Controller.GetInventoryInfo4(qq, page, t); + } + else + { + msgs = Controller.GetInventoryInfo4(qq, 1, t); + } + if (msgs.Count > 0) + { + await SendAsync(e, "查看分类库存", "\r\n" + string.Join("\r\n", msgs)); + } + } + return result; + } + + if (e.Detail.StartsWith("我角色", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("我角色", "").Trim(); + string msg = ""; + if (int.TryParse(detail, out int seq)) + { + msg = NetworkUtility.JsonDeserialize(Controller.GetCharacterInfoFromInventory(qq, seq, true)) ?? ""; + } + else + { + msg = NetworkUtility.JsonDeserialize(Controller.GetCharacterInfoFromInventory(qq, 1, true)) ?? ""; + } + if (msg != "") + { + await SendAsync(e, "查库存角色", msg); + } + return result; + } + + if (e.Detail.StartsWith("我的角色", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("我的角色", "").Trim(); + string msg = ""; + if (int.TryParse(detail, out int seq)) + { + msg = NetworkUtility.JsonDeserialize(Controller.GetCharacterInfoFromInventory(qq, seq, false)) ?? ""; + } + else + { + msg = NetworkUtility.JsonDeserialize(Controller.GetCharacterInfoFromInventory(qq, 1, false)) ?? ""; + } + if (msg != "") + { + await SendAsync(e, "查库存角色", msg); + } + return result; + } + + if (e.Detail.StartsWith("角色技能", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("角色技能", "").Trim(); + string msg = ""; + if (int.TryParse(detail, out int seq)) + { + msg = NetworkUtility.JsonDeserialize(Controller.GetCharacterSkills(qq, seq)) ?? ""; + } + else + { + msg = NetworkUtility.JsonDeserialize(Controller.GetCharacterSkills(qq, 1)) ?? ""; + } + if (msg != "") + { + await SendAsync(e, "角色技能", msg); + } + return result; + } + + if (e.Detail.StartsWith("角色物品", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("角色物品", "").Trim(); + string msg = ""; + if (int.TryParse(detail, out int seq)) + { + msg = NetworkUtility.JsonDeserialize(Controller.GetCharacterItems(qq, seq)) ?? ""; + } + else + { + msg = NetworkUtility.JsonDeserialize(Controller.GetCharacterItems(qq, 1)) ?? ""; + } + if (msg != "") + { + await SendAsync(e, "角色物品", msg); + } + return result; + } + + if (e.Detail.StartsWith("设置主战", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("设置主战", "").Trim(); + string msg = ""; + if (int.TryParse(detail, out int cid)) + { + msg = NetworkUtility.JsonDeserialize(Controller.SetMain(qq, cid)) ?? ""; + } + else + { + msg = NetworkUtility.JsonDeserialize(Controller.SetMain(qq, 1)) ?? ""; + } + if (msg != "") + { + await SendAsync(e, "设置主战角色", msg); + } + return result; + } + + if (e.Detail.StartsWith("开启练级", StringComparison.CurrentCultureIgnoreCase) || e.Detail.StartsWith("开始练级", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("开启练级", "").Replace("开始练级", "").Trim(); + string msg = ""; + if (int.TryParse(detail, out int cid)) + { + msg = NetworkUtility.JsonDeserialize(Controller.StartTraining(qq, cid)) ?? ""; + } + else + { + msg = NetworkUtility.JsonDeserialize(Controller.StartTraining(qq, 1)) ?? ""; + } + if (msg != "") + { + await SendAsync(e, "开启练级", msg); + } + return result; + } + + if (e.Detail == "练级信息") + { + string msg = NetworkUtility.JsonDeserialize(Controller.GetTrainingInfo(qq)) ?? ""; + if (msg != "") + { + await SendAsync(e, "练级信息", "\r\n" + msg); + } + return result; + } + + if (e.Detail == "练级结算") + { + string msg = NetworkUtility.JsonDeserialize(Controller.StopTraining(qq)) ?? ""; + if (msg != "") + { + await SendAsync(e, "练级结算", "\r\n" + msg); + } + return result; + } + + if (e.Detail == "任务列表") + { + string msg = NetworkUtility.JsonDeserialize(Controller.CheckQuestList(qq)) ?? ""; + if (msg != "") + { + await SendAsync(e, "任务列表", "\r\n" + msg); + } + return result; + } + + if (e.Detail == "任务信息") + { + string msg = NetworkUtility.JsonDeserialize(Controller.CheckWorkingQuest(qq)) ?? ""; + if (msg != "") + { + await SendAsync(e, "任务信息", "\r\n" + msg); + } + return result; + } + + if (e.Detail == "任务结算") + { + string msg = NetworkUtility.JsonDeserialize(Controller.SettleQuest(qq)) ?? ""; + if (msg != "") + { + await SendAsync(e, "任务结算", "\r\n" + msg); + } + return result; + } + + if (e.Detail == "签到") + { + string msg = NetworkUtility.JsonDeserialize(Controller.SignIn(qq)) ?? ""; + if (msg != "") + { + await SendAsync(e, "签到", "\r\n" + msg); + } + return result; + } + + if (e.Detail.StartsWith("开始任务", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("开始任务", "").Trim(); + if (int.TryParse(detail, out int index)) + { + string msg = NetworkUtility.JsonDeserialize(Controller.AcceptQuest(qq, index)) ?? ""; + if (msg != "") + { + await SendAsync(e, "开始任务", msg); + } + } + return result; + } + + if (e.Detail.StartsWith("我的物品", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("我的物品", "").Trim(); + if (int.TryParse(detail, out int index)) + { + string msg = NetworkUtility.JsonDeserialize(Controller.GetItemInfoFromInventory(qq, index)) ?? ""; + if (msg != "") + { + await SendAsync(e, "查库存物品", msg); + } + } + return result; + } + + if (e.Detail.StartsWith("兑换金币", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("兑换金币", "").Trim(); + if (int.TryParse(detail, out int materials)) + { + string msg = NetworkUtility.JsonDeserialize(Controller.ExchangeCredits(qq, materials)) ?? ""; + if (msg != "") + { + await SendAsync(e, "兑换金币", msg); + } + } + return result; + } + + if (e.Detail.StartsWith("取消装备", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("取消装备", "").Trim(); + string[] strings = detail.Split(" "); + int c = -1, i = -1; + if (strings.Length > 0 && int.TryParse(strings[0].Trim(), out c) && strings.Length > 1 && int.TryParse(strings[1].Trim(), out i)) + { + if (c != -1 && i != -1) + { + string msg = NetworkUtility.JsonDeserialize(Controller.UnEquipItem(qq, c, i)) ?? ""; + if (msg != "") + { + await SendAsync(e, "取消装备", msg); + } + } + } + return result; + } + + if (e.Detail.StartsWith("装备", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("装备", "").Trim(); + string[] strings = detail.Split(" "); + int c = -1, i = -1; + if (strings.Length > 0 && int.TryParse(strings[0].Trim(), out c) && strings.Length > 1 && int.TryParse(strings[1].Trim(), out i)) + { + if (c != -1 && i != -1) + { + string msg = NetworkUtility.JsonDeserialize(Controller.EquipItem(qq, c, i)) ?? ""; + if (msg != "") + { + await SendAsync(e, "装备", msg); + } + } + } + return result; + } + + if (e.Detail.StartsWith("查看技能升级", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("查看技能升级", "").Trim(); + string[] strings = detail.Split(" "); + int c = -1; + if (strings.Length > 0 && int.TryParse(strings[0].Trim(), out c) && strings.Length > 1) + { + string s = strings[1].Trim(); + if (c != -1 && s != "") + { + string msg = NetworkUtility.JsonDeserialize(Controller.GetSkillLevelUpNeedy(qq, c, s)) ?? ""; + if (msg != "") + { + await SendAsync(e, "查看技能升级", msg); + } + } + } + return result; + } + + if (e.Detail.StartsWith("技能升级", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("技能升级", "").Trim(); + string[] strings = detail.Split(" "); + int c = -1; + if (strings.Length > 0 && int.TryParse(strings[0].Trim(), out c) && strings.Length > 1) + { + string s = strings[1].Trim(); + if (c != -1 && s != "") + { + string msg = NetworkUtility.JsonDeserialize(Controller.SkillLevelUp(qq, c, s)) ?? ""; + if (msg != "") + { + await SendAsync(e, "技能升级", msg); + } + } + } + return result; + } + + if (e.Detail.StartsWith("合成魔法卡", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("合成魔法卡", "").Trim(); + string[] strings = detail.Split(" "); + int id1 = -1, id2 = -1, id3 = -1; + if (strings.Length > 0 && int.TryParse(strings[0].Trim(), out id1) && strings.Length > 1 && int.TryParse(strings[1].Trim(), out id2) && strings.Length > 2 && int.TryParse(strings[2].Trim(), out id3)) + { + if (id1 != -1 && id2 != -1 && id3 != -1) + { + string msg = NetworkUtility.JsonDeserialize(Controller.ConflateMagicCardPack(qq, [id1, id2, id3])) ?? ""; + if (msg != "") + { + await SendAsync(e, "合成魔法卡", msg); + } + } + } + return result; + } + + if (e.Detail.StartsWith("角色升级", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("角色升级", "").Trim(); + string msg = ""; + if (int.TryParse(detail, out int cid)) + { + msg = NetworkUtility.JsonDeserialize(Controller.CharacterLevelUp(qq, cid)) ?? ""; + } + else + { + msg = NetworkUtility.JsonDeserialize(Controller.CharacterLevelUp(qq, 1)) ?? ""; + } + if (msg != "") + { + await SendAsync(e, "角色升级", msg); + } + return result; + } + + if (e.Detail.StartsWith("查看普攻升级", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("查看普攻升级", "").Trim(); + string msg = ""; + if (int.TryParse(detail, out int cid)) + { + msg = NetworkUtility.JsonDeserialize(Controller.GetNormalAttackLevelUpNeedy(qq, cid)) ?? ""; + } + else + { + msg = NetworkUtility.JsonDeserialize(Controller.GetNormalAttackLevelUpNeedy(qq, 1)) ?? ""; + } + if (msg != "") + { + await SendAsync(e, "查看普攻升级", msg); + } + return result; + } + + if (e.Detail.StartsWith("普攻升级", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("普攻升级", "").Trim(); + string msg = ""; + if (int.TryParse(detail, out int cid)) + { + msg = NetworkUtility.JsonDeserialize(Controller.NormalAttackLevelUp(qq, cid)) ?? ""; + } + else + { + msg = NetworkUtility.JsonDeserialize(Controller.NormalAttackLevelUp(qq, 1)) ?? ""; + } + if (msg != "") + { + await SendAsync(e, "普攻升级", msg); + } + return result; + } + + if (e.Detail.StartsWith("角色突破", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("角色突破", "").Trim(); + string msg = ""; + if (int.TryParse(detail, out int cid)) + { + msg = NetworkUtility.JsonDeserialize(Controller.CharacterLevelBreak(qq, cid)) ?? ""; + } + else + { + msg = NetworkUtility.JsonDeserialize(Controller.CharacterLevelBreak(qq, 1)) ?? ""; + } + if (msg != "") + { + await SendAsync(e, "角色突破", msg); + } + return result; + } + + if (e.Detail.StartsWith("突破信息", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("突破信息", "").Trim(); + string msg = ""; + if (int.TryParse(detail, out int cid)) + { + msg = NetworkUtility.JsonDeserialize(Controller.GetLevelBreakNeedy(qq, cid)) ?? ""; + } + else + { + msg = NetworkUtility.JsonDeserialize(Controller.GetLevelBreakNeedy(qq, 1)) ?? ""; + } + if (msg != "") + { + await SendAsync(e, "突破信息", msg); + } + return result; + } + + if (e.Detail.StartsWith("使用", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("使用", "").Trim(); + if (detail.StartsWith("魔法卡")) + { + string pattern = @"\s*魔法卡\s*(?\d+)(?:\s*(?:角色\s*)?(?\d+))?\s*"; + Match match = Regex.Match(detail, pattern); + if (match.Success) + { + string itemId = match.Groups["itemId"].Value; + string characterId = match.Groups["characterId"].Value; + bool isCharacter = detail.Contains("角色"); + if (int.TryParse(itemId, out int id) && int.TryParse(characterId, out int id2)) + { + if (id > 0 && id2 > 0) + { + string msg = NetworkUtility.JsonDeserialize(Controller.UseItem3(qq, id, id2, isCharacter)) ?? ""; + if (msg != "") + { + await SendAsync(e, "使用魔法卡", msg); + } + } + } + } + } + else + { + char[] chars = [',', ' ']; + string pattern = @"\s*(?[^\d]+)\s*(?\d+)\s*(?:角色\s*(?[\d\s]*))?"; + Match match = Regex.Match(detail, pattern); + if (match.Success) + { + string itemName = match.Groups["itemName"].Value.Trim(); + if (int.TryParse(match.Groups["count"].Value, out int count)) + { + string characterIdsString = match.Groups["characterIds"].Value; + int[] characterIds = characterIdsString != "" ? [.. characterIdsString.Split(chars, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse)] : [1]; + string msg = NetworkUtility.JsonDeserialize(Controller.UseItem2(qq, itemName, count, characterIds)) ?? ""; + if (msg != "") + { + await SendAsync(e, "使用", msg); + } + } + } + else + { + pattern = @"\s*(?\d+)\s*(?:角色\s*(?[\d\s]*))?"; + match = Regex.Match(detail, pattern); + if (match.Success) + { + if (int.TryParse(match.Groups["itemId"].Value, out int itemId)) + { + string characterIdsString = match.Groups["characterIds"].Value; + int[] characterIds = characterIdsString != "" ? [.. characterIdsString.Split(chars, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse)] : [1]; + string msg = NetworkUtility.JsonDeserialize(Controller.UseItem(qq, itemId, characterIds)) ?? ""; + if (msg != "") + { + await SendAsync(e, "使用", msg); + } + } + } + else + { + pattern = @"\s*(?[^\d]+)\s*(?\d+)\s*"; + match = Regex.Match(detail, pattern); + if (match.Success) + { + string itemName = match.Groups["itemName"].Value.Trim(); + if (int.TryParse(match.Groups["count"].Value, out int count)) + { + string msg = NetworkUtility.JsonDeserialize(Controller.UseItem2(qq, itemName, count)) ?? ""; + if (msg != "") + { + await SendAsync(e, "使用", msg); + } + } + } + else + { + pattern = @"\s*(?\d+)\s*"; + match = Regex.Match(detail, pattern); + if (match.Success) + { + if (int.TryParse(match.Groups["itemId"].Value, out int itemId)) + { + string msg = NetworkUtility.JsonDeserialize(Controller.UseItem(qq, itemId)) ?? ""; + if (msg != "") + { + await SendAsync(e, "使用", msg); + } + } + } + } + } + } + } + + return result; + } + + if (e.Detail.StartsWith("分解物品", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("分解物品", "").Trim(); + List ids = []; + foreach (string str in detail.Split(' ')) + { + if (int.TryParse(str, out int id)) + { + ids.Add(id); + } + } + string msg = NetworkUtility.JsonDeserialize(Controller.DecomposeItem(qq, [.. ids])) ?? ""; + if (msg != "") + { + await SendAsync(e, "分解物品", msg); + } + + return result; + } + + if (e.Detail.StartsWith("分解", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("分解", "").Trim(); + string pattern = @"\s*(?[^\d]+)\s*(?\d+)\s*"; + Match match = Regex.Match(detail, pattern); + if (match.Success) + { + string itemName = match.Groups["itemName"].Value.Trim(); + if (int.TryParse(match.Groups["count"].Value, out int count)) + { + string msg = NetworkUtility.JsonDeserialize(Controller.DecomposeItem2(qq, itemName, count)) ?? ""; + if (msg != "") + { + await SendAsync(e, "分解", msg); + } + } + } + + return result; + } + + if (e.Detail.StartsWith("品质分解", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("品质分解", "").Trim(); + if (int.TryParse(detail, out int q)) + { + string msg = NetworkUtility.JsonDeserialize(Controller.DecomposeItem3(qq, q)) ?? ""; + if (msg != "") + { + await SendAsync(e, "品质分解", msg); + } + } + + return result; + } + + if (e.Detail.StartsWith("熟圣之力", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("熟圣之力", "").Trim(); + string[] strings = detail.Split(" "); + int count = -1; + if (strings.Length > 1 && int.TryParse(strings[1].Trim(), out count)) + { + string name = strings[0].Trim(); + if (count > 0) + { + long userid = qq; + if (strings.Length > 2 && long.TryParse(strings[2].Replace("@", "").Trim(), out long temp)) + { + userid = temp; + } + string msg = NetworkUtility.JsonDeserialize(Controller.CreateItem(qq, name, count, userid)) ?? ""; + if (msg != "") + { + await SendAsync(e, "熟圣之力", msg); + } + } + else + { + await SendAsync(e, "熟圣之力", "数量不能为0,请重新输入。"); + } + } + return result; + } + + if (e.Detail.StartsWith("完整决斗", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("完整决斗", "").Replace("@", "").Trim(); + List msgs = []; + if (long.TryParse(detail.Trim(), out long eqq)) + { + msgs = Controller.FightCustom(qq, eqq, true); + } + else + { + msgs = Controller.FightCustom2(qq, detail.Trim(), true); + } + List real = []; + if (msgs.Count >= 2) + { + if (msgs.Count < 20) + { + int remain = 7; + string merge = ""; + for (int i = 0; i < msgs.Count - 1; i++) + { + remain--; + merge += msgs[i] + "\r\n"; + if (remain == 0) + { + real.Add(merge); + merge = ""; + if ((msgs.Count - i - 2) < 7) + { + remain = msgs.Count - i - 2; + } + else remain = 7; + } + } + } + else + { + real.Add(msgs[^2]); + } + real.Add(msgs[^1]); + } + else + { + real = msgs; + } + if (real.Count >= 3) + { + real = real[^3..]; + } + foreach (string msg in real) + { + await SendAsync(e, "完整决斗", msg.Trim()); + await Task.Delay(1500); + } + return result; + } + + if (e.Detail.StartsWith("决斗", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("决斗", "").Replace("@", "").Trim(); + List msgs = []; + if (long.TryParse(detail.Trim(), out long eqq)) + { + msgs = Controller.FightCustom(qq, eqq, false); + } + else + { + msgs = Controller.FightCustom2(qq, detail.Trim(), false); + } + List real = []; + if (msgs.Count > 2) + { + int remain = 7; + string merge = ""; + for (int i = 0; i < msgs.Count - 1; i++) + { + remain--; + merge += msgs[i] + "\r\n"; + if (remain == 0) + { + real.Add(merge); + merge = ""; + if ((msgs.Count - i - 3) < 7) + { + remain = msgs.Count - i - 3; + } + else remain = 7; + } + } + real.Add(msgs[^1]); + } + else + { + real = msgs; + } + if (real.Count >= 3) + { + real = real[^3..]; + } + foreach (string msg in real) + { + await SendAsync(e, "决斗", msg.Trim()); + await Task.Delay(1500); + } + return result; + } + + if (e.Detail.StartsWith("小队决斗", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("小队决斗", "").Replace("@", "").Trim(); + List msgs = []; + if (long.TryParse(detail.Trim(), out long eqq)) + { + msgs = Controller.FightCustomTeam(qq, eqq, true); + } + else + { + msgs = Controller.FightCustomTeam2(qq, detail.Trim(), true); + } + List real = []; + if (msgs.Count >= 3) + { + if (msgs.Count < 20) + { + int remain = 7; + string merge = ""; + for (int i = 0; i < msgs.Count - 1; i++) + { + remain--; + merge += msgs[i] + "\r\n"; + if (remain == 0) + { + real.Add(merge); + merge = ""; + if ((msgs.Count - i - 3) < 7) + { + remain = msgs.Count - i - 3; + } + else remain = 7; + } + } + } + else + { + real.Add(msgs[^3]); + } + real.Add(msgs[^2]); + real.Add(msgs[^1]); + } + else + { + real = msgs; + } + if (real.Count >= 3) + { + real = real[^3..]; + } + foreach (string msg in real) + { + await SendAsync(e, "完整决斗", msg.Trim()); + await Task.Delay(1500); + } + return result; + } + + if (e.Detail.StartsWith("查询boss", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("查询boss", "").Trim(); + List msgs = []; + if (int.TryParse(detail, out int cid)) + { + msgs = Controller.GetBoss(cid); + } + else + { + msgs = Controller.GetBoss(); + } + if (msgs.Count > 0) + { + await SendAsync(e, "BOSS", string.Join("\r\n", msgs)); + } + return result; + } + + if (e.Detail.StartsWith("小队讨伐boss", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("小队讨伐boss", "").Trim(); + List msgs = []; + if (int.TryParse(detail.Trim(), out int index)) + { + msgs = Controller.FightBossTeam(qq, index, true); + List real = []; + if (msgs.Count >= 3) + { + if (msgs.Count < 20) + { + int remain = 7; + string merge = ""; + for (int i = 0; i < msgs.Count - 1; i++) + { + remain--; + merge += msgs[i] + "\r\n"; + if (remain == 0) + { + real.Add(merge); + merge = ""; + if ((msgs.Count - i - 3) < 7) + { + remain = msgs.Count - i - 3; + } + else remain = 7; + } + } + } + else + { + real.Add(msgs[^3]); + } + real.Add(msgs[^2]); + real.Add(msgs[^1]); + } + else + { + real = msgs; + } + if (real.Count >= 3) + { + real = real[^3..]; + } + foreach (string msg in real) + { + await SendAsync(e, "BOSS", msg.Trim()); + await Task.Delay(1500); + } + } + else + { + await SendAsync(e, "BOSS", "请输入正确的编号!"); + } + return result; + } + + if (e.Detail.StartsWith("讨伐boss", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("讨伐boss", "").Trim(); + List msgs = []; + if (int.TryParse(detail.Trim(), out int index)) + { + msgs = Controller.FightBoss(qq, index, true); + List real = []; + if (msgs.Count >= 3) + { + if (msgs.Count < 20) + { + int remain = 7; + string merge = ""; + for (int i = 0; i < msgs.Count - 1; i++) + { + remain--; + merge += msgs[i] + "\r\n"; + if (remain == 0) + { + real.Add(merge); + merge = ""; + if ((msgs.Count - i - 3) < 7) + { + remain = msgs.Count - i - 3; + } + else remain = 7; + } + } + } + else + { + real.Add(msgs[^3]); + } + real.Add(msgs[^2]); + real.Add(msgs[^1]); + } + else + { + real = msgs; + } + if (real.Count >= 3) + { + real = real[^3..]; + } + foreach (string msg in real) + { + await SendAsync(e, "BOSS", msg.Trim()); + await Task.Delay(1500); + } + } + else + { + await SendAsync(e, "BOSS", "请输入正确的编号!"); + } + return result; + } + + if (e.Detail.StartsWith("小队添加", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("小队添加", "").Trim(); + if (int.TryParse(detail, out int c)) + { + string msg = NetworkUtility.JsonDeserialize(Controller.AddSquad(qq, c)) ?? ""; + if (msg != "") + { + await SendAsync(e, "小队", msg); + } + } + return result; + } + + if (e.Detail.StartsWith("小队移除", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("小队移除", "").Trim(); + if (int.TryParse(detail, out int c)) + { + string msg = NetworkUtility.JsonDeserialize(Controller.RemoveSquad(qq, c)) ?? ""; + if (msg != "") + { + await SendAsync(e, "小队", msg); + } + } + return result; + } + + if (e.Detail.StartsWith("设置小队") || e.Detail.StartsWith("重组小队")) + { + string detail = e.Detail.Replace("设置小队", "").Replace("重组小队", "").Trim(); + string[] strings = detail.Split(' '); + List cindexs = []; + foreach (string s in strings) + { + if (int.TryParse(s, out int c)) + { + cindexs.Add(c); + } + } + string msg = NetworkUtility.JsonDeserialize(Controller.SetSquad(qq, [.. cindexs])) ?? ""; + if (msg != "") + { + await SendAsync(e, "小队", msg); + } + return result; + } + + if (e.Detail.StartsWith("加入社团", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("加入社团", "").Trim(); + if (int.TryParse(detail, out int c)) + { + string msg = NetworkUtility.JsonDeserialize(Controller.JoinClub(qq, c)) ?? ""; + if (msg != "") + { + await SendAsync(e, "社团", msg); + } + } + return result; + } + + if (e.Detail.StartsWith("创建社团", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("创建社团", "").Trim(); + bool isPublic = true; + if (detail.Contains("私密")) + { + isPublic = false; + } + detail = detail.Replace("私密", "").Trim(); + string msg = NetworkUtility.JsonDeserialize(Controller.CreateClub(qq, isPublic, detail)) ?? ""; + if (msg != "") + { + await SendAsync(e, "社团", msg); + } + return result; + } + + if (e.Detail == "退出社团") + { + string msg = NetworkUtility.JsonDeserialize(Controller.QuitClub(qq)) ?? ""; + if (msg != "") + { + await SendAsync(e, "社团", "\r\n" + msg); + } + return result; + } + + if (e.Detail == "我的社团") + { + string msg = NetworkUtility.JsonDeserialize(Controller.ShowClubInfo(qq)) ?? ""; + if (msg != "") + { + await SendAsync(e, "社团", "\r\n" + msg); + } + return result; + } + + if (e.Detail == "解散社团") + { + string msg = NetworkUtility.JsonDeserialize(Controller.DisbandClub(qq)) ?? ""; + if (msg != "") + { + await SendAsync(e, "社团", "\r\n" + msg); + } + return result; + } + + if (e.Detail == "查看社团成员") + { + string msg = NetworkUtility.JsonDeserialize(Controller.ShowClubMemberList(qq, 0)) ?? ""; + if (msg != "") + { + await SendAsync(e, "社团", "\r\n" + msg); + } + return result; + } + + if (e.Detail == "查看社团管理") + { + string msg = NetworkUtility.JsonDeserialize(Controller.ShowClubMemberList(qq, 1)) ?? ""; + if (msg != "") + { + await SendAsync(e, "社团", "\r\n" + msg); + } + return result; + } + + if (e.Detail == "查看申请人列表") + { + string msg = NetworkUtility.JsonDeserialize(Controller.ShowClubMemberList(qq, 2)) ?? ""; + if (msg != "") + { + await SendAsync(e, "社团", "\r\n" + msg); + } + return result; + } + + if (e.Detail.StartsWith("社团批准", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("社团批准", "").Replace("@", "").Trim(); + if (long.TryParse(detail, out long id)) + { + string msg = NetworkUtility.JsonDeserialize(Controller.ApproveClub(qq, id, true)) ?? ""; + if (msg != "") + { + await SendAsync(e, "社团", msg); + } + } + return result; + } + + if (e.Detail.StartsWith("社团拒绝", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("社团拒绝", "").Replace("@", "").Trim(); + if (long.TryParse(detail, out long id)) + { + string msg = NetworkUtility.JsonDeserialize(Controller.ApproveClub(qq, id, false)) ?? ""; + if (msg != "") + { + await SendAsync(e, "社团", msg); + } + } + return result; + } + + if (e.Detail.StartsWith("社团踢出", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("社团踢出", "").Replace("@", "").Trim(); + if (long.TryParse(detail, out long id)) + { + string msg = NetworkUtility.JsonDeserialize(Controller.KickClub(qq, id)) ?? ""; + if (msg != "") + { + await SendAsync(e, "社团", msg); + } + } + return result; + } + + if (e.Detail.StartsWith("社团设置", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("社团设置", "").Trim(); + string[] strings = detail.Split(' '); + if (strings.Length > 0) + { + string part = strings[0].Trim() switch + { + "名称" => "name", + "前缀" => "prefix", + "描述" => "description", + "批准" => "isneedapproval", + "公开" => "ispublic", + "管理" => "setadmin", + "取消管理" => "setnotadmin", + "新社长" => "setmaster", + _ => "", + }; + List args = []; + if (strings.Length > 1) + { + args = [.. strings[1..]]; + } + string msg = NetworkUtility.JsonDeserialize(Controller.ChangeClub(qq, part, [.. args])) ?? ""; + if (msg != "") + { + await SendAsync(e, "社团", msg); + } + } + return result; + } + + if (e.Detail.StartsWith("社团转让", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("社团转让", "").Replace("@", "").Trim(); + List args = [detail]; + string msg = NetworkUtility.JsonDeserialize(Controller.ChangeClub(qq, "setmaster", [.. args])) ?? ""; + if (msg != "") + { + await SendAsync(e, "社团", msg); + } + return result; + } + + if (qq == GeneralSettings.Master && e.Detail.StartsWith("重载FunGame", StringComparison.CurrentCultureIgnoreCase)) + { + string msg = NetworkUtility.JsonDeserialize(Controller.Relaod(qq)) ?? ""; + if (msg != "") + { + await SendAsync(e, "重载FunGame", msg); + } + return result; + } + } + catch (Exception e) + { + Logger.LogError("Error: {e}", e); + } + + return false; + } + } +}