Пример #1
0
        private static async Task <int> HandleAlt(ISteamSessionLocator locator, List <Tuple <string, string> > filter,
                                                  Action <ArmaServerInfoModel> act)
        {
            var api = new SteamApi(locator);

            var bc = new Subject <IPEndPoint>();

            var dq = new DirectQuerier();
            var t  = dq.Load(page => {
                foreach (var i in page)
                {
                    var r  = (SourceParseResult)i.Settings;
                    var s  = r.MapTo <ArmaServerInfoModel>();
                    s.Ping = i.Ping;
                    if (r.Rules != null)
                    {
                        try {
                            var rules       = SourceQueryParser.ParseRules(r.Rules);
                            var mods        = SourceQueryParser.GetList(rules, "modNames");
                            s.SignatureList = SourceQueryParser.GetList(rules, "sigNames").ToHashSet();
                            s.ModList       = mods.Select(x => new ServerModInfo {
                                Name = x
                            }).ToList();
                            s.ReceivedRules = true;
                        } catch (Exception ex) {
                            Console.WriteLine(ex);
                        }
                    }
                    act(s);
                }
            }, bc);

            var c2 = await api.GetServerInfo(locator.Session.AppId, x => {
                try {
                    var ip        = x.m_NetAdr.GetQueryAddressString().Split(':').First();
                    var ipAddress = IPAddress.Parse(ip);
                    bc.OnNext(new IPEndPoint(ipAddress, x.m_NetAdr.GetQueryPort()));
                } catch (Exception ex) {
                    Console.WriteLine(ex);
                }
            }, filter).ConfigureAwait(false);

            bc.OnCompleted();
            await t;

            return(c2);
        }
Пример #2
0
        private static async Task<int> HandleAlt(ISteamSessionLocator locator, List<Tuple<string, string>> filter,
            Action<ArmaServerInfoModel> act) {
            var api = new SteamApi(locator);

            var bc = new Subject<IPEndPoint>();

            var dq = new DirectQuerier();
            var t = dq.Load(page => {
                foreach (var i in page) {
                    var r = (SourceParseResult) i.Settings;
                    var s = r.MapTo<ArmaServerInfoModel>();
                    s.Ping = i.Ping;
                    if (r.Rules != null) {
                        try {
                            var rules = SourceQueryParser.ParseRules(r.Rules);
                            var mods = SourceQueryParser.GetList(rules, "modNames");
                            s.SignatureList = SourceQueryParser.GetList(rules, "sigNames").ToHashSet();
                            s.ModList = mods.Select(x => new ServerModInfo {Name = x}).ToList();
                            s.ReceivedRules = true;
                        } catch (Exception ex) {
                            Console.WriteLine(ex);
                        }
                    }
                    act(s);
                }
            }, bc);

            var c2 = await api.GetServerInfo(locator.Session.AppId, x => {
                try {
                    var ip = x.m_NetAdr.GetQueryAddressString().Split(':').First();
                    var ipAddress = IPAddress.Parse(ip);
                    bc.OnNext(new IPEndPoint(ipAddress, x.m_NetAdr.GetQueryPort()));
                } catch (Exception ex) {
                    Console.WriteLine(ex);
                }
            }, filter).ConfigureAwait(false);
            bc.OnCompleted();
            await t;
            return c2;
        }