Created tell and entries packages and Constants class.

This commit is contained in:
Erik C. Thauvin 2019-04-19 20:24:17 -07:00
parent 7cede1d560
commit 474a31bdee
12 changed files with 259 additions and 116 deletions

View file

@ -4,7 +4,11 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://github.com/spotbugs/filter/3.0.0 https://raw.githubusercontent.com/spotbugs/spotbugs/3.1.0/spotbugs/etc/findbugsfilter.xsd">
<Match>
<Or>
<Package name="net.thauvin.erik.mobibot.*"/>
<Package name="net.thauvin.erik.mobibot.tell.*"/>
<Package name="net.thauvin.erik.mobibot.entries.*"/>
</Or>
<Or>
<Bug pattern="PATH_TRAVERSAL_IN"/>
<Bug pattern="PATH_TRAVERSAL_OUT"/>

View file

@ -0,0 +1,59 @@
/*
* Constants.java
*
* Copyright (c) 2004-2019, 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.
*/
package net.thauvin.erik.mobibot;
/**
* The <code>Constants</code> class.
*
* @author <a href="https://erik.thauvin.net/" target="_blank">Erik C. Thauvin</a>
* @created 2019-04-19
* @since 1.0
*/
public final class Constants {
/**
* The empty title string.
*/
public static final String NO_TITLE = "No Title";
/**
* The Twitter handle property key.
*/
public static final String TWITTER_HANDLE_PROP = "twitter-handle";
/**
* Disables the default constructor.
*/
private Constants() {
throw new UnsupportedOperationException("Illegal constructor call.");
}
}

View file

@ -34,6 +34,10 @@ package net.thauvin.erik.mobibot;
import com.rometools.rome.io.FeedException;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import net.thauvin.erik.mobibot.entries.EntriesMgr;
import net.thauvin.erik.mobibot.entries.EntriesUtils;
import net.thauvin.erik.mobibot.entries.EntryComment;
import net.thauvin.erik.mobibot.entries.EntryLink;
import net.thauvin.erik.mobibot.modules.AbstractModule;
import net.thauvin.erik.mobibot.modules.Calc;
import net.thauvin.erik.mobibot.modules.CurrencyConverter;
@ -41,6 +45,7 @@ import net.thauvin.erik.mobibot.modules.Dice;
import net.thauvin.erik.mobibot.modules.GoogleSearch;
import net.thauvin.erik.mobibot.modules.Joke;
import net.thauvin.erik.mobibot.modules.Lookup;
import net.thauvin.erik.mobibot.modules.ModuleException;
import net.thauvin.erik.mobibot.modules.Ping;
import net.thauvin.erik.mobibot.modules.StockQuote;
import net.thauvin.erik.mobibot.modules.Twitter;
@ -48,6 +53,7 @@ import net.thauvin.erik.mobibot.modules.War;
import net.thauvin.erik.mobibot.modules.Weather2;
import net.thauvin.erik.mobibot.modules.WorldTime;
import net.thauvin.erik.mobibot.msg.Message;
import net.thauvin.erik.mobibot.tell.Tell;
import net.thauvin.erik.semver.Version;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
@ -96,9 +102,6 @@ public class Mobibot extends PircBot {
*/
public static final int CONNECT_TIMEOUT = 5000;
// The empty title string.
static final String NO_TITLE = "No Title";
// The default port.
private static final int DEFAULT_PORT = 6667;
@ -186,6 +189,10 @@ public class Mobibot extends PircBot {
private final List<String> recap = new ArrayList<>(0);
// The tell object.
private final Tell tell;
// The Twitter handle for channel join notifications.
private final String twitterHandle;
// The Twitter module.
private final Twitter twitterModule;
// The backlogs URL.
private String backLogsUrl = "";
// The default tags/categories.
@ -202,7 +209,6 @@ public class Mobibot extends PircBot {
private Pinboard pinboard = null;
// Today's date.
private String today = Utils.today();
// The weblog URL.
private String weblogUrl = "";
@ -943,14 +949,6 @@ public class Mobibot extends PircBot {
connect();
}
/**
* {@inheritDoc}
*/
@Override
protected void onJoin(final String channel, final String sender, final String login, final String hostname) {
tell.send(sender);
}
/**
* {@inheritDoc}
*/
@ -988,7 +986,7 @@ public class Mobibot extends PircBot {
}
final StringBuilder tags = new StringBuilder(defaultTags);
String title = NO_TITLE;
String title = Constants.NO_TITLE;
if (cmds.length == 2) {
final String[] data = cmds[1].trim().split(TAGS_MARKER, 2);
@ -1004,7 +1002,7 @@ public class Mobibot extends PircBot {
}
}
if (NO_TITLE.equals(title)) {
if (Constants.NO_TITLE.equals(title)) {
try {
final Document html = Jsoup.connect(link).userAgent("Mozilla").get();
final String htmlTitle = html.title();
@ -1021,7 +1019,7 @@ public class Mobibot extends PircBot {
final int index = entries.size() - 1;
final EntryLink entry = entries.get(index);
send(channel, Utils.buildLink(index, entry));
send(channel, EntriesUtils.buildLink(index, entry));
if (pinboard != null) {
pinboard.addPost(entry);
@ -1029,13 +1027,14 @@ public class Mobibot extends PircBot {
saveEntries(isBackup);
if (NO_TITLE.equals(entry.getTitle())) {
if (Constants.NO_TITLE.equals(entry.getTitle())) {
send(sender, "Please specify a title, by typing:", true);
send(sender, helpIndent(Commands.LINK_CMD + (index + 1) + ":|This is the title"), true);
}
} else {
final EntryLink entry = entries.get(dupIndex);
send(sender, Utils.bold("Duplicate") + " >> " + Utils.buildLink(dupIndex, entry));
send(sender, Utils.bold("Duplicate") + " >> "
+ EntriesUtils.buildLink(dupIndex, entry));
}
}
} else if (message.matches(getNickPattern() + ":.*")) { // mobibot: <command>
@ -1090,17 +1089,17 @@ public class Mobibot extends PircBot {
if (cmd.length() == 0) {
final EntryLink entry = entries.get(index);
send(channel, Utils.buildLink(index, entry));
send(channel, EntriesUtils.buildLink(index, entry));
if (entry.hasTags()) {
send(channel, Utils.buildTags(index, entry));
send(channel, EntriesUtils.buildTags(index, entry));
}
if (entry.hasComments()) {
final EntryComment[] comments = entry.getComments();
for (int i = 0; i < comments.length; i++) {
send(channel, Utils.buildComment(index, i, comments[i]));
send(channel, EntriesUtils.buildComment(index, i, comments[i]));
}
}
} else {
@ -1128,7 +1127,7 @@ public class Mobibot extends PircBot {
pinboard.updatePost(entry.getLink(), entry);
}
send(channel, Utils.buildLink(index, entry));
send(channel, EntriesUtils.buildLink(index, entry));
saveEntries(false);
}
} else if (cmd.charAt(0) == '=') { // L1:=<url>
@ -1146,7 +1145,7 @@ public class Mobibot extends PircBot {
pinboard.updatePost(oldLink, entry);
}
send(channel, Utils.buildLink(index, entry));
send(channel, EntriesUtils.buildLink(index, entry));
saveEntries(false);
}
} else {
@ -1157,7 +1156,7 @@ public class Mobibot extends PircBot {
if (cmd.length() > 1) {
final EntryLink entry = entries.get(index);
entry.setNick(cmd.substring(1));
send(channel, Utils.buildLink(index, entry));
send(channel, EntriesUtils.buildLink(index, entry));
saveEntries(false);
}
} else {
@ -1168,7 +1167,7 @@ public class Mobibot extends PircBot {
final int cindex = entry.addComment(cmd, sender);
final EntryComment comment = entry.getComment(cindex);
send(sender, Utils.buildComment(index, cindex, comment));
send(sender, EntriesUtils.buildComment(index, cindex, comment));
saveEntries(false);
}
}
@ -1192,14 +1191,14 @@ public class Mobibot extends PircBot {
pinboard.updatePost(entry.getLink(), entry);
}
send(channel, Utils.buildTags(index, entry));
send(channel, EntriesUtils.buildTags(index, entry));
saveEntries(false);
} else {
send(sender, "Please ask a channel op to change the tags for you.");
}
} else {
if (entry.hasTags()) {
send(channel, Utils.buildTags(index, entry));
send(channel, EntriesUtils.buildTags(index, entry));
} else {
send(sender, "The entry has no tags. Why don't add some?");
}
@ -1221,7 +1220,7 @@ public class Mobibot extends PircBot {
// L1.1:
if (cmd.length() == 0) {
final EntryComment comment = entry.getComment(cindex);
send(channel, Utils.buildComment(index, cindex, comment));
send(channel, EntriesUtils.buildComment(index, cindex, comment));
} else if ("-".equals(cmd)) { // L1.1:-
entry.deleteComment(cindex);
send(channel, "Comment " + Commands.LINK_CMD + (index + 1) + '.' + (cindex + 1) + " removed.");
@ -1231,7 +1230,7 @@ public class Mobibot extends PircBot {
if (cmd.length() > 1) {
final EntryComment comment = entry.getComment(cindex);
comment.setNick(cmd.substring(1));
send(channel, Utils.buildComment(index, cindex, comment));
send(channel, EntriesUtils.buildComment(index, cindex, comment));
saveEntries(false);
}
} else {
@ -1241,7 +1240,7 @@ public class Mobibot extends PircBot {
entry.setComment(cindex, cmd, sender);
final EntryComment comment = entry.getComment(cindex);
send(sender, Utils.buildComment(index, cindex, comment));
send(sender, EntriesUtils.buildComment(index, cindex, comment));
saveEntries(false);
}
}
@ -1255,14 +1254,6 @@ public class Mobibot extends PircBot {
tell.send(sender, true);
}
/**
* {@inheritDoc}
*/
@Override
protected void onNickChange(final String oldNick, final String login, final String hostname, final String newNick) {
tell.send(newNick);
}
/**
* {@inheritDoc}
*/
@ -1373,6 +1364,36 @@ public class Mobibot extends PircBot {
}
}
/**
* {@inheritDoc}
*/
@Override
protected final void onAction(final String sender,
final String login,
final String hostname,
final String target,
final String action) {
if (target.equals(ircChannel)) {
storeRecap(sender, action, true);
}
}
/**
* {@inheritDoc}
*/
@Override
protected void onJoin(final String channel, final String sender, final String login, final String hostname) {
tell.send(sender);
}
/**
* {@inheritDoc}
*/
@Override
protected void onNickChange(final String oldNick, final String login, final String hostname, final String newNick) {
tell.send(newNick);
}
/**
* Responds with the last 10 public messages.
*
@ -1657,7 +1678,7 @@ public class Mobibot extends PircBot {
break;
}
send(sender, Utils.buildLink(i, entry, true), isPrivate);
send(sender, EntriesUtils.buildLink(i, entry, true), isPrivate);
sent++;
}
} else {
@ -1670,7 +1691,7 @@ public class Mobibot extends PircBot {
break;
}
send(sender, Utils.buildLink(i, entry, true), isPrivate);
send(sender, EntriesUtils.buildLink(i, entry, true), isPrivate);
sent++;
}
}

View file

@ -32,6 +32,7 @@
package net.thauvin.erik.mobibot;
import net.thauvin.erik.mobibot.entries.EntryLink;
import net.thauvin.erik.pinboard.PinboardPoster;
import javax.swing.SwingWorker;

View file

@ -77,72 +77,6 @@ public final class Utils {
return colorize(s, Colors.BOLD);
}
/**
* Builds an entry's comment for display on the channel.
*
* @param entryIndex The entry's index.
* @param commentIndex The comment's index.
* @param comment The {@link net.thauvin.erik.mobibot.EntryComment comment} object.
* @return The entry's comment.
*/
static String buildComment(final int entryIndex, final int commentIndex, final EntryComment comment) {
return (Commands.LINK_CMD + (entryIndex + 1) + '.' + (commentIndex + 1) + ": [" + comment.getNick() + "] "
+ comment.getComment());
}
/**
* Builds an entry's link for display on the channel.
*
* @param index The entry's index.
* @param entry The {@link net.thauvin.erik.mobibot.EntryLink entry} object.
* @return The entry's link.
* @see #buildLink(int, net.thauvin.erik.mobibot.EntryLink, boolean)
*/
static String buildLink(final int index, final EntryLink entry) {
return buildLink(index, entry, false);
}
/**
* Builds an entry's link for display on the channel.
*
* @param index The entry's index.
* @param entry The {@link net.thauvin.erik.mobibot.EntryLink entry} object.
* @param isView Set to true to display the number of comments.
* @return The entry's link.
*/
static String buildLink(final int index, final EntryLink entry, final boolean isView) {
final StringBuilder buff = new StringBuilder(Commands.LINK_CMD + (index + 1) + ": ");
buff.append('[').append(entry.getNick()).append(']');
if (isView && entry.hasComments()) {
buff.append("[+").append(entry.getCommentsCount()).append(']');
}
buff.append(' ');
if (Mobibot.NO_TITLE.equals(entry.getTitle())) {
buff.append(entry.getTitle());
} else {
buff.append(bold(entry.getTitle()));
}
buff.append(" ( ").append(Utils.green(entry.getLink())).append(" )");
return buff.toString();
}
/**
* Build an entry's tags/categories for display on the channel.
*
* @param entryIndex The entry's index.
* @param entry The {@link net.thauvin.erik.mobibot.EntryLink entry} object.
* @return The entry's tags.
*/
static String buildTags(final int entryIndex, final EntryLink entry) {
return (Commands.LINK_CMD + (entryIndex + 1) + "T: " + entry.getPinboardTags().replaceAll(",", ", "));
}
/**
* Capitalize a string.
*

View file

@ -30,7 +30,7 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.thauvin.erik.mobibot;
package net.thauvin.erik.mobibot.entries;
import com.rometools.rome.feed.synd.SyndContent;
import com.rometools.rome.feed.synd.SyndContentImpl;
@ -41,6 +41,8 @@ import com.rometools.rome.feed.synd.SyndFeedImpl;
import com.rometools.rome.io.FeedException;
import com.rometools.rome.io.SyndFeedInput;
import com.rometools.rome.io.SyndFeedOutput;
import net.thauvin.erik.mobibot.Mobibot;
import net.thauvin.erik.mobibot.Utils;
import java.io.FileInputStream;
import java.io.FileOutputStream;
@ -60,7 +62,7 @@ import java.util.List;
* @created 2014-04-28
* @since 1.0
*/
final class EntriesMgr {
public final class EntriesMgr {
/**
* The name of the file containing the current entries.
*/

View file

@ -0,0 +1,118 @@
/*
* EntriesUtils.java
*
* Copyright (c) 2004-2019, 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.
*/
package net.thauvin.erik.mobibot.entries;
import net.thauvin.erik.mobibot.Commands;
import net.thauvin.erik.mobibot.Constants;
/**
* The <code>Utils</code> class.
*
* @author <a href="https://erik.thauvin.net/" target="_blank">Erik C. Thauvin</a>
* @created 2019-04-19
* @since 1.0
*/
public final class EntriesUtils {
/**
* Disables the default constructor.
*/
private EntriesUtils() {
throw new UnsupportedOperationException("Illegal constructor call.");
}
/**
* Builds an entry's comment for display on the channel.
*
* @param entryIndex The entry's index.
* @param commentIndex The comment's index.
* @param comment The {@link EntryComment comment} object.
* @return The entry's comment.
*/
public static String buildComment(final int entryIndex, final int commentIndex, final EntryComment comment) {
return (Commands.LINK_CMD + (entryIndex + 1) + '.' + (commentIndex + 1) + ": [" + comment.getNick() + "] "
+ comment.getComment());
}
/**
* Builds an entry's link for display on the channel.
*
* @param index The entry's index.
* @param entry The {@link EntryLink entry} object.
* @return The entry's link.
* @see #buildLink(int, EntryLink, boolean)
*/
public static String buildLink(final int index, final EntryLink entry) {
return buildLink(index, entry, false);
}
/**
* Builds an entry's link for display on the channel.
*
* @param index The entry's index.
* @param entry The {@link EntryLink entry} object.
* @param isView Set to true to display the number of comments.
* @return The entry's link.
*/
public static String buildLink(final int index, final EntryLink entry, final boolean isView) {
final StringBuilder buff = new StringBuilder(Commands.LINK_CMD + (index + 1) + ": ");
buff.append('[').append(entry.getNick()).append(']');
if (isView && entry.hasComments()) {
buff.append("[+").append(entry.getCommentsCount()).append(']');
}
buff.append(' ');
if (Constants.NO_TITLE.equals(entry.getTitle())) {
buff.append(entry.getTitle());
} else {
buff.append(net.thauvin.erik.mobibot.Utils.bold(entry.getTitle()));
}
buff.append(" ( ").append(net.thauvin.erik.mobibot.Utils.green(entry.getLink())).append(" )");
return buff.toString();
}
/**
* Build an entry's tags/categories for display on the channel.
*
* @param entryIndex The entry's index.
* @param entry The {@link EntryLink entry} object.
* @return The entry's tags.
*/
public static String buildTags(final int entryIndex, final EntryLink entry) {
return (Commands.LINK_CMD + (entryIndex + 1) + "T: " + entry.getPinboardTags().replaceAll(",", ", "));
}
}

View file

@ -30,7 +30,7 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.thauvin.erik.mobibot;
package net.thauvin.erik.mobibot.entries;
import java.io.Serializable;
import java.time.LocalDateTime;

View file

@ -30,7 +30,7 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.thauvin.erik.mobibot;
package net.thauvin.erik.mobibot.entries;
import com.rometools.rome.feed.synd.SyndCategory;
import com.rometools.rome.feed.synd.SyndCategoryImpl;

View file

@ -30,7 +30,11 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.thauvin.erik.mobibot;
package net.thauvin.erik.mobibot.tell;
import net.thauvin.erik.mobibot.Commands;
import net.thauvin.erik.mobibot.Mobibot;
import net.thauvin.erik.mobibot.Utils;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

View file

@ -30,7 +30,7 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.thauvin.erik.mobibot;
package net.thauvin.erik.mobibot.tell;
import java.io.Serializable;
import java.time.Clock;

View file

@ -30,7 +30,7 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.thauvin.erik.mobibot;
package net.thauvin.erik.mobibot.tell;
import org.apache.logging.log4j.Logger;
@ -93,7 +93,7 @@ final class TellMessagesMgr {
*
* @param file The serialized objects file.
* @param logger The logger.
* @return The {@link net.thauvin.erik.mobibot.TellMessage} array.
* @return The {@link TellMessage} array.
*/
@SuppressWarnings("unchecked")
public static List<TellMessage> load(final String file, final Logger logger) {
@ -121,7 +121,7 @@ final class TellMessagesMgr {
* Saves the messages.
*
* @param file The serialized objects file.
* @param messages The {@link net.thauvin.erik.mobibot.TellMessage} array.
* @param messages The {@link TellMessage} array.
* @param logger The logger.
*/
public static void save(final String file, final List<TellMessage> messages, final Logger logger) {