Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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();
            }
        }