Cleanup, copyright, etc.

This commit is contained in:
Erik C. Thauvin 2020-03-23 13:17:18 -07:00
parent fd6c1309e3
commit c078a51ebf
26 changed files with 167 additions and 126 deletions

2
.idea/mobibot.iml generated
View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id="mobibot" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" external.system.module.group="" external.system.module.version="0.7.3-beta+660" type="JAVA_MODULE" version="4"> <module external.linked.project.id="mobibot" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" external.system.module.group="" external.system.module.version="0.7.3-beta+682" type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_14" inherit-compiler-output="true"> <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_14" inherit-compiler-output="true">
<exclude-output /> <exclude-output />
<content url="file://$MODULE_DIR$"> <content url="file://$MODULE_DIR$">

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id="mobibot:main" external.linked.project.path="$MODULE_DIR$/../.." external.root.project.path="$MODULE_DIR$/../.." external.system.id="GRADLE" external.system.module.group="" external.system.module.type="sourceSet" external.system.module.version="0.7.3-beta+660" type="JAVA_MODULE" version="4"> <module external.linked.project.id="mobibot:main" external.linked.project.path="$MODULE_DIR$/../.." external.root.project.path="$MODULE_DIR$/../.." external.system.id="GRADLE" external.system.module.group="" external.system.module.type="sourceSet" external.system.module.version="0.7.3-beta+682" type="JAVA_MODULE" version="4">
<component name="FacetManager"> <component name="FacetManager">
<facet type="kotlin-language" name="Kotlin"> <facet type="kotlin-language" name="Kotlin">
<configuration version="3" platform="JVM 1.6" allPlatforms="JVM [1.6]" useProjectSettings="false"> <configuration version="3" platform="JVM 1.6" allPlatforms="JVM [1.6]" useProjectSettings="false">

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id="mobibot:test" external.linked.project.path="$MODULE_DIR$/../.." external.root.project.path="$MODULE_DIR$/../.." external.system.id="GRADLE" external.system.module.group="" external.system.module.type="sourceSet" external.system.module.version="0.7.3-beta+660" type="JAVA_MODULE" version="4"> <module external.linked.project.id="mobibot:test" external.linked.project.path="$MODULE_DIR$/../.." external.root.project.path="$MODULE_DIR$/../.." external.system.id="GRADLE" external.system.module.group="" external.system.module.type="sourceSet" external.system.module.version="0.7.3-beta+682" type="JAVA_MODULE" version="4">
<component name="FacetManager"> <component name="FacetManager">
<facet type="kotlin-language" name="Kotlin"> <facet type="kotlin-language" name="Kotlin">
<configuration version="3" platform="JVM 1.6" allPlatforms="JVM [1.6]" useProjectSettings="false"> <configuration version="3" platform="JVM 1.6" allPlatforms="JVM [1.6]" useProjectSettings="false">

View file

@ -14,13 +14,13 @@ import java.time.*;
public final class ReleaseInfo { public final class ReleaseInfo {
public static final String PROJECT = "mobibot"; public static final String PROJECT = "mobibot";
public static final LocalDateTime BUILDDATE = public static final LocalDateTime BUILDDATE =
LocalDateTime.ofInstant(Instant.ofEpochMilli(1584966079848L), ZoneId.systemDefault()); LocalDateTime.ofInstant(Instant.ofEpochMilli(1584991174842L), ZoneId.systemDefault());
public static final int MAJOR = 0; public static final int MAJOR = 0;
public static final int MINOR = 7; public static final int MINOR = 7;
public static final int PATCH = 3; public static final int PATCH = 3;
public static final String PRERELEASE = "beta"; public static final String PRERELEASE = "beta";
public static final String BUILDMETA = "682"; public static final String BUILDMETA = "704";
public static final String VERSION = "0.7.3-beta+682"; public static final String VERSION = "0.7.3-beta+704";
/** /**
* Disables the default constructor. * Disables the default constructor.

View file

@ -49,19 +49,19 @@ import java.util.List;
* @since 1.0 * @since 1.0
*/ */
class FeedReader implements Runnable { class FeedReader implements Runnable {
// The maximum number of feed items to display. // Maximum number of feed items to display
private static final int MAX_ITEMS = 5; private static final int MAX_ITEMS = 5;
// The tab indent (4 spaces). // Tab indent (4 spaces)
private static final String TAB_INDENT = " "; private static final String TAB_INDENT = " ";
// The bot. // Bot
private final Mobibot bot; private final Mobibot bot;
// The nick of the person who sent the message. // Nick of the person who sent the message
private final String sender; private final String sender;
// The URL to fetch. // URL to fetch
private final String url; private final String url;
/** /**

View file

@ -108,40 +108,40 @@ import static org.apache.commons.lang3.StringUtils.isNotBlank;
className = "ReleaseInfo") className = "ReleaseInfo")
public class Mobibot extends PircBot { public class Mobibot extends PircBot {
// The default port. // Default port
private static final int DEFAULT_PORT = 6667; private static final int DEFAULT_PORT = 6667;
// The default server. // Default server
private static final String DEFAULT_SERVER = "irc.freenode.net"; private static final String DEFAULT_SERVER = "irc.freenode.net";
// The info strings. // Info strings
@SuppressWarnings("indentation") @SuppressWarnings("indentation")
private static final String[] INFO_STRS = { private static final String[] INFO_STRS = {
ReleaseInfo.PROJECT + " v" + ReleaseInfo.VERSION + " by Erik C. Thauvin (erik@thauvin.net)", ReleaseInfo.PROJECT + " v" + ReleaseInfo.VERSION + " by Erik C. Thauvin (erik@thauvin.net)",
"https://www.mobitopia.org/mobibot/" }; "https://www.mobitopia.org/mobibot/" };
// The link match string. // Link match string
private static final String LINK_MATCH = "^[hH][tT][tT][pP](|[sS])://.*"; private static final String LINK_MATCH = "^[hH][tT][tT][pP](|[sS])://.*";
// The default maximum number of entries to display. // Default maximum number of entries to display
private static final int MAX_ENTRIES = 8; private static final int MAX_ENTRIES = 8;
// The default maximum recap entries. // Default maximum recap entries
private static final int MAX_RECAP = 10; private static final int MAX_RECAP = 10;
// The maximum number of times the bot will try to reconnect, if disconnected. // Maximum number of times the bot will try to reconnect, if disconnected
private static final int MAX_RECONNECT = 10; private static final int MAX_RECONNECT = 10;
// The number of milliseconds to delay between consecutive messages. // Number of milliseconds to delay between consecutive messages
private static final long MESSAGE_DELAY = 1000L; private static final long MESSAGE_DELAY = 1000L;
// The modules. // Modules
private static final List<AbstractModule> MODULES = new ArrayList<>(0); private static final List<AbstractModule> MODULES = new ArrayList<>(0);
// The tags/categories marker. // Tags/categories marker
private static final String TAGS_MARKER = "tags:"; private static final String TAGS_MARKER = "tags:";
/* The version strings.*/ // Version strings
@SuppressWarnings("indentation") @SuppressWarnings("indentation")
private static final String[] VERSION_STRS = private static final String[] VERSION_STRS =
{ "Version: " + ReleaseInfo.VERSION + " (" + Utils.isoLocalDate(ReleaseInfo.BUILDDATE) + ')', { "Version: " + ReleaseInfo.VERSION + " (" + Utils.isoLocalDate(ReleaseInfo.BUILDDATE) + ')',
@ -151,53 +151,53 @@ public class Mobibot extends PircBot {
"java.runtime.version") + ')', "java.runtime.version") + ')',
"VM: " + System.getProperty("java.vm.name") + " (build " + System.getProperty("java.vm.version") + ", " "VM: " + System.getProperty("java.vm.name") + " (build " + System.getProperty("java.vm.version") + ", "
+ System.getProperty("java.vm.info") + ')' }; + System.getProperty("java.vm.info") + ')' };
// The logger. // Logger
private static final Logger logger = LogManager.getLogger(Mobibot.class); private static final Logger logger = LogManager.getLogger(Mobibot.class);
// The commands list. // Commands list
private final List<String> commandsList = new ArrayList<>(); private final List<String> commandsList = new ArrayList<>();
// The entries array. // Entries array
private final List<EntryLink> entries = new ArrayList<>(0); private final List<EntryLink> entries = new ArrayList<>(0);
// The history/backlogs array. // History/backlogs array
private final List<String> history = new ArrayList<>(0); private final List<String> history = new ArrayList<>(0);
// The ignored nicks array. // Ignored nicks array
private final Set<String> ignoredNicks = new HashSet<>(0); private final Set<String> ignoredNicks = new HashSet<>(0);
// The main channel. // Main channel
private final String ircChannel; private final String ircChannel;
// The IRC port. // IRC port
private final int ircPort; private final int ircPort;
// The IRC server. // IRC server
private final String ircServer; private final String ircServer;
// The logger default level. // Logger default level
private final Level loggerLevel; private final Level loggerLevel;
// The log directory. // Log directory
private final String logsDir; private final String logsDir;
// The recap array. // Recap array
private final List<String> recap = new ArrayList<>(0); private final List<String> recap = new ArrayList<>(0);
// The tell object. // Tell object
private final Tell tell; private final Tell tell;
// The Twitter handle for channel join notifications.
// Automatically post links to Twitter // Automatically post links to Twitter
private final boolean twitterAutoPost; private final boolean twitterAutoPost;
// Twitter handle for channel join notifications
private final String twitterHandle; private final String twitterHandle;
// The Twitter module. // Twitter module
private final Twitter twitterModule; private final Twitter twitterModule;
// The backlogs URL. // Backlogs URL
private String backLogsUrl = ""; private String backLogsUrl = "";
// The default tags/categories. // Default tags/categories
private String defaultTags = ""; private String defaultTags = "";
// The feed URL. // Feed URL
private String feedUrl = ""; private String feedUrl = "";
// The ident message. // Ident message
private String identMsg = ""; private String identMsg = "";
// The ident nick. // Ident nick
private String identNick = ""; private String identNick = "";
// The NickServ ident password. // NickServ ident password
private String identPwd = ""; private String identPwd = "";
// The pinboard posts handler. // Pinboard posts handler
private Pinboard pinboard; private Pinboard pinboard;
// Today's date. // Today's date
private String today = Utils.today(); private String today = Utils.today();
// The weblog URL. // Weblog URL
private String weblogUrl = ""; private String weblogUrl = "";
/** /**
@ -225,7 +225,7 @@ public class Mobibot extends PircBot {
// Set the logger level // Set the logger level
loggerLevel = logger.getLevel(); loggerLevel = logger.getLevel();
// Load the current entries, if any. // Load the current entries, if any
try { try {
today = EntriesMgr.loadEntries(logsDir + EntriesMgr.CURRENT_XML, ircChannel, entries); today = EntriesMgr.loadEntries(logsDir + EntriesMgr.CURRENT_XML, ircChannel, entries);
@ -238,18 +238,18 @@ public class Mobibot extends PircBot {
today = Utils.today(); today = Utils.today();
} }
} catch (IOException ignore) { } catch (IOException ignore) {
// Do nothing. // Do nothing
} catch (FeedException e) { } catch (FeedException e) {
if (logger.isErrorEnabled()) { if (logger.isErrorEnabled()) {
logger.error("An error occurred while parsing the '" + EntriesMgr.CURRENT_XML + "' file.", e); logger.error("An error occurred while parsing the '" + EntriesMgr.CURRENT_XML + "' file.", e);
} }
} }
// Load the backlogs, if any. // Load the backlogs, if any
try { try {
EntriesMgr.loadBacklogs(logsDir + EntriesMgr.NAV_XML, history); EntriesMgr.loadBacklogs(logsDir + EntriesMgr.NAV_XML, history);
} catch (IOException ignore) { } catch (IOException ignore) {
// Do nothing. // Do nothing
} catch (FeedException e) { } catch (FeedException e) {
if (logger.isErrorEnabled()) { if (logger.isErrorEnabled()) {
logger.error("An error occurred while parsing the '" + EntriesMgr.NAV_XML + "' file.", e); logger.error("An error occurred while parsing the '" + EntriesMgr.NAV_XML + "' file.", e);
@ -421,7 +421,7 @@ public class Mobibot extends PircBot {
try { try {
Thread.sleep(secs * 1000L); Thread.sleep(secs * 1000L);
} catch (InterruptedException ignore) { } catch (InterruptedException ignore) {
// Do nothing. // Do nothing
} }
} }
@ -956,7 +956,12 @@ public class Mobibot extends PircBot {
final String htmlTitle = html.title(); final String htmlTitle = html.title();
if (isNotBlank(htmlTitle)) { if (isNotBlank(htmlTitle)) {
title = htmlTitle; final String[] split = htmlTitle.split("( \\| )", 2);
if (split.length == 2) {
title = split[0];
} else {
title = htmlTitle;
}
} }
} catch (IOException ignore) { } catch (IOException ignore) {
// Do nothing // Do nothing
@ -969,6 +974,7 @@ public class Mobibot extends PircBot {
final EntryLink entry = entries.get(index); final EntryLink entry = entries.get(index);
send(channel, EntriesUtils.buildLink(index, entry)); send(channel, EntriesUtils.buildLink(index, entry));
// Add link to pinboard
if (pinboard != null) { if (pinboard != null) {
pinboard.addPost(entry); pinboard.addPost(entry);
} }
@ -1038,7 +1044,7 @@ public class Mobibot extends PircBot {
} }
} }
} }
} else if (message.matches(Commands.LINK_CMD + "[0-9]+:.*")) { // L1:<comment>, L1:-, L1:|<title>, etc. } else if (message.matches(Commands.LINK_CMD + "[0-9]+:.*")) { // L1:<comment>, L1:-, L1:|<title>, etc
isCommand = true; isCommand = true;
final String[] cmds = message.substring(1).split(":", 2); final String[] cmds = message.substring(1).split(":", 2);
@ -1165,7 +1171,7 @@ public class Mobibot extends PircBot {
} }
} }
} }
} else if (message.matches(Commands.LINK_CMD + "[0-9]+\\.[0-9]+:.*")) { // L1.1:<command> } else if (message.matches(Commands.LINK_CMD + "[0-9]+\\.[0-9]+:.*")) { // L11:<command>
isCommand = true; isCommand = true;
final String[] cmds = message.substring(1).split("[.:]", 3); final String[] cmds = message.substring(1).split("[.:]", 3);
@ -1178,15 +1184,15 @@ public class Mobibot extends PircBot {
if (cindex < entry.getCommentsCount()) { if (cindex < entry.getCommentsCount()) {
final String cmd = cmds[2].trim(); final String cmd = cmds[2].trim();
// L1.1: // L11:
if (cmd.length() == 0) { if (cmd.length() == 0) {
final EntryComment comment = entry.getComment(cindex); final EntryComment comment = entry.getComment(cindex);
send(channel, EntriesUtils.buildComment(index, cindex, comment)); send(channel, EntriesUtils.buildComment(index, cindex, comment));
} else if ("-".equals(cmd)) { // L1.1:- } else if ("-".equals(cmd)) { // L11:-
entry.deleteComment(cindex); entry.deleteComment(cindex);
send(channel, "Comment " + Commands.LINK_CMD + (index + 1) + '.' + (cindex + 1) + " removed."); send(channel, "Comment " + Commands.LINK_CMD + (index + 1) + '.' + (cindex + 1) + " removed.");
saveEntries(false); saveEntries(false);
} else if (cmd.charAt(0) == '?') { // L1.1:?<author> } else if (cmd.charAt(0) == '?') { // L11:?<author>
if (isOp(sender)) { if (isOp(sender)) {
if (cmd.length() > 1) { if (cmd.length() > 1) {
final EntryComment comment = entry.getComment(cindex); final EntryComment comment = entry.getComment(cindex);
@ -1258,7 +1264,7 @@ public class Mobibot extends PircBot {
} else if (Commands.USERS_CMD.equals(cmd)) { } else if (Commands.USERS_CMD.equals(cmd)) {
usersResponse(sender, true); usersResponse(sender, true);
} else if ((cmds.length > 1) && isOp(sender) && Commands.ADDLOG_CMD.equals(cmd)) { } else if ((cmds.length > 1) && isOp(sender) && Commands.ADDLOG_CMD.equals(cmd)) {
// e.g. 2014-04-01 // e.g 2014-04-01
final File backlog = new File(logsDir + args + EntriesMgr.XML_EXT); final File backlog = new File(logsDir + args + EntriesMgr.XML_EXT);
if (backlog.exists()) { if (backlog.exists()) {
history.add(0, args); history.add(0, args);
@ -1557,7 +1563,10 @@ public class Mobibot extends PircBot {
if (twitterModule.isEnabled() && isNotBlank(twitterHandle)) { if (twitterModule.isEnabled() && isNotBlank(twitterHandle)) {
new Thread(() -> { new Thread(() -> {
try { try {
twitterModule.post(twitterHandle, getName() + ' ' + ReleaseInfo.VERSION + " " + msg, true); twitterModule.post(
twitterHandle,
getName() + ' ' + ReleaseInfo.VERSION + " " + msg,
true);
} catch (ModuleException e) { } catch (ModuleException e) {
if (logger.isWarnEnabled()) { if (logger.isWarnEnabled()) {
logger.warn("Failed to notify @{}: {}", twitterHandle, msg, e); logger.warn("Failed to notify @{}: {}", twitterHandle, msg, e);
@ -1647,7 +1656,7 @@ public class Mobibot extends PircBot {
i = 0; i = 0;
} }
} catch (NumberFormatException ignore) { } catch (NumberFormatException ignore) {
// Do nothing. // Do nothing
} }
} }

View file

@ -1,7 +1,7 @@
/* /*
* EntriesMgr.java * EntriesMgr.java
* *
* Copyright (c) 2004-2019, Erik C. Thauvin (erik@thauvin.net) * Copyright (c) 2004-2020, Erik C. Thauvin (erik@thauvin.net)
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -81,7 +81,7 @@ public final class EntriesMgr {
*/ */
public static final String XML_EXT = ".xml"; public static final String XML_EXT = ".xml";
// The maximum number of backlogs to keep. // Maximum number of backlogs to keep
private static final int MAX_BACKLOGS = 10; private static final int MAX_BACKLOGS = 10;
/** /**

View file

@ -1,7 +1,7 @@
/* /*
* EntryComment.java * EntryComment.java
* *
* Copyright (c) 2004-2019, Erik C. Thauvin (erik@thauvin.net) * Copyright (c) 2004-2020, Erik C. Thauvin (erik@thauvin.net)
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -44,10 +44,10 @@ import java.time.LocalDateTime;
*/ */
@SuppressWarnings({"PMD.DataClass"}) @SuppressWarnings({"PMD.DataClass"})
public class EntryComment implements Serializable { public class EntryComment implements Serializable {
// The serial version UID. // Serial version UID
static final long serialVersionUID = 1L; static final long serialVersionUID = 1L;
// The creation date. // Creation date
private final LocalDateTime date = LocalDateTime.now(); private final LocalDateTime date = LocalDateTime.now();
private String comment = ""; private String comment = "";
@ -69,7 +69,7 @@ public class EntryComment implements Serializable {
*/ */
@SuppressWarnings("UnusedDeclaration") @SuppressWarnings("UnusedDeclaration")
protected EntryComment() { protected EntryComment() {
// Required for serialization. // Required for serialization
} }
/** /**

View file

@ -1,7 +1,7 @@
/* /*
* EntryLink.java * EntryLink.java
* *
* Copyright (c) 2004-2019, Erik C. Thauvin (erik@thauvin.net) * Copyright (c) 2004-2020, Erik C. Thauvin (erik@thauvin.net)
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -51,31 +51,31 @@ import java.util.concurrent.CopyOnWriteArrayList;
* @since 1.0 * @since 1.0
*/ */
public class EntryLink implements Serializable { public class EntryLink implements Serializable {
// The serial version UID. // Serial version UID
static final long serialVersionUID = 1L; static final long serialVersionUID = 1L;
// The link's comments // Link's comments
private final List<EntryComment> comments = new CopyOnWriteArrayList<>(); private final List<EntryComment> comments = new CopyOnWriteArrayList<>();
// The tags/categories // Tags/categories
private final List<SyndCategory> tags = new CopyOnWriteArrayList<>(); private final List<SyndCategory> tags = new CopyOnWriteArrayList<>();
// The channel // Channel
private String channel; private String channel;
// The creation date // Creation date
private Date date = Calendar.getInstance().getTime(); private Date date = Calendar.getInstance().getTime();
// The link's URL // Link's URL
private String link; private String link;
// The author's login // Author's login
private String login = ""; private String login = "";
// The author's nickname // Author's nickname
private String nick; private String nick;
// The link's title // Link's title
private String title; private String title;
/** /**
@ -313,7 +313,7 @@ public class EntryLink implements Serializable {
mod = part.charAt(0); mod = part.charAt(0);
if (mod == '-') { if (mod == '-') {
// Don't remove the channel tag, if any. // Don't remove the channel tag, if any
if (!channel.substring(1).equals(tag.getName())) { if (!channel.substring(1).equals(tag.getName())) {
this.tags.remove(tag); this.tags.remove(tag);
} }

View file

@ -47,7 +47,7 @@ import java.text.DecimalFormat;
* @since 1.0 * @since 1.0
*/ */
public class Calc extends AbstractModule { public class Calc extends AbstractModule {
// The Calc command. // Calc command
private static final String CALC_CMD = "calc"; private static final String CALC_CMD = "calc";
/** /**

View file

@ -70,13 +70,13 @@ public final class CurrencyConverter extends ThreadedModule {
*/ */
static final String CURRENCY_RATES_KEYWORD = "rates"; static final String CURRENCY_RATES_KEYWORD = "rates";
// The currency command. // Currency command
private static final String CURRENCY_CMD = "currency"; private static final String CURRENCY_CMD = "currency";
// The exchange rates. // Exchange rates
private static final Map<String, String> EXCHANGE_RATES = new TreeMap<>(); private static final Map<String, String> EXCHANGE_RATES = new TreeMap<>();
// The exchange rates table URL. // Exchange rates table URL
private static final String EXCHANGE_TABLE_URL = "https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml"; private static final String EXCHANGE_TABLE_URL = "https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml";
// The last exchange rates table publication date. // Last exchange rates table publication date
private static String pubDate = ""; private static String pubDate = "";
/** /**
@ -100,7 +100,7 @@ public final class CurrencyConverter extends ThreadedModule {
if (EXCHANGE_RATES.isEmpty()) { if (EXCHANGE_RATES.isEmpty()) {
try { try {
final SAXBuilder builder = new SAXBuilder(); final SAXBuilder builder = new SAXBuilder();
// See https://rules.sonarsource.com/java/tag/owasp/RSPEC-2755 // See https://rules.sonarsourcecom/java/tag/owasp/RSPEC-2755
builder.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, ""); builder.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");
builder.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); builder.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
builder.setIgnoringElementContentWhitespace(true); builder.setIgnoringElementContentWhitespace(true);

View file

@ -45,7 +45,7 @@ import java.security.SecureRandom;
* @since 1.0 * @since 1.0
*/ */
public final class Dice extends AbstractModule { public final class Dice extends AbstractModule {
// The dice command. // Dice command
private static final String DICE_CMD = "dice"; private static final String DICE_CMD = "dice";
/** /**

View file

@ -60,13 +60,13 @@ import java.util.List;
* @since 1.0 * @since 1.0
*/ */
public final class GoogleSearch extends ThreadedModule { public final class GoogleSearch extends ThreadedModule {
// The Google API Key property. // Google API Key property
static final String GOOGLE_API_KEY_PROP = "google-api-key"; static final String GOOGLE_API_KEY_PROP = "google-api-key";
// The Google Custom Search Engine ID property. // Google Custom Search Engine ID property
static final String GOOGLE_CSE_KEY_PROP = "google-cse-cx"; static final String GOOGLE_CSE_KEY_PROP = "google-cse-cx";
// The Google command // Google command
private static final String GOOGLE_CMD = "google"; private static final String GOOGLE_CMD = "google";
// The tab indent (4 spaces). // Tab indent (4 spaces)
private static final String TAB_INDENT = " "; private static final String TAB_INDENT = " ";
/** /**

View file

@ -52,9 +52,9 @@ import java.nio.charset.StandardCharsets;
* @since 1.0 * @since 1.0
*/ */
public final class Joke extends ThreadedModule { public final class Joke extends ThreadedModule {
// The joke command. // Joke command
private static final String JOKE_CMD = "joke"; private static final String JOKE_CMD = "joke";
// The ICNDB URL. // ICNDB URL
private static final String JOKE_URL = private static final String JOKE_URL =
"http://api.icndb.com/jokes/random?escape=javascript&exclude=[explicit]&limitTo=[nerdy]"; "http://api.icndb.com/jokes/random?escape=javascript&exclude=[explicit]&limitTo=[nerdy]";

View file

@ -53,7 +53,7 @@ public final class Lookup extends AbstractModule {
*/ */
static final String WHOIS_HOST = "whois.arin.net"; static final String WHOIS_HOST = "whois.arin.net";
// The lookup command. // Lookup command
private static final String LOOKUP_CMD = "lookup"; private static final String LOOKUP_CMD = "lookup";
/** /**

View file

@ -68,9 +68,9 @@ public final class StockQuote extends ThreadedModule {
* The Invalid Symbol error string. * The Invalid Symbol error string.
*/ */
static final String INVALID_SYMBOL = "Invalid symbol."; static final String INVALID_SYMBOL = "Invalid symbol.";
// The Alpha Advantage URL. // Alpha Advantage URL
private static final String ALAPHAVANTAGE_URL = "https://www.alphavantage.co/query?function="; private static final String ALAPHAVANTAGE_URL = "https://www.alphavantage.co/query?function=";
// The quote command. // Quote command
private static final String STOCK_CMD = "stock"; private static final String STOCK_CMD = "stock";
/** /**
@ -95,7 +95,7 @@ public final class StockQuote extends ThreadedModule {
throw new ModuleException(debugMessage, Utils.unescapeXml(info)); throw new ModuleException(debugMessage, Utils.unescapeXml(info));
} }
} catch (JSONException ignore) { } catch (JSONException ignore) {
// Do nothing. // Do nothing
} }
try { try {
@ -104,7 +104,7 @@ public final class StockQuote extends ThreadedModule {
throw new ModuleException(debugMessage, Utils.unescapeXml(error)); throw new ModuleException(debugMessage, Utils.unescapeXml(error));
} }
} catch (JSONException ignore) { } catch (JSONException ignore) {
// Do nothing. // Do nothing
} }
try { try {
@ -113,7 +113,7 @@ public final class StockQuote extends ThreadedModule {
throw new ModuleException(debugMessage, Utils.unescapeXml(error)); throw new ModuleException(debugMessage, Utils.unescapeXml(error));
} }
} catch (JSONException ignore) { } catch (JSONException ignore) {
// Do nothing. // Do nothing
} }
return json; return json;

View file

@ -45,12 +45,12 @@ import java.security.SecureRandom;
* @since 1.0 * @since 1.0
*/ */
public final class War extends AbstractModule { public final class War extends AbstractModule {
// The war command // War command
private static final String WAR_CMD = "war"; private static final String WAR_CMD = "war";
// The deck of card. // Deck of card
private static final String[] WAR_DECK = private static final String[] WAR_DECK =
new String[]{ "Ace", "King", "Queen", "Jack", "10", "9", "8", "7", "6", "5", "4", "3", "2" }; new String[]{ "Ace", "King", "Queen", "Jack", "10", "9", "8", "7", "6", "5", "4", "3", "2" };
// The suits for the deck of card. // Suits for the deck of card
private static final String[] WAR_SUITS = new String[]{ "Hearts", "Spades", "Diamonds", "Clubs" }; private static final String[] WAR_SUITS = new String[]{ "Hearts", "Spades", "Diamonds", "Clubs" };
/** /**

View file

@ -65,7 +65,7 @@ public class Weather2 extends ThreadedModule {
*/ */
static final String OWM_API_KEY_PROP = "owm-api-key"; static final String OWM_API_KEY_PROP = "owm-api-key";
// The weather command. // Weather command
private static final String WEATHER_CMD = "weather"; private static final String WEATHER_CMD = "weather";
/** /**

View file

@ -56,9 +56,9 @@ import java.util.TreeMap;
*/ */
@SuppressWarnings("PMD.UseConcurrentHashMap") @SuppressWarnings("PMD.UseConcurrentHashMap")
public final class WorldTime extends AbstractModule { public final class WorldTime extends AbstractModule {
// The beats (Internet Time) keyword. // Beats (Internet Time) keyword
private static final String BEATS_KEYWORD = ".beats"; private static final String BEATS_KEYWORD = ".beats";
// The supported countries. // Supported countries
private static final Map<String, String> COUNTRIES_MAP; private static final Map<String, String> COUNTRIES_MAP;

View file

@ -1,7 +1,7 @@
/* /*
* Message.java * Message.java
* *
* Copyright (c) 2004-2019, Erik C. Thauvin (erik@thauvin.net) * Copyright (c) 2004-2020, Erik C. Thauvin (erik@thauvin.net)
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -52,7 +52,7 @@ public class Message {
* Creates a new message. * Creates a new message.
*/ */
public Message() { public Message() {
// This constructor is intentionally empty. // This constructor is intentionally empty
} }
/** /**

View file

@ -1,7 +1,7 @@
/* /*
* Tell.java * Tell.java
* *
* Copyright (c) 2004-2019, Erik C. Thauvin (erik@thauvin.net) * Copyright (c) 2004-2020, Erik C. Thauvin (erik@thauvin.net)
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -54,26 +54,26 @@ public class Tell {
*/ */
public static final String TELL_CMD = "tell"; public static final String TELL_CMD = "tell";
// The default maximum number of days to keep messages. // Default maximum number of days to keep messages
private static final int DEFAULT_TELL_MAX_DAYS = 7; private static final int DEFAULT_TELL_MAX_DAYS = 7;
// The default message max queue size. // Default message max queue size
private static final int DEFAULT_TELL_MAX_SIZE = 50; private static final int DEFAULT_TELL_MAX_SIZE = 50;
// The serialized object file extension. // Serialized object file extension
private static final String SER_EXT = ".ser"; private static final String SER_EXT = ".ser";
// The all keyword. // All keyword
private static final String TELL_ALL_KEYWORD = "all"; private static final String TELL_ALL_KEYWORD = "all";
//T he delete command. //T he delete command.
private static final String TELL_DEL_KEYWORD = "del"; private static final String TELL_DEL_KEYWORD = "del";
// The bot instance. // Bot instance
private final Mobibot bot; private final Mobibot bot;
// The maximum number of days to keep messages. // Maximum number of days to keep messages
private final int maxDays; private final int maxDays;
// The message maximum queue size. // Message maximum queue size
private final int maxSize; private final int maxSize;
// The messages queue. // Messages queue
private final List<TellMessage> messages = new CopyOnWriteArrayList<>(); private final List<TellMessage> messages = new CopyOnWriteArrayList<>();
// The serialized object file. // Serialized object file
private final String serializedObject; private final String serializedObject;
/** /**
@ -88,7 +88,7 @@ public class Tell {
this.maxDays = Utils.getIntProperty(maxDays, DEFAULT_TELL_MAX_DAYS); this.maxDays = Utils.getIntProperty(maxDays, DEFAULT_TELL_MAX_DAYS);
this.maxSize = Utils.getIntProperty(maxSize, DEFAULT_TELL_MAX_SIZE); this.maxSize = Utils.getIntProperty(maxSize, DEFAULT_TELL_MAX_SIZE);
// Load the message queue. // Load the message queue
serializedObject = bot.getLogsDir() + bot.getName() + SER_EXT; serializedObject = bot.getLogsDir() + bot.getName() + SER_EXT;
messages.addAll(TellMessagesMgr.load(serializedObject, bot.getLogger())); messages.addAll(TellMessagesMgr.load(serializedObject, bot.getLogger()));

View file

@ -1,7 +1,7 @@
/* /*
* TellMessagesMgr.java * TellMessagesMgr.java
* *
* Copyright (c) 2004-2019, Erik C. Thauvin (erik@thauvin.net) * Copyright (c) 2004-2020, Erik C. Thauvin (erik@thauvin.net)
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -99,7 +99,7 @@ final class TellMessagesMgr {
return ((List<TellMessage>) input.readObject()); return ((List<TellMessage>) input.readObject());
} }
} catch (FileNotFoundException ignore) { } catch (FileNotFoundException ignore) {
// Do nothing. // Do nothing
} catch (IOException e) { } catch (IOException e) {
logger.error("An IO error occurred loading the messages queue.", e); logger.error("An IO error occurred loading the messages queue.", e);
} catch (Exception e) { } catch (Exception e) {

View file

@ -1,7 +1,7 @@
/* /*
* GoogleSearchTest.java * GoogleSearchTest.java
* *
* Copyright (c) 2004-2019, Erik C. Thauvin (erik@thauvin.net) * Copyright (c) 2004-2020, Erik C. Thauvin (erik@thauvin.net)
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -78,7 +78,7 @@ public class GoogleSearchTest extends LocalProperties {
assertThatThrownBy(() -> GoogleSearch.searchGoogle("", "apikey", "apiKey")).as("no query").isInstanceOf( assertThatThrownBy(() -> GoogleSearch.searchGoogle("", "apikey", "apiKey")).as("no query").isInstanceOf(
ModuleException.class).hasNoCause(); ModuleException.class).hasNoCause();
} catch (ModuleException e) { } catch (ModuleException e) {
// Avoid displaying api keys in CI logs. // Avoid displaying api keys in CI logs
if ("true".equals(System.getenv("CI"))) { if ("true".equals(System.getenv("CI"))) {
throw new ModuleException(e.getDebugMessage(), e.getSanitizedMessage(apiKey, cseKey)); throw new ModuleException(e.getDebugMessage(), e.getSanitizedMessage(apiKey, cseKey));
} else { } else {

View file

@ -41,7 +41,7 @@ class RockPaperScissorsTest {
@Test(invocationCount = 5) @Test(invocationCount = 5)
fun testWinLoseOrDraw() { fun testWinLoseOrDraw() {
var play = RockPaperScissors.winLoseOrDraw(Shapes.SCISSORS) var play = RockPaperScissors.winLoseOrDraw(Shapes.SCISSORS)
// println("SCISSORS vs ${play.first}: ${play.second}") // println("SCISSORS vs ${play.first}: ${playsecond}")
when (play.first) { when (play.first) {
Shapes.SCISSORS -> assertThat(play.second).`as`("SCISSORS vs ${play.first}").isEqualTo(Results.DRAW) Shapes.SCISSORS -> assertThat(play.second).`as`("SCISSORS vs ${play.first}").isEqualTo(Results.DRAW)
Shapes.ROCK -> assertThat(play.second).`as`("SCISSORS vs ${play.first}").isEqualTo(Results.LOSE) Shapes.ROCK -> assertThat(play.second).`as`("SCISSORS vs ${play.first}").isEqualTo(Results.LOSE)
@ -49,7 +49,7 @@ class RockPaperScissorsTest {
} }
play = RockPaperScissors.winLoseOrDraw(Shapes.ROCK) play = RockPaperScissors.winLoseOrDraw(Shapes.ROCK)
// println("ROCK vs ${play.first}: ${play.second}") // println("ROCK vs ${play.first}: ${playsecond}")
when (play.first) { when (play.first) {
Shapes.SCISSORS -> assertThat(play.second).`as`("ROCK vs ${play.first}").isEqualTo(Results.WIN) Shapes.SCISSORS -> assertThat(play.second).`as`("ROCK vs ${play.first}").isEqualTo(Results.WIN)
Shapes.ROCK -> assertThat(play.second).`as`("ROCK vs ${play.first}").isEqualTo(Results.DRAW) Shapes.ROCK -> assertThat(play.second).`as`("ROCK vs ${play.first}").isEqualTo(Results.DRAW)
@ -57,7 +57,7 @@ class RockPaperScissorsTest {
} }
play = RockPaperScissors.winLoseOrDraw(Shapes.PAPER) play = RockPaperScissors.winLoseOrDraw(Shapes.PAPER)
// println("PAPER vs ${play.first}: ${play.second}") // println("PAPER vs ${play.first}: ${playsecond}")
when (play.first) { when (play.first) {
Shapes.SCISSORS -> assertThat(play.second).`as`("PAPER vs ${play.first}").isEqualTo(Results.LOSE) Shapes.SCISSORS -> assertThat(play.second).`as`("PAPER vs ${play.first}").isEqualTo(Results.LOSE)
Shapes.ROCK -> assertThat(play.second).`as`("PAPER vs ${play.first}").isEqualTo(Results.WIN) Shapes.ROCK -> assertThat(play.second).`as`("PAPER vs ${play.first}").isEqualTo(Results.WIN)

View file

@ -1,7 +1,7 @@
/* /*
* StockQuoteTest.java * StockQuoteTest.java
* *
* Copyright (c) 2004-2019, Erik C. Thauvin (erik@thauvin.net) * Copyright (c) 2004-2020, Erik C. Thauvin (erik@thauvin.net)
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -73,7 +73,7 @@ public class StockQuoteTest extends LocalProperties {
ModuleException.class).hasNoCause(); ModuleException.class).hasNoCause();
} catch (ModuleException e) { } catch (ModuleException e) {
// Avoid displaying api keys in CI logs. // Avoid displaying api keys in CI logs
if ("true".equals(System.getenv("CI"))) { if ("true".equals(System.getenv("CI"))) {
throw new ModuleException(e.getDebugMessage(), e.getSanitizedMessage(apiKey)); throw new ModuleException(e.getDebugMessage(), e.getSanitizedMessage(apiKey));
} else { } else {

View file

@ -1,9 +1,41 @@
#
# version.properties
#
# Copyright (c) 2004-2020, Erik C. Thauvin (erik@thauvin.net)
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# Redistributions of source code must retain the above copyright notice, this
# list of conditions and the following disclaimer.
#
# Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# Neither the name of this project nor the names of its contributors may be
# used to endorse or promote products derived from this software without
# specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
#Generated by the Semver Plugin for Gradle #Generated by the Semver Plugin for Gradle
#Mon Mar 23 05:21:18 PDT 2020 #Mon Mar 23 12:19:33 PDT 2020
version.buildmeta=682 version.buildmeta=704
version.major=0 version.major=0
version.minor=7 version.minor=7
version.patch=3 version.patch=3
version.prerelease=beta version.prerelease=beta
version.project=mobibot version.project=mobibot
version.semver=0.7.3-beta+682 version.semver=0.7.3-beta+704