internal static PlayerInfo LoadFormat2(string[] fields)
{
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;
fields[3].ToDateTime(ref info.RankChangeDate);
if (fields[4].Length > 0)
{
info.RankChangedBy = 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 (fields[6].ToDateTime(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 (fields[8].ToDateTime(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
fields[12].ToDateTime(ref info.LastFailedLoginDate);
if (fields[13].Length > 1 || !IPAddress.TryParse(fields[13], out info.LastFailedLoginIP)) // LEGACY
{
info.LastFailedLoginIP = IPAddress.None;
}
// skip 14
fields[15].ToDateTime(ref info.FirstLoginDate);
// login/logout times
fields[16].ToDateTime(ref info.LastLoginDate);
fields[17].ToTimeSpan(out info.TotalTime);
// stats
if (fields[18].Length > 0)
{
Int32.TryParse(fields[18], out info.BlocksBuilt);
}
if (fields[19].Length > 0)
{
Int32.TryParse(fields[19], out info.BlocksDeleted);
}
Int32.TryParse(fields[20], out info.TimesVisited);
if (fields[20].Length > 0)
{
Int32.TryParse(fields[21], 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], out info.TimesKicked);
Int32.TryParse(fields[27], out info.TimesKickedOthers);
Int32.TryParse(fields[28], 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;
if (!Enum.IsDefined(typeof(RankChangeType), rankChangeTypeCode))
{
info.GuessRankChangeType();
}
}
else
{
info.GuessRankChangeType();
}
fields[31].ToDateTime(ref info.LastKickDate);
if (!fields[32].ToDateTime(ref info.LastSeen) || info.LastSeen < info.LastLoginDate)
{
info.LastSeen = info.LastLoginDate;
}
Int64.TryParse(fields[33], 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]);
}
fields[36].ToDateTime(ref info.BannedUntil);
info.IsFrozen = (fields[37] == "f");
if (fields[38].Length > 0)
{
info.FrozenBy = PlayerDB.Unescape(fields[38]);
}
fields[39].ToDateTime(ref info.FrozenOn);
fields[40].ToDateTime(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], out bandwidthUseModeCode))
{
info.BandwidthUseMode = (BandwidthUseMode)bandwidthUseModeCode;
if (!Enum.IsDefined(typeof(BandwidthUseMode), bandwidthUseModeCode))
{
info.BandwidthUseMode = BandwidthUseMode.Default;
}
}
else
{
info.BandwidthUseMode = BandwidthUseMode.Default;
}
if (fields.Length > 45)
{
if (fields[45].Length == 0)
{
info.IsHidden = false;
}
else
{
info.IsHidden = info.Rank.Can(Permission.Hide);
}
}
if (fields.Length > 46)
{
fields[46].ToDateTime(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], out accountTypeCode))
{
info.AccountType = (AccountType)accountTypeCode;
if (!Enum.IsDefined(typeof(AccountType), accountTypeCode))
{
info.AccountType = AccountType.Unknown;
}
}
}
if (info.LastSeen < info.FirstLoginDate)
{
info.LastSeen = info.FirstLoginDate;
}
if (info.LastLoginDate < info.FirstLoginDate)
{
info.LastLoginDate = info.FirstLoginDate;
}
return(info);
}