internal static void RulesHandler( Player player, Command cmd )
{
string sectionName = cmd.Next();
// if no section name is given
if ( sectionName == null ) {
FileInfo ruleFile = new FileInfo( Paths.RulesFileName );
if ( ruleFile.Exists ) {
PrintRuleFile( player, ruleFile );
} else {
player.Message( DefaultRules );
}
// print a list of available sections
IEnumerable<string> sections = GetRuleSectionList();
if ( sections != null ) {
player.Message( "Rule sections: {0}. Type &H/Rules SectionName&S to read.", sections.JoinToString() );
}
return;
}
// if a section name is given, but no section files exist
if ( !Directory.Exists( Paths.RulesPath ) ) {
player.Message( "There are no rule sections defined." );
return;
}
string ruleFileName = null;
string[] sectionFiles = Directory.GetFiles( Paths.RulesPath,
"*.txt",
SearchOption.TopDirectoryOnly );
for ( int i = 0; i < sectionFiles.Length; i++ ) {
string sectionFullName = Path.GetFileNameWithoutExtension( sectionFiles[i] );
if ( sectionFullName == null )
continue;
if ( sectionFullName.StartsWith( sectionName, StringComparison.OrdinalIgnoreCase ) ) {
if ( sectionFullName.Equals( sectionName, StringComparison.OrdinalIgnoreCase ) ) {
// if there is an exact match, break out of the loop early
ruleFileName = sectionFiles[i];
break;
} else if ( ruleFileName == null ) {
// if there is a partial match, keep going to check for multiple matches
ruleFileName = sectionFiles[i];
} else {
var matches = sectionFiles.Select( f => Path.GetFileNameWithoutExtension( f ) )
.Where( sn => sn != null && sn.StartsWith( sectionName, StringComparison.OrdinalIgnoreCase ) );
// if there are multiple matches, print a list
player.Message( "Multiple rule sections matched \"{0}\": {1}",
sectionName, matches.JoinToString() );
return;
}
}
}
if ( ruleFileName != null ) {
string sectionFullName = Path.GetFileNameWithoutExtension( ruleFileName );
// ReSharper disable AssignNullToNotNullAttribute
player.Message( "Rule section \"{0}\":", sectionFullName );
// ReSharper restore AssignNullToNotNullAttribute
PrintRuleFile( player, new FileInfo( ruleFileName ) );
} else {
var sectionList = GetRuleSectionList();
if ( sectionList == null ) {
player.Message( "There are no rule sections defined." );
} else {
player.Message( "No rule section defined for \"{0}\". Available sections: {1}",
sectionName, sectionList.JoinToString() );
}
}
}