- if (_sniffer.Battle.WrongResultRank.Count == 0 && _sniffer.WrongBattleResult.Count == 0)\r
- return;\r
- if (_errorDialog.ShowDialog(this,\r
- "戦闘結果の計算に誤りがあります。",\r
- GenerateBattleErrorLog()) == DialogResult.Abort)\r
- Application.Exit();\r
- _sniffer.Battle.WrongResultRank.Clear();\r
- _sniffer.WrongBattleResult.Clear();\r
- }\r
-\r
- private BattleState _prevBattleState = BattleState.None;\r
-\r
- private void SaveBattleApi(string url, string request, string response)\r
- {\r
- if (_prevBattleState == BattleState.None)\r
- _battleApiLog.Clear();\r
- if (_sniffer.Battle.BattleState != BattleState.None)\r
- _battleApiLog.Add(new[] {url, request, response});\r
- _prevBattleState = _sniffer.Battle.BattleState;\r
- }\r
-\r
- private string GenerateBattleErrorLog()\r
- {\r
- foreach (var logs in _battleApiLog)\r
- RemoveUnwantedInformation(ref logs[1], ref logs[2]);\r
- var version = string.Join(".", Application.ProductVersion.Split('.').Take(2));\r
- var api = CompressApi(string.Join("\r\n", _battleApiLog.Select(logs => string.Join("\r\n", logs))));\r
- var ranks = _sniffer.Battle.WrongResultRank;\r
- var status = ranks.Count > 0\r
- ? $"{ranks[0]}->{ranks[1]}"\r
- : string.Join(" ",\r
- from pair in _sniffer.WrongBattleResult\r
- let assumed = pair.Assumed\r
- let actual = pair.Actual\r
- select $"({assumed.Fleet}-{assumed.DeckIndex}) {assumed.Id}: {assumed.NowHp}->{actual.NowHp}");\r
- var result = $"{{{{{{\r\n{DateTime.Now:g} {version}\r\n{status}\r\n{api}\r\n}}}}}}";\r
- File.WriteAllText("error.log", result);\r
- return result;\r
- }\r
-\r
- private string GenerateErrorLog(string url, string request, string response, string exception)\r
- {\r
- RemoveUnwantedInformation(ref request, ref response);\r
- var version = string.Join(".", Application.ProductVersion.Split('.').Take(2));\r
- var api = CompressApi($"{url}\r\n{request}\r\n{response}");\r
- var result = $"{{{{{{\r\n{DateTime.Now:g} {version}\r\n{exception}\r\n{api}\r\n}}}}}}";\r
- File.WriteAllText("error.log", result);\r
- return result;\r
- }\r
-\r
- private void RemoveUnwantedInformation(ref string request, ref string response)\r
- {\r
- var token = new Regex("&api%5Ftoken=[^&]*|api%5Ftoken=[^&]*&?");\r
- request = token.Replace(request, "");\r
- var id = new Regex(@"""api_member_id"":\d+,?|""api_nickname"":[^,]+,""api_nickname_id"":""d+"",?");\r
- response = id.Replace(response, "");\r
- }\r
-\r
- private string CompressApi(string api)\r
- {\r
- var output = new MemoryStream();\r
- var gzip = new GZipStream(output, CompressionLevel.Optimal);\r
- var bytes = Encoding.UTF8.GetBytes(api);\r
- gzip.Write(bytes, 0, bytes.Length);\r
- gzip.Close();\r
- var ascii85 = Ascii85.Encode(output.ToArray());\r
- var result = new List<string>();\r
- var rest = ascii85.Length;\r
- const int lineLength = 46;\r
- for (var i = 0; i < ascii85.Length; i += lineLength, rest -= lineLength)\r
- result.Add(ascii85.Substring(i, Min(rest, lineLength)));\r
- return string.Join("\r\n", result);\r