public static void CollectStats(HttpListenerContext Context, string Query) { try { var Request = new iRequest() { Endpoint = Context.Request.RemoteEndPoint.ToString(), Headers = ToDictionary(Context.Request.Headers), Referer = Context.Request.UrlReferrer, URI = Context.Request.Url, UserAgent = Context.Request.UserAgent, UserLanguages = Context.Request.UserLanguages }; var Stat = new Stat() { Request = Request, Query = Query }; while (LastQueries.Count > 3) { LastQueries.RemoveAt(0); } if (Query != "/" && !string.IsNullOrWhiteSpace(Query)) { string ShowQ = Query; if (!LastQueries.Contains(CultureInfo.CurrentCulture.TextInfo.ToTitleCase(ShowQ))) { LastQueries.Add(CultureInfo.CurrentCulture.TextInfo.ToTitleCase(ShowQ)); } } Zorro.MongoDB.SendStat(Stat); } catch { } }
protected virtual void RegisterForCooldown() { if (!Config.MaxCallsPerMinute.HasValue) { return; } lock (LastQueries) { LastQueries.Add(DateTimeOffset.UtcNow); } }
protected virtual bool CheckCooldownEnough(int requiredCount = 1) { if (!Config.MaxCallsPerMinute.HasValue) { return(true); } lock (LastQueries) { var now = DateTimeOffset.UtcNow; var minuteAgo = now.AddMinutes(-1.0); LastQueries.RemoveWhere(callTime => callTime < minuteAgo); return(LastQueries.Count + requiredCount <= Config.MaxCallsPerMinute.Value); } }
public static void Query(HttpListenerContext Context) { try { var body = new StreamReader(Context.Request.InputStream).ReadToEnd(); var q = HttpUtility.UrlDecode(body).Replace("q=", "").Replace("+", " "); if (string.IsNullOrWhiteSpace(q) && Context.Request.QueryString.AllKeys.Contains("q")) { q = Context.Request.QueryString["q"]; } if (string.IsNullOrWhiteSpace(q) && LastQueries.Any()) { Context.Response.Redirect("../random"); } else { var res = Entries.Where(x => x.Title.ToLower().Contains(q.ToLower())).Take(10).ToList(); res.AddRange(ThePirateBay.Query(q)); if (q.Contains(" ")) { var qu = q.Split(' '); foreach (var que in qu) { res.AddRange(Entries.Where(x => x.Title.ToLower().Contains(que.ToLower())).ToList().Take(10)); } } List <Entry> FEntries = new List <Entry>(); foreach (var Entry in res) { if (!FEntries.Contains(Entry)) { FEntries.Add(Entry); } } var Data = new StringBuilder(); foreach (var entry in FEntries.Take(30).GroupBy(x => x.Link).Select(y => y.First()).OrderBy(x => x.Title)) { Data.AppendLine($"<tr><td class=\"column1\">{entry.IndexDate}</td><td class=\"column2\">{entry.Title}</td><td class=\"column3\">{FormatSize(entry.Size)}</td><td class=\"column4\">{entry.Repacker}</td><td class=\"column5\"><a href=\"/open?q={q}&link={entry.Link}\" target=\"_blank\">Source</a></td></tr>"); } var template = File.ReadAllText("Web/search.html"); API.Respond(template.Replace("%data%", Data.ToString()).Replace("%q%", q), "text/html", Context); CollectStats(Context, q); } } catch { } }