private async Task Connect(GameServer server)
        {
            var log = new LogReceiver(
                server.ServerConfiguration.LogPort,
                server.ServerConfiguration.EndPoint
                );

            log.Listen <ChatMessage>(server.ChatReceived);
            log.Listen <KillFeed>(server.KillReceived);

            log.Listen <PlayerConnected>(connected =>
            {
                server.Players.Add(connected.Player);
                server.ServerInfoUpdated();
            });

            log.Listen <PlayerDisconnected>(disconnected =>
            {
                var player = server.Players.FirstOrDefault(p => p.ClientId == disconnected.Player.ClientId);
                if (player == null)
                {
                    return;
                }
                server.Players.Remove(player);
                server.ServerInfoUpdated();
            });

            log.Listen <NameChange>(change =>
            {
                var player = server.Players.FirstOrDefault(p => p.ClientId == change.Player.ClientId);
                if (player == null)
                {
                    return;
                }
                player.Name = change.NewName;
                server.ServerInfoUpdated();
            });

            server.Connected = true;
            server.ServerInfoUpdated();
            await Task.Delay(-1);
        }
Exemple #2
0
        private async void Start()
        {
            //Let's start the listener on our listen port. Allow all IPs from the server list.
            _            = _logHandler.LogMessage($"Starting SRCDSLogService on {_port}", channel: false);
            _logReceiver = new LogReceiver(_port, CreateIpEndPoints());

            await Task.Run(() =>
            {
                if (_dataService.RSettings.ProgramSettings.Debug)
                {
                    _logReceiver.ListenRaw(msg => { Console.WriteLine($"RAW LOG FROM {_logReceiver.lastServer.Address}: " + msg); });
                }

                _logReceiver.Listen <GenericCommand>(genericCommand => { HandleIngameCommand(_logReceiver.lastServer, genericCommand); });
            });

            //We are going to use this loop to make sure log services are still running. Should they fail, we will tear
            //down and rebuild.
            while (true)
            {
                bool portBound = IPGlobalProperties.GetIPGlobalProperties()
                                 .GetActiveUdpListeners().Any(p => p.Port == _port);

                if (!portBound)
                {
                    if (_restartCount < RESTART_LIMIT)
                    {
                        try
                        {
                            _logReceiver.Dispose();
                        }
                        catch (Exception e)
                        {
                            await _logHandler.LogMessage($"Attempted dispose, but had an issue.\n{e}", alert : true, color : LOG_COLOR);
                        }

                        _restartCount++;

                        //Restart the service
                        Start();
                        await _logHandler.LogMessage($"Log service has been restarted {_restartCount} times!", color : LOG_COLOR);

                        //Reset the retry count in 15 minutes after the first issue
                        //I expect the log service to die sometimes for whatever reason.
                        if (_restartCount == 0)
                        {
                            _ = Task.Run(async() =>
                            {
                                await Task.Delay(TimeSpan.FromMinutes(15));
                                _restartCount = 0;
                            });
                        }
                    }
                    else
                    {
                        await _logHandler.LogMessage($"The SrcdsLogService has restarted over {RESTART_LIMIT} in the last 15 minutes. " +
                                                     $"I will not restart the service again.", alert : true, color : LOG_COLOR);
                    }
                    return;
                }

                //Hol up for a bit before rechecking
                await Task.Delay(5000);
            }
        }
Exemple #3
0
        /// <summary>
        /// Example program for CoreRCON.
        /// </summary>
        internal static void Main(string[] args)
        {
            var task = Task.Run(async() =>
            {
                var ip       = "192.168.1.8"; // "162.248.93.211"; //
                var endpoint = new IPEndPoint(
                    IPAddress.Parse(ip),
                    27015
                    );

                var rcon    = new RCON(endpoint, "rcon");
                var log     = new LogReceiver(0, endpoint);
                var players = await ServerQuery.Players(endpoint);
                var info    = await ServerQuery.Info(endpoint, ServerQuery.ServerType.Source) as SourceQueryInfo;

                Console.WriteLine($"Connected to server with {players.Length} players.  Map is {info.Map} in game {info.Game} running on {info.Environment}");

                // Tell the server to send logs here
                await rcon.SendCommandAsync($"logaddress_add 192.168.1.8:{log.ResolvedPort}");

                rcon.OnDisconnected += () =>
                {
                    Console.WriteLine("Server closed connection!");
                };

                var status = await rcon.SendCommandAsync <Status>("status");
                Console.WriteLine($"Got status, hostname is: {status.Hostname}");

                // Listen for chat messages
                log.Listen <ChatMessage>(chat =>
                {
                    Console.WriteLine($"Chat message: {chat.Player.Name} said {chat.Message} on channel {chat.Channel}");
                });

                // Listen for kills
                log.Listen <KillFeed>(kill =>
                {
                    Console.WriteLine($"Player {kill.Killer.Name} ({kill.Killer.Team}) killed {kill.Killed.Name} ({kill.Killed.Team}) with {kill.Weapon}");
                });

                log.Listen <PlayerConnected>(connection =>
                {
                    Console.WriteLine($"Player {connection.Player.Name} connected with host {connection.Host}");
                });

                log.Listen <PlayerDisconnected>(dis =>
                {
                    Console.WriteLine($"Player {dis.Player.Name} disconnected");
                });

                log.Listen <NameChange>(name =>
                {
                    Console.WriteLine($"{name.Player.Name} changed name to {name.NewName}");
                });

                // Never stop
                await Task.Delay(-1);
            });

            // .Wait() puts exceptions into an AggregateException, while .GetResult() doesn't
            task.GetAwaiter().GetResult();
        }
        private void StartListeners(LogReceiver logReceiver)
        {
            logReceiver.Listen <ChatMessage>(chat =>
            {
                ProcessChatMessage(chat);
            });

            logReceiver.Listen <RoundEndScores>(roundEndScore =>
            {
                if (Match.IsLive)
                {
                    Match.CTScore = roundEndScore.CTScore + Match.CtSwapScore;
                    Match.TScore  = roundEndScore.TScore + Match.TSwapScore;

                    if (Match.CTScore + Match.TScore == 15 || ((Match.CTScore + Match.TScore) > 29 && (Match.CTScore + Match.TScore) % 3 == 0))
                    {
                        Match.CtSwapScore = Match.TScore;
                        Match.TSwapScore  = Match.CTScore;
                    }

                    if ((Match.CTScore + Match.TScore) == 15 || Match.ShouldSwapSides(Match.CTScore + Match.TScore))
                    {
                        Match.SwapSides();
                        Match.Paused = true;
                        ProcessSwapSides();
                    }

                    ProcessScoreUpdate();
                }
            });

            logReceiver.ListenRaw(result => { ProcessRaw(result); });

            logReceiver.Listen <KillFeed>(e =>
            {
            });

            logReceiver.Listen <MatchLive>(live =>
            {
                Match.MapName = live.MapName;

                Match.IsLive = true;

                ProcessMatchStarting(Match);
            });

            logReceiver.Listen <CTTeamName>(ctSide =>
            {
                Match.CTName = ctSide.CTName;
            });

            logReceiver.Listen <TTeamName>(tSide =>
            {
                Match.TName = tSide.TName;
            });

            logReceiver.Listen <StartFreezeTime>(startfreezeTime =>
            {
                Match.IsFreezeTime = true;
            });

            logReceiver.Listen <EndFreezeTime>(endFreezeTime =>
            {
                if (Match.Paused == true)
                {
                    ProcessUnpauseMatch();
                }
                Match.IsFreezeTime = false;
                Match.Paused       = false;
            });

            logReceiver.Listen <MatchEnd>(matchEnd =>
            {
                Console.WriteLine(matchEnd.MatchId);

                ProcessMatchEnd(matchEnd.MatchId);

                Match.EndMatch();
            });
        }