diff --git a/config/detekt/baseline.xml b/config/detekt/baseline.xml index 32e2375..59b5db4 100644 --- a/config/detekt/baseline.xml +++ b/config/detekt/baseline.xml @@ -24,6 +24,8 @@ MagicNumber:Ignore.kt$Ignore$8 MagicNumber:Modules.kt$Modules$7 MagicNumber:Recap.kt$Recap.Companion$10 + MagicNumber:Tell.kt$Tell$50 + MagicNumber:Tell.kt$Tell$7 MagicNumber:Twitter.kt$Twitter$1000L MagicNumber:Twitter.kt$Twitter$60L MagicNumber:Users.kt$Users$8 @@ -55,6 +57,9 @@ NestedBlockDepth:Lookup.kt$Lookup$override fun commandResponse( sender: String, cmd: String, args: String, isPrivate: Boolean ) NestedBlockDepth:StockQuote.kt$StockQuote$ override fun run(sender: String, cmd: String, args: String, isPrivate: Boolean) NestedBlockDepth:StockQuote.kt$StockQuote.Companion$ @JvmStatic @Throws(ModuleException::class) fun getQuote(symbol: String, apiKey: String?): List<Message> + NestedBlockDepth:Tell.kt$Tell$ @JvmOverloads fun send(nickname: String, isMessage: Boolean = false) + NestedBlockDepth:Tell.kt$Tell$// Delete message. private fun deleteMessage(sender: String, args: String, isOp: Boolean, isPrivate: Boolean) + NestedBlockDepth:TellMessagesMgr.kt$TellMessagesMgr.Companion$ fun save(file: String, messages: List<TellMessage?>?, logger: Logger) NestedBlockDepth:Weather2.kt$Weather2$ override fun run(sender: String, cmd: String, args: String, isPrivate: Boolean) NestedBlockDepth:Weather2.kt$Weather2.Companion$ @JvmStatic @Throws(ModuleException::class) fun getWeather(query: String, apiKey: String?): List<Message> NestedBlockDepth:WorldTime.kt$WorldTime$override fun commandResponse( sender: String, cmd: String, args: String, isPrivate: Boolean ) @@ -66,6 +71,7 @@ TooGenericExceptionCaught:FeedReader.kt$FeedReader$e: Exception TooGenericExceptionCaught:StockQuote.kt$StockQuote.Companion$e: NullPointerException TooGenericExceptionCaught:Weather2.kt$Weather2.Companion$e: NullPointerException + TooManyFunctions:Tell.kt$Tell : AbstractCommand TooManyFunctions:Utils.kt$Utils$Companion diff --git a/src/main/java/net/thauvin/erik/mobibot/Utils.kt b/src/main/java/net/thauvin/erik/mobibot/Utils.kt index e14f1eb..09f7062 100644 --- a/src/main/java/net/thauvin/erik/mobibot/Utils.kt +++ b/src/main/java/net/thauvin/erik/mobibot/Utils.kt @@ -298,8 +298,12 @@ class Utils private constructor() { * Returns the specified date formatted as `yyyy-MM-dd HH:mm`. */ @JvmStatic - fun utcDateTime(date: LocalDateTime): String { - return date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")) + fun utcDateTime(date: LocalDateTime?): String { + return if (date != null) { + date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")) + } else { + "" + } } } } diff --git a/src/main/java/net/thauvin/erik/mobibot/commands/tell/Tell.java b/src/main/java/net/thauvin/erik/mobibot/commands/tell/Tell.java deleted file mode 100644 index d3fa026..0000000 --- a/src/main/java/net/thauvin/erik/mobibot/commands/tell/Tell.java +++ /dev/null @@ -1,393 +0,0 @@ -/* - * Tell.java - * - * 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. - */ - -package net.thauvin.erik.mobibot.commands.tell; - -import net.thauvin.erik.mobibot.Mobibot; -import net.thauvin.erik.mobibot.Utils; -import net.thauvin.erik.mobibot.commands.AbstractCommand; -import net.thauvin.erik.mobibot.commands.links.View; -import org.apache.commons.lang3.StringUtils; -import org.jetbrains.annotations.NotNull; - -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; - -/** - * The Tell command. - * - * @author Erik C. Thauvin - * @created 2016-07-02 - * @since 1.0 - */ -public class Tell extends AbstractCommand { - /** - * Max days property. - */ - public static final String MAX_DAYS_PROP = "tell-max-days"; - /** - * Max size proeprty. - */ - public static final String MAX_SIZE_PROP = "tell-max-size"; - /** - * The tell command. - */ - public static final String TELL_CMD = "tell"; - // Arrow - private static final String ARROW = " --> "; - // Serialized object file extension - private static final String SER_EXT = ".ser"; - // All keyword - private static final String TELL_ALL_KEYWORD = "all"; - //T he delete command. - private static final String TELL_DEL_KEYWORD = "del"; - // Messages queue - private final List messages = new CopyOnWriteArrayList<>(); - // Serialized object file - private final String serializedObject; - // Maximum number of days to keep messages - private int maxDays = 7; - // Message maximum queue size - private int maxSize = 50; - - /** - * Creates a new instance. - * - * @param bot The bot. - */ - public Tell(final Mobibot bot) { - super(bot); - initProperties(MAX_DAYS_PROP, MAX_SIZE_PROP); - - // Load the message queue - serializedObject = bot.getLogsDir() + bot.getName() + SER_EXT; - messages.addAll(TellMessagesMgr.load(serializedObject, bot.getLogger())); - - if (clean()) { - save(); - } - } - - /** - * Cleans the messages queue. - * - * @return true if the queue was cleaned. - */ - @SuppressWarnings("WeakerAccess") - final boolean clean() { - if (getBot().getLogger().isDebugEnabled()) { - getBot().getLogger().debug("Cleaning the messages."); - } - return TellMessagesMgr.clean(messages, maxDays); - } - - // Delete message. - private void deleteMessage(final String sender, final String args, final boolean isOp, final boolean isPrivate) { - final String[] split = args.split(" "); - - if (split.length == 2) { - final String id = split[1]; - boolean deleted = false; - - if (TELL_ALL_KEYWORD.equalsIgnoreCase(id)) { - for (final TellMessage message : messages) { - if (message.getSender().equalsIgnoreCase(sender) && message.isReceived()) { - messages.remove(message); - deleted = true; - } - } - - if (deleted) { - save(); - getBot().send(sender, "Delivered messages have been deleted.", isPrivate); - } else { - getBot().send(sender, "No delivered messages were found.", isPrivate); - } - - } else { - boolean found = false; - - for (final TellMessage message : messages) { - found = message.isMatchId(id); - - if (found && (message.getSender().equalsIgnoreCase(sender) || getBot().isOp(sender))) { - messages.remove(message); - - save(); - getBot().send(sender, "Your message was deleted from the queue.", isPrivate); - deleted = true; - break; - } - } - - if (!deleted) { - if (found) { - getBot().send(sender, "Only messages that you sent can be deleted.", isPrivate); - } else { - getBot().send(sender, "The specified message [ID " + id + "] could not be found.", isPrivate); - } - } - } - } else { - helpResponse(args, sender, isOp, isPrivate); - } - } - - @NotNull - @Override - public String getName() { - return TELL_CMD; - } - - @NotNull - @Override - public List getHelp() { - return List.of("To send a message to someone when they join the channel:", - Utils.helpIndent("%c " + TELL_CMD + " "), - "To view queued and sent messages:", - Utils.helpIndent("%c " + TELL_CMD + ' ' + View.VIEW_CMD), - "Messages are kept for " + Utils.bold(maxDays) - + Utils.plural(maxDays, " day.", " days.")); - } - - @Override - public boolean isOp() { - return false; - } - - @Override - public boolean isPublic() { - return isEnabled(); - } - - @Override - public boolean isVisible() { - return isEnabled(); - } - - @Override - public void commandResponse(@NotNull final String sender, - @NotNull final String login, - @NotNull final String args, - final boolean isOp, - final boolean isPrivate) { - if (isEnabled()) { - if (StringUtils.isBlank(args)) { - helpResponse(args, sender, isOp, isPrivate); - } else if (args.startsWith(View.VIEW_CMD)) { - if (getBot().isOp(sender) && (View.VIEW_CMD + ' ' + TELL_ALL_KEYWORD).equals(args)) { - viewAll(sender, isPrivate); - } else { - viewMessages(sender, isPrivate); - } - } else if (args.startsWith(TELL_DEL_KEYWORD + ' ')) { - deleteMessage(sender, args, isOp, isPrivate); - } else { - newMessage(sender, args, isOp, isPrivate); - } - - if (clean()) { - save(); - } - } - } - - @Override - public boolean isEnabled() { - return maxSize > 0 && maxDays > 0; - } - - @Override - public void setProperty(@NotNull final String key, @NotNull final String value) { - super.setProperty(key, value); - if (MAX_DAYS_PROP.equals(key)) { - this.maxDays = Utils.getIntProperty(value, maxDays); - } else if (MAX_SIZE_PROP.equals(key)) { - this.maxSize = Utils.getIntProperty(value, maxSize); - } - } - - // New message. - private void newMessage(final String sender, final String args, final boolean isOp, final boolean isPrivate) { - final String[] split = args.split(" ", 2); - - if (split.length == 2 && (StringUtils.isNotBlank(split[1]) && split[1].contains(" "))) { - if (messages.size() < maxSize) { - final TellMessage message = new TellMessage(sender, split[0], split[1].trim()); - - messages.add(message); - - save(); - - getBot().send(sender, "Message [ID " + message.getId() + "] was queued for " - + Utils.bold(message.getRecipient()), isPrivate); - } else { - getBot().send(sender, "Sorry, the messages queue is currently full.", isPrivate); - } - } else { - helpResponse(args, sender, isOp, isPrivate); - } - } - - /** - * Saves the messages queue. - */ - @SuppressWarnings("WeakerAccess") - final void save() { - TellMessagesMgr.save(serializedObject, messages, getBot().getLogger()); - } - - /** - * Checks and sends messages. - * - * @param nickname The user's nickname. - * @param isMessage The message flag. - */ - public void send(final String nickname, final boolean isMessage) { - if (isEnabled() && !nickname.equals(getBot().getNick())) { - messages.stream().filter(message -> message.isMatch(nickname)).forEach(message -> { - if (message.getRecipient().equalsIgnoreCase(nickname) && !message.isReceived()) { - if (message.getSender().equals(nickname)) { - if (!isMessage) { - getBot().send(nickname, Utils.bold("You") + " wanted me to remind you: " - + Utils.reverseColor(message.getMessage()), - true); - - message.setIsReceived(); - message.setIsNotified(); - - save(); - } - } else { - getBot().send(nickname, message.getSender() + " wanted me to tell you: " - + Utils.reverseColor(message.getMessage()), - true); - - message.setIsReceived(); - - save(); - } - } else if (message.getSender().equalsIgnoreCase(nickname) && message.isReceived() - && !message.isNotified()) { - getBot().send(nickname, - "Your message " - + Utils.reverseColor("[ID " + message.getId() + ']') + " was sent to " - + Utils.bold(message.getRecipient()) + " on " - + Utils.utcDateTime(message.getReceived()), - true); - - message.setIsNotified(); - - save(); - } - }); - } - } - - /** - * Checks and sends messages. - * - * @param nickname The user's nickname. - */ - public void send(final String nickname) { - send(nickname, false); - } - - /** - * Returns the messages queue size. - * - * @return The size. - */ - public int size() { - return messages.size(); - } - - // View all messages. - private void viewAll(final String sender, final boolean isPrivate) { - if (!messages.isEmpty()) { - for (final TellMessage message : messages) { - getBot().send(sender, Utils.bold(message.getSender()) + ARROW + Utils.bold(message.getRecipient()) - + " [ID: " + message.getId() + ", " - + (message.isReceived() ? "DELIVERED" : "QUEUED") + ']', - isPrivate); - } - } else { - getBot().send(sender, "There are no messages in the queue.", isPrivate); - } - } - - // View messages. - private void viewMessages(final String sender, final boolean isPrivate) { - boolean hasMessage = false; - - for (final TellMessage message : messages) { - if (message.isMatch(sender)) { - if (!hasMessage) { - hasMessage = true; - getBot().send(sender, "Here are your messages: ", isPrivate); - } - - if (message.isReceived()) { - getBot().send(sender, - Utils.bold(message.getSender()) + ARROW + Utils.bold(message.getRecipient()) - + " [" + Utils.utcDateTime(message.getReceived()) + ", ID: " - + Utils.bold(message.getId()) + ", DELIVERED]", - isPrivate); - - } else { - getBot().send(sender, - Utils.bold(message.getSender()) + ARROW + Utils.bold(message.getRecipient()) - + " [" + Utils.utcDateTime(message.getQueued()) + ", ID: " - + Utils.bold(message.getId()) + ", QUEUED]", - isPrivate); - } - - getBot().send(sender, Utils.helpIndent(message.getMessage()), isPrivate); - } - } - - if (!hasMessage) { - getBot().send(sender, "You have no messages in the queue.", isPrivate); - } else { - getBot().send(sender, "To delete one or all delivered messages:", isPrivate); - getBot().send(sender, - Utils.helpIndent(Utils.helpFormat( - "%c " + TELL_CMD + ' ' + TELL_DEL_KEYWORD + " ', - getBot().getNick(), - isPrivate)), - isPrivate); - getBot().send(sender, - "Messages are kept for " + Utils.bold(maxDays) - + Utils.plural(maxDays, " day.", " days."), isPrivate); - } - } -} diff --git a/src/main/java/net/thauvin/erik/mobibot/commands/tell/Tell.kt b/src/main/java/net/thauvin/erik/mobibot/commands/tell/Tell.kt new file mode 100644 index 0000000..0b485eb --- /dev/null +++ b/src/main/java/net/thauvin/erik/mobibot/commands/tell/Tell.kt @@ -0,0 +1,362 @@ +/* + * Tell.kt + * + * 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. + */ +package net.thauvin.erik.mobibot.commands.tell + +import net.thauvin.erik.mobibot.Mobibot +import net.thauvin.erik.mobibot.Utils.Companion.bold +import net.thauvin.erik.mobibot.Utils.Companion.getIntProperty +import net.thauvin.erik.mobibot.Utils.Companion.helpFormat +import net.thauvin.erik.mobibot.Utils.Companion.helpIndent +import net.thauvin.erik.mobibot.Utils.Companion.plural +import net.thauvin.erik.mobibot.Utils.Companion.reverseColor +import net.thauvin.erik.mobibot.Utils.Companion.utcDateTime +import net.thauvin.erik.mobibot.commands.AbstractCommand +import net.thauvin.erik.mobibot.commands.links.View +import org.apache.commons.lang3.StringUtils +import java.util.concurrent.CopyOnWriteArrayList + +/** + * The `Tell` command. + */ +class Tell(bot: Mobibot) : AbstractCommand(bot) { + // Messages queue + private val messages: MutableList = CopyOnWriteArrayList() + + // Serialized object file + private val serializedObject: String + + // Maximum number of days to keep messages + private var maxDays = 7 + + // Message maximum queue size + private var maxSize = 50 + + /** + * Cleans the messages queue. + */ + private fun clean(): Boolean { + if (bot.logger.isDebugEnabled) { + bot.logger.debug("Cleaning the messages.") + } + return TellMessagesMgr.clean(messages, maxDays) + } + + // Delete message. + private fun deleteMessage(sender: String, args: String, isOp: Boolean, isPrivate: Boolean) { + val split = args.split(" ").toTypedArray() + if (split.size == 2) { + val id = split[1] + var deleted = false + if (TELL_ALL_KEYWORD.equals(id, ignoreCase = true)) { + for (message in messages) { + if (message.sender.equals(sender, ignoreCase = true) && message.isReceived) { + messages.remove(message) + deleted = true + } + } + if (deleted) { + save() + bot.send(sender, "Delivered messages have been deleted.", isPrivate) + } else { + bot.send(sender, "No delivered messages were found.", isPrivate) + } + } else { + var found = false + for (message in messages) { + found = message.isMatchId(id) + if (found && (message.sender.equals(sender, ignoreCase = true) || bot.isOp(sender))) { + messages.remove(message) + save() + bot.send(sender, "Your message was deleted from the queue.", isPrivate) + deleted = true + break + } + } + if (!deleted) { + if (found) { + bot.send(sender, "Only messages that you sent can be deleted.", isPrivate) + } else { + bot.send(sender, "The specified message [ID $id] could not be found.", isPrivate) + } + } + } + } else { + helpResponse(args, sender, isOp, isPrivate) + } + } + + /** + * The tell command. + */ + override val name = "tell" + + override val help: List + get() = listOf( + "To send a message to someone when they join the channel:", + helpIndent("%c $name "), + "To view queued and sent messages:", + helpIndent("%c $name ${View.VIEW_CMD}"), + "Messages are kept for " + bold(maxDays) + + plural(maxDays.toLong(), " day.", " days.") + ) + override val isOp: Boolean + get() = false + override val isPublic: Boolean + get() = isEnabled() + override val isVisible: Boolean + get() = isEnabled() + + override fun commandResponse( + sender: String, + login: String, + args: String, + isOp: Boolean, + isPrivate: Boolean + ) { + if (isEnabled()) { + if (StringUtils.isBlank(args)) { + helpResponse(args, sender, isOp, isPrivate) + } else if (args.startsWith(View.VIEW_CMD)) { + if (bot.isOp(sender) && "${View.VIEW_CMD} $TELL_ALL_KEYWORD" == args) { + viewAll(sender, isPrivate) + } else { + viewMessages(sender, isPrivate) + } + } else if (args.startsWith("$TELL_DEL_KEYWORD ")) { + deleteMessage(sender, args, isOp, isPrivate) + } else { + newMessage(sender, args, isOp, isPrivate) + } + if (clean()) { + save() + } + } + } + + override fun isEnabled(): Boolean { + return maxSize > 0 && maxDays > 0 + } + + override fun setProperty(key: String, value: String) { + super.setProperty(key, value) + if (MAX_DAYS_PROP == key) { + maxDays = getIntProperty(value, maxDays) + } else if (MAX_SIZE_PROP == key) { + maxSize = getIntProperty(value, maxSize) + } + } + + // New message. + private fun newMessage(sender: String, args: String, isOp: Boolean, isPrivate: Boolean) { + val split = args.split(" ".toRegex(), 2).toTypedArray() + if (split.size == 2 && StringUtils.isNotBlank(split[1]) && split[1].contains(" ")) { + if (messages.size < maxSize) { + val message = TellMessage(sender, split[0], split[1].trim()) + messages.add(message) + save() + bot.send(sender, "Message [ID ${message.id}] was queued for ${bold(message.recipient)}", isPrivate + ) + } else { + bot.send(sender, "Sorry, the messages queue is currently full.", isPrivate) + } + } else { + helpResponse(args, sender, isOp, isPrivate) + } + } + + /** + * Saves the messages queue. + */ + private fun save() { + TellMessagesMgr.save(serializedObject, messages, bot.logger) + } + + /** + * Checks and sends messages. + */ + @JvmOverloads + fun send(nickname: String, isMessage: Boolean = false) { + if (isEnabled() && nickname != bot.nick) { + messages.stream().filter { message: TellMessage -> message.isMatch(nickname) } + .forEach { message: TellMessage -> + if (message.recipient.equals(nickname, ignoreCase = true) && !message.isReceived) { + if (message.sender == nickname) { + if (!isMessage) { + bot.send( + nickname, + "${bold("You")} wanted me to remind you: ${reverseColor(message.message)}", + true + ) + message.isReceived = true + message.isNotified = true + save() + } + } else { + bot.send( + nickname, + "${message.sender} wanted me to tell you: ${reverseColor(message.message)}", + true + ) + message.isReceived = true + save() + } + } else if (message.sender.equals(nickname, ignoreCase = true) && message.isReceived + && !message.isNotified + ) { + bot.send( + nickname, + "Your message ${reverseColor("[ID " + message.id + ']')} was sent to " + + "${bold(message.recipient)} on ${utcDateTime(message.receptionDate)}", + true + ) + message.isNotified = true + save() + } + } + } + } + + /** + * Returns the messages queue size. + * + * @return The size. + */ + fun size(): Int { + return messages.size + } + + // View all messages. + private fun viewAll(sender: String, isPrivate: Boolean) { + if (messages.isNotEmpty()) { + for (message in messages) { + bot.send( + sender, bold(message.sender) + ARROW + bold(message.recipient) + + " [ID: " + message.id + ", " + + (if (message.isReceived) "DELIVERED" else "QUEUED") + ']', + isPrivate + ) + } + } else { + bot.send(sender, "There are no messages in the queue.", isPrivate) + } + } + + // View messages. + private fun viewMessages(sender: String, isPrivate: Boolean) { + var hasMessage = false + for (message in messages) { + if (message.isMatch(sender)) { + if (!hasMessage) { + hasMessage = true + bot.send(sender, "Here are your messages: ", isPrivate) + } + if (message.isReceived) { + bot.send( + sender, + bold(message.sender) + ARROW + bold(message.recipient) + + " [" + utcDateTime(message.receptionDate) + ", ID: " + + bold(message.id) + ", DELIVERED]", + isPrivate + ) + } else { + bot.send( + sender, + bold(message.sender) + ARROW + bold(message.recipient) + + " [" + utcDateTime(message.queued) + ", ID: " + + bold(message.id) + ", QUEUED]", + isPrivate + ) + } + bot.send(sender, helpIndent(message.message), isPrivate) + } + } + if (!hasMessage) { + bot.send(sender, "You have no messages in the queue.", isPrivate) + } else { + bot.send(sender, "To delete one or all delivered messages:", isPrivate) + bot.send( + sender, + helpIndent( + helpFormat( + "%c $name $TELL_DEL_KEYWORD ", + bot.nick, + isPrivate + ) + ), + isPrivate + ) + bot.send( + sender, + "Messages are kept for ${bold(maxDays)}${plural(maxDays.toLong(), " day.", " days.")}", + isPrivate + ) + } + } + + companion object { + /** + * Max days property. + */ + const val MAX_DAYS_PROP = "tell-max-days" + + /** + * Max size proeprty. + */ + const val MAX_SIZE_PROP = "tell-max-size" + + // Arrow + private const val ARROW = " --> " + + // Serialized object file extension + private const val SER_EXT = ".ser" + + // All keyword + private const val TELL_ALL_KEYWORD = "all" + + //T he delete command. + private const val TELL_DEL_KEYWORD = "del" + } + + /** + * Creates a new instance. + */ + init { + initProperties(MAX_DAYS_PROP, MAX_SIZE_PROP) + + // Load the message queue + serializedObject = bot.logsDir + bot.name + SER_EXT + messages.addAll(TellMessagesMgr.load(serializedObject, bot.logger)) + if (clean()) { + save() + } + } +} diff --git a/src/main/java/net/thauvin/erik/mobibot/commands/tell/TellMessage.java b/src/main/java/net/thauvin/erik/mobibot/commands/tell/TellMessage.java deleted file mode 100644 index 40d71f7..0000000 --- a/src/main/java/net/thauvin/erik/mobibot/commands/tell/TellMessage.java +++ /dev/null @@ -1,195 +0,0 @@ -/* - * TellMessage.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.commands.tell; - -import java.io.Serializable; -import java.time.Clock; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; - -/** - * The TellMessage class. - * - * @author Erik C. Thauvin - * @created 2014-04-24 - * @since 1.0 - */ -@SuppressWarnings("PMD.DataClass") -public class TellMessage implements Serializable { - private static final long serialVersionUID = 2L; - private final String id; - private final String message; - private final LocalDateTime queued; - private final String recipient; - private final String sender; - private boolean isNotified; - private boolean isReceived; - private LocalDateTime received; - - /** - * Create a new message. - * - * @param sender The sender's nick. - * @param recipient The recipient's nick. - * @param message The message. - */ - TellMessage(final String sender, final String recipient, final String message) { - this.sender = sender; - this.recipient = recipient; - this.message = message; - - this.queued = LocalDateTime.now(Clock.systemUTC()); - this.id = this.queued.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")); - } - - /** - * Returns the message id. - * - * @return The message id. - */ - public String getId() { - return id; - } - - /** - * Returns the message text. - * - * @return The text of the message. - */ - public String getMessage() { - return message; - } - - /** - * Returns the queued date/time. - * - * @return true if the message is queued. - */ - LocalDateTime getQueued() { - return queued; - } - - /** - * Returns the state of the received flag. - * - * @return true if the message has been received. - */ - public LocalDateTime getReceived() { - return received; - } - - /** - * Returns the message's recipient. - * - * @return The recipient of the message. - */ - String getRecipient() { - return recipient; - } - - /** - * Returns the message's sender. - * - * @return The sender of the message. - */ - public String getSender() { - return sender; - } - - /** - * Matches the message sender or recipient. - * - * @param nick The nickname to match with. - * @return true if the nickname matches. - */ - boolean isMatch(final String nick) { - return (sender.equalsIgnoreCase(nick) || recipient.equalsIgnoreCase(nick)); - } - - /** - * Match the message ID. - * - * @param id The ID to match with. - * @return true if the id matches. - */ - boolean isMatchId(final String id) { - return this.id.equals(id); - } - - /** - * Returns the notification flag state. - * - * @return true if the sender has been notified. - */ - boolean isNotified() { - return isNotified; - } - - /** - * Returns the received flag state. - * - * @return true if the message was received. - */ - public boolean isReceived() { - return isReceived; - } - - /** - * Sets the notified flag. - */ - void setIsNotified() { - isNotified = true; - } - - /** - * Sets the received flag. - */ - void setIsReceived() { - received = LocalDateTime.now(Clock.systemUTC()); - isReceived = true; - } - - @Override - public String toString() { - return "TellMessage{" - + "id='" + id + '\'' - + ", isNotified=" + isNotified - + ", isReceived=" + isReceived - + ", message='" + message + '\'' - + ", queued=" + queued - + ", received=" + received - + ", recipient='" + recipient + '\'' - + ", sender='" + sender + '\'' - + '}'; - } -} diff --git a/src/main/java/net/thauvin/erik/mobibot/commands/tell/TellMessage.kt b/src/main/java/net/thauvin/erik/mobibot/commands/tell/TellMessage.kt new file mode 100644 index 0000000..4dd3f40 --- /dev/null +++ b/src/main/java/net/thauvin/erik/mobibot/commands/tell/TellMessage.kt @@ -0,0 +1,112 @@ +/* + * TellMessage.kt + * + * 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.commands.tell + +import java.io.Serializable +import java.time.Clock +import java.time.LocalDateTime +import java.time.format.DateTimeFormatter + +/** + * The `TellMessage` class. + */ +class TellMessage internal constructor( + /** + * Returns the message's sender. + */ + val sender: String, + + /** + * Returns the message's recipient. + */ + val recipient: String, + + /** + * Returns the message text. + */ + val message: String +) : Serializable { + /** + * Returns the queued date/time. + */ + var queued: LocalDateTime = LocalDateTime.now(Clock.systemUTC()) + + /** + * Returns the message id. + */ + var id: String = queued.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + + /** + * Returns {@code true) if a notification was send. + */ + var isNotified = false + + /** + * Returns {@code true) if the message was received. + */ + var isReceived = false + set(value) { + if (value) { + receptionDate = LocalDateTime.now(Clock.systemUTC()) + } + field = value + } + + /** + * Return the message creating date. + */ + var receptionDate: LocalDateTime = LocalDateTime.MIN + + + /** + * Matches the message sender or recipient. + */ + fun isMatch(nick: String?): Boolean { + return sender.equals(nick, ignoreCase = true) || recipient.equals(nick, ignoreCase = true) + } + + /** + * Match the message ID. + */ + fun isMatchId(id: String): Boolean { + return this.id == id + } + + override fun toString(): String { + return ("TellMessage{id='$id', isNotified=$isNotified, isReceived=$isReceived, message='$message', " + + "queued=$queued, received=$receptionDate, recipient='$recipient', sender='$sender'}") + } + + companion object { + private const val serialVersionUID = 2L + } +} diff --git a/src/main/java/net/thauvin/erik/mobibot/commands/tell/TellMessagesMgr.java b/src/main/java/net/thauvin/erik/mobibot/commands/tell/TellMessagesMgr.java deleted file mode 100644 index 98eed8a..0000000 --- a/src/main/java/net/thauvin/erik/mobibot/commands/tell/TellMessagesMgr.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * TellMessagesMgr.java - * - * 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. - */ - -package net.thauvin.erik.mobibot.commands.tell; - -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import org.apache.logging.log4j.Logger; - -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.ObjectInput; -import java.io.ObjectInputStream; -import java.io.ObjectOutput; -import java.io.ObjectOutputStream; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.time.Clock; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - - -/** - * The Tell Messages Manager. - * - * @author Erik C. Thauvin - * @created 2014-04-26 - * @since 1.0 - */ -final class TellMessagesMgr { - /** - * Disables the default constructor. - * - * @throws UnsupportedOperationException If the constructor is called. - */ - private TellMessagesMgr() { - throw new UnsupportedOperationException("Illegal constructor call."); - } - - /** - * Cleans the messages queue. - * - * @param tellMessages The messages list. - * @param tellMaxDays The maximum number of days to keep messages for. - * @return True if the queue was cleaned. - */ - static boolean clean(final List tellMessages, final int tellMaxDays) { - final LocalDateTime today = LocalDateTime.now(Clock.systemUTC()); - - return tellMessages.removeIf(o -> o.getQueued().plusDays(tellMaxDays).isBefore(today)); - } - - /** - * Loads the messages. - * - * @param file The serialized objects file. - * @param logger The logger. - * @return The {@link TellMessage} array. - */ - @SuppressWarnings("unchecked") - @SuppressFBWarnings("OBJECT_DESERIALIZATION") - public static List load(final String file, final Logger logger) { - try { - try (final ObjectInput input = new ObjectInputStream( - new BufferedInputStream(Files.newInputStream(Paths.get(file))))) { - if (logger.isDebugEnabled()) { - logger.debug("Loading the messages."); - } - return ((List) input.readObject()); - } - } catch (FileNotFoundException ignore) { - // Do nothing - } catch (IOException | ClassNotFoundException e) { - logger.error("An error occurred loading the messages queue.", e); - } - - return new ArrayList<>(); - } - - /** - * Saves the messages. - * - * @param file The serialized objects file. - * @param messages The {@link TellMessage} array. - * @param logger The logger. - */ - public static void save(final String file, final List messages, final Logger logger) { - try { - try (final BufferedOutputStream bos = new BufferedOutputStream(Files.newOutputStream(Paths.get(file)))) { - try (final ObjectOutput output = new ObjectOutputStream(bos)) { - if (logger.isDebugEnabled()) { - logger.debug("Saving the messages."); - } - output.writeObject(messages); - } - } - } catch (IOException e) { - logger.error("Unable to save messages queue.", e); - } - } -} diff --git a/src/main/java/net/thauvin/erik/mobibot/commands/tell/TellMessagesMgr.kt b/src/main/java/net/thauvin/erik/mobibot/commands/tell/TellMessagesMgr.kt new file mode 100644 index 0000000..44f487d --- /dev/null +++ b/src/main/java/net/thauvin/erik/mobibot/commands/tell/TellMessagesMgr.kt @@ -0,0 +1,104 @@ +/* + * TellMessagesMgr.kt + * + * 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. + */ +package net.thauvin.erik.mobibot.commands.tell + +import org.apache.logging.log4j.Logger +import java.time.LocalDateTime +import java.io.ObjectInputStream +import java.io.BufferedInputStream +import java.io.FileNotFoundException +import java.io.IOException +import java.lang.ClassNotFoundException +import java.io.BufferedOutputStream +import java.io.ObjectOutputStream +import java.nio.file.Files +import java.nio.file.Paths +import java.time.Clock +import java.util.ArrayList + +/** + * The Tell Messages Manager. + */ +internal class TellMessagesMgr private constructor() { + companion object { + /** + * Cleans the messages queue. + */ + fun clean(tellMessages: MutableList, tellMaxDays: Int): Boolean { + val today = LocalDateTime.now(Clock.systemUTC()) + return tellMessages.removeIf { o: TellMessage -> o.queued.plusDays(tellMaxDays.toLong()).isBefore(today) } + } + + /** + * Loads the messages. + */ + + fun load(file: String, logger: Logger): List { + try { + ObjectInputStream( + BufferedInputStream(Files.newInputStream(Paths.get(file))) + ).use { input -> + if (logger.isDebugEnabled) { + logger.debug("Loading the messages.") + } + @Suppress("UNCHECKED_CAST") + return input.readObject() as List + } + } catch (ignore: FileNotFoundException) { + // Do nothing + } catch (e: IOException) { + logger.error("An IO error occurred loading the messages queue.", e) + } catch (e: ClassNotFoundException) { + logger.error("An error occurred loading the messages queue.", e) + } + return ArrayList() + } + + /** + * Saves the messages. + */ + fun save(file: String, messages: List?, logger: Logger) { + try { + BufferedOutputStream(Files.newOutputStream(Paths.get(file))).use { bos -> + ObjectOutputStream(bos).use { output -> + if (logger.isDebugEnabled) { + logger.debug("Saving the messages.") + } + output.writeObject(messages) + } + } + } catch (e: IOException) { + logger.error("Unable to save messages queue.", e) + } + } + } +} diff --git a/src/test/java/net/thauvin/erik/mobibot/commands/tell/TellMessageTest.java b/src/test/java/net/thauvin/erik/mobibot/commands/tell/TellMessageTest.java deleted file mode 100644 index e57c52a..0000000 --- a/src/test/java/net/thauvin/erik/mobibot/commands/tell/TellMessageTest.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * TellMessageTest.java - * - * 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. - */ - -package net.thauvin.erik.mobibot.commands.tell; - -import org.testng.annotations.Test; - -import java.time.Duration; -import java.time.LocalDateTime; -import java.time.temporal.Temporal; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * The TellMessageTest class. - * - * @author Erik C. Thauvin - * @created 2019-07-29 - * @since 1.0 - */ -public class TellMessageTest { - private boolean isValidDate(final Temporal date) { - return Duration.between(date, LocalDateTime.now()).toMinutes() < 1; - } - - @Test - void testTellMessage() { - final String message = "Test message."; - final String recipient = "recipient"; - final String sender = "sender"; - final TellMessage tellMessage = new TellMessage(sender, recipient, message); - - assertThat(tellMessage.getSender()).as(sender).isEqualTo(sender); - assertThat(tellMessage.getRecipient()).as(recipient).isEqualTo(recipient); - assertThat(tellMessage.getMessage()).as(message).isEqualTo(message); - assertThat(isValidDate(tellMessage.getQueued())).as("queued is valid date/time").isTrue(); - - assertThat(tellMessage.isMatch(sender)).as("match sender").isTrue(); - assertThat(tellMessage.isMatch(recipient)).as("match recipient").isTrue(); - assertThat(tellMessage.isMatch("foo")).as("foo is no match").isFalse(); - - assertThat(tellMessage.isMatchId(tellMessage.getId())).as("is match ID").isTrue(); - - tellMessage.setIsReceived(); - assertThat(tellMessage.isReceived()).as("is received").isTrue(); - assertThat(isValidDate(tellMessage.getReceived())).as("received is valid date/time").isTrue(); - - tellMessage.setIsNotified(); - assertThat(tellMessage.isNotified()).as("is notified").isTrue(); - } -} - diff --git a/src/test/java/net/thauvin/erik/mobibot/commands/tell/TellMessageTest.kt b/src/test/java/net/thauvin/erik/mobibot/commands/tell/TellMessageTest.kt new file mode 100644 index 0000000..5dbf7f3 --- /dev/null +++ b/src/test/java/net/thauvin/erik/mobibot/commands/tell/TellMessageTest.kt @@ -0,0 +1,68 @@ +/* + * TellMessageTest.kt + * + * 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. + */ +package net.thauvin.erik.mobibot.commands.tell + +import java.time.temporal.Temporal +import java.time.LocalDateTime +import org.assertj.core.api.Assertions +import org.testng.annotations.Test +import java.time.Duration + +/** + * The `TellMessageTest` class. + */ +class TellMessageTest { + private fun isValidDate(date: Temporal): Boolean { + return Duration.between(date, LocalDateTime.now()).toMinutes() < 1 + } + + @Test + fun testTellMessage() { + val message = "Test message." + val recipient = "recipient" + val sender = "sender" + val tellMessage = TellMessage(sender, recipient, message) + Assertions.assertThat(tellMessage.sender).`as`(sender).isEqualTo(sender) + Assertions.assertThat(tellMessage.recipient).`as`(recipient).isEqualTo(recipient) + Assertions.assertThat(tellMessage.message).`as`(message).isEqualTo(message) + Assertions.assertThat(isValidDate(tellMessage.queued)).`as`("queued is valid date/time").isTrue + Assertions.assertThat(tellMessage.isMatch(sender)).`as`("match sender").isTrue + Assertions.assertThat(tellMessage.isMatch(recipient)).`as`("match recipient").isTrue + Assertions.assertThat(tellMessage.isMatch("foo")).`as`("foo is no match").isFalse + Assertions.assertThat(tellMessage.isMatchId(tellMessage.id)).`as`("is match ID").isTrue + tellMessage.isReceived = true + Assertions.assertThat(tellMessage.isReceived).`as`("is received").isTrue + Assertions.assertThat(isValidDate(tellMessage.receptionDate)).`as`("received is valid date/time").isTrue + tellMessage.isNotified = true + Assertions.assertThat(tellMessage.isNotified).`as`("is notified").isTrue + } +}