private void _beServer_PlayerHandler(BEItemsMessage <Player> e)
        {
            if (e.ServerId != _serverId)
            {
                return;
            }

            var newItems = new List <Player>();
            var global   = new Player(-1, null, 0, 0, null, "GLOBAL", Player.PlayerState.Ingame);

            newItems.Add(global);
            newItems.AddRange(e.Items.OrderBy(x => x.Name));

            var selected = SelectedPlayer;

            Players = newItems;

            if (selected != null)
            {
                var newSelected = Players.FirstOrDefault(x => x.Num == selected.Num && x.Name == selected.Name);
                if (newSelected != null)
                {
                    SelectedPlayer = newSelected;
                }
            }
            else
            {
                SelectedPlayer = global;
            }

            ProcessPlayers(e);
        }
        private void ProcessPlayers(BEItemsMessage <Player> newPlayers)
        {
            if (newPlayers.ServerId != _serverId)
            {
                return;
            }

            var prev = _prev;
            var next = newPlayers.Items.GroupBy(x => x.Guid).ToDictionary(x => x.Key, x => x.First().Name);

            _prev = next;

            var addedItems   = next.Where(x => prev.ContainsKey(x.Key) == false).ToArray();
            var removedItems = prev.Where(x => next.ContainsKey(x.Key) == false).ToArray();

            if (addedItems.Any())
            {
                OnPlayersInHandler(addedItems);
            }

            if (removedItems.Any())
            {
                OnPlayersOutHandler(removedItems);
            }
        }
Beispiel #3
0
        private void PlayersUpdate(BEItemsMessage <Player> data)
        {
            try
            {
                var settingsStore   = _settingsStoreSource.GetCustomSettingsStore();
                var serversSettings = settingsStore.Load <ServerSettings>(data.ServerId.ToString());

                if (serversSettings?.IdleTimeInMins > 0 && serversSettings?.KickIdlePlayers == true)
                {
                    var idleTime = serversSettings.IdleTimeInMins;
                    if (!_servers.ContainsKey(data.ServerId))
                    {
                        _servers.Add(data.ServerId, new LobbyIdleStore());
                    }
                    var items = data.Items.ToArray();
                    _servers[data.ServerId].Update(items);

                    var span        = TimeSpan.FromMinutes(idleTime);
                    var idlePlayers = _servers[data.ServerId].GetIdlePlayers(span, items);

                    var reason = serversSettings.IdleKickReason;

                    foreach (var idlePlayer in idlePlayers)
                    {
                        _aggregator.GetEvent <BEMessageEvent <BECommand> >()
                        .Publish(new BECommand(data.ServerId, CommandType.Kick, $"{idlePlayer} {reason}"));
                    }
                }
            }
            catch (Exception e)
            {
                _logger.Error(e);
            }
        }