コード例 #1
0
ファイル: Web.cs プロジェクト: thebitbrine/Zorro
        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 { }
        }
コード例 #2
0
        protected virtual void RegisterForCooldown()
        {
            if (!Config.MaxCallsPerMinute.HasValue)
            {
                return;
            }

            lock (LastQueries)
            {
                LastQueries.Add(DateTimeOffset.UtcNow);
            }
        }
コード例 #3
0
        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);
            }
        }
コード例 #4
0
ファイル: Web.cs プロジェクト: thebitbrine/Zorro
        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 { }
        }