private async Task <ErrorOutput> OnErrorOccur(HttpStatusCode statusCode, HttpContent content, string message = "", ConsoleColor color = ConsoleColor.Black) { ErrorOutput errorOutput = null; if (statusCode == HttpStatusCode.Forbidden) { Console.BackgroundColor = ConsoleColor.DarkBlue; // 需驗證 try { errorOutput = await content.ReadAsJsonAsync <ErrorOutput>(); Console.WriteLine(errorOutput.Error); Console.ForegroundColor = color; Console.WriteLine($"[{Global.MyKiritoDto.Nickname}] 驗證 [{message}] 後 [{Global.GameOptions.DefaultAct.GetDescriptionText()}] 按任意鍵繼續"); } catch { var output = await content.ReadAsStringAsync(); Console.WriteLine(output); Console.ForegroundColor = color; Console.WriteLine("換IP後按任意鍵繼續"); } Console.ResetColor(); Console.ReadKey(); } else if (statusCode == HttpStatusCode.BadRequest) { // 冷卻中or你的角色現在是死亡狀態 try { errorOutput = await content.ReadAsJsonAsync <ErrorOutput>(); Console.WriteLine(errorOutput.Error); } catch { var output = await content.ReadAsStringAsync(); Console.WriteLine(output); } } else { // 未知錯誤 try { var output = await content.ReadAsStringAsync(); Console.WriteLine(output); } catch (Exception e) { Console.WriteLine("未知錯誤"); Console.WriteLine(e); } } return(errorOutput); }
public async Task <bool> GetUserListThenChallenge() { _logger.LogDebug("GetUserListThenChallenge"); UserListDto userList; UserList user; BattleLog battleLog = null; HttpStatusCode httpStatusCode = HttpStatusCode.UpgradeRequired; ErrorOutput errorOutput = null; string coonDownMessage = "還在冷卻中"; _logger.LogDebug("PvpUid" + Global.GameOptions.PvpUid); if (!string.IsNullOrWhiteSpace(Global.GameOptions.PvpUid)) { var uidUser = await _myKiritoService.GetProfile(Global.GameOptions.PvpUid); if (uidUser != null && uidUser.profile != null) { if (!uidUser.profile.dead) { (battleLog, httpStatusCode, errorOutput) = await _myKiritoService.Challenge(uidUser.profile.lv, uidUser.profile._id, uidUser.profile.nickname); } if (!string.IsNullOrWhiteSpace(Global.GameOptions.PvpNickName) && uidUser.profile.nickname == Global.GameOptions.PvpNickName) { Global.GameOptions.PvpNickName = string.Empty; } if (httpStatusCode == HttpStatusCode.Forbidden || battleLog != null) { return(true); } if (errorOutput != null && errorOutput.Error.Contains(coonDownMessage)) { return(false); } } } _logger.LogDebug("PvpUid" + Global.GameOptions.PvpNickName); if (!string.IsNullOrWhiteSpace(Global.GameOptions.PvpNickName) && battleLog == null) { userList = await _myKiritoService.GetUserByName(Global.GameOptions.PvpNickName); if (userList != null && userList.UserList != null && userList.UserList.Any()) { user = userList.UserList.FirstOrDefault(); if (user != null) { if (string.IsNullOrWhiteSpace(Global.GameOptions.PvpUid)) { Global.GameOptions.PvpUid = user.Uid; } if (user != null) { (battleLog, httpStatusCode, errorOutput) = await _myKiritoService.Challenge(user.Lv, user.Uid, user.Nickname); } if (httpStatusCode == HttpStatusCode.Forbidden || battleLog != null) { return(true); } if (errorOutput != null && errorOutput.Error.Contains(coonDownMessage)) { return(false); } } } } if (Global.MyKiritoDto == null) { return(false); } _logger.LogDebug("CurrentPvpUser"); if (Global.GameOptions.CurrentPvpUser != null && Global.GameOptions.CurrentPvpUser.Lv > Global.MyKiritoDto.Lv) { var uidUser = await _myKiritoService.GetProfile(Global.GameOptions.CurrentPvpUser.Uid); if (uidUser != null && uidUser.profile != null) { if (uidUser.profile.dead || Global.MyKiritoDto.Lv > uidUser.profile.lv) { Global.GameOptions.LostUidListPVP.Add(Global.GameOptions.CurrentPvpUser.Uid); Global.GameOptions.CurrentPvpUser = null; } else { (battleLog, httpStatusCode, errorOutput) = await _myKiritoService.Challenge(uidUser.profile.lv, uidUser.profile._id, uidUser.profile.nickname); if (httpStatusCode == HttpStatusCode.Forbidden) { return(true); } if (errorOutput != null && errorOutput.Error.Contains(coonDownMessage)) { return(false); } if (battleLog != null) { if (battleLog.Result != "勝利") { Global.GameOptions.LostUidListPVP.Add(Global.GameOptions.CurrentPvpUser.Uid); Global.GameOptions.CurrentPvpUser = null; } return(true); } } } } _logger.LogDebug("MustIsCharacterPVP"); while (Global.GameOptions.MustIsModeEnable && Global.GameOptions.CurrentSearchLv >= Global.MyKiritoDto.Lv) { _logger.LogDebug($"取得目標清單:Lv={Global.GameOptions.CurrentSearchLv}, Page={Global.GameOptions.CurrentPage}"); userList = await _myKiritoService.GetUserListByLevel(Global.GameOptions.CurrentSearchLv, Global.GameOptions.CurrentPage); if (userList == null || userList.UserList == null || !userList.UserList.Any()) { _logger.LogDebug("清單取得失敗"); break; } var minLv = userList.UserList.Min(x => x.Lv); _logger.LogDebug($"紀錄目前清單的最低等級 {minLv}"); List <UserList> users = userList.UserList; _logger.LogDebug("排除不打的資料並排序"); users.RemoveAll(x => x.Color == "grey" || x.Lv < Global.MyKiritoDto.Lv || Global.GameOptions.LostUidListPVP.Contains(x.Uid)); if (Global.GameOptions.MustIsModeIgnore == false && Global.GameOptions.MustIsCharacterPVP != null && Global.GameOptions.MustIsCharacterPVP.Any()) { users.RemoveAll(x => Global.GameOptions.MustIsCharacterPVP.Contains(x.Character)); } if (!users.Any()) { _logger.LogDebug("如果沒有資料則直接繼續下一個迴圈取得下一頁"); Global.GameOptions.CurrentPage++; continue; } _logger.LogDebug("篩選後還有剩餘資料,逐一對目標進行挑戰"); foreach (var u in users) { _logger.LogDebug($"{u.Lv} - {u.Uid} - {u.Nickname}"); (battleLog, httpStatusCode, errorOutput) = await _myKiritoService.Challenge(u.Lv, u.Uid, u.Nickname); _logger.LogDebug("處理挑戰結果"); if (httpStatusCode == HttpStatusCode.Forbidden) { _logger.LogDebug("驗證後紀錄當前玩家並進行冷卻"); Global.GameOptions.CurrentPvpUser = u; return(true); } if (errorOutput != null && errorOutput.Error.Contains(coonDownMessage)) { _logger.LogDebug("自身冷卻中,紀錄當前玩家並退出"); Global.GameOptions.CurrentPvpUser = u; return(false); } if (battleLog == null) { _logger.LogDebug("戰鬥未完成,可能死了或重生,加入黑名單後繼續對戰下一個目標"); Global.GameOptions.LostUidListPVP.Add(u.Uid); continue; } if (battleLog.Result == "勝利") { _logger.LogDebug("戰鬥完成並勝利,紀錄當前玩家供下次對戰使用"); Global.GameOptions.CurrentPvpUser = u; } else { _logger.LogDebug("戰鬥完成並輸了,加入黑名單"); Global.GameOptions.CurrentPvpUser = null; Global.GameOptions.LostUidListPVP.Add(u.Uid); } _logger.LogDebug("戰鬥完成後退出"); return(true); } _logger.LogDebug("目標清單處理完成"); if (Global.GameOptions.CurrentSearchLv == minLv) { _logger.LogDebug($"最低等級{minLv}等於搜尋等級{Global.GameOptions.CurrentSearchLv},進行翻頁"); Global.GameOptions.CurrentPage++; } else { _logger.LogDebug($"搜尋等級{Global.GameOptions.CurrentSearchLv}高於最低等級{minLv},搜尋條件更新為最低等級,重置頁次"); Global.GameOptions.CurrentSearchLv = minLv; Global.GameOptions.CurrentPage = 1; } } _logger.LogDebug("GetUserListByLevel" + Global.MyKiritoDto.Lv + Global.GameOptions.PvpLevel); userList = await _myKiritoService.GetUserListByLevel(Global.MyKiritoDto.Lv + Global.GameOptions.PvpLevel); if (userList != null && userList.UserList != null && userList.UserList.Any()) { var users = userList.UserList; users.RemoveAll(x => x.Color == "grey"); // 先打紅 橘 foreach (var u in users.Where(x => Global.GameOptions.ColorPVP.Contains(x.Color)).OrderByDescending(x => x.Color).ThenBy(x => x.Floor)) { (battleLog, httpStatusCode, errorOutput) = await _myKiritoService.Challenge(u.Lv, u.Uid, u.Nickname); if (httpStatusCode == HttpStatusCode.Forbidden) { return(true); } if (errorOutput != null && errorOutput.Error.Contains(coonDownMessage)) { return(false); } if (battleLog != null) { return(true); } } users.RemoveAll(x => Global.GameOptions.ColorPVP.Contains(x.Color)); // 先打喜歡的人 foreach (var u in users.Where(x => Global.GameOptions.CharacterPVP.Contains(x.Character)).OrderBy(x => x.Floor)) { (battleLog, httpStatusCode, errorOutput) = await _myKiritoService.Challenge(u.Lv, u.Uid, u.Nickname); if (httpStatusCode == HttpStatusCode.Forbidden) { return(true); } if (errorOutput != null && errorOutput.Error.Contains(coonDownMessage)) { return(false); } if (battleLog != null) { return(true); } } users.RemoveAll(x => Global.GameOptions.CharacterPVP.Contains(x.Character)); // 先不打討厭的人 foreach (var u in users.Where(x => !Global.GameOptions.NotWantCharacterPVP.Contains(x.Character)).OrderBy(x => x.Floor)) { (battleLog, httpStatusCode, errorOutput) = await _myKiritoService.Challenge(u.Lv, u.Uid, u.Nickname); if (httpStatusCode == HttpStatusCode.Forbidden) { return(true); } if (errorOutput != null && errorOutput.Error.Contains(coonDownMessage)) { return(false); } if (battleLog != null) { return(true); } } users.RemoveAll(x => !Global.GameOptions.NotWantCharacterPVP.Contains(x.Character)); // 打剩下的人 foreach (var u in users.OrderBy(x => x.Floor)) { (battleLog, httpStatusCode, errorOutput) = await _myKiritoService.Challenge(u.Lv, u.Uid, u.Nickname); if (httpStatusCode == HttpStatusCode.Forbidden) { return(true); } if (errorOutput != null && errorOutput.Error.Contains(coonDownMessage)) { return(false); } if (battleLog != null) { return(true); } } } return(battleLog != null); }