diff --git a/pom.xml b/pom.xml
index 8031795..eeb95f8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,6 +39,11 @@
smack-experimental
4.4.8
+
+ info.picocli
+ picocli
+ 4.7.6
+
@@ -72,7 +77,25 @@
-
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ ${maven-compiler-plugin-version}
+
+
+
+ info.picocli
+ picocli-codegen
+ 4.7.6
+
+
+
+ -Aproject=${project.groupId}/${project.artifactId}
+
+
+
diff --git a/src/main/java/de/thedevstack/xmpp/mamloader/MamLoader.java b/src/main/java/de/thedevstack/xmpp/mamloader/MamLoader.java
index cdca064..55ffd03 100644
--- a/src/main/java/de/thedevstack/xmpp/mamloader/MamLoader.java
+++ b/src/main/java/de/thedevstack/xmpp/mamloader/MamLoader.java
@@ -8,79 +8,122 @@ import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.stream.Collectors;
-import org.jivesoftware.smack.SmackException;
-import org.jivesoftware.smack.XMPPException;
+import org.jivesoftware.smack.packet.ExtensionElement;
import org.jivesoftware.smack.packet.Message;
+import org.jivesoftware.smack.packet.Message.Body;
-public class MamLoader {
+import picocli.CommandLine;
+import picocli.CommandLine.Command;
+import picocli.CommandLine.Option;
+import picocli.CommandLine.Parameters;
+
+@Command(name = "MamLoader")
+public class MamLoader implements Callable {
+ private static final String DATE_INPUT_FORMAT = "yyyy-mm-dd";
private static final SimpleDateFormat SDF = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
- private static final SimpleDateFormat INPUT = new SimpleDateFormat("dd.MM.yyyy");
+ private static final SimpleDateFormat SDF_DATE = new SimpleDateFormat("dd.MM.yyyy");
+ @Option(names = {"-d", "--debug"}, description = "Enables debugging output")
+ private boolean debug = false;
+ @Option(names = {"-f", "--from"}, description = "Limit loading history beginning with date. Date needs to be formatted as: " + DATE_INPUT_FORMAT)
+ private Date from;
+ @Option(names = {"-t", "--to"}, description = "Limit loading history ending with date. Date needs to be formatted as: " + DATE_INPUT_FORMAT)
+ private Date to;
+ @Option(names = {"-l", "--limit"}, description = "Maximum number of messages")
+ private int limit = -1;
+ @Parameters(description = "Your JID", arity = "1")
+ private String myjid;
+ @Parameters(description = "The JID of your chatpartner", arity = "1")
+ private String jid;
+ @Option(names = {"-p", "--password"}, description = "Your password", arity = "0..1", interactive = true)
+ private String password;
+ @Option(names = {"-m", "--markers"}, description = "Print also messages with markers")
+ private boolean printMarkers = false;
+ @Option(names = {"-b", "--with-body-only"}, description = "Print only messages with body")
+ private boolean withBodyOnly = true;
- public static void main(String[] args) throws InterruptedException, SmackException, IOException, XMPPException {
- if (2 > args.length) {
- System.err.println("Your JID and the JID of your chatpartner is needed.");
- System.exit(1);
+ public static void main(String[] args) {
+ int exitCode = new CommandLine(new MamLoader()).execute(args);
+ System.exit(exitCode);
+ }
+
+ private void printMessagesWithBody(List messages, String withJid) {
+ for (MamMessage mamMessage : messages) {
+ printMessage(mamMessage, withJid);
}
- String myjid = args[0];
- String jid = args[1];
- String password;
- boolean debug = false;
- Date start = null;
- Date end = null;
- int limit = -1;
-
- for (int i = 2; i < args.length; i++) {
- switch (args[i]) {
- case "-debug":
- debug = true;
- break;
- case "-from":
- start = parseDate(args[++i]);
- break;
- case "-to":
- end = parseDate(args[++i]);
- break;
- case "-limit":
- limit = Integer.parseInt(args[++i]);
- break;
+ }
+
+ private void printMessage(MamMessage mamMessage, String withJid) {
+ StringBuilder sb = new StringBuilder();
+ Message message = mamMessage.getMessage();
+
+ if (withBodyOnly) {
+ if (null != message.getBody()) {
+ if (withJid.equals(message.getFrom().asBareJid().toString())) {
+ sb.append("<");
+ } else {
+ sb.append(">");
+ }
+ sb.append(" ");
+ sb.append(SDF.format(mamMessage.getDate()));
+ sb.append(": ");
+ sb.append(message.getBody());
+ System.out.println(sb.toString());
}
- }
-
- if (null != end && null == start) {
- System.err.println("End without start not supported.");
- System.exit(1);
- } else if (null != start && -1 < limit) {
- System.err.println("Limit not supported if start date is given.");
- System.exit(1);
- } else if (null == jid || null == myjid) {
- System.err.println("Your JID and the JID of your chatpartner is needed.");
- System.exit(1);
- }
-
- System.out.println("Your JID: " + myjid);
-
- Console console = System.console();
- if (null == console) {
- System.out.println("Testenvironment!");
- System.out.println("Warning: Password will be shown.");
- System.out.print("Password: ");
- BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
- password = reader.readLine();
} else {
- password = String.valueOf(console.readPassword("Password: "));
+ if (withJid.equals(message.getFrom().asBareJid().toString())) {
+ sb.append("<");
+ } else {
+ sb.append(">");
+ }
+ sb.append(" ");
+ sb.append(SDF.format(mamMessage.getDate()));
+ sb.append(": ");
+ if (null != message.getBody()) {
+ sb.append(message.getBody());
+ }
+ if (printMarkers) {
+ sb.append("(");
+ sb.append(message.getExtensions().stream()
+ .filter(item -> !(item instanceof Body))
+ .map(ExtensionElement::toXML)
+ .collect(Collectors.joining(", ")));
+ sb.append(")");
+ }
+
+ System.out.println(sb.toString());
+ }
+ }
+
+ @Override
+ public Integer call() throws Exception {
+ System.out.println("Your own JID: " + myjid);
+
+ if (null == this.password) {
+ Console console = System.console();
+ if (null == console) {
+ System.out.println("Testenvironment!");
+ System.out.println("Warning: Password will be shown.");
+ System.out.print("Password: ");
+ BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
+ password = reader.readLine();
+ } else {
+ password = String.valueOf(console.readPassword("Password: "));
+ }
}
System.out.println("Loading history for chats with " + jid);
System.out.println("Limitations:");
- if (null == start && null == end && -1 == limit) {
+ if (null == from && null == to && -1 == limit) {
System.out.println("None");
} else {
- if (null != start) {
- System.out.println("Starting from: " + INPUT.format(start));
+ if (null != from) {
+ System.out.println("Starting from: " + SDF_DATE.format(from));
}
- if (null != end) {
- System.out.println("Ending at: " + INPUT.format(end));
+ if (null != to) {
+ System.out.println("Ending at: " + SDF_DATE.format(to));
}
if (-1 < limit) {
System.out.println("Only collecting " + limit + " messages. The limit is applied to all messages but only messages containing a body are printed out.");
@@ -89,22 +132,25 @@ public class MamLoader {
if (debug) {
System.out.println("Debugging is enabled.");
}
+ if (printMarkers) {
+ System.out.println("Printing messages markers.");
+ }
+ if (withBodyOnly) {
+ System.out.println("Printing only messages with body.");
+ }
MamLoadClient mlc = new MamLoadClient(debug);
try {
mlc.connectAndLogin(myjid, password);
-// mlc.loadHistory(jid, Date.from(LocalDate.of(2017, 11, 8).atStartOfDay().toInstant(ZoneOffset.UTC)), Date.from(LocalDate.of(2017, 11, 9).atStartOfDay().toInstant(ZoneOffset.UTC)));
-// mlc.loadHistory(jid);
List messages = null;
- if (start == null && -1 == limit) {
+ if (from == null && -1 == limit) {
messages = mlc.loadHistory(jid);
- //printMessage(messages.get(0), jid, false);
- } else if (start == null && -1 < limit) {
+ } else if (from == null && -1 < limit) {
messages = mlc.loadHistory(jid, limit);
- } else if (start != null && end == null) {
- messages = mlc.loadHistory(jid, start);
+ } else if (from != null && to == null) {
+ messages = mlc.loadHistory(jid, from);
} else {
- messages = mlc.loadHistory(jid, start, end);
+ messages = mlc.loadHistory(jid, from, to);
}
@@ -117,51 +163,8 @@ public class MamLoader {
mlc.disconnect();
}
}
- }
-
- private static Date parseDate(String dateToParse) {
- try {
- return INPUT.parse(dateToParse);
- } catch (ParseException e) {
- System.err.println("Could not parse date: " + dateToParse);
- System.err.println("Needed format: dd.MM.yyyy");
- System.exit(1);
-
- return null;
- }
- }
-
- private static void printMessagesWithBody(List messages, String withJid) {
- for (MamMessage mamMessage : messages) {
- printMessage(mamMessage, withJid, true);
- }
- }
- private static void printMessage(MamMessage mamMessage, String withJid, boolean onlyWithBody) {
- StringBuilder sb = new StringBuilder();
- Message message = mamMessage.getMessage();
-
- if (onlyWithBody && null != message.getBody()) {
- if (withJid.equals(message.getFrom().asBareJid().toString())) {
- sb.append("<");
- } else {
- sb.append(">");
- }
- sb.append(" ");
- sb.append(SDF.format(mamMessage.getDate()));
- sb.append(": ");
- sb.append(message.getBody());
- System.out.println(sb.toString());
- } else if (!onlyWithBody) {
- if (withJid.equals(message.getFrom().asBareJid().toString())) {
- sb.append("<");
- } else {
- sb.append(">");
- }
- sb.append(" ");
- sb.append(SDF.format(mamMessage.getDate()));
- System.out.println(sb.toString());
- }
+ return 0;
}
}