123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- using Microsoft.Extensions.DependencyInjection;
- using Microsoft.Extensions.Options;
- using System.Collections.Generic;
- using System.Linq;
- using System.Net;
- namespace FastGithub.Scanner
- {
- /// <summary>
- /// GithubContext集合
- /// </summary>
- [Service(ServiceLifetime.Singleton)]
- sealed class GithubScanResults : IGithubScanResults
- {
- private readonly object syncRoot = new();
- private readonly List<GithubContext> contexts = new();
- private readonly IOptionsMonitor<GithubLookupFactoryOptions> options;
- public GithubScanResults(IOptionsMonitor<GithubLookupFactoryOptions> options)
- {
- this.options = options;
- }
- /// <summary>
- /// 添加GithubContext
- /// </summary>
- /// <param name="context"></param>
- /// <returns></returns>
- public bool Add(GithubContext context)
- {
- lock (this.syncRoot)
- {
- if (this.contexts.Contains(context))
- {
- return false;
- }
- this.contexts.Add(context);
- return true;
- }
- }
- /// <summary>
- /// 转换为数组
- /// </summary>
- /// <returns></returns>
- public GithubContext[] ToArray()
- {
- lock (this.syncRoot)
- {
- return this.contexts.ToArray();
- }
- }
- /// <summary>
- /// 查找最优的ip
- /// </summary>
- /// <param name="domain"></param>
- /// <returns></returns>
- public IPAddress? FindBestAddress(string domain)
- {
- if (this.options.CurrentValue.Domains.Contains(domain) == false)
- {
- return default;
- }
- lock (this.syncRoot)
- {
- return this.contexts
- .Where(item => item.Domain == domain && item.AvailableRate > 0d)
- .OrderByDescending(item => item.AvailableRate)
- .ThenByDescending(item => item.Available)
- .ThenBy(item => item.AvgElapsed)
- .Select(item => item.Address)
- .FirstOrDefault();
- }
- }
- }
- }
|