diff --git a/vilebot/src/main/java/com/oldterns/vilebot/Vilebot.java b/vilebot/src/main/java/com/oldterns/vilebot/Vilebot.java index 80a11bb4..77aa8a69 100644 --- a/vilebot/src/main/java/com/oldterns/vilebot/Vilebot.java +++ b/vilebot/src/main/java/com/oldterns/vilebot/Vilebot.java @@ -6,10 +6,56 @@ */ package com.oldterns.vilebot; -import com.oldterns.vilebot.handlers.admin.*; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import com.oldterns.vilebot.handlers.admin.AdminManagement; +import com.oldterns.vilebot.handlers.admin.AdminPing; +import com.oldterns.vilebot.handlers.admin.Auth; +import com.oldterns.vilebot.handlers.admin.GetLog; +import com.oldterns.vilebot.handlers.admin.NickChange; +import com.oldterns.vilebot.handlers.admin.Quit; +import com.oldterns.vilebot.handlers.user.AnswerQuestion; +import com.oldterns.vilebot.handlers.user.Ascii; +import com.oldterns.vilebot.handlers.user.ChatLogger; +import com.oldterns.vilebot.handlers.user.Church; +import com.oldterns.vilebot.handlers.user.Countdown; +import com.oldterns.vilebot.handlers.user.Decide; +import com.oldterns.vilebot.handlers.user.Excuses; +import com.oldterns.vilebot.handlers.user.FakeNews; +import com.oldterns.vilebot.handlers.user.Fortune; +import com.oldterns.vilebot.handlers.user.GetInfoOn; import com.oldterns.vilebot.handlers.user.Help; +import com.oldterns.vilebot.handlers.user.ImageToAscii; +import com.oldterns.vilebot.handlers.user.Inspiration; +import com.oldterns.vilebot.handlers.user.Jaziz; +import com.oldterns.vilebot.handlers.user.Jokes; +import com.oldterns.vilebot.handlers.user.Kaomoji; +import com.oldterns.vilebot.handlers.user.Karma; +import com.oldterns.vilebot.handlers.user.KarmaRoll; +import com.oldterns.vilebot.handlers.user.LastMessageSed; +import com.oldterns.vilebot.handlers.user.LastSeen; +import com.oldterns.vilebot.handlers.user.Markov; +import com.oldterns.vilebot.handlers.user.News; +import com.oldterns.vilebot.handlers.user.Omgword; import com.oldterns.vilebot.handlers.user.Ops; -import com.oldterns.vilebot.handlers.user.*; +import com.oldterns.vilebot.handlers.user.QuotesAndFacts; +import com.oldterns.vilebot.handlers.user.Reddit; +import com.oldterns.vilebot.handlers.user.RemindMe; +import com.oldterns.vilebot.handlers.user.RockPaperScissors; +import com.oldterns.vilebot.handlers.user.Trivia; +import com.oldterns.vilebot.handlers.user.Ttc; +import com.oldterns.vilebot.handlers.user.TwitterCorrection; +import com.oldterns.vilebot.handlers.user.UrlTitleAnnouncer; +import com.oldterns.vilebot.handlers.user.UrlTweetAnnouncer; +import com.oldterns.vilebot.handlers.user.UserPing; +import com.oldterns.vilebot.handlers.user.Userlists; +import com.oldterns.vilebot.handlers.user.Weather; import com.oldterns.vilebot.util.BaseNick; import org.pircbotx.Configuration; import org.pircbotx.MultiBotManager; @@ -21,14 +67,6 @@ import redis.clients.jedis.JedisPoolConfig; import redis.clients.jedis.Protocol; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; - public class Vilebot extends ListenerAdapter { @@ -78,7 +116,7 @@ public static void main( String[] args ) Configuration botConfiguration = new Configuration.Builder().setName( ircNick ).setLogin( ircUser ).setRealName( ircRealName ).addServer( ircServerAddress, - ircPort ).addAutoJoinChannel( ircChannel ).setAutoReconnect( true ).addListener( new Vilebot() ).addListener( new AdminManagement() ).addListener( new AdminPing() ).addListener( new Auth() ).addListener( new GetLog() ).addListener( new com.oldterns.vilebot.handlers.admin.Help() ).addListener( new NickChange() ).addListener( new com.oldterns.vilebot.handlers.admin.Ops() ).addListener( new Quit() ).addListener( new AnswerQuestion() ).addListener( new Ascii() ).addListener( new ChatLogger() ).addListener( new Church() ).addListener( new Countdown() ).addListener( new Decide() ).addListener( new Excuses() ).addListener( new FakeNews() ).addListener( new Fortune() ).addListener( new GetInfoOn() ).addListener( new Help() ).addListener( new ImageToAscii() ).addListener( new Inspiration() ).addListener( new Jaziz() ).addListener( new Jokes() ).addListener( new Kaomoji() ).addListener( new Karma() ).addListener( new KarmaRoll() ).addListener( new LastMessageSed() ).addListener( new LastSeen() ).addListener( new Markov() ).addListener( new News() ).addListener( new Omgword() ).addListener( new Ops() ).addListener( new QuotesAndFacts() ).addListener( new RemindMe() ).addListener( new RockPaperScissors() ).addListener( new Trivia() ).addListener( new Ttc() ).addListener( new TwitterCorrection() ).addListener( new UrlTitleAnnouncer() ).addListener( new UrlTweetAnnouncer() ).addListener( new Userlists() ).addListener( new UserPing() ).addListener( new Weather() ).buildConfiguration(); + ircPort ).addAutoJoinChannel( ircChannel ).setAutoReconnect( true ).addListener( new Vilebot() ).addListener( new AdminManagement() ).addListener( new AdminPing() ).addListener( new Auth() ).addListener( new GetLog() ).addListener( new com.oldterns.vilebot.handlers.admin.Help() ).addListener( new NickChange() ).addListener( new com.oldterns.vilebot.handlers.admin.Ops() ).addListener( new Quit() ).addListener( new AnswerQuestion() ).addListener( new Ascii() ).addListener( new ChatLogger() ).addListener( new Church() ).addListener( new Countdown() ).addListener( new Decide() ).addListener( new Excuses() ).addListener( new FakeNews() ).addListener( new Fortune() ).addListener( new GetInfoOn() ).addListener( new Help() ).addListener( new ImageToAscii() ).addListener( new Inspiration() ).addListener( new Jaziz() ).addListener( new Jokes() ).addListener( new Kaomoji() ).addListener( new Karma() ).addListener( new KarmaRoll() ).addListener( new LastMessageSed() ).addListener( new LastSeen() ).addListener( new Markov() ).addListener( new News() ).addListener( new Omgword() ).addListener( new Ops() ).addListener( new QuotesAndFacts() ).addListener( new Reddit() ).addListener( new RemindMe() ).addListener( new RockPaperScissors() ).addListener( new Trivia() ).addListener( new Ttc() ).addListener( new TwitterCorrection() ).addListener( new UrlTitleAnnouncer() ).addListener( new UrlTweetAnnouncer() ).addListener( new Userlists() ).addListener( new UserPing() ).addListener( new Weather() ).buildConfiguration(); botManager.addBot( botConfiguration ); } diff --git a/vilebot/src/main/java/com/oldterns/vilebot/handlers/user/Help.java b/vilebot/src/main/java/com/oldterns/vilebot/handlers/user/Help.java index c126d07b..c0bf8782 100644 --- a/vilebot/src/main/java/com/oldterns/vilebot/handlers/user/Help.java +++ b/vilebot/src/main/java/com/oldterns/vilebot/handlers/user/Help.java @@ -6,12 +6,12 @@ */ package com.oldterns.vilebot.handlers.user; -import org.pircbotx.hooks.ListenerAdapter; -import org.pircbotx.hooks.types.GenericMessageEvent; - import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.pircbotx.hooks.ListenerAdapter; +import org.pircbotx.hooks.types.GenericMessageEvent; + public class Help extends ListenerAdapter { @@ -108,6 +108,7 @@ private static String generateHelpMessage() sb.append( " { !asciifonts }" ); sb.append( " { !news [] }" ); sb.append( " { !fakenews [] }" ); + sb.append( " { !reddit [] } " ); sb.append( "\n" ); sb.append( " Userlists:" ); sb.append( " { !list }" ); diff --git a/vilebot/src/main/java/com/oldterns/vilebot/handlers/user/QuotesAndFacts.java b/vilebot/src/main/java/com/oldterns/vilebot/handlers/user/QuotesAndFacts.java index feb53ae1..db996a37 100644 --- a/vilebot/src/main/java/com/oldterns/vilebot/handlers/user/QuotesAndFacts.java +++ b/vilebot/src/main/java/com/oldterns/vilebot/handlers/user/QuotesAndFacts.java @@ -61,7 +61,7 @@ public class QuotesAndFacts // update cache when new quotes/facts added private Map dumpSize = new HashMap<>(); - private static final String PASTEBIN_API_URL = Vilebot.getConfig().get("pastebinApiUrl"); + private static final String PASTEBIN_API_URL = Vilebot.getConfig().get( "pastebinApiUrl" ); @Override public void onJoin( final JoinEvent event ) // announce fact or quote on join diff --git a/vilebot/src/main/java/com/oldterns/vilebot/handlers/user/Reddit.java b/vilebot/src/main/java/com/oldterns/vilebot/handlers/user/Reddit.java new file mode 100644 index 00000000..fe0ec29a --- /dev/null +++ b/vilebot/src/main/java/com/oldterns/vilebot/handlers/user/Reddit.java @@ -0,0 +1,85 @@ +/** + * Copyright (C) 2019 Oldterns + * + * This file may be modified and distributed under the terms + * of the MIT license. See the LICENSE file for details. + */ + +package com.oldterns.vilebot.handlers.user; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import com.oldterns.vilebot.Vilebot; +import com.oldterns.vilebot.util.LimitCommand; +import com.oldterns.vilebot.util.NewsParser; +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.pircbotx.hooks.types.GenericMessageEvent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Reddit + extends NewsParser +{ + private static final Logger logger = LoggerFactory.getLogger( Reddit.class ); + + private static final Pattern REDDIT_PATTERN = Pattern.compile( "^!reddit(?: ([a-zA-Z]+)|)" ); + + private static final Pattern REDDIT_HELP_PATTERN = Pattern.compile( "^!reddit help" ); + + private final String HELP_MESSAGE = generateHelpMessage(); + + private final String HELP_COMMAND = "'!reddit help'"; + + public static LimitCommand limitCommand = new LimitCommand(); + + private static final String RESTRICTED_CHANNEL = Vilebot.getConfig().get( "ircChannel1" ); + + @Override + public void onGenericMessage( final GenericMessageEvent event ) + { + String text = event.getMessage(); + Matcher matcher = REDDIT_PATTERN.matcher( text ); + Matcher helpMatcher = REDDIT_HELP_PATTERN.matcher( text ); + + if ( helpMatcher.matches() ) + { + for ( String line : HELP_MESSAGE.split( "\n" ) ) + { + event.respondPrivateMessage( line ); + } + } + else if ( matcher.matches() ) + { + Map> redditRSSMap = new HashMap<>(); + String subreddit = matcher.group( 1 ) != null ? matcher.group( 1 ) : ""; + try + { + redditRSSMap.put( subreddit, + new ImmutablePair( "Subredit", new URL( new StringBuilder( + "https://reddit.com/" ).append( subreddit.isEmpty() ? subreddit : "r/" + subreddit + "/" ).append( ".rss" ).toString() ) ) ); + currentNews( event, matcher, redditRSSMap, subreddit, HELP_COMMAND, limitCommand, RESTRICTED_CHANNEL, + logger ); + } + catch ( MalformedURLException e ) + { + event.respond( subreddit + " is not a subreddit." ); + } + + } + } + + @Override + protected String generateHelpMessage() + { + StringBuilder sb = new StringBuilder(); + + sb.append( "Reddit (example: !reddit toronto)\n" ); + + return sb.toString(); + } +} diff --git a/vilebot/src/main/java/com/oldterns/vilebot/util/NewsParser.java b/vilebot/src/main/java/com/oldterns/vilebot/util/NewsParser.java index ce3e678c..459f84ef 100644 --- a/vilebot/src/main/java/com/oldterns/vilebot/util/NewsParser.java +++ b/vilebot/src/main/java/com/oldterns/vilebot/util/NewsParser.java @@ -7,6 +7,12 @@ package com.oldterns.vilebot.util; +import java.io.IOException; +import java.net.URL; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; + import com.sun.syndication.feed.synd.SyndEntry; import com.sun.syndication.feed.synd.SyndFeed; import com.sun.syndication.io.FeedException; @@ -19,12 +25,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.net.URL; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.regex.Matcher; - public abstract class NewsParser extends ListenerAdapter { @@ -33,9 +33,8 @@ public abstract class NewsParser protected static final int NUM_HEADLINES = 3; protected void currentNews( GenericMessageEvent event, Matcher matcher, - LinkedHashMap> newsFeedsByCategory, - String defaultCategory, String helpCommand, LimitCommand limitCommand, - String restrictedChannel, Logger logger ) + Map> newsFeedsByCategory, String defaultCategory, + String helpCommand, LimitCommand limitCommand, String restrictedChannel, Logger logger ) { String category = matcher.group( 1 ); // The news category @@ -52,9 +51,8 @@ protected void currentNews( GenericMessageEvent event, Matcher matcher, } } - protected void newsLimit( GenericMessageEvent event, - LinkedHashMap> newsFeedsByCategory, String category, - Logger logger, LimitCommand limitCommand, String restrictedChannel ) + protected void newsLimit( GenericMessageEvent event, Map> newsFeedsByCategory, + String category, Logger logger, LimitCommand limitCommand, String restrictedChannel ) { if ( event instanceof MessageEvent && ( (MessageEvent) event ).getChannel().getName().equals( restrictedChannel ) ) @@ -76,8 +74,8 @@ protected void newsLimit( GenericMessageEvent event, } protected void printHeadlines( GenericMessageEvent event, - LinkedHashMap> newsFeedsByCategory, - String category, Logger logger ) + Map> newsFeedsByCategory, String category, + Logger logger ) { SyndFeedInput input = new SyndFeedInput(); SyndFeed feed = null;