コード例 #1
0
ファイル: IWDBParser.cs プロジェクト: Grollicus/iwdb
 public void HandleRequest(ParserRequestMessage msg)
 {
     try {
         String coords = msg[1].AsString;
         String req = msg[3].AsString;
         List<uint> entries = new List<uint>();
         switch (msg[2].AsString) {
             case "Geb":
                 Match planetenBauschleife = Regex.Match(req, @"aktuell im Bau auf diesem Planeten((?:\s+.*?bis\s+" + IWZeit + @"\n(?:1\sTag\s)?(?:\d+\sTage\s)?\d+:\d+:\d+)+)");
                 if (planetenBauschleife.Success) {
                     MatchCollection matches = Regex.Matches(planetenBauschleife.Groups[1].Value, @"\s+.*?bis\s+(" + IWZeit + @")\n(?:1\sTag\s)?(?:\d+\sTage\s)?\d+:\d+:\d+");
                     foreach (Match m in matches) {
                         entries.Add(IWDBUtils.parseIWTime(m.Groups[1].Value));
                     }
                 } else {
                     Match ausbaustatus = Regex.Match(req, @"Ausbaustatus((?:\s+" + KolonieName + @"\s+" + Koordinaten + @".*?bis\s+" + IWZeit + @"(?:\s+|\s-\s)\d+:\d+:\d+)+)");
                     if (ausbaustatus.Success) {
                         if (coords == "all") {
                             MatchCollection c = Regex.Matches(ausbaustatus.Groups[1].Value, KolonieName + @"\s+(" + Koordinaten + @").*?bis\s+(" + IWZeit + @")(?:\n|\s-\s)");
                             // jeez. Kleinste Zeit zu der die 1. / 2. / 3. Bauschleife (=Item3) ausläuft. Damit der PHP-Teil nicht vollkommen irre wird :/
                             entries.AddRange(c.OfType<Match>().Select(m => new Tuple<String, uint>(m.Groups[1].Value, IWDBUtils.parseIWTime(m.Groups[2].Value))).GroupBy(t => t.Item1).SelectMany((grp)=> grp.Select((el,i) => new Tuple<String, uint, int>(el.Item1, el.Item2, i))).GroupBy(el => el.Item3).Select(grp => grp.Select(el => el.Item2).Min()));
                         } else {
                             foreach (Match m in Regex.Matches(ausbaustatus.Groups[1].Value, KolonieName + @"\s+\(" + coords + @"\).*?bis\s+(" + IWZeit + @")(?:\n|\s-\s)")) {
                                 entries.Add(IWDBUtils.parseIWTime(m.Groups[1].Value));
                             }
                         }
                     }
                 }
                 break;
             case "For": {
                     Match m = Regex.Match(req, @"Forschungsstatus\s+[^\n]+\s+(" + IWZeit + ")");
                     if (m.Success)
                         entries.Add(IWDBUtils.parseIWTime(m.Groups[1].Value));
                 } break;
             case "Sch":
                 Match outerMatch = Regex.Match(req, @"Schiffbau.{1,2}bersicht((?:\s+\[\d+:\d+:\d+\]\s+" + KolonieName + @"(?:\s+\d+.+?bis\s+" + PräziseIWZeit + @"\s+[\d:]+)+)+)");
                 if (outerMatch.Success) {
                     foreach (Match match in Regex.Matches(outerMatch.Groups[1].Value, @"\[(\d+:\d+:\d+)\]\s+" + KolonieName + @"((?:\s+\d+.+?bis\s+" + PräziseIWZeit + @"\s+[\d:]+)+)")) {
                         if (coords != "all" && match.Groups[1].Value != coords)
                             continue;
                         foreach (Match m in Regex.Matches(match.Groups[2].Value, @"bis\s+(" + PräziseIWZeit + ")")) {
                             entries.Add(IWDBUtils.parsePreciseIWTime(m.Groups[1].Value));
                         }
                     }
                 }
                 break;
         }
         if (entries.Count == 0) {
             msg.Answer("err");
         } else {
             entries.Sort();
             foreach (uint entry in entries) {
                 msg.AnswerLine(entry.ToString());
             }
         }
     } catch(Exception e) {
         Log.WriteLine("Exception im BauschleifenHandler");
         Log.WriteException(e);
         msg.Answer("err");
     } finally {
         msg.Handled();
     }
 }
コード例 #2
0
ファイル: IWDBParser.cs プロジェクト: Grollicus/iwdb
        private void NetworkCallback(NetworkMessage Msg)
        {
            try {
                Log.WriteLine(LogLevel.E_DEBUG, "NetworkCallback begin");
                Socket s = ((NewConnectionNetworkMessage)Msg).NewSocket;
                s.ReceiveTimeout = 1000;
                StringBuilder sb = new StringBuilder();
                byte b = 0;
                byte previous;
                byte[] buffer = new byte[512];
                int read;
                bool finished = false;
                ParserRequestMessage msg = new ParserRequestMessage(s);
                ParserRequestMessagePart part = msg.NextPart();
                while (!finished) {
                    read = s.Receive(buffer, 512, SocketFlags.None);
                    if (read == 0)
                        return;
                    for (int i = 0; i < read; ++i) {
                        previous = b;
                        b = buffer[i];
                        if (b == 0) {
                            if (previous == 0) { // zwei Nullen => Ende der Nachricht
                                finished = true;
                                break;
                            } else {
                                part = msg.NextPart();
                            }
                        } else {
                            part.Add(b);
                        }
                    }
                }
                msg.Finished();

                RequestHandler handler;
                if (handlers.TryGetValue(msg[0].AsString, out handler)) {
                    Log.WriteLine(LogLevel.E_DEBUG, "NetworkCallback: Got Message for " + msg[0].AsString);
                    handler.HandleRequest(msg);
                } else {
                    msg.AnswerLine("Protocol Mismatch.");
                }
            } catch (IOException e) {
                Log.WriteLine(LogLevel.E_NOTICE, "IWDBParser exception");
                Log.WriteException(e);
            } catch (SocketException e) {
                Log.WriteLine(LogLevel.E_NOTICE, "IWDBParser exception");
                Log.WriteException(e);
            } finally {
                Log.WriteLine(LogLevel.E_DEBUG, "NetworkCallback end");
            }
        }