async Task <BatchResult> GetServersFromSteam(uint appId, IEnumerable <IPEndPoint> addresses, ServerQueryOptions options, Action <Server> act) { var cvt = GetConverter(options.InclExtendedDetails); var r = await Task.WhenAll(addresses.Batch(15).Select(b => { // Ports adjusted because it expects the Connection Port! var filter = ServerFilterBuilder.Build() .FilterByAddresses(b.Select(x => new IPEndPoint(x.Address, x.Port - 1)).ToList()); return(_steamHelperService.GetServers <ArmaServerInfoModel>(appId, new GetServers { Filter = filter.Value, IncludeDetails = options.InclExtendedDetails, IncludeRules = options.InclExtendedDetails, PageSize = 1 }, CancellationToken.None, x => { foreach (var s in x.Select(cvt)) { act(s); } })); })); return(new BatchResult(r.Sum(x => x.Count))); }
// todo; use factory private static async Task <BatchResult> GetFromGameServerQuery( IEnumerable <IPEndPoint> addresses, ServerQueryOptions options, Action <Server> act) { var q = new ReactiveSource(); using (var client = q.CreateUdpClient()) { return(new BatchResult(await q.ProcessResults(q.GetResults(addresses, client, new QuerySettings { InclPlayers = options.InclPlayers, InclRules = options.InclExtendedDetails })) .Do(x => { var serverInfo = new Server { QueryAddress = x.Address }; var r = (SourceParseResult)x.Settings; r.MapTo(serverInfo); serverInfo.Ping = x.Ping; var tags = r.Keywords; if (tags != null) { var p = GameTags.Parse(tags); p.MapTo(serverInfo); } act(serverInfo); }).Count())); } }
private async Task <BatchResult> TryGetServersFromSteam(uint appId, IReadOnlyCollection <IPEndPoint> addresses, ServerQueryOptions options, Action <Server> act) { try { return(await GetServersFromSteam(appId, addresses, options, act).ConfigureAwait(false)); } catch (Exception ex) { MainLog.Logger.FormattedWarnException(ex, "Problem while processing info from Steam!"); return(await GetFromGameServerQuery(addresses, options, act).ConfigureAwait(false)); } }
private static async Task <BatchResult> GetFromGameServerQuery( IEnumerable <IPEndPoint> addresses, ServerQueryOptions options, Action <Server> act) { var q = new ReactiveSource(); using (var client = q.CreateUdpClient()) { var results = q.ProcessResults(q.GetResults(addresses, client, new QuerySettings { InclPlayers = options.InclPlayers, InclRules = options.InclExtendedDetails })); results = options.InclPlayers ? results.Do(x => MapServerInclPlayers(act, x)) : results.Do(x => MapServer(act, x)); return(new BatchResult(await results.Count())); } }
public Task <BatchResult> GetServerInfos(IServerQueryFactory factory, IReadOnlyCollection <IPEndPoint> addresses, Action <Server> act, ServerQueryOptions options) => factory.Create(this).GetServerInfo(SteamInfo.AppId, addresses, options, act);
public Task <BatchResult> GetServerInfo(uint appId, IReadOnlyCollection <IPEndPoint> addresses, ServerQueryOptions options, Action <Server> act) => options.InclExtendedDetails ? TryGetServersFromSteam(appId, addresses, options, act) : GetFromGameServerQuery(addresses, options, act);
public Task <BatchResult> GetServerInfos(IServerQueryFactory factory, IReadOnlyCollection <IPEndPoint> addresses, Action <Server> act, ServerQueryOptions options) => GetFromGameServerQuery(addresses, options, act);