Example #1
0
 public GetServerAddressesHandler(IMessageBusProxy mb, IRequestScopeLocator locator,
                                  ISteamSessionLocator sessionLocator)
 {
     _mb             = mb;
     _locator        = locator;
     _sessionLocator = sessionLocator;
 }
Example #2
0
 public GetServersHandler(ISteamApi steamApi, IMessageBusProxy mb, IRequestScopeLocator scopeLocator,
                          ISteamSessionLocator sessionLocator)
 {
     _steamApi       = steamApi;
     _mb             = mb;
     _scopeLocator   = scopeLocator;
     _sessionLocator = sessionLocator;
 }
Example #3
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);
            }
        }
Example #4
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);
        }
        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<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;
        }
Example #7
0
 public SteamApi(ISteamSessionLocator sessionLocator)
 {
     _sessionLocator = sessionLocator;
 }
 public static Task<int> GetServers(ISteamSessionLocator locator, bool inclRules,
     List<Tuple<string, string>> filter, Action<ArmaServerInfoModel> act) {
     return HandleAlt(locator, filter, act); // HandleNative(locator, inclRules, filter, act)
 }
Example #9
0
 public GetServersSession(ISteamApi steamApi, IMessageBusProxy mb, IRequestScope scope,
                          ISteamSessionLocator sessionLocator) : base(mb, scope, sessionLocator)
 {
     _steamApi = steamApi;
 }
Example #10
0
 public GetServerAddressesSession(IMessageBusProxy mb, IRequestScope scope,
                                  ISteamSessionLocator sessionLocator)
     : base(mb, scope, sessionLocator)
 {
 }
Example #11
0
 protected ServerSession(IMessageBusProxy mb, IRequestScope scope, ISteamSessionLocator sessionLocator)
 {
     _mb            = mb;
     _scope         = scope;
     SessionLocator = sessionLocator;
 }
Example #12
0
 public static Task <int> GetServers(ISteamSessionLocator locator, bool inclRules,
                                     List <Tuple <string, string> > filter, Action <ArmaServerInfoModel> act)
 {
     return(HandleAlt(locator, filter, act)); // HandleNative(locator, inclRules, filter, act)
 }