private static void DumpStatsHandler( Player player, Command cmd )
{
string fileName = cmd.Next();
if ( fileName == null ) {
CdDumpStats.PrintUsage( player );
return;
}
if ( !Paths.Contains( Paths.WorkingPath, fileName ) ) {
player.MessageUnsafePath();
return;
}
// ReSharper disable AssignNullToNotNullAttribute
if ( Paths.IsProtectedFileName( Path.GetFileName( fileName ) ) ) {
// ReSharper restore AssignNullToNotNullAttribute
player.Message( "You may not use this file." );
return;
}
string extension = Path.GetExtension( fileName );
if ( extension == null || !extension.Equals( ".txt", StringComparison.OrdinalIgnoreCase ) ) {
player.Message( "Stats filename must end with .txt" );
return;
}
if ( File.Exists( fileName ) && !cmd.IsConfirmed ) {
player.Confirm( cmd, "File \"{0}\" already exists. Overwrite?", Path.GetFileName( fileName ) );
return;
}
if ( !Paths.TestFile( "DumpStats file", fileName, false, FileAccess.Write ) ) {
player.Message( "Cannot create specified file. See log for details." );
return;
}
using ( FileStream fs = File.Create( fileName ) ) {
using ( var writer = new StreamWriter( fs ) ) {
PlayerInfo[] infos = PlayerDB.PlayerInfoList;
if ( infos.Length == 0 ) {
writer.WriteLine( "(TOTAL) (0 players)" );
writer.WriteLine();
} else {
DumpPlayerGroupStats( writer, infos, "(TOTAL)" );
}
List<PlayerInfo> rankPlayers = new List<PlayerInfo>();
foreach ( Rank rank in RankManager.Ranks ) {
// ReSharper disable LoopCanBeConvertedToQuery
foreach (PlayerInfo t in infos)
{
// ReSharper restore LoopCanBeConvertedToQuery
if ( t.Rank == rank )
rankPlayers.Add( t );
}
if ( rankPlayers.Count == 0 ) {
writer.WriteLine( "{0}: 0 players, 0 banned, 0 inactive", rank.Name );
writer.WriteLine();
} else {
DumpPlayerGroupStats( writer, rankPlayers, rank.Name );
}
rankPlayers.Clear();
}
}
}
player.Message( "Stats saved to \"{0}\"", fileName );
}