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); } }
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); } }