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(); } }
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"); } }