private static async Task<int> HandleNative(ISteamSessionLocator locator, bool inclRules, List<Tuple<string, string>> filter, Action<ArmaServerInfoModel> act) { var api = new SteamApi(locator); var degreeOfParallelism = inclRules ? 30 : 1; using (var bc = new BlockingCollection<ArmaServerInfoModel>()) { // TODO: better MT model var bcT = TaskExt.StartLongRunningTask(async () => { await Task.WhenAll(Enumerable.Range(1, degreeOfParallelism).Select(_ => Task.Run(async () => { foreach (var s in bc.GetConsumingEnumerable()) { await UpdateServerInfo(s, api, inclRules).ConfigureAwait(false); act(s); } }) )); }); var c2 = await api.GetServerInfo(locator.Session.AppId, x => { try { var ip = x.m_NetAdr.GetQueryAddressString().Split(':').First(); var ipAddress = IPAddress.Parse(ip); var map = x.GetMap(); var s = new ArmaServerInfoModel(new IPEndPoint(ipAddress, x.m_NetAdr.GetQueryPort())) { ConnectionEndPoint = new IPEndPoint(ipAddress, x.m_NetAdr.GetConnectionPort()), Name = x.GetServerName(), Tags = x.GetGameTags(), Mission = string.IsNullOrEmpty(map) ? null : x.GetGameDescription(), Map = map, Ping = x.m_nPing, MaxPlayers = x.m_nMaxPlayers, CurrentPlayers = x.m_nPlayers, RequirePassword = x.m_bPassword, IsVacEnabled = x.m_bSecure, ServerVersion = x.m_nServerVersion }; bc.Add(s); } catch (Exception ex) { Console.WriteLine(ex); } }, filter); bc.CompleteAdding(); await bcT; return c2; } }
private static async Task UpdateServerInfo(ArmaServerInfoModel s, SteamApi api, bool inclRules) { s.GameTags = s.Tags == null ? null : GameTags.Parse(s.Tags); if (inclRules) { var rules = await api.GetServerRules(s.QueryEndPoint).ConfigureAwait(false); var mods = SourceQueryParser.GetList(rules, "modNames"); s.SignatureList = SourceQueryParser.GetList(rules, "sigNames").ToHashSet(); s.ModList = mods.Select(x => new ServerModInfo {Name = x}).ToList(); } }