diff --git a/wmud/Makefile.am b/wmud/Makefile.am index 830f553..c2dedbe 100644 --- a/wmud/Makefile.am +++ b/wmud/Makefile.am @@ -1,38 +1,41 @@ bin_PROGRAMS = wmud AM_CPPFLAGS = -DWMUD_STATEDIR=\""$(localstatedir)"\" -DWMUD_CONFDIR=\""$(sysconfdir)"\" -DG_LOG_DOMAIN=\""wMUD"\" $(MEMCACHED_CFLAGS) $(GLIB_CFLAGS) $(GIO_CFLAGS) $(GTHREAD_CFLAGS) $(GDA_CFLAGS) $(CURL_CFLAGS) -wmud_SOURCES = \ - main.c \ - main.h \ - game-networking.c \ - game-networking.h \ - interpreter.c \ - interpreter.h \ - db.c \ - db.h \ - players.c \ - players.h \ - maintenance.c \ - maintenance.h \ - game.c \ - game.h \ - configuration.c \ - configuration.h \ - world.c \ - world.h \ - menu.c \ - menu.h \ - texts.c \ - texts.h \ - wmudclient.c \ - wmudclient.h \ - wmudplayer.c \ - wmudplayer.h \ - wmudclientstate.h \ - enumtypes.h \ - enumtypes.c \ - wmudworld.c \ - wmudworld.h +wmud_SOURCES = \ + main.c \ + main.h \ + game-networking.c \ + game-networking.h \ + interpreter.c \ + interpreter.h \ + db.c \ + db.h \ + players.c \ + players.h \ + maintenance.c \ + maintenance.h \ + game.c \ + game.h \ + configuration.c \ + configuration.h \ + world.c \ + world.h \ + menu.c \ + menu.h \ + texts.c \ + texts.h \ + wmudclient.c \ + wmudclient.h \ + wmudplayer.c \ + wmudplayer.h \ + wmudclientstate.h \ + enumtypes.h \ + enumtypes.c \ + wmudworld.c \ + wmudworld.h \ + wmud-configuration.c \ + wmud-configuration.h \ + $(NULL) wmud_LDADD = $(MEMCACHED_LIBS) $(GLIB_LIBS) $(GIO_LIBS) $(GTHREAD_LIBS) $(GDA_LIBS) $(CURL_LIBS) diff --git a/wmud/main.c b/wmud/main.c index 0869d35..7aef745 100644 --- a/wmud/main.c +++ b/wmud/main.c @@ -39,6 +39,8 @@ #include "menu.h" #include "texts.h" +#include "wmud-configuration.h" + /** * SECTION:utils * @short_description: Utilities and uncategorized functions @@ -193,16 +195,32 @@ wmud_logger(const gchar *log_domain, int main(int argc, char **argv) { - GError *err = NULL; - GThread *game_thread; - GMainContext *game_context; - GSList *game_menu = NULL; + GThread *game_thread; + GMainContext *game_context; + GError *err = NULL; + GSList *game_menu = NULL; + WmudConfiguration *current_config = NULL; + gchar *filename = NULL; g_log_set_handler(G_LOG_DOMAIN, G_LOG_LEVEL_MASK, wmud_logger, NULL); - /* TODO: Command line parsing */ + current_config = wmud_configuration_new(); + + // Process command line options + wmud_configuration_update_from_cmdline( + current_config, + &argc, &argv, + NULL); + /* TODO: Create signal handlers! */ + if ((filename = wmud_configuration_get_filename(current_config)) == NULL) { + filename = WMUD_CONFDIR "/wmud.conf"; + } + + // Process configuration file + wmud_configuration_update_from_file(current_config, filename, NULL); + if (!wmud_config_init(&active_config, &err)) { if (err) { g_critical("Config file parsing error: %s", err->message); diff --git a/wmud/wmud-configuration.c b/wmud/wmud-configuration.c index 3cc497b..48cec2b 100644 --- a/wmud/wmud-configuration.c +++ b/wmud/wmud-configuration.c @@ -2,19 +2,21 @@ typedef struct _WmudConfigurationPrivate { gchar *file_name; - guint port; - gchar *database_dsn; + GKeyFile *key_file; gchar *admin_email; - gchar *smtp_server; - gboolean smtp_tls; - gchar *smtp_username; - gchar *smtp_password; - gchar *smtp_sender; + gboolean *hide_single_race; + gboolean *hide_single_class; + guint *house_occupy_time; + guint *minimum_deities; + gboolean *clan_wars; + guint *maximum_group_size; + guint *trainable_abilities; + gboolean *reborn; } WmudConfigurationPrivate; G_DEFINE_TYPE_WITH_PRIVATE(WmudConfiguration, wmud_configuration, - G_TYPE_KEY_FILE); + G_TYPE_OBJECT); static void wmud_configuration_finalize(GObject *gobject) @@ -34,8 +36,97 @@ wmud_configuration_class_init(WmudConfigurationClass *klass) 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); +} + +void +wmud_configuration_update_from_file(WmudConfiguration *configuration, + gchar *filename, + GError **error) +{ + WmudConfigurationPrivate *priv = wmud_configuration_get_instance_private( + configuration); + + // Save the file name for possible later use + priv->file_name = g_strdup(filename); + + priv->key_file = g_key_file_new(); + + if (!g_key_file_load_from_file(priv->key_file, + filename, + G_KEY_FILE_NONE, + error)) { + return; + } } WmudConfiguration * -wmud_configuration_new(gchar *filename) -{} +wmud_configuration_new(void) +{ + WmudConfiguration *configuration = g_object_new( + WMUD_TYPE_CONFIGURATION, NULL); + + // TODO: Update with built-in defaults + + 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 index 9e9bd33..5133869 100644 --- a/wmud/wmud-configuration.h +++ b/wmud/wmud-configuration.h @@ -1,5 +1,5 @@ -#ifndef __WMUD_CONFIGURATION_H__ -#define __WMUD_CONFIGURATION_H__ +#ifndef __WMUD_WMUD_CONFIGURATION_H__ +#define __WMUD_WMUD_CONFIGURATION_H__ #include @@ -17,17 +17,28 @@ typedef struct _WmudConfigurationClass WmudConfigurationClass; struct _WmudConfiguration { /* Parent instance structure */ - GKeyFile parent_instance; + GObject parent_instance; /* Instance members */ }; struct _WmudConfigurationClass { - GKeyFileClass parent_class; + 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_CONFIGURATION_H__ */ +#endif /* __WMUD_WMUD_CONFIGURATION_H__ */