diff --git a/.gitignore b/.gitignore index 1df0674..8ff4ec1 100644 --- a/.gitignore +++ b/.gitignore @@ -68,3 +68,5 @@ gradle-app.setting # # Work around https://youtrack.jetbrains.com/issue/IDEA-116898 # gradle/wrapper/gradle-wrapper.properties + +dcf.properties diff --git a/build.gradle b/build.gradle index 1ec0b83..4c67af1 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ group 'net.pingex' -version '0.1' +version '0.1-dev' apply plugin: 'java' @@ -10,5 +10,13 @@ repositories { } dependencies { + // Logging + compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.6.1' + compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.6.1' + + // Configuration framework + compile group: 'org.apache.commons', name: 'commons-configuration2', version: '2.0' + runtime group: 'commons-beanutils', name: 'commons-beanutils', version: '1.9.2' + testCompile group: 'junit', name: 'junit', version: '4.11' } \ No newline at end of file diff --git a/dcf.properties.example b/dcf.properties.example new file mode 100644 index 0000000..134b07d --- /dev/null +++ b/dcf.properties.example @@ -0,0 +1,2 @@ +# Bot display name +general.bot_name = DCF-enabled Bot diff --git a/settings.gradle b/settings.gradle index 91a4c3d..273876f 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,2 @@ -rootProject.name = 'dcm' +rootProject.name = 'dcf' diff --git a/src/main/java/net/pingex/dcf/DiscordCommandableFramework.java b/src/main/java/net/pingex/dcf/DiscordCommandableFramework.java new file mode 100644 index 0000000..14cb2fb --- /dev/null +++ b/src/main/java/net/pingex/dcf/DiscordCommandableFramework.java @@ -0,0 +1,25 @@ +package net.pingex.dcf; + +import net.pingex.dcf.core.Configuration; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * Main class for DCF + */ +public class DiscordCommandableFramework +{ + private static final Logger LOGGER = LogManager.getLogger(DiscordCommandableFramework.class); + + /** + * Main entry point + */ + public static void main(String[] args) + { + LOGGER.info("Hello World"); + Configuration.load(); + Configuration.init(); + + LOGGER.info("I'm " + Configuration.BOT_NAME); + } +} diff --git a/src/main/java/net/pingex/dcf/core/Configuration.java b/src/main/java/net/pingex/dcf/core/Configuration.java new file mode 100644 index 0000000..fbcae11 --- /dev/null +++ b/src/main/java/net/pingex/dcf/core/Configuration.java @@ -0,0 +1,70 @@ +package net.pingex.dcf.core; + +import org.apache.commons.configuration2.ConfigurationUtils; +import org.apache.commons.configuration2.FileBasedConfiguration; +import org.apache.commons.configuration2.ImmutableConfiguration; +import org.apache.commons.configuration2.PropertiesConfiguration; +import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder; +import org.apache.commons.configuration2.builder.fluent.Parameters; +import org.apache.commons.configuration2.ex.ConfigurationException; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * Configuration manager + */ +public class Configuration +{ + /** + * File name to look for + */ + private static final String FILENAME = "dcf.properties"; + private static final Logger LOGGER = LogManager.getLogger(Configuration.class); + + /** + * Main configuration store + */ + private static org.apache.commons.configuration2.Configuration store; + + /** + * Load configuration file + */ + public static void load() + { + try + { + LOGGER.info("Loading configuration file"); + store = new FileBasedConfigurationBuilder(PropertiesConfiguration.class) + .configure(new Parameters().fileBased().setFileName(FILENAME)) + .getConfiguration(); + } catch (ConfigurationException e) + { + LOGGER.fatal("Failed to load configuration", e); + } + } + + /** + * Get the store in read-only mode + * @return The read-only store + */ + public static ImmutableConfiguration getStore() + { + return ConfigurationUtils.unmodifiableConfiguration(store); + } + + // ======================================== + + /** + * Bot display name + */ + public static String BOT_NAME = "DCF-enabled Bot"; + + + /** + * Load config keys + */ + public static void init() + { + BOT_NAME = store.getString("general.bot_name", BOT_NAME); + } +} diff --git a/src/main/java/net/pingex/dcf/core/package-info.java b/src/main/java/net/pingex/dcf/core/package-info.java new file mode 100644 index 0000000..dd4a355 --- /dev/null +++ b/src/main/java/net/pingex/dcf/core/package-info.java @@ -0,0 +1,4 @@ +/** + * Very core components: configuration, handlers, and so on + */ +package net.pingex.dcf.core; \ No newline at end of file diff --git a/src/main/java/net/pingex/dcf/package-info.java b/src/main/java/net/pingex/dcf/package-info.java new file mode 100644 index 0000000..5b7b09e --- /dev/null +++ b/src/main/java/net/pingex/dcf/package-info.java @@ -0,0 +1,4 @@ +/** + * Main package of DCF, contains everything to make it run ! + */ +package net.pingex.dcf; \ No newline at end of file diff --git a/src/main/resources/log4j2.properties b/src/main/resources/log4j2.properties new file mode 100644 index 0000000..d612e44 --- /dev/null +++ b/src/main/resources/log4j2.properties @@ -0,0 +1,9 @@ +name = LoggingConfig + +appender.console.type = Console +appender.console.name = STDOUT +appender.console.layout.type = PatternLayout +appender.console.layout.pattern = %d{dd/MM/yyyy HH:mm:ss} [%t/%p] %c:%M - %m%n + +rootLogger.level = info +rootLogger.appenderRef.stdout.ref = STDOUT \ No newline at end of file