OSDN Git Service

ヘッダのCondとExpのマウスカーソルを変える
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / LogServer.cs
index af74ab9..007f8ef 100644 (file)
@@ -19,6 +19,7 @@ using System.IO;
 using System.Linq;\r
 using System.Net.Sockets;\r
 using System.Text;\r
+using System.Text.RegularExpressions;\r
 \r
 namespace KancolleSniffer\r
 {\r
@@ -32,6 +33,8 @@ namespace KancolleSniffer
             set => _outputDir = value;\r
         }\r
 \r
+        public static MaterialCount[] MaterialHistory { private get; set; }\r
+\r
         public static void Process(Socket client, string requestLine)\r
         {\r
             var from = DateTime.MinValue;\r
@@ -61,14 +64,12 @@ namespace KancolleSniffer
                 var query = HttpUtility.ParseQueryString(tmp[1]);\r
                 if (query["from"] != null)\r
                 {\r
-                    double tick;\r
-                    double.TryParse(query["from"], out tick);\r
+                    double.TryParse(query["from"], out var tick);\r
                     from = new DateTime(1970, 1, 1).ToLocalTime().AddSeconds(tick / 1000);\r
                 }\r
                 if (query["to"] != null)\r
                 {\r
-                    double tick;\r
-                    double.TryParse(query["to"], out tick);\r
+                    double.TryParse(query["to"], out var tick);\r
                     to = new DateTime(1970, 1, 1).ToLocalTime().AddSeconds(tick / 1000);\r
                 }\r
                 if (query["number"] != null)\r
@@ -153,7 +154,7 @@ namespace KancolleSniffer
                 }\r
                 else if (path.EndsWith("海戦・ドロップ報告書.json"))\r
                 {\r
-                    records = 38;\r
+                    records = 39;\r
                     battle = true;\r
                 }\r
                 else if (path.EndsWith("開発報告書.json"))\r
@@ -180,10 +181,18 @@ namespace KancolleSniffer
                     if (!DateTime.TryParseExact(data[0], Logger.DateTimeFormat, CultureInfo.InvariantCulture,\r
                         DateTimeStyles.AssumeLocal, out DateTime date))\r
                     {\r
-                        if (DateTime.TryParse(data[0], CultureInfo.CurrentCulture,\r
+                        // システムが和暦に設定されていて和暦が出力されてしまったケースを救う\r
+                        var wareki = CultureInfo.CreateSpecificCulture("ja-JP");\r
+                        wareki.DateTimeFormat.Calendar = new JapaneseCalendar();\r
+                        if (DateTime.TryParseExact(data[0], Logger.DateTimeFormat, wareki,\r
+                            DateTimeStyles.AssumeLocal, out date))\r
+                        {\r
+                            data[0] = Logger.FormatDateTime(date);\r
+                        }\r
+                        else if (DateTime.TryParse(data[0], CultureInfo.CurrentCulture,\r
                             DateTimeStyles.AssumeLocal, out date))\r
                         {\r
-                            data[0] = date.ToString(Logger.DateTimeFormat);\r
+                            data[0] = Logger.FormatDateTime(date);\r
                         }\r
                         else\r
                         {\r
@@ -196,7 +205,7 @@ namespace KancolleSniffer
                     if (material)\r
                         entries = data.Take(9);\r
                     if (battle)\r
-                        entries = data.Concat(Enumerable.Repeat("", 3)).Take(38);\r
+                        entries = BattleLogProcessor.Process(data);\r
                     if (entries.Count() != records)\r
                         continue;\r
                     if (number)\r
@@ -214,6 +223,11 @@ namespace KancolleSniffer
                     }\r
                     delimiter = ",\n";\r
                 }\r
+                if (material && !number)\r
+                {\r
+                    client.Send(encoding.GetBytes(delimiter + "[\"" +\r
+                                                  string.Join("\",\"", GetCurrentMaterialRecord()) + "\"]"));\r
+                }\r
             }\r
             finally\r
             {\r
@@ -221,6 +235,12 @@ namespace KancolleSniffer
             }\r
         }\r
 \r
+        private static IEnumerable<string> GetCurrentMaterialRecord()\r
+        {\r
+            return new[] {Logger.FormatDateTime(DateTime.Now)}.\r
+                Concat(MaterialHistory.Select(c => c.Now.ToString()));\r
+        }\r
+\r
         private static void SendFile(Socket client, string path, string mime)\r
         {\r
             using (var header = new StreamWriter(new MemoryStream(), Encoding.ASCII))\r
@@ -252,12 +272,12 @@ namespace KancolleSniffer
             var pacFile = @"\r
 function FindProxyForURL(url, host) {\r
   if(isInNet(host, ""203.104.209.71"", ""255.255.255.255"") ||\r
-     isInNet(host, ""125.6.184.15"", ""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, ""125.6.187.253"", ""255.255.255.255"") ||\r
-     isInNet(host, ""125.6.188.25"", ""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
@@ -270,8 +290,7 @@ function FindProxyForURL(url, host) {
      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
-     isInNet(host, ""203.104.209.87"", ""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
@@ -281,4 +300,95 @@ function FindProxyForURL(url, host) {
             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 == 40)\r
+            {\r
+                data = data.Take(21).Concat(new[] {data[21] + "・" + data[23], data[22] + "・" + data[24]})\r
+                    .Concat(data.Skip(25)).ToArray();\r
+            }\r
+            else if (data.Length != 38)\r
+            {\r
+                return data;\r
+            }\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
+        {\r
+            return Kana.Replace(name, "(");\r
+        }\r
+    }\r
 }
\ No newline at end of file