diff --git a/build-appjar.xml b/build-appjar.xml index 9799526..617dcf4 100644 --- a/build-appjar.xml +++ b/build-appjar.xml @@ -83,12 +83,13 @@ - + + diff --git a/build-snapshot.xml b/build-snapshot.xml index 33c4142..3c68374 100644 --- a/build-snapshot.xml +++ b/build-snapshot.xml @@ -7,7 +7,7 @@ - + diff --git a/src/org/april/hebdobot/cli/HebdobotCLI.java b/src/org/april/hebdobot/cli/HebdobotCLI.java index b0829d5..f2cdd7a 100644 --- a/src/org/april/hebdobot/cli/HebdobotCLI.java +++ b/src/org/april/hebdobot/cli/HebdobotCLI.java @@ -33,6 +33,7 @@ import org.apache.log4j.PropertyConfigurator; import org.april.hebdobot.HebdobotException; import org.april.hebdobot.model.Hebdobot; import org.april.hebdobot.model.UserAliases; +import org.april.hebdobot.util.BuildInformation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -45,7 +46,6 @@ public class HebdobotCLI { private static final Logger logger = LoggerFactory.getLogger(HebdobotCLI.class); - public static final String HEBDOBOT_VERSION = "v2.0"; private static final String DEFAULT_CONFIG_FILE = "hebdobot.conf"; private static final String DEFAULT_ALIAS_FILE = "users.conf"; @@ -63,10 +63,11 @@ public class HebdobotCLI { StringList message = new StringList(); - message.append("Hebdobot version ").appendln(HEBDOBOT_VERSION); + message.append("Hebdobot ").appendln(new BuildInformation().version()); message.appendln("Usage:"); message.appendln(" hebdobot [ -h | -help | --help ]"); message.appendln(" hebdobot [ -c config-file ]"); + message.appendln(" hebdobot [ -version ]"); System.out.println(message.toString()); } @@ -86,6 +87,7 @@ public class HebdobotCLI // Options options = new Options(); options.addOption("h", "help", false, "Help option"); + options.addOption("version", false, "Version option"); options.addOption("c", true, "Config file"); CommandLineParser parser = new DefaultParser(); @@ -98,6 +100,10 @@ public class HebdobotCLI HelpFormatter formatter = new HelpFormatter(); formatter.printHelp("hebdobot", options); } + else if (commandLine.hasOption("version")) + { + showVersion(); + } else { // Find the configuration file. @@ -161,6 +167,7 @@ public class HebdobotCLI logger.info("Basic log configuration done."); logger.info("Configuration file was not found in [{}].", loggerConfigFile.getAbsoluteFile()); } + System.out.println(new BuildInformation().toString()); // Load configuration file. logger.info("Configuration file loading… ({}).", configFile.getAbsolutePath()); @@ -235,4 +242,16 @@ public class HebdobotCLI help(); } } + + /** + * version. + */ + public static void showVersion() + { + StringList message = new StringList(); + + message.appendln(new BuildInformation().toString()); + + System.out.println(message.toString()); + } } diff --git a/src/org/april/hebdobot/model/Hebdobot.java b/src/org/april/hebdobot/model/Hebdobot.java index 4df11de..50506db 100644 --- a/src/org/april/hebdobot/model/Hebdobot.java +++ b/src/org/april/hebdobot/model/Hebdobot.java @@ -41,6 +41,7 @@ import org.april.hebdobot.review.Review; import org.april.hebdobot.review.Topic; import org.april.hebdobot.twitter.TwitterClient; import org.april.hebdobot.twitter.TwitterSettings; +import org.april.hebdobot.util.BuildInformation; import org.jibble.pircbot.IrcException; import org.jibble.pircbot.NickAlreadyInUseException; import org.jibble.pircbot.PircBot; @@ -492,6 +493,12 @@ public class Hebdobot extends PircBot sendMessage(sender + ", Hebdobot est un logiciel libre de l'April sous licence GNU AGPL (sources : https://agir.april.org/projects/hebdobot/repository)."); } + else if (StringsUtils.equalsAnyIgnoreCase(text, "!version")) + { + logger.info("!version caught."); + + sendMessage(new BuildInformation().toString()); + } else if (text.startsWith("%")) { logger.info("% caught."); diff --git a/src/org/april/hebdobot/util/BuildInformation.java b/src/org/april/hebdobot/util/BuildInformation.java new file mode 100644 index 0000000..ca3ffde --- /dev/null +++ b/src/org/april/hebdobot/util/BuildInformation.java @@ -0,0 +1,187 @@ +/** + * Copyright (C) 2016-2017 Christian Pierre MOMON + * + * This file is part of (April) Hebdobot. + * + * Hebdobot is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Hebdobot is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Hebdobot. If not, see + */ +package org.april.hebdobot.util; + +import java.io.IOException; +import java.net.URL; +import java.util.Properties; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The Class BuildInformation. + */ +public class BuildInformation +{ + private static final Logger logger = LoggerFactory.getLogger(BuildInformation.class); + + private static String BUILD_INFORMATION_FILE = "/org/april/hebdobot/build_information.properties"; + + private String productName; + private String majorRevision; + private String minorRevision; + private String buildNumber; + private String snapshotStamp; + private String buildDate; + private String generator; + private String author; + + /** + * Instantiates a new builds the information. + */ + public BuildInformation() + { + Properties build = new Properties(); + + try + { + // + URL buildInformationFile = BuildInformation.class.getResource(BUILD_INFORMATION_FILE); + + if (buildInformationFile != null) + { + build.load(BuildInformation.class.getResource(BUILD_INFORMATION_FILE).openStream()); + } + + // + this.productName = build.getProperty("product.name", "DevInProgress"); + this.majorRevision = build.getProperty("product.revision.major", "d"); + this.minorRevision = build.getProperty("product.revision.minor", "e"); + this.buildNumber = build.getProperty("product.revision.build", "v"); + this.snapshotStamp = build.getProperty("product.revision.snapshot", "-s"); + this.buildDate = build.getProperty("product.revision.date", "today"); + this.generator = build.getProperty("product.revision.generator", "n/a"); + this.author = build.getProperty("product.revision.author", "n/a"); + + } + catch (IOException exception) + { + // + logger.error("Error loading the build.properties file: " + exception.getMessage()); + logger.error(ExceptionUtils.getStackTrace(exception)); + + // + this.productName = "n/a"; + this.majorRevision = "n/a"; + this.minorRevision = "n/a"; + this.buildNumber = "n/a"; + this.snapshotStamp = "n/a"; + this.buildDate = "n/a"; + this.generator = "n/a"; + this.author = "n/a"; + } + } + + public String author() + { + return this.author; + } + + public String buildDate() + { + return this.buildDate; + } + + public String buildNumber() + { + return this.buildNumber; + } + + public String generator() + { + return this.generator; + } + + public String majorRevision() + { + return this.majorRevision; + } + + public String minorRevision() + { + return this.minorRevision; + } + + public String productName() + { + return this.productName; + } + + public String snapshotStamp() + { + return this.snapshotStamp; + } + + /** + * To string. + * + * @return the string + */ + @Override + public String toString() + { + String result; + + result = String.format("%s %s.%s.%s%s built on %s by %s", StringUtils.capitalize(this.productName), this.majorRevision, this.minorRevision, + this.buildNumber, this.snapshotStamp, this.buildDate, this.author); + + // + return result; + } + + /** + * Version. + * + * @return the string + */ + public String version() + { + String result; + + result = String.format("%s.%s.%s%s", this.majorRevision, this.minorRevision, this.buildNumber, this.snapshotStamp); + + // + return result; + } + + /** + * Checks if is defined. + * + * @return true, if is defined + */ + public static boolean isDefined() + { + boolean result; + + if (BuildInformation.class.getResource(BUILD_INFORMATION_FILE) == null) + { + result = false; + } + else + { + result = true; + } + + // + return result; + } +}