+ private static void SendProxyPac(Socket client, int port)\r
+ {\r
+ using (var header = new StreamWriter(new MemoryStream(), Encoding.ASCII))\r
+ {\r
+ header.Write("HTTP/1.1 200 OK\r\n");\r
+ header.Write("Server: KancolleSniffer\r\n");\r
+ header.Write("Date: {0:R}\r\n", DateTime.Now);\r
+ header.Write("Content-Type: application/x-ns-proxy-autoconfig\r\n");\r
+ header.Write("Connection: close\r\n\r\n");\r
+ header.Flush();\r
+ client.Send(((MemoryStream)header.BaseStream).ToArray());\r
+ }\r
+ var pacFile = @"\r
+function FindProxyForURL(url, host) {\r
+ if(isInNet(host, ""203.104.209.71"", ""255.255.255.255"") ||\r
+ isInNet(host, ""203.104.209.87"", ""255.255.255.255"") ||\r
+ isInNet(host, ""125.6.184.16"", ""255.255.255.255"") ||\r
+ isInNet(host, ""125.6.187.205"", ""255.255.255.255"") ||\r
+ isInNet(host, ""125.6.187.229"", ""255.255.255.255"") ||\r
+ isInNet(host, ""203.104.209.134"", ""255.255.255.255"") ||\r
+ isInNet(host, ""203.104.209.167"", ""255.255.255.255"") ||\r
+ isInNet(host, ""203.104.248.135"", ""255.255.255.255"") ||\r
+ isInNet(host, ""125.6.189.7"", ""255.255.255.255"") ||\r
+ isInNet(host, ""125.6.189.39"", ""255.255.255.255"") ||\r
+ isInNet(host, ""125.6.189.71"", ""255.255.255.255"") ||\r
+ isInNet(host, ""125.6.189.103"", ""255.255.255.255"") ||\r
+ isInNet(host, ""125.6.189.135"", ""255.255.255.255"") ||\r
+ isInNet(host, ""125.6.189.167"", ""255.255.255.255"") ||\r
+ isInNet(host, ""125.6.189.215"", ""255.255.255.255"") ||\r
+ isInNet(host, ""125.6.189.247"", ""255.255.255.255"") ||\r
+ isInNet(host, ""203.104.209.23"", ""255.255.255.255"") ||\r
+ isInNet(host, ""203.104.209.39"", ""255.255.255.255"") ||\r
+ isInNet(host, ""203.104.209.55"", ""255.255.255.255"") ||\r
+ isInNet(host, ""203.104.209.102"", ""255.255.255.255"")) {\r
+ return ""PROXY 127.0.0.1:8080"";\r
+ }\r
+ else {\r
+ return ""DIRECT"";\r
+ }\r
+}".Replace("8080", port.ToString());\r
+ client.Send(Encoding.ASCII.GetBytes(pacFile));\r
+ }\r
+ }\r
+\r
+ public static class BattleLogProcessor\r
+ {\r
+ public static IEnumerable<string> Process(string[] data)\r
+ {\r
+ if (data.Length == 35)\r
+ data = data.Concat(Enumerable.Repeat("", 3)).ToArray();\r
+ if (data.Length != 38)\r
+ return data;\r
+ if (data[5] == "T字戦(有利)")\r
+ data[5] = "T字有利";\r
+ if (data[5] == "T字戦(不利)")\r
+ data[5] = "T字不利";\r
+ if (data[6].EndsWith("航行序列"))\r
+ data[6] = data[6].Substring(0, 4);\r
+ if (data[7].EndsWith("航行序列"))\r
+ data[7] = data[7].Substring(0, 4);\r
+ data[37] = ShortenAirBattleResult(data[37]);\r
+ return AddDamagedShip(data);\r
+ }\r
+\r
+ private static string ShortenAirBattleResult(string result)\r
+ {\r
+ switch (result)\r
+ {\r
+ case "制空均衡":\r
+ return "均衡";\r
+ case "制空権確保":\r
+ return "確保";\r
+ case "航空優勢":\r
+ return "優勢";\r
+ case "航空劣勢":\r
+ return "劣勢";\r
+ case "制空権喪失":\r
+ return "喪失";\r
+ default:\r
+ return "";\r
+ }\r
+ }\r
+\r
+ private static IEnumerable<string> AddDamagedShip(string[] data)\r
+ {\r
+ var damaged = new List<string>();\r
+ for (var i = 11; i < 11 + 12; i += 2)\r
+ {\r
+ if (data[i] == "")\r
+ continue;\r
+ var ship = data[i] = StripKana(data[i]);\r
+ var hp = data[i + 1];\r
+ try\r
+ {\r
+ if (ship.Contains("・"))\r
+ {\r
+ var ships = ship.Split('・');\r
+ var hps = hp.Split('・');\r
+ var nowMax = hps[0].Split('/').Select(int.Parse).ToArray();\r
+ if (ShipStatus.CalcDamage(nowMax[0], nowMax[1]) == ShipStatus.Damage.Badly)\r
+ damaged.Add(ships[0]);\r
+ nowMax = hps[1].Split('/').Select(int.Parse).ToArray();\r
+ if (ShipStatus.CalcDamage(nowMax[0], nowMax[1]) == ShipStatus.Damage.Badly)\r
+ damaged.Add(ships[1]);\r
+ }\r
+ else\r
+ {\r
+ var nowMax = hp.Split('/').Select(int.Parse).ToArray();\r
+ if (ShipStatus.CalcDamage(nowMax[0], nowMax[1]) == ShipStatus.Damage.Badly)\r
+ damaged.Add(ship);\r
+ }\r
+ }\r
+ catch (FormatException)\r
+ {\r
+ return data;\r
+ }\r
+ }\r
+ return data.Take(23).Concat(new[] { string.Join("・", damaged) }).Concat(data.Skip(23));\r
+ }\r
+\r
+ private static readonly Regex Kana = new Regex(@"\([^)]+\)\(", RegexOptions.Compiled);\r
+\r
+ private static string StripKana(string name)\r