-
Notifications
You must be signed in to change notification settings - Fork 30
Configuration
BiM utilise une méthode dynamique pour créer des fichiers de configurations qui permettent de modifier des valeurs en général statique depuis un fichier .xml
On différencie deux choses :
- La configuration du programme en général (BiM.Core.Config)
- Les préférences associés à un personnage (BiM.Behaviors.Settings)
Au démarrage le bot une nouvelle instance de la class Config est créé. Celle-ci va enregistrer dans toutes les assemblies chargés les champs statiques ayant un attribut [Configurable]. Il associe chaque champ à une clé donnée par [Configurable]. Ensuite il charge le fichier config.xml, ce fichier contient des clés associés à des clés. A partir des clés il va retrouver les champs correspondant à chaque entrée du fichier xml et leur assigne la valeur lu depuis le fichier.
La configuration est ensuite sauvegardé à l'appel de la méthode Save() (à l'arrêt du bot)
Ainsi un champ configurable se présente sous la forme
[Configurable("DefaultBotTick", "The interval (ms) between two message dispatching")]
public static int DefaultBotTick = 100;Et dans le xml
<Key name="DefaultBotTick" comment="The interval (ms) between two message dispatching">
<int>100</int>
</Key>Rien de compliqué
Les préférences (ou settings en anglais) servent à garder les préférences de l'utilisateur pour la configuration d'un personnage. Par exemple un plugin de combat doit retrouver la configuration de l'I.A. pour un même personnage.
Pour cela il existe la classe BotSettings qui est initialisé au moment de la séléction du personnage (CharacterSelectedSuccessMessage). Cette classe charge un fichier xml dans un dossier au nom du compte et un fichier au nom du personnage (configurable depuis l'entrée SettingsFile). Cette classe va charger de la même manière des valeurs associés à des clés, mais cette fois ci les clés désignent une classe unique.
Le principe est que qu'un plugin dispose d'un classe héritant de SettingsEntry et qui surcharge la propriété EntryName qui doit donner une clé unique (le nom du plugin en général). Cette classe contient des propriétés diverses qui désignent les préférences de l'utilisateur. Pour récupérer ces préférences il faut appeler la méthode GetEntry() de BotSettings. T désigne la classe héritant SettingsEntry. A ce moment là BotSettings va chercher dans les valeurs préalablement chargés du fichier xml une entrée ayant pour clé la valeur d'EntryName et si elle est trouvé, elle sera désérialisé, sinon une nouvelle instance est créé en appelant le constructeur par défaut. A l'arrêt du bot, les valeurs sont sauvegardés.
De cette manière les préférences sont gardés d'une connexion à l'autre et sont dépendantes d'un personnage, non du programme.
Petit exemple
public class Settings : SettingsEntry
{
public Settings()
{
WelcomeMessage = "Welcome";
}
public override string EntryName
{
get
{
return "SimplePlugin";
}
}
public string WelcomeMessage
{
get;
set;
}
}
public class WelcomeMessage
{
private bool m_messageSent;
[MessageHandler(typeof(GameContextCreateMessage))]
public void HandleGameContextCreateMessage(Bot bot, GameContextCreateMessage message)
{
if (!m_messageSent)
{
var settings = bot.Settings.GetEntry<Settings>();
bot.Character.SendMessage(settings.WelcomeMessage);
if (settings.WelcomeMessage.EndsWith("!"))
settings.WelcomeMessage = settings.WelcomeMessage.Remove(settings.WelcomeMessage.Length - 1, 1);
else
settings.WelcomeMessage += "!";
m_messageSent = true;
}
}
}