Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }