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);
}