// generate blank info for a new player public PlayerInfo([NotNull] string name, [NotNull] IPAddress lastIP, [NotNull] Rank startingRank) : this() { if (name == null) { throw new ArgumentNullException("name"); } if (lastIP == null) { throw new ArgumentNullException("lastIP"); } if (startingRank == null) { throw new ArgumentNullException("startingRank"); } FirstLoginDate = DateTime.UtcNow; LastSeen = DateTime.UtcNow; LastLoginDate = DateTime.UtcNow; Rank = startingRank; Name = name; Id = PlayerDB.GetNextId(); LastIP = lastIP; }
internal static PlayerInfo LoadFormat2([NotNull] string[] fields) { if (fields.Length < 44) { throw new FormatException("PlayerInfo record did not contain all the expected information. " + "This record, or maybe the whole file, may be corrupted."); } if (!Player.IsValidPlayerName(fields[0])) { throw new FormatException("Unacceptable player name"); } PlayerInfo info = new PlayerInfo { Name = fields[0] }; if (fields[1].Length == 0 || !IPAddress.TryParse(fields[1], out info.LastIP)) { info.LastIP = IPAddress.None; } info.Rank = Rank.Parse(fields[2]) ?? RankManager.DefaultRank; DateTimeUtil.TryParseDateTime(fields[3], ref info.RankChangeDate); if (fields[4].Length > 0) { info.RankChangedBy = PlayerDB.Unescape(fields[4]); } switch (fields[5]) { case "b": info.BanStatus = BanStatus.Banned; break; case "x": info.BanStatus = BanStatus.IPBanExempt; break; default: info.BanStatus = BanStatus.NotBanned; break; } // ban information if (DateTimeUtil.TryParseDateTime(fields[6], ref info.BanDate)) { if (fields[7].Length > 0) { info.BannedBy = PlayerDB.Unescape(fields[7]); } if (fields[10].Length > 0) { info.BanReason = PlayerDB.Unescape(fields[10]); } } // unban information if (DateTimeUtil.TryParseDateTime(fields[8], ref info.UnbanDate)) { if (fields[9].Length > 0) { info.UnbannedBy = PlayerDB.Unescape(fields[9]); } if (fields[11].Length > 0) { info.UnbanReason = PlayerDB.Unescape(fields[11]); } } // failed logins DateTimeUtil.TryParseDateTime(fields[12], ref info.LastFailedLoginDate); if (fields[13].Length < 1 || !IPAddress.TryParse(fields[13], out info.LastFailedLoginIP)) { // LEGACY info.LastFailedLoginIP = IPAddress.None; } // skip 14 DateTimeUtil.TryParseDateTime(fields[15], ref info.FirstLoginDate); // login/logout times DateTimeUtil.TryParseDateTime(fields[16], ref info.LastLoginDate); DateTimeUtil.TryParseTimeSpan(fields[17], out info.TotalTime); // stats if (fields[18].Length > 0) { Int32.TryParse(fields[18], NumberStyles.Integer, NumberFormatter, out info.BlocksBuilt); } if (fields[19].Length > 0) { Int32.TryParse(fields[19], NumberStyles.Integer, NumberFormatter, out info.BlocksDeleted); } if (fields[20].Length > 0) { Int32.TryParse(fields[20], NumberStyles.Integer, NumberFormatter, out info.TimesVisited); } if (fields[21].Length > 0) { Int32.TryParse(fields[21], NumberStyles.Integer, NumberFormatter, out info.MessagesWritten); } // fields 22-23 are no longer in use if (fields[24].Length > 0) { info.PreviousRank = Rank.Parse(fields[24]); } if (fields[25].Length > 0) { info.RankChangeReason = PlayerDB.Unescape(fields[25]); } Int32.TryParse(fields[26], NumberStyles.Integer, NumberFormatter, out info.TimesKicked); Int32.TryParse(fields[27], NumberStyles.Integer, NumberFormatter, out info.TimesKickedOthers); Int32.TryParse(fields[28], NumberStyles.Integer, NumberFormatter, out info.TimesBannedOthers); info.Id = Int32.Parse(fields[29]); if (info.Id < 256) { info.Id = PlayerDB.GetNextId(); } byte rankChangeTypeCode; if (Byte.TryParse(fields[30], out rankChangeTypeCode)) { info.RankChangeType = (RankChangeType)rankChangeTypeCode; switch (info.RankChangeType) { case RankChangeType.AutoDemoted: case RankChangeType.AutoPromoted: case RankChangeType.Default: case RankChangeType.Demoted: case RankChangeType.Promoted: break; default: info.GuessRankChangeType(); break; } } else { info.GuessRankChangeType(); } DateTimeUtil.TryParseDateTime(fields[31], ref info.LastKickDate); if (!DateTimeUtil.TryParseDateTime(fields[32], ref info.LastSeen) || info.LastSeen < info.LastLoginDate) { info.LastSeen = info.LastLoginDate; } Int64.TryParse(fields[33], NumberStyles.Integer, NumberFormatter, out info.BlocksDrawn); if (fields[34].Length > 0) { info.LastKickBy = PlayerDB.Unescape(fields[34]); } if (fields[35].Length > 0) { info.LastKickReason = PlayerDB.Unescape(fields[35]); } DateTimeUtil.TryParseDateTime(fields[36], ref info.BannedUntil); info.IsFrozen = (fields[37] == "f"); if (fields[38].Length > 0) { info.FrozenBy = PlayerDB.Unescape(fields[38]); } DateTimeUtil.TryParseDateTime(fields[39], ref info.FrozenOn); DateTimeUtil.TryParseDateTime(fields[40], ref info.MutedUntil); if (fields[41].Length > 0) { info.MutedBy = PlayerDB.Unescape(fields[41]); } info.Password = PlayerDB.Unescape(fields[42]); // fields[43] is "online", and is ignored byte bandwidthUseModeCode; if (Byte.TryParse(fields[44], NumberStyles.Integer, NumberFormatter, out bandwidthUseModeCode)) { info.BandwidthUseMode = (BandwidthUseMode)bandwidthUseModeCode; switch (info.BandwidthUseMode) { case BandwidthUseMode.High: case BandwidthUseMode.Low: case BandwidthUseMode.Normal: case BandwidthUseMode.VeryHigh: case BandwidthUseMode.VeryLow: break; default: info.BandwidthUseMode = BandwidthUseMode.Default; break; } } else { info.BandwidthUseMode = BandwidthUseMode.Default; } if (fields.Length > 45 && fields[45] == "h") { info.IsHidden = info.Rank.Can(Permission.Hide); } if (fields.Length > 46) { DateTimeUtil.TryParseDateTime(fields[46], ref info.LastModified); } if (fields.Length > 47 && fields[47].Length > 0) { info.DisplayedName = PlayerDB.Unescape(fields[47]); } if (fields.Length > 48) { byte accountTypeCode; if (Byte.TryParse(fields[48], NumberStyles.Integer, NumberFormatter, out accountTypeCode)) { info.AccountType = (AccountType)accountTypeCode; if (!Enum.IsDefined(typeof(AccountType), accountTypeCode)) { info.AccountType = AccountType.Unknown; } } } if (fields.Length > 49 && fields[49].Length > 0) { info.Email = PlayerDB.Unescape(fields[49]); } if (fields.Length > 50 && fields[50].Length > 0) { info.AltNames = fields[50].Split('|'); } // date consistency checks if (info.LastSeen < info.FirstLoginDate) { info.LastSeen = info.FirstLoginDate; } if (info.LastLoginDate < info.FirstLoginDate) { info.LastLoginDate = info.FirstLoginDate; } return(info); }