public static void Run() { var server = new DotNetServer(); var pipe = server.Start(); server.Host((env, respond, error) => { var path = env["Owin.RequestUri"] as string; /* * if (path == "/") * respond( * "200 OK", * new Dictionary<string, IList<string>>() * { * { "Content-Type", new string[] { "text/plain" } } * }, * new object[] { Encoding.ASCII.GetBytes("Hello world.") } * ); * else if (path == "/stream") * { * StreamingApp(env, respond, error); * } * else if (path == "/bufferedecho") * { * BufferedEcho(env, respond, error); * } */ var urlParts = path.Substring(1).Split(new[] { '/' }, 2); if (urlParts.Length >= 1) { if (urlParts[0] == "nick") { var steamID = long.Parse(urlParts[1]); var client = Client.Get(steamID); Console.WriteLine(steamID); if (client.GameVersion != 0) { var nickname = client.GamerTag; respond( "200 OK", new Dictionary <string, IList <string> >() { { "Content-Type", new string[] { "text/plain" } } }, new object[] { Encoding.ASCII.GetBytes(nickname) } ); return; } } else if (urlParts[0] == "stats") { var statistics = Client.GetStatistics(); var retString = "[Stats]\r\n"; var totalPlayers = 0; foreach (var stat in statistics) { retString += string.Format("playerState{0}={1}\r\n", stat.StatisticID, stat.StatisticCount); totalPlayers += stat.StatisticCount; } retString += string.Format("totalPlayers={0}\r\n", totalPlayers); retString += "[Lobbies]\r\n"; totalPlayers = 0; foreach (var serverc in MatchServer.Servers) { var cnt = serverc.Value.Sessions.Count(sess => (DateTime.Now - sess.LastTouched).TotalSeconds < 60); //var cnt = serverc.Value.Sessions.Count; retString += string.Format("lobbies{0}={1}\r\n", serverc.Key, cnt); totalPlayers += cnt; } retString += string.Format("totalLobbies={0}", totalPlayers); respond( "200 OK", new Dictionary <string, IList <string> >() { { "Content-Type", new string[] { "text/plain" } } }, new object[] { Encoding.ASCII.GetBytes(retString) } ); return; } else if (urlParts[0] == "clean") { long clientID = 0; var valid = false; if (long.TryParse(urlParts[1], out clientID)) { if (clientID != 0x110000100000002) { var client = Client.Get(clientID); if ((DateTime.UtcNow - client.LastTouched).TotalSeconds < 300) { var state = CIServer.IsUnclean(clientID, null); if (!state) { valid = true; } } } } respond( "200 OK", new Dictionary <string, IList <string> >() { { "Content-Type", new string[] { "text/plain" } } }, new object[] { Encoding.ASCII.GetBytes((valid) ? "valid" : "invalid") } ); return; } else if (urlParts[0] == "cleanExt") { long clientID = 0; var valid = false; var reason = "invalid-id"; if (long.TryParse(urlParts[1], out clientID)) { if (clientID != 0x110000100000002) { var client = Client.Get(clientID); if ((DateTime.UtcNow - client.LastTouched).TotalHours < 6) { var state = CIServer.IsUnclean(clientID, null); if (state) { reason = CIServer.WhyUnclean(clientID); } else { reason = "actually-valid"; valid = true; } } else { reason = "not-registered-at-lsp"; } } else { reason = "00002-IDGEN-error"; } } respond( "200 OK", new Dictionary <string, IList <string> >() { { "Content-Type", new string[] { "text/plain" } } }, new object[] { Encoding.ASCII.GetBytes(((valid) ? "valid" : "invalid") + "\r\n" + reason) } ); return; } else if (urlParts[0] == "pc") { var file = "pc/" + urlParts[1].Replace('\\', '/'); if (!File.Exists(file)) { respond( "200 OK", new Dictionary <string, IList <string> >() { { "Content-Type", new string[] { "text/plain" } } }, new object[] { Encoding.ASCII.GetBytes("Not found!") } ); } else { var stream = File.OpenRead(file); var b = new byte[stream.Length]; stream.Read(b, 0, (int)stream.Length); stream.Close(); respond( "200 OK", new Dictionary <string, IList <string> >() { { "Content-Type", new string[] { "application/octet-stream" } } }, new object[] { b } ); } return; } else if (urlParts[0] == "servers") { var filter = urlParts[1].Replace(".xml", ""); if (filter.Contains("yeQA4reD")) { respond( "200 OK", new Dictionary <string, IList <string> >() { { "Content-Type", new string[] { "text/xml" } } }, new object[] { Encoding.ASCII.GetBytes(ProcessServers(filter)) } ); } else { respond( "200 OK", new Dictionary <string, IList <string> >() { { "Content-Type", new string[] { "text/html" } } }, new object[] { Encoding.ASCII.GetBytes("Invalid") } ); } return; } else { respond( "200 OK", new Dictionary <string, IList <string> >() { { "Content-Type", new string[] { "text/html" } } }, new object[] { Encoding.ASCII.GetBytes("Invalid") } ); } } }); Log.Info("Listening on " + server.ListenEndPoint); }
public void OnResponse(HttpListenerContext context) { try { var url = context.Request.Url.PathAndQuery; Log.Debug(string.Format("HTTP request for {0}", url)); var urlParts = url.Substring(1).Split(new[] { '/' }, 2); if (urlParts.Length >= 1) { if (urlParts[0] == "nick") { var steamID = long.Parse(urlParts[1]); var client = Client.Get(steamID); if (client.GameVersion != 0) { var nickname = client.GamerTag; //rp.status = (int)RespState.OK; //rp.Headers["Content-Type"] = "text/plain"; var b = Encoding.ASCII.GetBytes(nickname); context.Response.ContentLength64 = b.Length; context.Response.ContentType = "text/plain"; context.Response.OutputStream.Write(b, 0, b.Length); context.Response.OutputStream.Close(); return; } } else if (urlParts[0] == "stats") { var statistics = Client.GetStatistics(); var retString = "[Stats]\r\n"; var totalPlayers = 0; foreach (var stat in statistics) { retString += string.Format("playerState{0}={1}\r\n", stat.StatisticID, stat.StatisticCount); totalPlayers += stat.StatisticCount; } retString += string.Format("totalPlayers={0}\r\n", totalPlayers); retString += "[Lobbies]\r\n"; totalPlayers = 0; foreach (var server in MatchServer.Servers) { var cnt = server.Value.Sessions.Count(sess => (DateTime.Now - sess.LastTouched).TotalSeconds < 60); retString += string.Format("lobbies{0}={1}\r\n", server.Key, cnt); totalPlayers += cnt; } retString += string.Format("totalLobbies={0}", totalPlayers); /*rp.status = (int)RespState.OK; * rp.Headers["Content-Type"] = "text/plain"; * rp.BodyData = Encoding.ASCII.GetBytes(retString);*/ var b = Encoding.ASCII.GetBytes(retString); context.Response.ContentLength64 = b.Length; context.Response.ContentType = "text/plain"; context.Response.OutputStream.Write(b, 0, b.Length); context.Response.OutputStream.Close(); return; } else if (urlParts[0] == "clean") { long clientID = 0; var valid = false; if (long.TryParse(urlParts[1], out clientID)) { var client = Client.Get(clientID); if ((DateTime.UtcNow - client.LastTouched).TotalSeconds < 300) { var state = CIServer.IsUnclean(clientID, null); if (!state) { valid = true; } } } var b = Encoding.ASCII.GetBytes((valid) ? "valid" : "invalid"); context.Response.ContentLength64 = b.Length; context.Response.ContentType = "text/plain"; context.Response.OutputStream.Write(b, 0, b.Length); context.Response.OutputStream.Close(); return; } else if (urlParts[0] == "cleanExt") { long clientID = 0; var valid = false; var reason = "invalid-id"; if (long.TryParse(urlParts[1], out clientID)) { var client = Client.Get(clientID); if ((DateTime.UtcNow - client.LastTouched).TotalHours < 6) { var state = CIServer.IsUnclean(clientID, null); if (state) { reason = CIServer.WhyUnclean(clientID); } else { reason = "actually-valid"; valid = true; } } else { reason = "not-registered-at-lsp"; } } var b = Encoding.ASCII.GetBytes(((valid) ? "valid" : "invalid") + "\r\n" + reason); context.Response.ContentLength64 = b.Length; context.Response.ContentType = "text/plain"; context.Response.OutputStream.Write(b, 0, b.Length); context.Response.OutputStream.Close(); return; } /*else if (urlParts[0] == "key_public.xml") * { * if (_keyXML == string.Empty) * { * _keyXML = File.ReadAllText("key-public.xml"); * } * * var b = Encoding.ASCII.GetBytes(_keyXML); * context.Response.ContentLength64 = b.Length; * context.Response.ContentType = "text/plain"; * context.Response.OutputStream.Write(b, 0, b.Length); * context.Response.OutputStream.Close(); * return; * }*/ else if (urlParts[0] == "pc") { var file = "pc/" + urlParts[1].Replace('\\', '/'); if (!File.Exists(file)) { /*rp.status = (int)RespState.NOT_FOUND; * rp.Headers["Content-Type"] = "text/plain"; * rp.BodyData = Encoding.ASCII.GetBytes("Not Found!");*/ var b = Encoding.ASCII.GetBytes("Not Found!"); context.Response.ContentLength64 = b.Length; context.Response.ContentType = "text/plain"; context.Response.OutputStream.Write(b, 0, b.Length); context.Response.OutputStream.Close(); } else { var stream = File.OpenRead(file); var b = new byte[stream.Length]; stream.Read(b, 0, (int)stream.Length); stream.Close(); context.Response.ContentLength64 = b.Length; context.Response.ContentType = "application/octet-stream"; context.Response.OutputStream.Write(b, 0, b.Length); context.Response.OutputStream.Close(); } return; } else if (urlParts[0] == "servers") { var filter = urlParts[1].Replace(".xml", ""); if (filter.Contains("yeQA4reD")) { var b = Encoding.ASCII.GetBytes(ProcessServers(filter)); context.Response.ContentLength64 = b.Length; context.Response.ContentType = "text/xml"; context.Response.OutputStream.Write(b, 0, b.Length); context.Response.OutputStream.Close(); } return; } } } catch (Exception e) { Log.Error(e.ToString()); var b = Encoding.ASCII.GetBytes(e.Message); context.Response.ContentLength64 = b.Length; context.Response.ContentType = "text/plain"; context.Response.OutputStream.Write(b, 0, b.Length); context.Response.OutputStream.Close(); return; } var bt = Encoding.ASCII.GetBytes("Unknown Player"); context.Response.ContentLength64 = bt.Length; context.Response.ContentType = "text/plain"; context.Response.OutputStream.Write(bt, 0, bt.Length); context.Response.OutputStream.Close(); }