public override async Task <IEnumerable <IMessageBase> > GetReply(ChainEventArgs chat) { if (chat.Message.StartsWith("/清人")) { Logger.Instance.AddLog(LogType.Debug, "接受到检查指令"); var GroupMember = await chat.Session.GetGroupMemberListAsync(chat.FromGroup); var clan = BaseData.Instance.container.Resolve <ICocCoreClans>(); var result = clan.GetClansMembers(BaseData.Instance.config["部落冲突"][chat.FromGroup.ToString()].Trim()); if (result == null) { return(new IMessageBase[] { new PlainMessage("请检查设置或者绑定部落后才使用此功能!") }); } StringBuilder sb = new StringBuilder(); sb.AppendLine("不在部落的成员名单: "); List <string> noBind = new List <string>(); foreach (var member in GroupMember) { using var api = new GameAPI(chat.FromGroup, member.Id, chat.Session); try { if (api.Member.ClanData.Count < 1) { noBind.Add(api.Member.Member.Card); continue; } if (api.Member.ClanData.Any(x => !x.InClan)) { sb.AppendLine(member.Name + ":-"); var buffer = api.Member.ClanData; foreach (var data in buffer) { if (!data.InClan) { if (string.IsNullOrEmpty(data.Name)) { api.Member.ClanData.Remove(api.Member.ClanData.Where(x => x.ClanID == data.ClanID).First()); } else { try { sb.AppendLine(" * " + data.Name + " 已经不在部落" + (DateTime.Now - data.LastSeenInClan.Value).TotalDays.ToString("N2") + "天"); } catch { sb.AppendLine(" * " + data.Name + " 无在部落记录"); } } } } sb.AppendLine("=============="); } } catch { continue; } } sb.AppendLine("群里无绑定名单: "); foreach (var nb in noBind) { sb.AppendLine(nb); } return(new IMessageBase[] { BaseData.TextToImg(sb.ToString(), chat.Session) }); } return(await base.GetReply(chat)); }
public static async Task <bool> NewMember(string id, ApplyEventArgs e) { if (Directory.GetFiles("com.coc.groupadmin\\Blacklist").Any(x => x.EndsWith(e.EventArgs.FromQQ.ToString()))) { //在黑名单内,直接拒绝 return(false); } Logger.Instance.AddLog(LogType.Info, "接受到新人申请"); ICocCorePlayers players = BaseData.Instance.container.Resolve <ICocCorePlayers>(); List <int> levels = new List <int>(); int heroLvNeed = 0; Player player = players.GetPlayer(id); if (player != null) { StringBuilder sb = new StringBuilder(); bool troopFull = true, spellFull = true, heroFull = true; var troopsLV = BaseData.GetTownhallTroopsLV(player.TownHallLevel - 1); sb.AppendLine("大本营等级:" + player.TownHallLevel + ",名字:" + player.Name); sb.AppendLine("兵力:"); foreach (var troop in player.Troops) { if (troop.Village == "home") { if (!troopsLV.Keys.Contains(troop.Name.Replace(" ", "_"))) { for (int x = 1; x < BaseData.Instance.THLevels.Length; x++) { BaseData.Instance.thConfig[x.ToString() + "本"].AddKey(troop.Name.Replace(" ", "_"), troop.MaxLevel.ToString()); } BaseData.Instance.config["兵种翻译"].AddKey(troop.Name.Replace(" ", "_"), troop.Name); FileIniDataParser parser = new FileIniDataParser(); parser.WriteFile("Townhall.ini", BaseData.Instance.thConfig); parser.WriteFile("config.ini", BaseData.Instance.config); sb.AppendLine(troop.Name + " Townhall.ini 设置有错误,已自动生成"); } else { if (troopsLV[troop.Name.Replace(" ", "_")] == 99) { BaseData.Instance.thConfig[player.TownHallLevel.ToString() + "本"][troop.Name.Replace(" ", "_")] = troop.MaxLevel.ToString(); FileIniDataParser parser = new FileIniDataParser(); parser.WriteFile("Townhall.ini", BaseData.Instance.thConfig); troopsLV = BaseData.GetTownhallTroopsLV(player.TownHallLevel); } if (troopsLV[troop.Name.Replace(" ", "_")] > troop.Level) { troopFull = false; try { sb.AppendLine(BaseData.Instance.config["兵种翻译"][troop.Name.Replace(" ", "_")] + " 还缺" + (troopsLV[troop.Name.Replace(" ", "_")] - troop.Level) + "级"); levels.Add(troopsLV[troop.Name.Replace(" ", "_")] - troop.Level); } catch { sb.AppendLine(troop.Name + " 还缺" + (troopsLV[troop.Name.Replace(" ", "_")] - troop.Level) + "级"); } } } } } if (troopFull) { sb.AppendLine("已满级"); } sb.AppendLine("药水:"); foreach (var spell in player.Spells) { if (!troopsLV.Keys.Contains(spell.Name.Replace(" ", "_"))) { for (int x = 1; x < BaseData.Instance.THLevels.Length; x++) { BaseData.Instance.thConfig[x.ToString() + "本"].AddKey(spell.Name.Replace(" ", "_"), spell.MaxLevel.ToString()); } BaseData.Instance.config["兵种翻译"].AddKey(spell.Name.Replace(" ", "_"), spell.Name); FileIniDataParser parser = new FileIniDataParser(); parser.WriteFile("Townhall.ini", BaseData.Instance.thConfig); parser.WriteFile("config.ini", BaseData.Instance.config); sb.AppendLine(spell.Name + " Townhall.ini 设置有错误,已自动生成"); } else { if (troopsLV[spell.Name.Replace(" ", "_")] == 99) { BaseData.Instance.thConfig[player.TownHallLevel + "本"][spell.Name.Replace(" ", "_")] = spell.MaxLevel.ToString(); FileIniDataParser parser = new FileIniDataParser(); parser.WriteFile("Townhall.ini", BaseData.Instance.thConfig); troopsLV = BaseData.GetTownhallTroopsLV(player.TownHallLevel); } if (troopsLV[spell.Name.Replace(" ", "_")] > spell.Level) { spellFull = false; try { sb.AppendLine(BaseData.Instance.config["兵种翻译"][spell.Name.Replace(" ", "_")] + " 还缺" + (troopsLV[spell.Name.Replace(" ", "_")] - spell.Level) + "级"); levels.Add(troopsLV[spell.Name.Replace(" ", "_")] - spell.Level); } catch { sb.AppendLine(spell.Name + " 还缺" + (troopsLV[spell.Name.Replace(" ", "_")] - spell.Level) + "级"); } } } } if (spellFull) { sb.AppendLine("已满级"); } if (player.Heroes.Count > 0) { sb.AppendLine("英雄:"); foreach (var hero in player.Heroes) { if (hero.Village == "home") { if (!troopsLV.Keys.Contains(hero.Name.Replace(" ", "_"))) { for (int x = 1; x < BaseData.Instance.THLevels.Length; x++) { BaseData.Instance.thConfig[x.ToString() + "本"].AddKey(hero.Name.Replace(" ", "_"), hero.MaxLevel.ToString()); } BaseData.Instance.config["兵种翻译"].AddKey(hero.Name.Replace(" ", "_"), hero.Name); FileIniDataParser parser = new FileIniDataParser(); parser.WriteFile("Townhall.ini", BaseData.Instance.thConfig); parser.WriteFile("config.ini", BaseData.Instance.config); sb.AppendLine(hero.Name + " Townhall.ini 设置有错误,已自动生成"); } else { if (troopsLV[hero.Name.Replace(" ", "_")] == 99) { BaseData.Instance.thConfig[player.TownHallLevel + "本"][hero.Name.Replace(" ", "_")] = hero.MaxLevel.ToString(); FileIniDataParser parser = new FileIniDataParser(); parser.WriteFile("Townhall.ini", BaseData.Instance.thConfig); troopsLV = BaseData.GetTownhallTroopsLV(player.TownHallLevel); } if (troopsLV[hero.Name.Replace(" ", "_")] > hero.Level) { heroFull = false; heroLvNeed += (troopsLV[hero.Name.Replace(" ", "_")] - hero.Level); try { sb.AppendLine(BaseData.Instance.config["兵种翻译"][hero.Name.Replace(" ", "_")] + " 还缺" + (troopsLV[hero.Name.Replace(" ", "_")] - hero.Level) + "级"); } catch { sb.AppendLine(hero.Name + " 还缺" + (troopsLV[hero.Name.Replace(" ", "_")] - hero.Level) + "级"); } } } } } if (heroFull) { sb.AppendLine("已满级"); } } bool allow; if (levels.Count(x => x >= 1) > 6 || heroLvNeed >= 30) { sb.AppendLine("不批准!科技不足!"); allow = false; } else { sb.AppendLine("批准!科技已足够!"); allow = true; } if (player.WarStars >= 500) { sb.AppendLine("战星已超过500,强制批准!"); allow = true; } await e.Session.SendGroupMessageAsync(e.EventArgs.FromGroup, new PlainMessage("新人距离上一本的审核资料如下:\n" + sb.ToString())); return(allow); } else { //申请是来骂人的 foreach (var keyvalue in valuePairs(configType.禁止词句)) { if (id == keyvalue.Key) { if (int.TryParse(keyvalue.Value, out int ticks)) { if (ticks > 0) { return(false); } } } } return(true); } }
static async Task Main(string[] args) { string key = null; if (args.Length > 0) { key = args[0]; } long qqId = -1; if (args.Length > 1) { qqId = Convert.ToInt64(args[1]); } try { Logger.Instance.AddLog(LogType.Info, "正在加载..."); FileIniDataParser parse = new FileIniDataParser(); if (!File.Exists("config.ini")) { BaseData.Instance.config = new IniData(); foreach (var section in (configType[])Enum.GetValues(typeof(configType))) { BaseData.Instance.config.Sections.AddSection(section.ToString()); } BaseData.InitFirstUse(); parse.WriteFile("config.ini", BaseData.Instance.config, Encoding.Unicode); } BaseData.LoadCOCData(); Logger.Instance.AddLog(LogType.Info, "已加载" + BaseData.Instance.config.Sections.Count + "区域"); if (BaseData.Instance.checkClanWar != null) { BaseData.Instance.checkClanWar.Abort(); BaseData.Instance.checkClanWar = null; } BaseData.ReadGameData(); } catch (Exception ex) { Logger.Instance.AddLog(LogType.Error, ex.Message); } if (key == null) { if (!BaseData.valuePairs(configType.部落冲突).TryGetValue("AuthKey", out key)) { Logger.Instance.AddLog(LogType.Error, "法找到可使用的AuthKey! 请在config.ini的部落冲突栏位添加AuthKey = 相应的AuthKey!"); Console.ReadLine(); return; } } if (qqId == -1) { if (!BaseData.valuePairs(configType.部落冲突).TryGetValue("QQ号", out string qqString)) { Logger.Instance.AddLog(LogType.Error, "无法找到可使用的QQ号! 请在config.ini的部落冲突栏位添加QQ号 = 相应的QQ号!"); Console.ReadLine(); return; } if (!long.TryParse(qqString, out qqId)) { Logger.Instance.AddLog(LogType.Error, "QQ号不正确!请确保QQ号只有纯数字!"); Console.ReadLine(); return; } } LoggedInQQ = qqId; AppDomain.CurrentDomain.ProcessExit += CurrentDomain_ProcessExit; Loop: try { MiraiHttpSessionOptions options = new MiraiHttpSessionOptions("127.0.0.1", 8080, key); await using var session = new MiraiHttpSession(); BaseData.Instance.checkClanWar = new Thread(new Threading(session).CheckClanWar) { IsBackground = true }; BaseData.Instance.checkClanWar.Start(); session.AddPlugin(new GroupMessageHandler()); session.AddPlugin(new GroupRequestHandler()); session.AddPlugin(new GroupExitHandler()); Logger.Instance.AddLog(LogType.Info, "创建Event监听成功!"); Retry: try { await session.ConnectAsync(options, qqId, true); } catch { goto Retry; } Logger.Instance.AddLog(LogType.Info, "监听开始!"); do { var input = Console.ReadLine(); switch (input) { case "/D": if (!Directory.Exists("apk")) { Directory.CreateDirectory("apk"); Logger.Instance.AddLog(LogType.Info, "把部落冲突APK文件放到这个文件夹内后再输入/D"); Process.Start("explorer.exe", Path.Combine(Environment.CurrentDirectory, "apk")); break; } else { foreach (var f in Directory.GetFiles("apk", "*.*", SearchOption.AllDirectories)) { if (!f.EndsWith(".apk")) { File.Delete(f); } } } var files = Directory.GetFiles("apk", "*.apk", SearchOption.TopDirectoryOnly); Array.Sort(files, StringComparer.OrdinalIgnoreCase); var file = files.Last(); var zip = file.Replace(".apk", ".zip"); File.Copy(file, zip); ZipArchive zipFile = ZipFile.OpenRead(zip); zipFile.ExtractToDirectory(Path.Combine(Environment.CurrentDirectory, "apk")); foreach (var f in Directory.GetFiles("apk", "*.csv", SearchOption.AllDirectories)) { File.WriteAllBytes(f, SCDecompress.Decompress(f)); if (f.EndsWith("buildings.csv") || f.EndsWith("characters.csv") || f.EndsWith("heros.csv") || f.EndsWith("spells.csv") || f.EndsWith("texts.csv")) { var local = Path.Combine(Environment.CurrentDirectory, f.Split('\\').Last()); if (File.Exists(local)) { File.Delete(local); } File.Copy(f, local); } } FileIniDataParser parser = new FileIniDataParser(); BaseData.UpdateTownhallINI(parser); BaseData.UpdateTranslate(parser); BaseData.Instance.chains.Clear(); BaseData.Instance.checkClanWar.Abort(); BaseData.Instance.config = null; GC.Collect(); BaseData.LoadCOCData(); break; } }while (true); } catch (Exception ex) { Logger.Instance.AddLog(LogType.Error, ex.ToString()); goto Loop; } }
public override async Task <IEnumerable <IMessageBase> > GetReply(ChainEventArgs chat) { if (chat.Message == "/部落战") { ICocCoreClans clan = BaseData.Instance.container.Resolve <ICocCoreClans>(); var clanData = clan.GetCurrentWar(BaseData.Instance.config["部落冲突"][chat.FromGroup.ToString()]); if (!string.IsNullOrEmpty(clanData.Reason)) { return(new IMessageBase[] { new PlainMessage("无法获取部落资料!" + clanData.Reason) }); } else { if (clanData.State == "inWar") { StringBuilder sb = new StringBuilder(); sb.Append("当前的部落战资料:\n"); sb.Append("当前我方战星: " + clanData.Clan.Stars + "(摧毁:" + clanData.Clan.DestructionPercentage + ")\n"); sb.Append("当前对手战星:" + clanData.Opponent.Stars + "(摧毁:" + clanData.Opponent.DestructionPercentage + ")\n"); sb.AppendLine(); foreach (var Member in clanData.Clan.Members.OrderBy(x => x.MapPosition)) { if (Member.Attacks != null) { sb.Append(Member.Name + "已进攻 " + Member.Attacks.Count + " 次 \n"); int x = 1; foreach (var attack in Member.Attacks) { if (x == 1) { sb.Append("❶"); } else { sb.Append("❷"); } sb.Append("攻击了" + clanData.Opponent.Members.Where(y => y.Tag == attack.DefenderTag).FirstOrDefault().MapPosition + "号获得" + attack.Stars + "星|摧毁:" + attack.DestructionPercentage + "%\n"); x++; } sb.Append("\n"); } else { sb.Append(Member.Name + " " + Member.Tag + " 无进攻次数\n"); } } sb.Append("战斗日结束时间:" + clanData.EndTime.ToLocalTime().ToString("dd/MM/yyyy hh:mm:ss tt")); return(new IMessageBase[] { BaseData.TextToImg(sb.ToString(), chat.Session) }); } else if (clanData.State == "warEnded") { StringBuilder sb = new StringBuilder(); sb.Append("当前部落战资料:\n"); sb.Append("当前我方战星: " + clanData.Clan.Stars + "(摧毁:" + clanData.Clan.DestructionPercentage + ")\n"); sb.Append("当前对手战星:" + clanData.Opponent.Stars + "(摧毁:" + clanData.Opponent.DestructionPercentage + ")\n"); sb.AppendLine(); foreach (var Member in clanData.Clan.Members.OrderBy(x => x.MapPosition)) { if (Member.Attacks != null) { sb.Append(Member.Name + "已进攻 " + Member.Attacks.Count + " 次 \n"); int x = 1; foreach (var attack in Member.Attacks) { if (x == 1) { sb.Append("❶"); } else { sb.Append("❷"); } sb.Append("攻击了" + clanData.Opponent.Members.Where(y => y.Tag == attack.DefenderTag).FirstOrDefault().MapPosition + "号获得" + attack.Stars + "星|摧毁:" + attack.DestructionPercentage + "%\n"); x++; } sb.Append("\n"); } else { sb.Append(Member.Name + " 无进攻\n"); } } sb.Append("部落战已结束!"); return(new IMessageBase[] { BaseData.TextToImg(sb.ToString(), chat.Session) }); } else if (clanData.State == "preparation") { StringBuilder sb = new StringBuilder(); sb.Append("当前部落战资料:\n"); int x = 1; foreach (var Member in clanData.Clan.Members.OrderBy(y => y.MapPosition)) { sb.AppendLine(x + ". " + Member.Name); x++; } sb.AppendLine("开战时间为: " + clanData.EndTime.ToLocalTime().ToString("dd/MM/yyyy hh:mm:ss tt")); sb.AppendLine("当前为准备日"); return(new IMessageBase[] { BaseData.TextToImg(sb.ToString(), chat.Session) }); } else if (clanData.Reason == "inMaintenance") { return(new IMessageBase[] { new AtMessage(chat.FromQQ), new PlainMessage(" 当前服务器在维护!") }); } else { return(new IMessageBase[] { new AtMessage(chat.FromQQ), new PlainMessage(" 当前部落无部落战!") }); } } } return(await base.GetReply(chat)); }
public override async Task <IEnumerable <IMessageBase> > GetReply(ChainEventArgs chat) { if (chat.Message == "/联赛") { ICocCoreClans war = BaseData.Instance.container.Resolve <ICocCoreClans>(); var keypairs = BaseData.valuePairs(configType.部落冲突); if (keypairs.ContainsKey(chat.FromGroup.ToString())) { List <IMessageBase> result = new List <IMessageBase>(); LeagueWar league = war.GetCurrentWarLeague(keypairs[chat.FromGroup.ToString()]); if (league != null && string.IsNullOrEmpty(league.Reason)) { StringBuilder sb = new StringBuilder(); sb.AppendLine("============"); foreach (var clan in league.Clans) { sb.AppendLine("部落名: " + clan.Name); sb.AppendLine("参赛成员:" + clan.Members.Length); sb.AppendLine("-----------"); for (int x = 4; x <= 13; x++) { int count = clan.Members.Count(m => m.TownhallLevel == x); if (count > 0) { sb.AppendLine("拥有" + BaseData.Instance.THLevels[x] + "本 x" + count); } } sb.AppendLine("============"); } result.Add(BaseData.TextToImg(sb.ToString(), chat.Session)); sb.Clear(); Array.Reverse(league.Rounds); Parallel.ForEach(league.Rounds, (rounds) => { Parallel.ForEach(rounds.warTags, (warTag) => { if (warTag != "#0") { var roundData = war.GetCurrentWarLeagueRound(warTag); Logger.Instance.AddLog(LogType.Debug, "联赛部落" + roundData.clan.Name + " vs " + roundData.opponent.Name); if (roundData.clan.Tag == keypairs[chat.FromGroup.ToString()].ToUpper()) { if (roundData.state == "preparation") { sb.AppendLine("下场联赛开战时间为: " + roundData.StartTime.ToLocalTime().ToString("dd/MM/yyyy hh:mm:ss tt")); sb.AppendLine("对手为" + roundData.opponent.Name); result.Add(BaseData.TextToImg(sb.ToString(), chat.Session)); sb.Clear(); } else if (roundData.state == "inWar") { sb.AppendLine("当前联赛结束时间为: " + roundData.EndTime.ToLocalTime().ToString("dd/MM/yyyy hh:mm:ss tt")); sb.AppendLine("对手为" + roundData.opponent.Name); sb.AppendLine("当前我方战星: " + roundData.clan.Stars + ", 敌方战星: " + roundData.opponent.Stars); result.Add(BaseData.TextToImg(sb.ToString(), chat.Session)); } } else if (roundData.opponent.Tag == keypairs[chat.FromGroup.ToString()].ToUpper()) { if (roundData.state == "preparation") { sb.AppendLine("下场联赛开战时间为: " + roundData.StartTime.ToLocalTime().ToString("dd/MM/yyyy hh:mm:ss tt")); sb.AppendLine("对手为" + roundData.clan.Name); result.Add(BaseData.TextToImg(sb.ToString(), chat.Session)); sb.Clear(); } else if (roundData.state == "inWar") { sb.AppendLine("当前联赛结束时间为: " + roundData.EndTime.ToLocalTime().ToString("dd/MM/yyyy hh:mm:ss tt")); sb.AppendLine("对手为" + roundData.clan.Name); sb.AppendLine("当前我方战星: " + roundData.opponent.Stars + ", 敌方战星: " + roundData.clan.Stars); result.Add(BaseData.TextToImg(sb.ToString(), chat.Session)); } } } }); }); return(result); } else if (!string.IsNullOrEmpty(league.Reason)) { if (league.Reason == "inMaintenance") { return(new IMessageBase[] { new PlainMessage(" 当前服务器在维护!") }); } } else { return(new IMessageBase[] { new PlainMessage("请在config.ini设置好Clan_ID后再继续使用此功能或者当前不在联赛时间") }); } } else { return(new IMessageBase[] { new PlainMessage("请在config.ini设置好Clan_ID后再继续使用此功能") }); } } return(await base.GetReply(chat)); }