public static void PrintPlayerInfo( [NotNull] Player player, [NotNull] PlayerInfo info )
{
if ( player == null )
throw new ArgumentNullException( "player" );
if ( info == null )
throw new ArgumentNullException( "info" );
Player target = info.PlayerObject;
// hide online status when hidden
if ( target != null && !player.CanSee( target ) ) {
target = null;
}
if ( info.LastIP.Equals( IPAddress.None ) ) {
player.Message( "About {0}&S: Never seen before.", info.ClassyName );
} else {
if ( target != null ) {
TimeSpan idle = target.IdleTime;
if ( info.IsHidden ) {
if ( idle.TotalMinutes > 2 ) {
if ( player.Can( Permission.ViewPlayerIPs ) ) {
player.Message( "About {0}&S: HIDDEN from {1} (idle {2})",
info.ClassyName,
info.LastIP,
idle.ToMiniString() );
} else {
player.Message( "About {0}&S: HIDDEN (idle {1})",
info.ClassyName,
idle.ToMiniString() );
}
} else {
if ( player.Can( Permission.ViewPlayerIPs ) ) {
player.Message( "About {0}&S: HIDDEN. Online from {1}",
info.ClassyName,
info.LastIP );
} else {
player.Message( "About {0}&S: HIDDEN.",
info.ClassyName );
}
}
} else {
if ( idle.TotalMinutes > 1 ) {
if ( player.Can( Permission.ViewPlayerIPs ) ) {
player.Message( "About {0}&S: Online now from {1} (idle {2})",
info.ClassyName,
info.LastIP,
idle.ToMiniString() );
} else {
player.Message( "About {0}&S: Online now (idle {1})",
info.ClassyName,
idle.ToMiniString() );
}
} else {
if ( player.Can( Permission.ViewPlayerIPs ) ) {
player.Message( "About {0}&S: Online now from {1}",
info.ClassyName,
info.LastIP );
} else {
player.Message( "About {0}&S: Online now.",
info.ClassyName );
}
}
}
} else {
if ( player.Can( Permission.ViewPlayerIPs ) ) {
if ( info.LeaveReason != LeaveReason.Unknown ) {
player.Message( "About {0}&S: Last seen {1} ago from {2} ({3}).",
info.ClassyName,
info.TimeSinceLastSeen.ToMiniString(),
info.LastIP,
info.LeaveReason );
} else {
player.Message( "About {0}&S: Last seen {1} ago from {2}.",
info.ClassyName,
info.TimeSinceLastSeen.ToMiniString(),
info.LastIP );
}
} else {
if ( info.LeaveReason != LeaveReason.Unknown ) {
player.Message( "About {0}&S: Last seen {1} ago ({2}).",
info.ClassyName,
info.TimeSinceLastSeen.ToMiniString(),
info.LeaveReason );
} else {
player.Message( "About {0}&S: Last seen {1} ago.",
info.ClassyName,
info.TimeSinceLastSeen.ToMiniString() );
}
}
}
// Show login information
player.Message( " Logged in {0} time(s) since {1:d MMM yyyy}.",
info.TimesVisited,
info.FirstLoginDate );
}
if ( info.IsFrozen ) {
player.Message( " Frozen {0} ago by {1}",
info.TimeSinceFrozen.ToMiniString(),
info.FrozenByClassy );
}
if ( info.IsMuted ) {
player.Message( " Muted for {0} by {1}",
info.TimeMutedLeft.ToMiniString(),
info.MutedByClassy );
float blocks = ( ( info.BlocksBuilt + info.BlocksDrawn ) - info.BlocksDeleted );
if ( blocks < 0 )
player.Message( " &CWARNING! {0}&S has deleted more than built!", info.ClassyName );//<---- GlennMR on Au70 Galaxy
}
// Show ban information
IPBanInfo ipBan = IPBanList.Get( info.LastIP );
switch ( info.BanStatus ) {
case BanStatus.Banned:
if ( ipBan != null ) {
player.Message( " Account and IP are &CBANNED&S. See &H/BanInfo" );
} else {
player.Message( " Account is &CBANNED&S. See &H/BanInfo" );
}
break;
case BanStatus.IPBanExempt:
if ( ipBan != null ) {
player.Message( " IP is &CBANNED&S, but account is exempt. See &H/BanInfo" );
} else {
player.Message( " IP is not banned, and account is exempt. See &H/BanInfo" );
}
break;
case BanStatus.NotBanned:
if ( ipBan != null ) {
player.Message( " IP is &CBANNED&S. See &H/BanInfo" );
}
break;
}
if ( !info.LastIP.Equals( IPAddress.None ) ) {
// Show alts
List<PlayerInfo> altNames = new List<PlayerInfo>();
int bannedAltCount = 0;
foreach ( PlayerInfo playerFromSameIP in PlayerDB.FindPlayers( info.LastIP ) ) {
if ( playerFromSameIP == info )
continue;
altNames.Add( playerFromSameIP );
if ( playerFromSameIP.IsBanned ) {
bannedAltCount++;
}
}
if ( altNames.Count > 0 ) {
altNames.Sort( new PlayerInfoComparer( player ) );
if ( altNames.Count > MaxAltsToPrint ) {
if ( bannedAltCount > 0 ) {
player.MessagePrefixed( "&S ",
"&S Over {0} accounts ({1} banned) on IP: {2} &Setc",
MaxAltsToPrint,
bannedAltCount,
altNames.Take( 15 ).ToArray().JoinToClassyString() );
} else {
player.MessagePrefixed( "&S ",
"&S Over {0} accounts on IP: {1} &Setc",
MaxAltsToPrint,
altNames.Take( 15 ).ToArray().JoinToClassyString() );
}
} else {
if ( bannedAltCount > 0 ) {
player.MessagePrefixed( "&S ",
"&S {0} accounts ({1} banned) on IP: {2}",
altNames.Count,
bannedAltCount,
altNames.ToArray().JoinToClassyString() );
} else {
player.MessagePrefixed( "&S ",
"&S {0} accounts on IP: {1}",
altNames.Count,
altNames.ToArray().JoinToClassyString() );
}
}
}
}
// Stats
if ( info.BlocksDrawn > 500000000 ) {
player.Message( " Built {0} and deleted {1} blocks, drew {2}M blocks, wrote {3} messages.",
info.BlocksBuilt,
info.BlocksDeleted,
info.BlocksDrawn / 1000000,
info.MessagesWritten );
} else if ( info.BlocksDrawn > 500000 ) {
player.Message( " Built {0} and deleted {1} blocks, drew {2}K blocks, wrote {3} messages.",
info.BlocksBuilt,
info.BlocksDeleted,
info.BlocksDrawn / 1000,
info.MessagesWritten );
} else if ( info.BlocksDrawn > 0 ) {
player.Message( " Built {0} and deleted {1} blocks, drew {2} blocks, wrote {3} messages.",
info.BlocksBuilt,
info.BlocksDeleted,
info.BlocksDrawn,
info.MessagesWritten );
} else {
player.Message( " Built {0} and deleted {1} blocks, wrote {2} messages.",
info.BlocksBuilt,
info.BlocksDeleted,
info.MessagesWritten );
}
// More stats
if ( info.TimesBannedOthers > 0 || info.TimesKickedOthers > 0 || info.PromoCount > 0 ) {
player.Message( " Kicked {0}, Promoted {1} and banned {2} players.", info.TimesKickedOthers, info.PromoCount, info.TimesBannedOthers );
}
if ( info.TimesKicked > 0 ) {
if ( info.LastKickDate != DateTime.MinValue ) {
player.Message( " Got kicked {0} times. Last kick {1} ago by {2}",
info.TimesKicked,
info.TimeSinceLastKick.ToMiniString(),
info.LastKickByClassy );
} else {
player.Message( " Got kicked {0} times.", info.TimesKicked );
}
if ( info.LastKickReason != null ) {
player.Message( " Kick reason: {0}", info.LastKickReason );
}
}
// Promotion/demotion
if ( info.PreviousRank == null ) {
if ( info.RankChangedBy == null ) {
player.Message( " Rank is {0}&S (default).",
info.Rank.ClassyName );
} else {
player.Message( " Promoted to {0}&S by {1}&S {2} ago.",
info.Rank.ClassyName,
info.RankChangedByClassy,
info.TimeSinceRankChange.ToMiniString() );
if ( info.RankChangeReason != null ) {
player.Message( " Promotion reason: {0}", info.RankChangeReason );
}
}
} else if ( info.PreviousRank <= info.Rank ) {
player.Message( " Promoted from {0}&S to {1}&S by {2}&S {3} ago.",
info.PreviousRank.ClassyName,
info.Rank.ClassyName,
info.RankChangedByClassy,
info.TimeSinceRankChange.ToMiniString() );
if ( info.RankChangeReason != null ) {
player.Message( " Promotion reason: {0}", info.RankChangeReason );
}
} else {
player.Message( " Demoted from {0}&S to {1}&S by {2}&S {3} ago.",
info.PreviousRank.ClassyName,
info.Rank.ClassyName,
info.RankChangedByClassy,
info.TimeSinceRankChange.ToMiniString() );
if ( info.RankChangeReason != null ) {
player.Message( " Demotion reason: {0}", info.RankChangeReason );
}
}
if ( !info.LastIP.Equals( IPAddress.None ) ) {
// Time on the server
TimeSpan totalTime = info.TotalTime;
if ( target != null ) {
totalTime = totalTime.Add( info.TimeSinceLastLogin );
}
player.Message( " Spent a total of {0:F1} hours ({1:F1} minutes) here.",
totalTime.TotalHours,
totalTime.TotalMinutes );
}
}