Compare commits
3 commits
6fd59e9487
...
0fba4445f8
Author | SHA1 | Date | |
---|---|---|---|
0fba4445f8 | |||
e510a77af1 | |||
2b2d046835 |
35 changed files with 163 additions and 276 deletions
|
@ -54,7 +54,7 @@
|
||||||
<ID>NestedBlockDepth:EntryLink.kt$EntryLink$private fun setTags(tags: List<String?>)</ID>
|
<ID>NestedBlockDepth:EntryLink.kt$EntryLink$private fun setTags(tags: List<String?>)</ID>
|
||||||
<ID>NestedBlockDepth:FeedsManager.kt$FeedsManager.Companion$@JvmStatic @Throws(IOException::class, FeedException::class) fun loadFeed(entries: Entries, currentFile: String = currentXml): String</ID>
|
<ID>NestedBlockDepth:FeedsManager.kt$FeedsManager.Companion$@JvmStatic @Throws(IOException::class, FeedException::class) fun loadFeed(entries: Entries, currentFile: String = currentXml): String</ID>
|
||||||
<ID>NestedBlockDepth:FeedsManager.kt$FeedsManager.Companion$@JvmStatic fun saveFeed(entries: Entries, currentFile: String = currentXml)</ID>
|
<ID>NestedBlockDepth:FeedsManager.kt$FeedsManager.Companion$@JvmStatic fun saveFeed(entries: Entries, currentFile: String = currentXml)</ID>
|
||||||
<ID>NestedBlockDepth:GoogleSearch.kt$GoogleSearch$override fun run(channel: String, cmd: String, args: String, event: GenericMessageEvent)</ID>
|
<ID>NestedBlockDepth:GoogleSearch.kt$GoogleSearch$override fun commandResponse(channel: String, cmd: String, args: String, event: GenericMessageEvent)</ID>
|
||||||
<ID>NestedBlockDepth:GoogleSearch.kt$GoogleSearch.Companion$@JvmStatic @Throws(ModuleException::class) fun searchGoogle( query: String, apiKey: String?, cseKey: String?, quotaUser: String = ReleaseInfo.PROJECT ): List<Message></ID>
|
<ID>NestedBlockDepth:GoogleSearch.kt$GoogleSearch.Companion$@JvmStatic @Throws(ModuleException::class) fun searchGoogle( query: String, apiKey: String?, cseKey: String?, quotaUser: String = ReleaseInfo.PROJECT ): List<Message></ID>
|
||||||
<ID>NestedBlockDepth:LinksManager.kt$LinksManager$override fun commandResponse(channel: String, args: String, event: GenericMessageEvent)</ID>
|
<ID>NestedBlockDepth:LinksManager.kt$LinksManager$override fun commandResponse(channel: String, args: String, event: GenericMessageEvent)</ID>
|
||||||
<ID>NestedBlockDepth:Lookup.kt$Lookup$override fun commandResponse(channel: String, cmd: String, args: String, event: GenericMessageEvent)</ID>
|
<ID>NestedBlockDepth:Lookup.kt$Lookup$override fun commandResponse(channel: String, cmd: String, args: String, event: GenericMessageEvent)</ID>
|
||||||
|
@ -66,7 +66,7 @@
|
||||||
<ID>NestedBlockDepth:TwitterOAuth.kt$TwitterOAuth$@JvmStatic fun main(args: Array<String>)</ID>
|
<ID>NestedBlockDepth:TwitterOAuth.kt$TwitterOAuth$@JvmStatic fun main(args: Array<String>)</ID>
|
||||||
<ID>NestedBlockDepth:Utils.kt$Utils$@JvmStatic fun loadData(file: String, default: Any, logger: Logger, description: String): Any</ID>
|
<ID>NestedBlockDepth:Utils.kt$Utils$@JvmStatic fun loadData(file: String, default: Any, logger: Logger, description: String): Any</ID>
|
||||||
<ID>NestedBlockDepth:Utils.kt$Utils$@JvmStatic fun saveData(file: String, data: Any, logger: Logger, description: String)</ID>
|
<ID>NestedBlockDepth:Utils.kt$Utils$@JvmStatic fun saveData(file: String, data: Any, logger: Logger, description: String)</ID>
|
||||||
<ID>NestedBlockDepth:Weather2.kt$Weather2$override fun run(channel: String, cmd: String, args: String, event: GenericMessageEvent)</ID>
|
<ID>NestedBlockDepth:Weather2.kt$Weather2$override fun commandResponse(channel: String, cmd: String, args: String, event: GenericMessageEvent)</ID>
|
||||||
<ID>NestedBlockDepth:Weather2.kt$Weather2.Companion$@JvmStatic @Throws(ModuleException::class) fun getWeather(query: String, apiKey: String?): List<Message></ID>
|
<ID>NestedBlockDepth:Weather2.kt$Weather2.Companion$@JvmStatic @Throws(ModuleException::class) fun getWeather(query: String, apiKey: String?): List<Message></ID>
|
||||||
<ID>PrintStackTrace:TwitterOAuth.kt$TwitterOAuth$ioe</ID>
|
<ID>PrintStackTrace:TwitterOAuth.kt$TwitterOAuth$ioe</ID>
|
||||||
<ID>PrintStackTrace:TwitterOAuth.kt$TwitterOAuth$te</ID>
|
<ID>PrintStackTrace:TwitterOAuth.kt$TwitterOAuth$te</ID>
|
||||||
|
@ -86,6 +86,7 @@
|
||||||
<ID>ThrowsCount:WolframAlpha.kt$WolframAlpha.Companion$@JvmStatic @Throws(ModuleException::class) fun queryWolfram(query: String, units: String = IMPERIAL, appId: String?): String</ID>
|
<ID>ThrowsCount:WolframAlpha.kt$WolframAlpha.Companion$@JvmStatic @Throws(ModuleException::class) fun queryWolfram(query: String, units: String = IMPERIAL, appId: String?): String</ID>
|
||||||
<ID>TooGenericExceptionCaught:StockQuote.kt$StockQuote.Companion$e: NullPointerException</ID>
|
<ID>TooGenericExceptionCaught:StockQuote.kt$StockQuote.Companion$e: NullPointerException</ID>
|
||||||
<ID>TooGenericExceptionCaught:Weather2.kt$Weather2.Companion$e: NullPointerException</ID>
|
<ID>TooGenericExceptionCaught:Weather2.kt$Weather2.Companion$e: NullPointerException</ID>
|
||||||
|
<ID>TooManyFunctions:EntryLink.kt$EntryLink : Serializable</ID>
|
||||||
<ID>TooManyFunctions:Mobibot.kt$Mobibot : ListenerAdapter</ID>
|
<ID>TooManyFunctions:Mobibot.kt$Mobibot : ListenerAdapter</ID>
|
||||||
<ID>TooManyFunctions:Tell.kt$Tell : AbstractCommand</ID>
|
<ID>TooManyFunctions:Tell.kt$Tell : AbstractCommand</ID>
|
||||||
</CurrentIssues>
|
</CurrentIssues>
|
||||||
|
|
|
@ -46,8 +46,8 @@ import java.util.Properties
|
||||||
*/
|
*/
|
||||||
class Addons(private val props: Properties) {
|
class Addons(private val props: Properties) {
|
||||||
private val logger: Logger = LoggerFactory.getLogger(Addons::class.java)
|
private val logger: Logger = LoggerFactory.getLogger(Addons::class.java)
|
||||||
private val disabledModules = props.getProperty("disabled-modules", "").split(LinksManager.TAG_MATCH.toRegex())
|
private val disabledModules = props.getProperty("disabled-modules", "").split(LinksManager.TAG_MATCH)
|
||||||
private val disableCommands = props.getProperty("disabled-commands", "").split(LinksManager.TAG_MATCH.toRegex())
|
private val disableCommands = props.getProperty("disabled-commands", "").split(LinksManager.TAG_MATCH)
|
||||||
|
|
||||||
val commands: MutableList<AbstractCommand> = mutableListOf()
|
val commands: MutableList<AbstractCommand> = mutableListOf()
|
||||||
val modules: MutableList<AbstractModule> = mutableListOf()
|
val modules: MutableList<AbstractModule> = mutableListOf()
|
||||||
|
|
|
@ -65,7 +65,7 @@ class FeedReader(private val url: String, val event: GenericMessageEvent) : Runn
|
||||||
event.sendMessage("An error has occurred while parsing the feed: ${e.message}")
|
event.sendMessage("An error has occurred while parsing the feed: ${e.message}")
|
||||||
} catch (e: IOException) {
|
} catch (e: IOException) {
|
||||||
if (logger.isWarnEnabled) logger.warn("Unable to fetch the feed at $url", e)
|
if (logger.isWarnEnabled) logger.warn("Unable to fetch the feed at $url", e)
|
||||||
event.sendMessage("An error has occurred while fetching the feed: ${e.message}")
|
event.sendMessage("An IO error has occurred while fetching the feed: ${e.message}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -176,7 +176,7 @@ class Mobibot(nickname: String, val channel: String, logsDirPath: String, p: Pro
|
||||||
override fun onDisconnect(event: DisconnectEvent?) {
|
override fun onDisconnect(event: DisconnectEvent?) {
|
||||||
event?.let {
|
event?.let {
|
||||||
with(event.getBot<PircBotX>()) {
|
with(event.getBot<PircBotX>()) {
|
||||||
LinksManager.socialManager.notification("$nick disconnected from irc://$serverHostname")
|
LinksManager.socialManager.notification("$nick disconnected from $serverHostname")
|
||||||
seen.add(userChannelDao.getChannel(channel).users)
|
seen.add(userChannelDao.getChannel(channel).users)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -202,7 +202,7 @@ class Mobibot(nickname: String, val channel: String, logsDirPath: String, p: Pro
|
||||||
with(event.getBot<PircBotX>()) {
|
with(event.getBot<PircBotX>()) {
|
||||||
if (user.nick == nick) {
|
if (user.nick == nick) {
|
||||||
LinksManager.socialManager.notification(
|
LinksManager.socialManager.notification(
|
||||||
"$nick has joined ${event.channel.name} on irc://$serverHostname"
|
"$nick has joined ${event.channel.name} on $serverHostname"
|
||||||
)
|
)
|
||||||
seen.add(userChannelDao.getChannel(channel).users)
|
seen.add(userChannelDao.getChannel(channel).users)
|
||||||
} else {
|
} else {
|
||||||
|
@ -215,12 +215,10 @@ class Mobibot(nickname: String, val channel: String, logsDirPath: String, p: Pro
|
||||||
|
|
||||||
override fun onMessage(event: MessageEvent?) {
|
override fun onMessage(event: MessageEvent?) {
|
||||||
event?.user?.let { user ->
|
event?.user?.let { user ->
|
||||||
val sender = user.nick
|
|
||||||
val message = event.message
|
|
||||||
tell.send(event)
|
tell.send(event)
|
||||||
if (message.matches("(?i)${Pattern.quote(event.bot().nick)}:.*".toRegex())) { // mobibot: <command>
|
if (event.message.matches("(?i)${Pattern.quote(event.bot().nick)}:.*".toRegex())) { // mobibot: <command>
|
||||||
if (logger.isTraceEnabled) logger.trace(">>> $sender: $message")
|
if (logger.isTraceEnabled) logger.trace(">>> ${user.nick}: ${event.message}")
|
||||||
val cmds = message.substring(message.indexOf(':') + 1).trim().split(" ".toRegex(), 2)
|
val cmds = event.message.substring(event.bot().nick.length + 1).trim().split(" ".toRegex(), 2)
|
||||||
val cmd = cmds[0].lowercase()
|
val cmd = cmds[0].lowercase()
|
||||||
val args = cmds.lastOrEmpty().trim()
|
val args = cmds.lastOrEmpty().trim()
|
||||||
if (cmd.startsWith(Constants.HELP_CMD)) { // mobibot: help
|
if (cmd.startsWith(Constants.HELP_CMD)) { // mobibot: help
|
||||||
|
@ -230,10 +228,10 @@ class Mobibot(nickname: String, val channel: String, logsDirPath: String, p: Pro
|
||||||
addons.exec(channel, cmd, args, event)
|
addons.exec(channel, cmd, args, event)
|
||||||
}
|
}
|
||||||
} else if (addons.match(channel, event)) { // Links, e.g.: https://www.example.com/ or L1: , etc.
|
} else if (addons.match(channel, event)) { // Links, e.g.: https://www.example.com/ or L1: , etc.
|
||||||
if (logger.isTraceEnabled) logger.trace(">>> $sender: $message")
|
if (logger.isTraceEnabled) logger.trace(">>> ${user.nick}: ${event.message}")
|
||||||
}
|
}
|
||||||
storeRecap(sender, message, false)
|
storeRecap(user.nick, event.message, false)
|
||||||
seen.add(sender)
|
seen.add(user.nick)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -252,7 +250,7 @@ class Mobibot(nickname: String, val channel: String, logsDirPath: String, p: Pro
|
||||||
with(event.getBot<PircBotX>()) {
|
with(event.getBot<PircBotX>()) {
|
||||||
if (user.nick == nick) {
|
if (user.nick == nick) {
|
||||||
LinksManager.socialManager.notification(
|
LinksManager.socialManager.notification(
|
||||||
"$nick has left ${event.channel.name} on irc://$serverHostname"
|
"$nick has left ${event.channel.name} on $serverHostname"
|
||||||
)
|
)
|
||||||
seen.add(userChannelDao.getChannel(channel).users)
|
seen.add(userChannelDao.getChannel(channel).users)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -32,8 +32,6 @@
|
||||||
|
|
||||||
package net.thauvin.erik.mobibot
|
package net.thauvin.erik.mobibot
|
||||||
|
|
||||||
import kotlinx.coroutines.launch
|
|
||||||
import kotlinx.coroutines.runBlocking
|
|
||||||
import net.thauvin.erik.mobibot.entries.EntryLink
|
import net.thauvin.erik.mobibot.entries.EntryLink
|
||||||
import net.thauvin.erik.pinboard.PinboardPoster
|
import net.thauvin.erik.pinboard.PinboardPoster
|
||||||
import java.time.ZoneId
|
import java.time.ZoneId
|
||||||
|
@ -53,16 +51,8 @@ class Pinboard {
|
||||||
*/
|
*/
|
||||||
fun addPin(ircServer: String, entry: EntryLink) {
|
fun addPin(ircServer: String, entry: EntryLink) {
|
||||||
if (poster.apiToken.isNotBlank()) {
|
if (poster.apiToken.isNotBlank()) {
|
||||||
runBlocking {
|
with(entry) {
|
||||||
launch {
|
poster.addPin(link, title, postedBy(ircServer), formatTags(), date.toTimestamp())
|
||||||
poster.addPin(
|
|
||||||
entry.link,
|
|
||||||
entry.title,
|
|
||||||
entry.postedBy(ircServer),
|
|
||||||
entry.pinboardTags,
|
|
||||||
entry.date.toTimestamp()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -79,12 +69,9 @@ class Pinboard {
|
||||||
*/
|
*/
|
||||||
fun deletePin(entry: EntryLink) {
|
fun deletePin(entry: EntryLink) {
|
||||||
if (poster.apiToken.isNotBlank()) {
|
if (poster.apiToken.isNotBlank()) {
|
||||||
runBlocking {
|
|
||||||
launch {
|
|
||||||
poster.deletePin(entry.link)
|
poster.deletePin(entry.link)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -92,29 +79,31 @@ class Pinboard {
|
||||||
*/
|
*/
|
||||||
fun updatePin(ircServer: String, oldUrl: String, entry: EntryLink) {
|
fun updatePin(ircServer: String, oldUrl: String, entry: EntryLink) {
|
||||||
if (poster.apiToken.isNotBlank()) {
|
if (poster.apiToken.isNotBlank()) {
|
||||||
runBlocking {
|
|
||||||
launch {
|
|
||||||
with(entry) {
|
with(entry) {
|
||||||
if (oldUrl != link) {
|
if (oldUrl != link) {
|
||||||
poster.deletePin(oldUrl)
|
poster.deletePin(oldUrl)
|
||||||
}
|
}
|
||||||
poster.addPin(link, title, entry.postedBy(ircServer), pinboardTags, date.toTimestamp())
|
poster.addPin(link, title, postedBy(ircServer), formatTags(), date.toTimestamp())
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Format a date to a UTC timestamp.
|
* Formats a date to a UTC timestamp.
|
||||||
*/
|
*/
|
||||||
private fun Date.toTimestamp(): String {
|
private fun Date.toTimestamp(): String {
|
||||||
return ZonedDateTime.ofInstant(
|
return ZonedDateTime.ofInstant(
|
||||||
toInstant().truncatedTo(ChronoUnit.SECONDS),
|
toInstant().truncatedTo(ChronoUnit.SECONDS), ZoneId.systemDefault()
|
||||||
ZoneId.systemDefault()
|
|
||||||
).format(DateTimeFormatter.ISO_INSTANT)
|
).format(DateTimeFormatter.ISO_INSTANT)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Formats the tags for pinboard.
|
||||||
|
*/
|
||||||
|
private fun EntryLink.formatTags(): String {
|
||||||
|
return nick + formatTags(",", ",")
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the pinboard.in extended attribution line.
|
* Returns the pinboard.in extended attribution line.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -32,8 +32,6 @@
|
||||||
|
|
||||||
package net.thauvin.erik.mobibot.commands
|
package net.thauvin.erik.mobibot.commands
|
||||||
|
|
||||||
import kotlinx.coroutines.launch
|
|
||||||
import kotlinx.coroutines.runBlocking
|
|
||||||
import net.thauvin.erik.mobibot.FeedReader
|
import net.thauvin.erik.mobibot.FeedReader
|
||||||
import net.thauvin.erik.mobibot.Utils.helpFormat
|
import net.thauvin.erik.mobibot.Utils.helpFormat
|
||||||
import org.pircbotx.hooks.types.GenericMessageEvent
|
import org.pircbotx.hooks.types.GenericMessageEvent
|
||||||
|
@ -55,13 +53,9 @@ class ChannelFeed(channel: String) : AbstractCommand() {
|
||||||
|
|
||||||
override fun commandResponse(channel: String, args: String, event: GenericMessageEvent) {
|
override fun commandResponse(channel: String, args: String, event: GenericMessageEvent) {
|
||||||
if (isEnabled()) {
|
if (isEnabled()) {
|
||||||
runBlocking {
|
|
||||||
launch {
|
|
||||||
properties[FEED_PROP]?.let { FeedReader(it, event).run() }
|
properties[FEED_PROP]?.let { FeedReader(it, event).run() }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun isEnabled(): Boolean {
|
override fun isEnabled(): Boolean {
|
||||||
return !properties[FEED_PROP].isNullOrBlank()
|
return !properties[FEED_PROP].isNullOrBlank()
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
package net.thauvin.erik.mobibot.commands
|
package net.thauvin.erik.mobibot.commands
|
||||||
|
|
||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.runBlocking
|
import kotlinx.coroutines.runBlocking
|
||||||
import net.thauvin.erik.mobibot.Utils.bot
|
import net.thauvin.erik.mobibot.Utils.bot
|
||||||
import net.thauvin.erik.mobibot.Utils.helpFormat
|
import net.thauvin.erik.mobibot.Utils.helpFormat
|
||||||
|
@ -51,11 +52,13 @@ class Cycle : AbstractCommand() {
|
||||||
with(event.bot()) {
|
with(event.bot()) {
|
||||||
if (event.isChannelOp(channel)) {
|
if (event.isChannelOp(channel)) {
|
||||||
runBlocking {
|
runBlocking {
|
||||||
|
launch {
|
||||||
sendIRC().message(channel, "${event.user.nick} asked me to leave. I'll be back!")
|
sendIRC().message(channel, "${event.user.nick} asked me to leave. I'll be back!")
|
||||||
userChannelDao.getChannel(channel).send().part()
|
userChannelDao.getChannel(channel).send().part()
|
||||||
delay(wait * 1000L)
|
delay(wait * 1000L)
|
||||||
sendIRC().joinChannel(channel)
|
sendIRC().joinChannel(channel)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
helpResponse(channel, args, event)
|
helpResponse(channel, args, event)
|
||||||
}
|
}
|
||||||
|
|
|
@ -141,7 +141,7 @@ class Ignore : AbstractCommand() {
|
||||||
override fun setProperty(key: String, value: String) {
|
override fun setProperty(key: String, value: String) {
|
||||||
super.setProperty(key, value)
|
super.setProperty(key, value)
|
||||||
if (IGNORE_PROP == key) {
|
if (IGNORE_PROP == key) {
|
||||||
ignored.addAll(value.split(LinksManager.TAG_MATCH.toRegex()))
|
ignored.addAll(value.split(LinksManager.TAG_MATCH))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,15 +45,7 @@ class Users : AbstractCommand() {
|
||||||
override val isVisible = true
|
override val isVisible = true
|
||||||
|
|
||||||
override fun commandResponse(channel: String, args: String, event: GenericMessageEvent) {
|
override fun commandResponse(channel: String, args: String, event: GenericMessageEvent) {
|
||||||
val nicks = mutableListOf<String>()
|
|
||||||
val ch = event.bot().userChannelDao.getChannel(channel)
|
val ch = event.bot().userChannelDao.getChannel(channel)
|
||||||
ch.users.forEach {
|
event.sendList(ch.users.map { if (it.channelsOpIn.contains(ch)) "@${it.nick}" else it.nick }, 8)
|
||||||
if (it.channelsOpIn.contains(ch)) {
|
|
||||||
nicks.add("@${it.nick}")
|
|
||||||
} else {
|
|
||||||
nicks.add(it.nick)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
event.sendList(nicks, 8)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,7 @@ import net.thauvin.erik.mobibot.Utils.helpFormat
|
||||||
import net.thauvin.erik.mobibot.Utils.isChannelOp
|
import net.thauvin.erik.mobibot.Utils.isChannelOp
|
||||||
import net.thauvin.erik.mobibot.Utils.sendMessage
|
import net.thauvin.erik.mobibot.Utils.sendMessage
|
||||||
import net.thauvin.erik.mobibot.commands.AbstractCommand
|
import net.thauvin.erik.mobibot.commands.AbstractCommand
|
||||||
import net.thauvin.erik.mobibot.entries.EntriesUtils.buildComment
|
import net.thauvin.erik.mobibot.entries.EntriesUtils.printComment
|
||||||
import net.thauvin.erik.mobibot.entries.EntriesUtils.toLinkLabel
|
import net.thauvin.erik.mobibot.entries.EntriesUtils.toLinkLabel
|
||||||
import net.thauvin.erik.mobibot.entries.EntryLink
|
import net.thauvin.erik.mobibot.entries.EntryLink
|
||||||
import org.pircbotx.hooks.types.GenericMessageEvent
|
import org.pircbotx.hooks.types.GenericMessageEvent
|
||||||
|
@ -111,7 +111,7 @@ class Comment : AbstractCommand() {
|
||||||
if (event.isChannelOp(channel) && cmd.length > 1) {
|
if (event.isChannelOp(channel) && cmd.length > 1) {
|
||||||
val comment = entry.getComment(commentIndex)
|
val comment = entry.getComment(commentIndex)
|
||||||
comment.nick = cmd.substring(1)
|
comment.nick = cmd.substring(1)
|
||||||
event.sendMessage(buildComment(entryIndex, commentIndex, comment))
|
event.sendMessage(printComment(entryIndex, commentIndex, comment))
|
||||||
LinksManager.entries.save()
|
LinksManager.entries.save()
|
||||||
} else {
|
} else {
|
||||||
event.sendMessage("Please ask a channel op to change the author of this comment for you.")
|
event.sendMessage("Please ask a channel op to change the author of this comment for you.")
|
||||||
|
@ -142,11 +142,11 @@ class Comment : AbstractCommand() {
|
||||||
event: GenericMessageEvent
|
event: GenericMessageEvent
|
||||||
) {
|
) {
|
||||||
entry.setComment(commentIndex, cmd, event.user.nick)
|
entry.setComment(commentIndex, cmd, event.user.nick)
|
||||||
event.sendMessage(buildComment(entryIndex, commentIndex, entry.getComment(commentIndex)))
|
event.sendMessage(printComment(entryIndex, commentIndex, entry.getComment(commentIndex)))
|
||||||
LinksManager.entries.save()
|
LinksManager.entries.save()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun showComment(entry: EntryLink, entryIndex: Int, commentIndex: Int, event: GenericMessageEvent) {
|
private fun showComment(entry: EntryLink, entryIndex: Int, commentIndex: Int, event: GenericMessageEvent) {
|
||||||
event.sendMessage(buildComment(entryIndex, commentIndex, entry.getComment(commentIndex)))
|
event.sendMessage(printComment(entryIndex, commentIndex, entry.getComment(commentIndex)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,7 +42,7 @@ import net.thauvin.erik.mobibot.Utils.today
|
||||||
import net.thauvin.erik.mobibot.commands.AbstractCommand
|
import net.thauvin.erik.mobibot.commands.AbstractCommand
|
||||||
import net.thauvin.erik.mobibot.commands.Ignore.Companion.isNotIgnored
|
import net.thauvin.erik.mobibot.commands.Ignore.Companion.isNotIgnored
|
||||||
import net.thauvin.erik.mobibot.entries.Entries
|
import net.thauvin.erik.mobibot.entries.Entries
|
||||||
import net.thauvin.erik.mobibot.entries.EntriesUtils.buildLink
|
import net.thauvin.erik.mobibot.entries.EntriesUtils.printLink
|
||||||
import net.thauvin.erik.mobibot.entries.EntriesUtils.toLinkLabel
|
import net.thauvin.erik.mobibot.entries.EntriesUtils.toLinkLabel
|
||||||
import net.thauvin.erik.mobibot.entries.EntryLink
|
import net.thauvin.erik.mobibot.entries.EntryLink
|
||||||
import net.thauvin.erik.mobibot.social.SocialManager
|
import net.thauvin.erik.mobibot.social.SocialManager
|
||||||
|
@ -65,10 +65,10 @@ class LinksManager : AbstractCommand() {
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val LINK_MATCH = "^[hH][tT][tT][pP](|[sS])://.*"
|
val LINK_MATCH = "^[hH][tT][tT][pP](|[sS])://.*".toRegex()
|
||||||
const val KEYWORDS_PROP = "tags-keywords"
|
const val KEYWORDS_PROP = "tags-keywords"
|
||||||
const val TAGS_PROP = "tags"
|
const val TAGS_PROP = "tags"
|
||||||
const val TAG_MATCH = ", *| +"
|
val TAG_MATCH = ", *| +".toRegex()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Entries array
|
* Entries array
|
||||||
|
@ -116,7 +116,7 @@ class LinksManager : AbstractCommand() {
|
||||||
val data = cmds[1].trim().split("${Tags.COMMAND}:", limit = 2)
|
val data = cmds[1].trim().split("${Tags.COMMAND}:", limit = 2)
|
||||||
title = data[0].trim()
|
title = data[0].trim()
|
||||||
if (data.size > 1) {
|
if (data.size > 1) {
|
||||||
tags.addAll(data[1].split(TAG_MATCH.toRegex()))
|
tags.addAll(data[1].split(TAG_MATCH))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -136,7 +136,7 @@ class LinksManager : AbstractCommand() {
|
||||||
val entry = EntryLink(link, title, sender, login, channel, tags)
|
val entry = EntryLink(link, title, sender, login, channel, tags)
|
||||||
entries.links.add(entry)
|
entries.links.add(entry)
|
||||||
val index = entries.links.lastIndexOf(entry)
|
val index = entries.links.lastIndexOf(entry)
|
||||||
event.sendMessage(buildLink(index, entry))
|
event.sendMessage(printLink(index, entry))
|
||||||
|
|
||||||
pinboard.addPin(event.bot().serverHostname, entry)
|
pinboard.addPin(event.bot().serverHostname, entry)
|
||||||
|
|
||||||
|
@ -156,7 +156,7 @@ class LinksManager : AbstractCommand() {
|
||||||
override fun helpResponse(channel: String, topic: String, event: GenericMessageEvent): Boolean = false
|
override fun helpResponse(channel: String, topic: String, event: GenericMessageEvent): Boolean = false
|
||||||
|
|
||||||
override fun matches(message: String): Boolean {
|
override fun matches(message: String): Boolean {
|
||||||
return message.matches(LINK_MATCH.toRegex())
|
return message.matches(LINK_MATCH)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun fetchTitle(link: String): String {
|
internal fun fetchTitle(link: String): String {
|
||||||
|
@ -179,7 +179,7 @@ class LinksManager : AbstractCommand() {
|
||||||
return try {
|
return try {
|
||||||
val match = entries.links.single { it.link == link }
|
val match = entries.links.single { it.link == link }
|
||||||
event.sendMessage(
|
event.sendMessage(
|
||||||
"Duplicate".bold() + " >> " + buildLink(entries.links.indexOf(match), match)
|
"Duplicate".bold() + " >> " + printLink(entries.links.indexOf(match), match)
|
||||||
)
|
)
|
||||||
true
|
true
|
||||||
} catch (ignore: NoSuchElementException) {
|
} catch (ignore: NoSuchElementException) {
|
||||||
|
@ -200,9 +200,9 @@ class LinksManager : AbstractCommand() {
|
||||||
override fun setProperty(key: String, value: String) {
|
override fun setProperty(key: String, value: String) {
|
||||||
super.setProperty(key, value)
|
super.setProperty(key, value)
|
||||||
if (KEYWORDS_PROP == key) {
|
if (KEYWORDS_PROP == key) {
|
||||||
keywords.addAll(value.split(TAG_MATCH.toRegex()))
|
keywords.addAll(value.split(TAG_MATCH))
|
||||||
} else if (TAGS_PROP == key) {
|
} else if (TAGS_PROP == key) {
|
||||||
defaultTags.addAll(value.split(TAG_MATCH.toRegex()))
|
defaultTags.addAll(value.split(TAG_MATCH))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -94,7 +94,7 @@ class Posting : AbstractCommand() {
|
||||||
val entry: EntryLink = entries.links[entryIndex]
|
val entry: EntryLink = entries.links[entryIndex]
|
||||||
val commentIndex = entry.addComment(cmd, event.user.nick)
|
val commentIndex = entry.addComment(cmd, event.user.nick)
|
||||||
val comment = entry.getComment(commentIndex)
|
val comment = entry.getComment(commentIndex)
|
||||||
event.sendMessage(EntriesUtils.buildComment(entryIndex, commentIndex, comment))
|
event.sendMessage(EntriesUtils.printComment(entryIndex, commentIndex, comment))
|
||||||
entries.save()
|
entries.save()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,7 +103,7 @@ class Posting : AbstractCommand() {
|
||||||
val entry: EntryLink = entries.links[entryIndex]
|
val entry: EntryLink = entries.links[entryIndex]
|
||||||
entry.title = cmd.substring(1).trim()
|
entry.title = cmd.substring(1).trim()
|
||||||
LinksManager.pinboard.updatePin(event.bot().serverHostname, entry.link, entry)
|
LinksManager.pinboard.updatePin(event.bot().serverHostname, entry.link, entry)
|
||||||
event.sendMessage(EntriesUtils.buildLink(entryIndex, entry))
|
event.sendMessage(EntriesUtils.printLink(entryIndex, entry))
|
||||||
entries.save()
|
entries.save()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -112,11 +112,11 @@ class Posting : AbstractCommand() {
|
||||||
val entry: EntryLink = entries.links[entryIndex]
|
val entry: EntryLink = entries.links[entryIndex]
|
||||||
if (entry.login == event.user.login || event.isChannelOp(channel)) {
|
if (entry.login == event.user.login || event.isChannelOp(channel)) {
|
||||||
val link = cmd.substring(1)
|
val link = cmd.substring(1)
|
||||||
if (link.matches(LinksManager.LINK_MATCH.toRegex())) {
|
if (link.matches(LinksManager.LINK_MATCH)) {
|
||||||
val oldLink = entry.link
|
val oldLink = entry.link
|
||||||
entry.link = link
|
entry.link = link
|
||||||
LinksManager.pinboard.updatePin(event.bot().serverHostname, oldLink, entry)
|
LinksManager.pinboard.updatePin(event.bot().serverHostname, oldLink, entry)
|
||||||
event.sendMessage(EntriesUtils.buildLink(entryIndex, entry))
|
event.sendMessage(EntriesUtils.printLink(entryIndex, entry))
|
||||||
entries.save()
|
entries.save()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -128,7 +128,7 @@ class Posting : AbstractCommand() {
|
||||||
val entry: EntryLink = entries.links[index]
|
val entry: EntryLink = entries.links[index]
|
||||||
entry.nick = cmd.substring(1)
|
entry.nick = cmd.substring(1)
|
||||||
LinksManager.pinboard.updatePin(event.bot().serverHostname, entry.link, entry)
|
LinksManager.pinboard.updatePin(event.bot().serverHostname, entry.link, entry)
|
||||||
event.sendMessage(EntriesUtils.buildLink(index, entry))
|
event.sendMessage(EntriesUtils.printLink(index, entry))
|
||||||
entries.save()
|
entries.save()
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -151,14 +151,14 @@ class Posting : AbstractCommand() {
|
||||||
|
|
||||||
private fun showEntry(index: Int, event: GenericMessageEvent) {
|
private fun showEntry(index: Int, event: GenericMessageEvent) {
|
||||||
val entry: EntryLink = entries.links[index]
|
val entry: EntryLink = entries.links[index]
|
||||||
event.sendMessage(EntriesUtils.buildLink(index, entry))
|
event.sendMessage(EntriesUtils.printLink(index, entry))
|
||||||
if (entry.tags.isNotEmpty()) {
|
if (entry.tags.isNotEmpty()) {
|
||||||
event.sendMessage(EntriesUtils.buildTags(index, entry))
|
event.sendMessage(EntriesUtils.printTags(index, entry))
|
||||||
}
|
}
|
||||||
if (entry.comments.isNotEmpty()) {
|
if (entry.comments.isNotEmpty()) {
|
||||||
val comments = entry.comments
|
val comments = entry.comments
|
||||||
for (i in comments.indices) {
|
for (i in comments.indices) {
|
||||||
event.sendMessage(EntriesUtils.buildComment(index, i, comments[i]))
|
event.sendMessage(EntriesUtils.printComment(index, i, comments[i]))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,14 +67,14 @@ class Tags : AbstractCommand() {
|
||||||
if (entry.login == event.user.login || event.isChannelOp(channel)) {
|
if (entry.login == event.user.login || event.isChannelOp(channel)) {
|
||||||
entry.setTags(cmd)
|
entry.setTags(cmd)
|
||||||
LinksManager.pinboard.updatePin(event.bot().serverHostname, entry.link, entry)
|
LinksManager.pinboard.updatePin(event.bot().serverHostname, entry.link, entry)
|
||||||
event.sendMessage(EntriesUtils.buildTags(index, entry))
|
event.sendMessage(EntriesUtils.printTags(index, entry))
|
||||||
LinksManager.entries.save()
|
LinksManager.entries.save()
|
||||||
} else {
|
} else {
|
||||||
event.sendMessage("Please ask a channel op to change the tags for you.")
|
event.sendMessage("Please ask a channel op to change the tags for you.")
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (entry.tags.isNotEmpty()) {
|
if (entry.tags.isNotEmpty()) {
|
||||||
event.sendMessage(EntriesUtils.buildTags(index, entry))
|
event.sendMessage(EntriesUtils.printTags(index, entry))
|
||||||
} else {
|
} else {
|
||||||
event.sendMessage("The entry has no tags. Why don't add some?")
|
event.sendMessage("The entry has no tags. Why don't add some?")
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,11 +97,11 @@ class View : AbstractCommand() {
|
||||||
entry = entries.links[index]
|
entry = entries.links[index]
|
||||||
if (query.isNotBlank()) {
|
if (query.isNotBlank()) {
|
||||||
if (entry.matches(query)) {
|
if (entry.matches(query)) {
|
||||||
event.sendMessage(EntriesUtils.buildLink(index, entry, true))
|
event.sendMessage(EntriesUtils.printLink(index, entry, true))
|
||||||
sent++
|
sent++
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
event.sendMessage(EntriesUtils.buildLink(index, entry, true))
|
event.sendMessage(EntriesUtils.printLink(index, entry, true))
|
||||||
sent++
|
sent++
|
||||||
}
|
}
|
||||||
index++
|
index++
|
||||||
|
|
|
@ -37,7 +37,7 @@ import java.time.LocalDateTime
|
||||||
import java.time.format.DateTimeFormatter
|
import java.time.format.DateTimeFormatter
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The `TellMessage` class.
|
* Tell Message.
|
||||||
*/
|
*/
|
||||||
class TellMessage(
|
class TellMessage(
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -40,18 +40,18 @@ import net.thauvin.erik.mobibot.Utils.green
|
||||||
*/
|
*/
|
||||||
object EntriesUtils {
|
object EntriesUtils {
|
||||||
/**
|
/**
|
||||||
* Builds an entry's comment for display on the channel.
|
* Prints an entry's comment for display on the channel.
|
||||||
*/
|
*/
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun buildComment(entryIndex: Int, commentIndex: Int, comment: EntryComment): String =
|
fun printComment(entryIndex: Int, commentIndex: Int, comment: EntryComment): String =
|
||||||
("${entryIndex.toLinkLabel()}.${commentIndex + 1}: [${comment.nick}] ${comment.comment}")
|
("${entryIndex.toLinkLabel()}.${commentIndex + 1}: [${comment.nick}] ${comment.comment}")
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Builds an entry's link for display on the channel.
|
* Prints an entry's link for display on the channel.
|
||||||
*/
|
*/
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
@JvmOverloads
|
@JvmOverloads
|
||||||
fun buildLink(entryIndex: Int, entry: EntryLink, isView: Boolean = false): String {
|
fun printLink(entryIndex: Int, entry: EntryLink, isView: Boolean = false): String {
|
||||||
val buff = StringBuilder().append(entryIndex.toLinkLabel()).append(": ")
|
val buff = StringBuilder().append(entryIndex.toLinkLabel()).append(": ")
|
||||||
.append('[').append(entry.nick).append(']')
|
.append('[').append(entry.nick).append(']')
|
||||||
if (isView && entry.comments.isNotEmpty()) {
|
if (isView && entry.comments.isNotEmpty()) {
|
||||||
|
@ -70,14 +70,14 @@ object EntriesUtils {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build an entry's tags/categories for display on the channel.
|
* Prints an entry's tags/categories for display on the channel. e.g. L1T: tag1, tag2
|
||||||
*/
|
*/
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun buildTags(entryIndex: Int, entry: EntryLink): String =
|
fun printTags(entryIndex: Int, entry: EntryLink): String =
|
||||||
entryIndex.toLinkLabel() + "${Constants.TAG_CMD}: " + entry.pinboardTags.replace(",", ", ")
|
entryIndex.toLinkLabel() + "${Constants.TAG_CMD}: " + entry.formatTags(", ")
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build link label based on its index. e.g: L1
|
* Builds link label based on its index. e.g: L1
|
||||||
*/
|
*/
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun Int.toLinkLabel(): String = Constants.LINK_CMD + (this + 1)
|
fun Int.toLinkLabel(): String = Constants.LINK_CMD + (this + 1)
|
||||||
|
|
|
@ -127,24 +127,18 @@ class EntryLink(
|
||||||
return comments.remove(entryComment)
|
return comments.remove(entryComment)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Formats the tags.
|
||||||
|
*/
|
||||||
|
fun formatTags(sep: String, prefix: String = "") : String {
|
||||||
|
return tags.joinToString(separator = sep, prefix = prefix){it.name}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a comment.
|
* Returns a comment.
|
||||||
*/
|
*/
|
||||||
fun getComment(index: Int): EntryComment = comments[index]
|
fun getComment(index: Int): EntryComment = comments[index]
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the tags formatted for pinboard.in
|
|
||||||
*/
|
|
||||||
val pinboardTags: String
|
|
||||||
get() {
|
|
||||||
val pinboardTags = StringBuilder(nick)
|
|
||||||
for (tag in tags) {
|
|
||||||
pinboardTags.append(',')
|
|
||||||
pinboardTags.append(tag.name)
|
|
||||||
}
|
|
||||||
return pinboardTags.toString()
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if a string is contained in the link, title, or nick.
|
* Returns true if a string is contained in the link, title, or nick.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -160,7 +160,7 @@ class FeedsManager private constructor() {
|
||||||
item.description = SyndContentImpl().apply { value = buff.toString() }
|
item.description = SyndContentImpl().apply { value = buff.toString() }
|
||||||
item.title = title
|
item.title = title
|
||||||
item.publishedDate = date
|
item.publishedDate = date
|
||||||
item.author = "${channel.substring(1)}@${entries.ircServer} ($nick)"
|
item.author = "${channel.removePrefix("#")}@${entries.ircServer} ($nick)"
|
||||||
item.categories = tags
|
item.categories = tags
|
||||||
items.add(item)
|
items.add(item)
|
||||||
}
|
}
|
||||||
|
|
|
@ -113,7 +113,7 @@ abstract class AbstractModule {
|
||||||
*/
|
*/
|
||||||
open val isValidProperties: Boolean
|
open val isValidProperties: Boolean
|
||||||
get() {
|
get() {
|
||||||
for (s in propertyKeys) {
|
for (s in properties.keys) {
|
||||||
if (properties[s].isNullOrBlank()) {
|
if (properties[s].isNullOrBlank()) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,12 +46,12 @@ import java.net.http.HttpClient
|
||||||
import java.net.http.HttpRequest
|
import java.net.http.HttpRequest
|
||||||
import java.net.http.HttpResponse
|
import java.net.http.HttpResponse
|
||||||
|
|
||||||
class ChatGpt : ThreadedModule() {
|
class ChatGpt : AbstractModule() {
|
||||||
private val logger: Logger = LoggerFactory.getLogger(ChatGpt::class.java)
|
private val logger: Logger = LoggerFactory.getLogger(ChatGpt::class.java)
|
||||||
|
|
||||||
override val name = "ChatGPT"
|
override val name = "ChatGPT"
|
||||||
|
|
||||||
override fun run(channel: String, cmd: String, args: String, event: GenericMessageEvent) {
|
override fun commandResponse(channel: String, cmd: String, args: String, event: GenericMessageEvent) {
|
||||||
if (args.isNotBlank()) {
|
if (args.isNotBlank()) {
|
||||||
try {
|
try {
|
||||||
event.sendMessage(
|
event.sendMessage(
|
||||||
|
|
|
@ -46,7 +46,7 @@ import java.io.IOException
|
||||||
/**
|
/**
|
||||||
* The Cryptocurrency Prices module.
|
* The Cryptocurrency Prices module.
|
||||||
*/
|
*/
|
||||||
class CryptoPrices : ThreadedModule() {
|
class CryptoPrices : AbstractModule() {
|
||||||
private val logger: Logger = LoggerFactory.getLogger(CryptoPrices::class.java)
|
private val logger: Logger = LoggerFactory.getLogger(CryptoPrices::class.java)
|
||||||
|
|
||||||
override val name = "CryptoPrices"
|
override val name = "CryptoPrices"
|
||||||
|
@ -55,7 +55,7 @@ class CryptoPrices : ThreadedModule() {
|
||||||
* Returns the cryptocurrency market price from
|
* Returns the cryptocurrency market price from
|
||||||
* [Coinbase](https://docs.cloud.coinbase.com/sign-in-with-coinbase/docs/api-prices#get-spot-price).
|
* [Coinbase](https://docs.cloud.coinbase.com/sign-in-with-coinbase/docs/api-prices#get-spot-price).
|
||||||
*/
|
*/
|
||||||
override fun run(channel: String, cmd: String, args: String, event: GenericMessageEvent) {
|
override fun commandResponse(channel: String, cmd: String, args: String, event: GenericMessageEvent) {
|
||||||
if (CURRENCIES.isEmpty()) {
|
if (CURRENCIES.isEmpty()) {
|
||||||
try {
|
try {
|
||||||
loadCurrencies()
|
loadCurrencies()
|
||||||
|
|
|
@ -52,7 +52,7 @@ import java.util.TreeMap
|
||||||
/**
|
/**
|
||||||
* The CurrencyConverter module.
|
* The CurrencyConverter module.
|
||||||
*/
|
*/
|
||||||
class CurrencyConverter : ThreadedModule() {
|
class CurrencyConverter : AbstractModule() {
|
||||||
private val logger: Logger = LoggerFactory.getLogger(CurrencyConverter::class.java)
|
private val logger: Logger = LoggerFactory.getLogger(CurrencyConverter::class.java)
|
||||||
|
|
||||||
override val name = "CurrencyConverter"
|
override val name = "CurrencyConverter"
|
||||||
|
@ -71,7 +71,7 @@ class CurrencyConverter : ThreadedModule() {
|
||||||
/**
|
/**
|
||||||
* Converts the specified currencies.
|
* Converts the specified currencies.
|
||||||
*/
|
*/
|
||||||
override fun run(channel: String, cmd: String, args: String, event: GenericMessageEvent) {
|
override fun commandResponse(channel: String, cmd: String, args: String, event: GenericMessageEvent) {
|
||||||
reload()
|
reload()
|
||||||
|
|
||||||
if (SYMBOLS.isEmpty()) {
|
if (SYMBOLS.isEmpty()) {
|
||||||
|
|
|
@ -54,7 +54,7 @@ import java.net.URL
|
||||||
/**
|
/**
|
||||||
* The GoogleSearch module.
|
* The GoogleSearch module.
|
||||||
*/
|
*/
|
||||||
class GoogleSearch : ThreadedModule() {
|
class GoogleSearch : AbstractModule() {
|
||||||
private val logger: Logger = LoggerFactory.getLogger(GoogleSearch::class.java)
|
private val logger: Logger = LoggerFactory.getLogger(GoogleSearch::class.java)
|
||||||
|
|
||||||
override val name = "GoogleSearch"
|
override val name = "GoogleSearch"
|
||||||
|
@ -62,7 +62,7 @@ class GoogleSearch : ThreadedModule() {
|
||||||
/**
|
/**
|
||||||
* Searches Google.
|
* Searches Google.
|
||||||
*/
|
*/
|
||||||
override fun run(channel: String, cmd: String, args: String, event: GenericMessageEvent) {
|
override fun commandResponse(channel: String, cmd: String, args: String, event: GenericMessageEvent) {
|
||||||
if (args.isNotBlank()) {
|
if (args.isNotBlank()) {
|
||||||
try {
|
try {
|
||||||
val results = searchGoogle(
|
val results = searchGoogle(
|
||||||
|
|
|
@ -31,8 +31,6 @@
|
||||||
*/
|
*/
|
||||||
package net.thauvin.erik.mobibot.modules
|
package net.thauvin.erik.mobibot.modules
|
||||||
|
|
||||||
import kotlinx.coroutines.launch
|
|
||||||
import kotlinx.coroutines.runBlocking
|
|
||||||
import net.thauvin.erik.jokeapi.exceptions.HttpErrorException
|
import net.thauvin.erik.jokeapi.exceptions.HttpErrorException
|
||||||
import net.thauvin.erik.jokeapi.exceptions.JokeException
|
import net.thauvin.erik.jokeapi.exceptions.JokeException
|
||||||
import net.thauvin.erik.jokeapi.getJoke
|
import net.thauvin.erik.jokeapi.getJoke
|
||||||
|
@ -52,21 +50,15 @@ import java.io.IOException
|
||||||
/**
|
/**
|
||||||
* The Joke module.
|
* The Joke module.
|
||||||
*/
|
*/
|
||||||
class Joke : ThreadedModule() {
|
class Joke : AbstractModule() {
|
||||||
private val logger: Logger = LoggerFactory.getLogger(Joke::class.java)
|
private val logger: Logger = LoggerFactory.getLogger(Joke::class.java)
|
||||||
|
|
||||||
override val name = "Joke"
|
override val name = "Joke"
|
||||||
|
|
||||||
override fun commandResponse(channel: String, cmd: String, args: String, event: GenericMessageEvent) {
|
|
||||||
runBlocking {
|
|
||||||
launch { run(channel, cmd, args, event) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a random joke from [JokeAPI](https://v2.jokeapi.dev/).
|
* Returns a random joke from [JokeAPI](https://v2.jokeapi.dev/).
|
||||||
*/
|
*/
|
||||||
override fun run(channel: String, cmd: String, args: String, event: GenericMessageEvent) {
|
override fun commandResponse(channel: String, cmd: String, args: String, event: GenericMessageEvent) {
|
||||||
with(event.bot()) {
|
with(event.bot()) {
|
||||||
try {
|
try {
|
||||||
randomJoke().forEach {
|
randomJoke().forEach {
|
||||||
|
@ -92,12 +84,8 @@ class Joke : ThreadedModule() {
|
||||||
@Throws(ModuleException::class)
|
@Throws(ModuleException::class)
|
||||||
fun randomJoke(): List<Message> {
|
fun randomJoke(): List<Message> {
|
||||||
return try {
|
return try {
|
||||||
val messages = mutableListOf<Message>()
|
|
||||||
val joke = getJoke(safe = true, type = Type.SINGLE, splitNewLine = true)
|
val joke = getJoke(safe = true, type = Type.SINGLE, splitNewLine = true)
|
||||||
joke.joke.forEach {
|
joke.joke.map { PublicMessage(it, Colors.CYAN) }
|
||||||
messages.add(PublicMessage(it, Colors.CYAN))
|
|
||||||
}
|
|
||||||
messages
|
|
||||||
} catch (e: JokeException) {
|
} catch (e: JokeException) {
|
||||||
throw ModuleException("randomJoke(): ${e.additionalInfo}", e.message, e)
|
throw ModuleException("randomJoke(): ${e.additionalInfo}", e.message, e)
|
||||||
} catch (e: HttpErrorException) {
|
} catch (e: HttpErrorException) {
|
||||||
|
|
|
@ -52,23 +52,21 @@ class Mastodon : SocialModule() {
|
||||||
get() = properties[HANDLE_PROP]
|
get() = properties[HANDLE_PROP]
|
||||||
|
|
||||||
override val isAutoPost: Boolean
|
override val isAutoPost: Boolean
|
||||||
get() = isEnabled && properties[Twitter.AUTO_POST_PROP].toBoolean()
|
get() = isEnabled && properties[AUTO_POST_PROP].toBoolean()
|
||||||
|
|
||||||
override val isValidProperties: Boolean
|
override val isValidProperties: Boolean
|
||||||
get() {
|
get() = !(properties[INSTANCE_PROP].isNullOrBlank() || properties[ACCESS_TOKEN_PROP].isNullOrBlank())
|
||||||
for (s in propertyKeys) {
|
|
||||||
if (AUTO_POST_PROP != s && HANDLE_PROP != s && properties[s].isNullOrBlank()) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Formats the entry for posting.
|
* Formats the entry for posting.
|
||||||
*/
|
*/
|
||||||
override fun formatEntry(entry: EntryLink): String {
|
override fun formatEntry(entry: EntryLink): String {
|
||||||
return "${entry.title} via ${entry.nick} on ${entry.channel}\n\n${entry.link}"
|
return "${entry.title} (via ${entry.nick} on ${entry.channel})${formatTags(entry)}\n\n${entry.link}"
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun formatTags(entry: EntryLink): String {
|
||||||
|
return entry.tags.filter { !it.name.equals(entry.channel.removePrefix("#"), true) }
|
||||||
|
.joinToString(separator = " ", prefix = "\n\n") { "#${it.name}" }
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -95,7 +93,7 @@ class Mastodon : SocialModule() {
|
||||||
private const val MASTODON_CMD = "mastodon"
|
private const val MASTODON_CMD = "mastodon"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Toots on Mastodon.
|
* Post on Mastodon.
|
||||||
*/
|
*/
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
@Throws(ModuleException::class)
|
@Throws(ModuleException::class)
|
||||||
|
|
|
@ -52,7 +52,7 @@ import java.net.URL
|
||||||
/**
|
/**
|
||||||
* The StockQuote module.
|
* The StockQuote module.
|
||||||
*/
|
*/
|
||||||
class StockQuote : ThreadedModule() {
|
class StockQuote : AbstractModule() {
|
||||||
private val logger: Logger = LoggerFactory.getLogger(StockQuote::class.java)
|
private val logger: Logger = LoggerFactory.getLogger(StockQuote::class.java)
|
||||||
|
|
||||||
override val name = "StockQuote"
|
override val name = "StockQuote"
|
||||||
|
@ -60,7 +60,7 @@ class StockQuote : ThreadedModule() {
|
||||||
/**
|
/**
|
||||||
* Returns the specified stock quote from Alpha Vantage.
|
* Returns the specified stock quote from Alpha Vantage.
|
||||||
*/
|
*/
|
||||||
override fun run(channel: String, cmd: String, args: String, event: GenericMessageEvent) {
|
override fun commandResponse(channel: String, cmd: String, args: String, event: GenericMessageEvent) {
|
||||||
if (args.isNotBlank()) {
|
if (args.isNotBlank()) {
|
||||||
try {
|
try {
|
||||||
val messages = getQuote(args, properties[ALPHAVANTAGE_API_KEY_PROP])
|
val messages = getQuote(args, properties[ALPHAVANTAGE_API_KEY_PROP])
|
||||||
|
|
|
@ -1,58 +0,0 @@
|
||||||
/*
|
|
||||||
* ThreadedModule.kt
|
|
||||||
*
|
|
||||||
* Copyright (c) 2004-2022, 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.modules
|
|
||||||
|
|
||||||
import kotlinx.coroutines.launch
|
|
||||||
import kotlinx.coroutines.runBlocking
|
|
||||||
import org.pircbotx.hooks.types.GenericMessageEvent
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The `ThreadedModule` class.
|
|
||||||
*/
|
|
||||||
abstract class ThreadedModule : AbstractModule() {
|
|
||||||
override fun commandResponse(channel: String, cmd: String, args: String, event: GenericMessageEvent) {
|
|
||||||
if (isEnabled && event.message.isNotEmpty()) {
|
|
||||||
runBlocking {
|
|
||||||
launch {
|
|
||||||
run(channel, cmd, args, event)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
helpResponse(event)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Runs the thread.
|
|
||||||
*/
|
|
||||||
abstract fun run(channel: String, cmd: String, args: String, event: GenericMessageEvent)
|
|
||||||
}
|
|
|
@ -49,14 +49,8 @@ class Twitter : SocialModule() {
|
||||||
get() = isEnabled && properties[AUTO_POST_PROP].toBoolean()
|
get() = isEnabled && properties[AUTO_POST_PROP].toBoolean()
|
||||||
|
|
||||||
override val isValidProperties: Boolean
|
override val isValidProperties: Boolean
|
||||||
get() {
|
get() = !(properties[CONSUMER_KEY_PROP].isNullOrBlank() || properties[CONSUMER_SECRET_PROP].isNullOrBlank()
|
||||||
for (s in propertyKeys) {
|
|| properties[TOKEN_PROP].isNullOrBlank() || properties[TOKEN_SECRET_PROP].isNullOrBlank())
|
||||||
if (AUTO_POST_PROP != s && HANDLE_PROP != s && properties[s].isNullOrBlank()) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Formats the entry for posting.
|
* Formats the entry for posting.
|
||||||
|
@ -94,7 +88,7 @@ class Twitter : SocialModule() {
|
||||||
private const val TWITTER_CMD = "twitter"
|
private const val TWITTER_CMD = "twitter"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tweets on Twitter.
|
* Post on Twitter.
|
||||||
*/
|
*/
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
@Throws(ModuleException::class)
|
@Throws(ModuleException::class)
|
||||||
|
|
|
@ -54,7 +54,7 @@ import kotlin.math.roundToInt
|
||||||
/**
|
/**
|
||||||
* The `Weather2` module.
|
* The `Weather2` module.
|
||||||
*/
|
*/
|
||||||
class Weather2 : ThreadedModule() {
|
class Weather2 : AbstractModule() {
|
||||||
private val logger: Logger = LoggerFactory.getLogger(Weather2::class.java)
|
private val logger: Logger = LoggerFactory.getLogger(Weather2::class.java)
|
||||||
|
|
||||||
override val name = "Weather"
|
override val name = "Weather"
|
||||||
|
@ -62,7 +62,7 @@ class Weather2 : ThreadedModule() {
|
||||||
/**
|
/**
|
||||||
* Fetches the weather data from a specific city.
|
* Fetches the weather data from a specific city.
|
||||||
*/
|
*/
|
||||||
override fun run(channel: String, cmd: String, args: String, event: GenericMessageEvent) {
|
override fun commandResponse(channel: String, cmd: String, args: String, event: GenericMessageEvent) {
|
||||||
if (args.isNotBlank()) {
|
if (args.isNotBlank()) {
|
||||||
try {
|
try {
|
||||||
val messages = getWeather(args, properties[OWM_API_KEY_PROP])
|
val messages = getWeather(args, properties[OWM_API_KEY_PROP])
|
||||||
|
|
|
@ -43,7 +43,7 @@ import org.slf4j.LoggerFactory
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
import java.net.URL
|
import java.net.URL
|
||||||
|
|
||||||
class WolframAlpha : ThreadedModule() {
|
class WolframAlpha : AbstractModule() {
|
||||||
private val logger: Logger = LoggerFactory.getLogger(WolframAlpha::class.java)
|
private val logger: Logger = LoggerFactory.getLogger(WolframAlpha::class.java)
|
||||||
|
|
||||||
override val name = "WolframAlpha"
|
override val name = "WolframAlpha"
|
||||||
|
@ -56,7 +56,7 @@ class WolframAlpha : ThreadedModule() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun run(channel: String, cmd: String, args: String, event: GenericMessageEvent) {
|
override fun commandResponse(channel: String, cmd: String, args: String, event: GenericMessageEvent) {
|
||||||
if (args.isNotBlank()) {
|
if (args.isNotBlank()) {
|
||||||
try {
|
try {
|
||||||
val query = args.trim().split("units=", limit = 2, ignoreCase = true)
|
val query = args.trim().split("units=", limit = 2, ignoreCase = true)
|
||||||
|
|
|
@ -110,8 +110,8 @@ class SocialManager {
|
||||||
*/
|
*/
|
||||||
fun shutdown() {
|
fun shutdown() {
|
||||||
timer.cancel()
|
timer.cancel()
|
||||||
for (index in entries) {
|
entries.forEach {
|
||||||
postEntry(index)
|
postEntry(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,18 +32,16 @@
|
||||||
|
|
||||||
package net.thauvin.erik.mobibot.social
|
package net.thauvin.erik.mobibot.social
|
||||||
|
|
||||||
import kotlinx.coroutines.launch
|
|
||||||
import kotlinx.coroutines.runBlocking
|
|
||||||
import net.thauvin.erik.mobibot.commands.links.LinksManager
|
import net.thauvin.erik.mobibot.commands.links.LinksManager
|
||||||
import net.thauvin.erik.mobibot.entries.EntriesUtils.toLinkLabel
|
import net.thauvin.erik.mobibot.entries.EntriesUtils.toLinkLabel
|
||||||
import net.thauvin.erik.mobibot.entries.EntryLink
|
import net.thauvin.erik.mobibot.entries.EntryLink
|
||||||
|
import net.thauvin.erik.mobibot.modules.AbstractModule
|
||||||
import net.thauvin.erik.mobibot.modules.ModuleException
|
import net.thauvin.erik.mobibot.modules.ModuleException
|
||||||
import net.thauvin.erik.mobibot.modules.ThreadedModule
|
|
||||||
import org.pircbotx.hooks.types.GenericMessageEvent
|
import org.pircbotx.hooks.types.GenericMessageEvent
|
||||||
import org.slf4j.Logger
|
import org.slf4j.Logger
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
|
|
||||||
abstract class SocialModule : ThreadedModule() {
|
abstract class SocialModule : AbstractModule() {
|
||||||
private val logger: Logger = LoggerFactory.getLogger(SocialManager::class.java)
|
private val logger: Logger = LoggerFactory.getLogger(SocialManager::class.java)
|
||||||
|
|
||||||
abstract val handle: String?
|
abstract val handle: String?
|
||||||
|
@ -56,8 +54,6 @@ abstract class SocialModule : ThreadedModule() {
|
||||||
*/
|
*/
|
||||||
fun notification(msg: String) {
|
fun notification(msg: String) {
|
||||||
if (isEnabled && !handle.isNullOrBlank()) {
|
if (isEnabled && !handle.isNullOrBlank()) {
|
||||||
runBlocking {
|
|
||||||
launch {
|
|
||||||
try {
|
try {
|
||||||
post(message = msg, isDm = true)
|
post(message = msg, isDm = true)
|
||||||
if (logger.isDebugEnabled) logger.debug("Notified $handle on $name: $msg")
|
if (logger.isDebugEnabled) logger.debug("Notified $handle on $name: $msg")
|
||||||
|
@ -66,8 +62,6 @@ abstract class SocialModule : ThreadedModule() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
abstract fun post(message: String, isDm: Boolean): String
|
abstract fun post(message: String, isDm: Boolean): String
|
||||||
|
|
||||||
|
@ -76,8 +70,6 @@ abstract class SocialModule : ThreadedModule() {
|
||||||
*/
|
*/
|
||||||
fun postEntry(index: Int) {
|
fun postEntry(index: Int) {
|
||||||
if (isAutoPost && LinksManager.entries.links.size >= index) {
|
if (isAutoPost && LinksManager.entries.links.size >= index) {
|
||||||
runBlocking {
|
|
||||||
launch {
|
|
||||||
try {
|
try {
|
||||||
if (logger.isDebugEnabled) {
|
if (logger.isDebugEnabled) {
|
||||||
logger.debug("Posting {} to $name.", index.toLinkLabel())
|
logger.debug("Posting {} to $name.", index.toLinkLabel())
|
||||||
|
@ -91,10 +83,8 @@ abstract class SocialModule : ThreadedModule() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun run(channel: String, cmd: String, args: String, event: GenericMessageEvent) {
|
override fun commandResponse(channel: String, cmd: String, args: String, event: GenericMessageEvent) {
|
||||||
try {
|
try {
|
||||||
event.respond(post("$args (by ${event.user.nick} on $channel)", false))
|
event.respond(post("$args (by ${event.user.nick} on $channel)", false))
|
||||||
} catch (e: ModuleException) {
|
} catch (e: ModuleException) {
|
||||||
|
|
|
@ -36,9 +36,9 @@ import assertk.assertThat
|
||||||
import assertk.assertions.contains
|
import assertk.assertions.contains
|
||||||
import assertk.assertions.isEqualTo
|
import assertk.assertions.isEqualTo
|
||||||
import net.thauvin.erik.mobibot.Constants
|
import net.thauvin.erik.mobibot.Constants
|
||||||
import net.thauvin.erik.mobibot.entries.EntriesUtils.buildComment
|
import net.thauvin.erik.mobibot.entries.EntriesUtils.printComment
|
||||||
import net.thauvin.erik.mobibot.entries.EntriesUtils.buildLink
|
import net.thauvin.erik.mobibot.entries.EntriesUtils.printLink
|
||||||
import net.thauvin.erik.mobibot.entries.EntriesUtils.buildTags
|
import net.thauvin.erik.mobibot.entries.EntriesUtils.printTags
|
||||||
import net.thauvin.erik.mobibot.entries.EntriesUtils.toLinkLabel
|
import net.thauvin.erik.mobibot.entries.EntriesUtils.toLinkLabel
|
||||||
import org.testng.annotations.Test
|
import org.testng.annotations.Test
|
||||||
|
|
||||||
|
@ -60,33 +60,33 @@ class EntriesUtilsTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(groups = ["entries"])
|
@Test(groups = ["entries"])
|
||||||
fun buildLinkLabelTest() {
|
fun printCommentTest() {
|
||||||
assertThat(1.toLinkLabel()).isEqualTo("${Constants.LINK_CMD}2")
|
assertThat(printComment(0, 0, comment)).isEqualTo("${Constants.LINK_CMD}1.1: [nick] comment")
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(groups = ["entries"])
|
@Test(groups = ["entries"])
|
||||||
fun buildCommentTest() {
|
fun printLinkTest() {
|
||||||
assertThat(buildComment(0, 0, comment)).isEqualTo("${Constants.LINK_CMD}1.1: [nick] comment")
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test(groups = ["entries"])
|
|
||||||
fun buildLinkTest() {
|
|
||||||
for (i in links.indices) {
|
for (i in links.indices) {
|
||||||
assertThat(
|
assertThat(
|
||||||
buildLink(i - 1, links[i]), "link $i"
|
printLink(i - 1, links[i]), "link $i"
|
||||||
).isEqualTo("L$i: [Skynx$i] \u0002Mobitopia$i\u0002 ( \u000303https://www.mobitopia.org/$i\u000F )")
|
).isEqualTo("L$i: [Skynx$i] \u0002Mobitopia$i\u0002 ( \u000303https://www.mobitopia.org/$i\u000F )")
|
||||||
}
|
}
|
||||||
|
|
||||||
assertThat(links.first().addComment(comment), "addComment()").isEqualTo(0)
|
assertThat(links.first().addComment(comment), "addComment()").isEqualTo(0)
|
||||||
assertThat(buildLink(0, links.first(), isView = true), "buildLink(isView=true)").contains("[+1]")
|
assertThat(printLink(0, links.first(), isView = true), "printLink(isView=true)").contains("[+1]")
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(groups = ["entries"])
|
@Test(groups = ["entries"])
|
||||||
fun buildTagsTest() {
|
fun printTagsTest() {
|
||||||
for (i in links.indices) {
|
for (i in links.indices) {
|
||||||
assertThat(
|
assertThat(
|
||||||
buildTags(i - 1, links[i]), "tag $i"
|
printTags(i - 1, links[i]), "tag $i"
|
||||||
).isEqualTo("L${i}T: Skynx$i, tag1, tag2, tag3, tag4, tag5")
|
).isEqualTo("L${i}T: tag1, tag2, tag3, tag4, tag5")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test(groups = ["entries"])
|
||||||
|
fun toLinkLabelTest() {
|
||||||
|
assertThat(1.toLinkLabel()).isEqualTo("${Constants.LINK_CMD}2")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -94,13 +94,11 @@ class EntryLinkTest {
|
||||||
|
|
||||||
@Test(groups = ["entries"])
|
@Test(groups = ["entries"])
|
||||||
fun testConstructor() {
|
fun testConstructor() {
|
||||||
val tag = "test"
|
val tags = listOf(SyndCategoryImpl().apply { name = "tag1" }, SyndCategoryImpl().apply { name = "tag2" })
|
||||||
val tags = listOf(SyndCategoryImpl().apply { name = tag })
|
|
||||||
val link = EntryLink("link", "title", "nick", "channel", Date(), tags)
|
val link = EntryLink("link", "title", "nick", "channel", Date(), tags)
|
||||||
assertThat(link, "link").all {
|
assertThat(link, "link").all {
|
||||||
prop(EntryLink::tags).size().isEqualTo(tags.size)
|
prop(EntryLink::tags).size().isEqualTo(tags.size)
|
||||||
prop(EntryLink::tags).index(0).prop(SyndCategory::getName).isEqualTo(tag)
|
prop(EntryLink::tags).index(0).prop(SyndCategory::getName).isEqualTo("tag1")
|
||||||
prop(EntryLink::pinboardTags).isEqualTo("nick,$tag")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,11 +120,17 @@ class EntryLinkTest {
|
||||||
assertThat(tag.name, "tag.name($i)").isEqualTo("tag${i + 1}")
|
assertThat(tag.name, "tag.name($i)").isEqualTo("tag${i + 1}")
|
||||||
}
|
}
|
||||||
assertThat(entryLink::tags).size().isEqualTo(5)
|
assertThat(entryLink::tags).size().isEqualTo(5)
|
||||||
entryLink.setTags("-tag5")
|
entryLink.setTags("-tag5, tag4")
|
||||||
entryLink.setTags("+mobitopia")
|
entryLink.setTags("+mobitopia")
|
||||||
entryLink.setTags("tag4")
|
|
||||||
entryLink.setTags("-mobitopia")
|
entryLink.setTags("-mobitopia")
|
||||||
assertThat(entryLink::pinboardTags).isEqualTo(entryLink.nick + ",tag1,tag2,tag3,tag4,mobitopia")
|
assertThat(
|
||||||
|
entryLink.formatTags(","),
|
||||||
|
"formatTags(',')"
|
||||||
|
).isEqualTo("tag1,tag2,tag3,tag4,mobitopia")
|
||||||
|
entryLink.setTags("-tag4 tag5")
|
||||||
|
assertThat(
|
||||||
|
entryLink.formatTags(" ", ","), "formatTag(' ',',')"
|
||||||
|
).isEqualTo(",tag1 tag2 tag3 mobitopia tag5")
|
||||||
val size = entryLink.tags.size
|
val size = entryLink.tags.size
|
||||||
entryLink.setTags("")
|
entryLink.setTags("")
|
||||||
assertThat(entryLink.tags, "setTags('')").size().isEqualTo(size)
|
assertThat(entryLink.tags, "setTags('')").size().isEqualTo(size)
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
#Generated by the Semver Plugin for Gradle
|
#Generated by the Semver Plugin for Gradle
|
||||||
#Mon Dec 05 21:57:24 PST 2022
|
#Sat Dec 10 10:16:56 PST 2022
|
||||||
version.buildmeta=814
|
version.buildmeta=874
|
||||||
version.major=0
|
version.major=0
|
||||||
version.minor=8
|
version.minor=8
|
||||||
version.patch=0
|
version.patch=0
|
||||||
version.prerelease=rc
|
version.prerelease=rc
|
||||||
version.project=mobibot
|
version.project=mobibot
|
||||||
version.semver=0.8.0-rc+814
|
version.semver=0.8.0-rc+874
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue