bool DefineClass( XElement el ) {
PlayerClass playerClass = new PlayerClass();
// read required attributes
XAttribute attr = el.Attribute( "name" );
if( attr == null ) {
Log( "Config.DefineClass: Class definition with no name was ignored.", LogType.Warning );
return false;
}
if( !PlayerClass.IsValidClassName( attr.Value.Trim() ) ) {
Log( "Config.DefineClass: Invalid name specified for class \"{0}\". Class name can only contain letters, digits, and underscores.",
LogType.Warning, playerClass.name );
return false;
}
playerClass.name = attr.Value.Trim();
if( classes.classes.ContainsKey( playerClass.name ) ) {
Log( "Config.DefineClass: Duplicate class definition for \"{0}\" was ignored.", LogType.Warning, playerClass.name );
return true;
}
if( (attr = el.Attribute( "rank" )) == null ) {
Log( "Config.DefineClass: No rank specified for {0}. Class definition was ignored.", LogType.Warning, playerClass.name );
return false;
}
if( !Byte.TryParse( attr.Value, out playerClass.rank ) ) {
Log( "Config.DefineClass: Cannot parse rank for {0}. Class definition was ignored.", LogType.Warning, playerClass.name );
return false;
}
attr = el.Attribute( "color" );
if( attr == null || Color.Parse( attr.Value ) == null ) {
playerClass.color = "";
} else {
playerClass.color = Color.Parse( attr.Value );
}
// read optional attributes
if( (attr = el.Attribute( "prefix" )) != null ) {
if( PlayerClass.IsValidPrefix( attr.Value ) ) {
playerClass.prefix = attr.Value;
} else {
Log( "Config.DefineClass: Invalid prefix specified for {0}.", LogType.Warning, playerClass.name );
playerClass.prefix = "";
}
}
if( (attr = el.Attribute( "spamKickAt" )) != null ) {
if( !Int32.TryParse( attr.Value, out playerClass.spamKickThreshold ) ) {
Log( "Config.DefineClass: Could not parse the value for spamKickAt for {0}. Assuming 0 (never).", LogType.Warning, playerClass.name );
playerClass.spamKickThreshold = 0;
}
} else {
playerClass.spamKickThreshold = 0;
}
if( (attr = el.Attribute( "spamBanAt" )) != null ) {
if( !Int32.TryParse( attr.Value, out playerClass.spamBanThreshold ) ) {
Log( "Config.DefineClass: Could not parse the value for spamBanAt for {0}. Assuming 0 (never).", LogType.Warning, playerClass.name );
playerClass.spamBanThreshold = 0;
}
} else {
playerClass.spamBanThreshold = 0;
}
if( (attr = el.Attribute( "idleKickAfter" )) != null ) {
if( !Int32.TryParse( attr.Value, out playerClass.idleKickTimer ) ) {
Log( "Config.DefineClass: Could not parse the value for idleKickAfter for {0}. Assuming 0 (never).", LogType.Warning, playerClass.name );
playerClass.idleKickTimer = 0;
}
} else {
playerClass.idleKickTimer = 0;
}
if( (attr = el.Attribute( "reserveSlot" )) != null ) {
if( !Boolean.TryParse( attr.Value, out playerClass.reservedSlot ) ) {
Log( "Config.DefineClass: Could not parse the value for reserveSlot for {0}. Assuming \"false\".", LogType.Warning, playerClass.name );
playerClass.reservedSlot = false;
}
} else {
playerClass.reservedSlot = false;
}
// read permissions
XElement temp;
for( int i = 0; i < Enum.GetValues(typeof(Permissions)).Length; i++ ) {
string permission = ((Permissions)i).ToString();
if( (temp=el.Element( permission )) != null ) {
playerClass.permissions[i] = true;
if( i == (int)Permissions.Promote ) {
if( (attr = temp.Attribute( "max" )) != null ) {
playerClass.maxPromoteVal = attr.Value;
} else {
playerClass.maxPromoteVal = "";
}
} else if( i == (int)Permissions.Demote ) {
if( (attr = temp.Attribute( "max" )) != null ) {
playerClass.maxDemoteVal = attr.Value;
} else {
playerClass.maxDemoteVal = "";
}
} else if( i == (int)Permissions.Kick ) {
if( (attr = temp.Attribute( "max" )) != null ) {
playerClass.maxKickVal = attr.Value;
} else {
playerClass.maxKickVal = "";
}
} else if( i == (int)Permissions.Ban ) {
if( (attr = temp.Attribute( "max" )) != null ) {
playerClass.maxBanVal = attr.Value;
} else {
playerClass.maxBanVal = "";
}
}
}
}
// check for consistency in ban permissions
if( !playerClass.Can( Permissions.Ban ) &&
(playerClass.Can( Permissions.BanAll ) || playerClass.Can( Permissions.BanIP )) ) {
Log( "Class \"{0}\" is allowed to BanIP and/or BanAll but not allowed to Ban.\n" +
"Assuming that all ban permissions were ment to be off.", LogType.Warning, playerClass.name );
playerClass.permissions[(int)Permissions.BanIP] = false;
playerClass.permissions[(int)Permissions.BanAll] = false;
}
classes.AddClass( playerClass );
return true;
}