diff --git a/wmud/main.c b/wmud/main.c index a2472e2..f298988 100644 --- a/wmud/main.c +++ b/wmud/main.c @@ -206,10 +206,10 @@ main(int argc, char **argv) current_config = wmud_configuration_new(); // Process command line options - wmud_configuration_update_from_cmdline( - current_config, - &argc, &argv, - NULL); + // wmud_configuration_update_from_cmdline( + // current_config, + // &argc, &argv, + // NULL); /* TODO: Create signal handlers! */ diff --git a/wmud/wmud-configuration.c b/wmud/wmud-configuration.c deleted file mode 100644 index c948bb1..0000000 --- a/wmud/wmud-configuration.c +++ /dev/null @@ -1,275 +0,0 @@ -#include "wmud-configuration.h" - -#include "configuration.h" - -typedef struct _WmudConfigurationPrivate { - gchar *file_name; - GKeyFile *key_file; - gchar *admin_email; - gboolean *hide_single_race; - gboolean *hide_single_class; - guint *house_occupy_time; - guint *minimum_deities; - gboolean *clan_wars; - guint *maximum_group_size; - gboolean *trainable_abilities; - gboolean *reborn; -} WmudConfigurationPrivate; - -// The following defines are the default values for configurable -// items. These can be changed in run time! - -// If there is only one race, should the race changing step be hidden? -#define DEFAULT_HIDE_SINGLE_RACE FALSE - -// If there is only one class, should the class changing step be hidden? -#define DEFAULT_HIDE_SINGLE_CLASS FALSE - -// If the owner of the house is not present to this many (real world) -// days, their house can be occupied (traps and the like may still -// trigger, though! If this is set to 0, houses cannot be occupied. -#define DEFAULT_HOUSE_OCCUPY_TIME 0 - -// The minimum number of deities that must be choosen during character -// generation. If the number of available deities is less than this, -// it will be decremented runtime! -#define DEFAULT_MINIMUM_DEITIES 0 - -// TRUE if clans can declare war on each other (ie. PvP) -#define DEFAULT_CLAN_WARS FALSE - -// The maximum size of a group -#define DEFAULT_MAXIMUM_GROUP_SIZE 5 - -// If TRUE, abilities (Strength, Intelligence, etc.) are trainable -#define DEFAULT_TRAINABLE_ABILITIES FALSE - -// If TRUE, characters can choose to reborn (ie. reroll) -#define DEFAULT_REBORN FALSE - -G_DEFINE_TYPE_WITH_PRIVATE(WmudConfiguration, - wmud_configuration, - G_TYPE_OBJECT); - -static void -wmud_configuration_finalize(GObject *gobject) -{ - g_signal_handlers_destroy(gobject); - G_OBJECT_CLASS(wmud_configuration_parent_class)->finalize(gobject); -} - -static void -wmud_configuration_class_init(WmudConfigurationClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS(klass); - - gobject_class->finalize = wmud_configuration_finalize; -} - -static void -wmud_configuration_init(WmudConfiguration *configuration) -{ - WmudConfigurationPrivate *priv = wmud_configuration_get_instance_private( - configuration); - - priv->key_file = NULL; - priv->file_name = NULL; - priv->admin_email = NULL; - priv->hide_single_race = NULL; - priv->hide_single_class = NULL; - priv->house_occupy_time = NULL; - priv->minimum_deities = NULL; - priv->clan_wars = NULL; - priv->maximum_group_size = NULL; - priv->trainable_abilities = NULL; - priv->reborn = NULL; -} - -void -wmud_configuration_update_from_cmdline(WmudConfiguration *configuration, - gint *argc, - gchar **argv[], - GError **error) -{ - WmudConfigurationPrivate *priv = wmud_configuration_get_instance_private( - configuration); - GOptionEntry entries[] = { - { - "config-file", 'c', - 0, - G_OPTION_ARG_FILENAME, - &(priv->file_name), - "The name of the configuration file to parse", - "FILE" - }, - {NULL} - }; - GError *err = NULL; - GOptionContext *context; - - context = g_option_context_new("- Yet Another MUD Engine"); - g_option_context_add_main_entries(context, entries, NULL); - - if (!g_option_context_parse(context, argc, argv, &err)) { - g_print("Option parsing failed: %s\n", err->message); - - g_object_unref(configuration); - - // TODO: Update error! - - return; - } - - g_print("Config file: %s\n", priv->file_name); -} - -#define wmud_configuration_read_value_from_file(configuration_priv, \ - type, \ - group, \ - key, \ - tmp_var, \ - default_value, \ - target, \ - target_is_ptr, \ - tmp_err, \ - error) \ - tmp_var = g_key_file_get_ ## type ((configuration_priv)->key_file, \ - group, key, \ - &tmp_err); \ - \ - if (tmp_err && (tmp_err->domain == G_KEY_FILE_ERROR)) { \ - if (tmp_err->code == G_KEY_FILE_ERROR_KEY_NOT_FOUND) { \ - tmp_var = default_value; \ - } else if (tmp_err->code == G_KEY_FILE_ERROR_INVALID_VALUE) { \ - g_propagate_error(error, tmp_err); \ - g_clear_error(&tmp_err); \ - \ - return; \ - } \ - } \ - \ - if (target_is_ptr) { \ - g_free(target); \ - target = g_new(g ## type, 1); \ - *(target) = tmp_var; \ - } else { \ - target = tmp_var; \ - } - -void -wmud_configuration_update_from_file(WmudConfiguration *configuration, - gchar *filename, - GError **error) -{ - gboolean tmp_bool; - guint tmp_uint; - - GError *tmp_err = NULL; - WmudConfigurationPrivate *priv = wmud_configuration_get_instance_private( - configuration); - - if (filename != NULL) { - g_free(priv->file_name); - priv->file_name = g_strdup(filename); - } else if (priv->file_name == NULL) { - priv->file_name = g_strdup(WMUD_CONFDIR "/wmud.conf"); - } - - priv->key_file = g_key_file_new(); - - if (!g_key_file_load_from_file(priv->key_file, - priv->file_name, - G_KEY_FILE_NONE, - error)) { - return; - } - - if (!g_key_file_has_group(priv->key_file, "global")) { - g_set_error(error, - WMUD_CONFIG_ERROR, WMUD_CONFIG_ERROR_NOGLOBAL, - "Configuration file (%s) does not contain " - "the required [global] group!", - priv->file_name); - - return; - } - - priv->admin_email = g_key_file_get_string( - priv->key_file, - "global", "admin email", - NULL); - - wmud_configuration_read_value_from_file(priv, boolean, - "global", "hide single race", - tmp_bool, DEFAULT_HIDE_SINGLE_RACE, - priv->hide_single_race, TRUE, - tmp_err, error); - wmud_configuration_read_value_from_file(priv, boolean, - "global", "hide single class", - tmp_bool, DEFAULT_HIDE_SINGLE_CLASS, - priv->hide_single_class, TRUE, - tmp_err, error); - wmud_configuration_read_value_from_file(priv, uint, - "global", "house occupy time", - tmp_uint, DEFAULT_HOUSE_OCCUPY_TIME, - priv->house_occupy_time, TRUE, - tmp_err, error); - wmud_configuration_read_value_from_file(priv, uint, - "global", "minimum deities", - tmp_uint, DEFAULT_MINIMUM_DEITIES, - priv->minimum_deities, TRUE, - tmp_err, error); - wmud_configuration_read_value_from_file(priv, boolean, - "global", "clan wars", - tmp_bool, DEFAULT_CLAN_WARS, - priv->clan_wars, TRUE, - tmp_err, error); - wmud_configuration_read_value_from_file(priv, uint, - "global", "maximum group size", - tmp_uint, DEFAULT_MAXIMUM_GROUP_SIZE, - priv->maximum_group_size, TRUE, - tmp_err, error); - wmud_configuration_read_value_from_file(priv, boolean, - "global", "trainable abilities", - tmp_bool, DEFAULT_TRAINABLE_ABILITIES, - priv->trainable_abilities, TRUE, - tmp_err, error); - wmud_configuration_read_value_from_file(priv, boolean, - "global", "reborn", - tmp_bool, DEFAULT_REBORN, - priv->reborn, TRUE, - tmp_err, error); -} - -#define wmud_new(type, var, value) \ - var = g_new(type, 1); \ - *(var) = value; - -WmudConfiguration * -wmud_configuration_new(void) -{ - WmudConfiguration *configuration = g_object_new( - WMUD_TYPE_CONFIGURATION, NULL); - WmudConfigurationPrivate *priv = wmud_configuration_get_instance_private( - configuration); - - wmud_new(gboolean, priv->hide_single_race, DEFAULT_HIDE_SINGLE_RACE); - wmud_new(gboolean, priv->hide_single_class, DEFAULT_HIDE_SINGLE_CLASS); - wmud_new(guint, priv->house_occupy_time, DEFAULT_HOUSE_OCCUPY_TIME); - wmud_new(guint, priv->minimum_deities, DEFAULT_MINIMUM_DEITIES); - wmud_new(gboolean, priv->clan_wars, DEFAULT_CLAN_WARS); - wmud_new(guint, priv->maximum_group_size, DEFAULT_MAXIMUM_GROUP_SIZE); - wmud_new(gboolean, priv->trainable_abilities, DEFAULT_TRAINABLE_ABILITIES); - wmud_new(gboolean, priv->reborn, DEFAULT_REBORN); - - return configuration; -} - -gchar * -wmud_configuration_get_filename(WmudConfiguration *configuration) -{ - WmudConfigurationPrivate *priv = wmud_configuration_get_instance_private( - configuration); - - return priv->file_name; -} diff --git a/wmud/wmud-configuration.h b/wmud/wmud-configuration.h deleted file mode 100644 index 5133869..0000000 --- a/wmud/wmud-configuration.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef __WMUD_WMUD_CONFIGURATION_H__ -#define __WMUD_WMUD_CONFIGURATION_H__ - -#include - -G_BEGIN_DECLS - -#define WMUD_TYPE_CONFIGURATION (wmud_configuration_get_type()) -#define WMUD_CONFIGURATION(o) (G_TYPE_CHECK_INSTANCE_CAST((o), WMUD_TYPE_CONFIGURATION, WmudConfiguration)) -#define WMUD_CONFIGURATION_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), WMUD_TYPE_CONFIGURATION, WmudConfigurationClass)) -#define WMUD_IS_CONFIGURATION(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), WMUD_TYPE_CONFIGURATION)) -#define WMUD_IS_CONFIGURATION_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE((k), WMUD_TYPE_CONFIGURATION)) -#define WMUD_CONFIGURATION_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), WMUD_TYPE_CONFIGURATION, WmudConfigurationClass)) - -typedef struct _WmudConfiguration WmudConfiguration; -typedef struct _WmudConfigurationClass WmudConfigurationClass; - -struct _WmudConfiguration { - /* Parent instance structure */ - GObject parent_instance; - - /* Instance members */ -}; - -struct _WmudConfigurationClass { - GObjectClass parent_class; -}; - -GType wmud_configuration_get_type(void) G_GNUC_CONST; - -WmudConfiguration *wmud_configuration_new(void); -void wmud_configuration_update_from_cmdline(WmudConfiguration *configuration, - gint *argc, - gchar **argv[], - GError **error); -void wmud_configuration_update_from_file(WmudConfiguration *configuration, - gchar *filename, - GError **error); - -gchar *wmud_configuration_get_filename(WmudConfiguration *configuration); - -G_END_DECLS - -#endif /* __WMUD_WMUD_CONFIGURATION_H__ */ diff --git a/wmud/wmud-configuration.vala b/wmud/wmud-configuration.vala new file mode 100644 index 0000000..2e6b8f3 --- /dev/null +++ b/wmud/wmud-configuration.vala @@ -0,0 +1,59 @@ +public errordomain Wmud.ConfigError { + NOGLOBAL; +} + +extern const string WMUD_CONFDIR; + +public class Wmud.Configuration : Object { + private string? filename = null; + private GLib.KeyFile? key_file; + private string? admin_email; + private bool hide_single_race; + private bool hide_single_class; + private uint64 house_occupy_time; + private uint64 minimum_deities; + private bool clan_wars; + private uint64 maximum_group_size; + private bool trainable_abilities; + private bool reborn; + + + public void + update_from_file(string? filename) + throws FileError, KeyFileError, ConfigError + { + if (filename != null) { + this.filename = filename; + } else if (this.filename == null) { + this.filename = WMUD_CONFDIR + "/wmud.conf"; + } + + key_file = new KeyFile(); + + key_file.load_from_file(this.filename, KeyFileFlags.NONE); + + if (!key_file.has_group("global")) { + throw new ConfigError.NOGLOBAL( + "Configuration file (%s) does not contain the required [global] section!", + this.filename); + } + + admin_email = key_file.get_string("global", "admin email"); + + hide_single_race = key_file.get_boolean("global", "hide single race"); + hide_single_class = key_file.get_boolean("global", "hide single class"); + house_occupy_time = key_file.get_uint64("global", "house occupy time"); + minimum_deities = key_file.get_uint64("global", "minimum deities"); + clan_wars = key_file.get_boolean("global", "clan wars"); + maximum_group_size = key_file.get_uint64("global", "maximum group size"); + trainable_abilities = key_file.get_boolean("global", "trainable abilities"); + reborn = key_file.get_boolean("global", "reborn"); + } + + public + Configuration() + { + maximum_group_size = 5; + reborn = true; + } +}