Ejemplo n.º 1
0
        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)));
        }
Ejemplo n.º 2
0
        // 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()));
            }
        }
Ejemplo n.º 3
0
 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));
     }
 }
Ejemplo n.º 4
0
        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()));
            }
        }
Ejemplo n.º 5
0
 public Task <BatchResult> GetServerInfos(IServerQueryFactory factory, IReadOnlyCollection <IPEndPoint> addresses,
                                          Action <Server> act, ServerQueryOptions options)
 => factory.Create(this).GetServerInfo(SteamInfo.AppId, addresses, options, act);
Ejemplo n.º 6
0
 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);
Ejemplo n.º 7
0
 public Task <BatchResult> GetServerInfos(IServerQueryFactory factory, IReadOnlyCollection <IPEndPoint> addresses,
                                          Action <Server> act, ServerQueryOptions options)
 => GetFromGameServerQuery(addresses, options, act);