using Lidgren.Network; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; namespace Barotrauma.Networking { [Flags] enum ClientPermissions { None = 0, [Description("End round")] EndRound = 1, [Description("Kick")] Kick = 2, [Description("Ban")] Ban = 4 } class Client { public string name; public byte ID; public Character Character; public CharacterInfo characterInfo; public NetConnection Connection { get; set; } public string version; public bool inGame; public UInt32 lastRecvLobbyUpdate = 0; public bool hasLobbyData = false; public UInt32 lastSentChatMsgID = 0; //last msg this client said public UInt32 lastRecvChatMsgID = 0; //last msg this client knows about public List ChatMessages = new List(); public float ChatSpamSpeed; public float ChatSpamTimer; public int ChatSpamCount; private List kickVoters; public bool ReadyToStart; private object[] votes; public List jobPreferences; public JobPrefab assignedJob; public float deleteDisconnectedTimer; public ClientPermissions Permissions; public void InitClientSync() { lastSentChatMsgID = 0; lastRecvChatMsgID = ChatMessage.LastID; } public int KickVoteCount { get { return kickVoters.Count; } } public Client(NetPeer server, string name, byte ID) : this(name, ID) { } public Client(string name, byte ID) { this.name = name; this.ID = ID; kickVoters = new List(); votes = new object[Enum.GetNames(typeof(VoteType)).Length]; jobPreferences = new List(JobPrefab.List.GetRange(0, 3)); } public static bool IsValidName(string name) { if (name.Contains("\n") || name.Contains("\r\n")) return false; return (name.All(c => c != ';' && c != ',' && c != '<' && c != '/')); } public static string SanitizeName(string name) { if (name.Length > 20) { name = name.Substring(0, 20); } string rName = ""; for (int i=0;i 126) { //TODO: allow safe unicode characters, this is just to prevent players from taking names that look similar but aren't the same rName += '?'; } else { rName += name[i]; } } return rName; } public void SetPermissions(ClientPermissions permissions) { this.Permissions = permissions; } public void GivePermission(ClientPermissions permission) { this.Permissions |= permission; } public void RemovePermission(ClientPermissions permission) { this.Permissions &= ~permission; } public bool HasPermission(ClientPermissions permission) { return false; //Permissions.HasFlag(permission); } public T GetVote(VoteType voteType) { return (votes[(int)voteType] is T) ? (T)votes[(int)voteType] : default(T); } public void SetVote(VoteType voteType, object value) { votes[(int)voteType] = value; } public void ResetVotes() { for (int i = 0; i < votes.Length; i++) { votes[i] = null; } } public void AddKickVote(Client voter) { if (!kickVoters.Contains(voter)) kickVoters.Add(voter); } public void RemoveKickVote(Client voter) { kickVoters.Remove(voter); } public bool HasKickVoteFromID(int id) { return kickVoters.Any(k => k.ID == id); } public static void UpdateKickVotes(List connectedClients) { foreach (Client client in connectedClients) { client.kickVoters.RemoveAll(voter => !connectedClients.Contains(voter)); } } } }