diff --git a/pom.xml b/pom.xml index ff8adf5..83aa9cc 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ ru.bvn13 jircbot - ${bot.version} + ${jircbot.version} jar @@ -18,7 +18,7 @@ - 2.0.8 + 2.1.0 1.8 diff --git a/src/main/java/ru/bvn13/jircbot/MainApp.java b/src/main/java/ru/bvn13/jircbot/MainApp.java index 0de3836..b67fded 100644 --- a/src/main/java/ru/bvn13/jircbot/MainApp.java +++ b/src/main/java/ru/bvn13/jircbot/MainApp.java @@ -2,8 +2,6 @@ package ru.bvn13.jircbot; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import ru.bvn13.jircbot.bot.JircBot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -11,10 +9,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; public class MainApp { private static final Logger logger = LoggerFactory.getLogger(MainApp.class); - - @Autowired - private JircBot bot; - + public static void main(String[] args) { SpringApplication.run(MainApp.class, args); logger.info("==============> STARTING <=============="); diff --git a/src/main/java/ru/bvn13/jircbot/bot/JircBot.java b/src/main/java/ru/bvn13/jircbot/bot/JircBot.java index de43032..98500f7 100644 --- a/src/main/java/ru/bvn13/jircbot/bot/JircBot.java +++ b/src/main/java/ru/bvn13/jircbot/bot/JircBot.java @@ -1,7 +1,6 @@ package ru.bvn13.jircbot.bot; -import lombok.Getter; import org.pircbotx.Configuration; import org.pircbotx.MultiBotManager; import org.pircbotx.PircBotX; @@ -14,7 +13,6 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; -import ru.bvn13.jircbot.services.YandexSearchService; import ru.bvn13.jircbot.config.JircBotConfiguration; import ru.bvn13.jircbot.listeners.*; import ru.bvn13.jircbot.listeners.advices.AdviceListener; @@ -38,9 +36,9 @@ public class JircBot extends ListenerAdapter { private static Logger logger = LoggerFactory.getLogger(JircBot.class); - @Value("${bot.version}") + @Value("${jircbot.version}") private String version; - public String getVersion() { + private String getVersion() { return version == null ? "" : version; } @@ -49,9 +47,6 @@ public class JircBot extends ListenerAdapter { private Map bots = new HashMap<>(); - @Autowired - private YandexSearchService yandexSearchService; - @Autowired public JircBot(JircBotConfiguration config) { @@ -63,64 +58,37 @@ public class JircBot extends ListenerAdapter { private MultiBotManager manager = new MultiBotManager(); - @Autowired private PingPongListener pingPongListener; - @Autowired private CalculatorListener calculatorListener; - @Autowired private RegexCheckerListener regexCheckerListener; - @Autowired private AdviceListener adviceListener; - @Autowired private QuizListener quizListener; - @Autowired private BashOrgListener bashOrgListener; - @Autowired private AutoRejoinListener autoRejoinListener; - @Autowired private DeferredMessagesListener deferredMessagesListener; - - @Autowired private LinkPreviewListener linkPreviewListener; - @Autowired private HelloOnJoinListener helloOnJoinListener; - - @Autowired private GrammarCorrectorListener grammarCorrectorListener; - - @Autowired - private GoogleSearchListener googleSearchListener; - - @Autowired + private HelpListener helpListener; private DuckDuckGoSearchListener duckDuckGoSearchListener; - - @Autowired private LoggerListener loggerListener; - - @Autowired private AdminListener adminListener; - - @Autowired private StatisticsListener statisticsListener; + + @PostConstruct public void postConstruct() { logger.warn("VERSION: "+version); this.executorService = Executors.newScheduledThreadPool(10); - this.executorService.schedule(new Runnable() { - @Override - public void run() { - initBots(); - startBots(); - } + this.executorService.schedule(() -> { + initBots(); + startBots(); }, 5, TimeUnit.SECONDS); - this.executorService.scheduleAtFixedRate(new Runnable() { - @Override - public void run() { - logger.debug("check"); - checkBots(); - } + this.executorService.scheduleAtFixedRate(() -> { + logger.debug("check"); + checkBots(); }, 15, 5, TimeUnit.SECONDS); } @@ -162,14 +130,10 @@ public class JircBot extends ListenerAdapter { .addListener(linkPreviewListener) .addListener(helloOnJoinListener) .addListener(grammarCorrectorListener) - //.addListener(googleSearchListener) + .addListener(helpListener) .addListener(duckDuckGoSearchListener) .addListener(loggerListener) - // not tested - //.addListener(new GoogleDoodleListener(this.config)) - //.addListener(new YandexSearchListener(this.config, this.yandexSearchService)) - .setServers(servers) .setAutoReconnect(true) .addAutoJoinChannels(c.getChannelsNames()); @@ -235,4 +199,85 @@ public class JircBot extends ListenerAdapter { return ""+d[d.length-2]+"."+d[d.length-1]; } + //************************************************* + + @Autowired + public void setPingPongListener(PingPongListener pingPongListener) { + this.pingPongListener = pingPongListener; + } + + @Autowired + public void setCalculatorListener(CalculatorListener calculatorListener) { + this.calculatorListener = calculatorListener; + } + + @Autowired + public void setRegexCheckerListener(RegexCheckerListener regexCheckerListener) { + this.regexCheckerListener = regexCheckerListener; + } + + @Autowired + public void setAdviceListener(AdviceListener adviceListener) { + this.adviceListener = adviceListener; + } + + @Autowired + public void setQuizListener(QuizListener quizListener) { + this.quizListener = quizListener; + } + + @Autowired + public void setBashOrgListener(BashOrgListener bashOrgListener) { + this.bashOrgListener = bashOrgListener; + } + + @Autowired + public void setAutoRejoinListener(AutoRejoinListener autoRejoinListener) { + this.autoRejoinListener = autoRejoinListener; + } + + @Autowired + public void setDeferredMessagesListener(DeferredMessagesListener deferredMessagesListener) { + this.deferredMessagesListener = deferredMessagesListener; + } + + @Autowired + public void setLinkPreviewListener(LinkPreviewListener linkPreviewListener) { + this.linkPreviewListener = linkPreviewListener; + } + + @Autowired + public void setHelloOnJoinListener(HelloOnJoinListener helloOnJoinListener) { + this.helloOnJoinListener = helloOnJoinListener; + } + + @Autowired + public void setGrammarCorrectorListener(GrammarCorrectorListener grammarCorrectorListener) { + this.grammarCorrectorListener = grammarCorrectorListener; + } + + @Autowired + public void setHelpListener(HelpListener helpListener) { + this.helpListener = helpListener; + } + + @Autowired + public void setDuckDuckGoSearchListener(DuckDuckGoSearchListener duckDuckGoSearchListener) { + this.duckDuckGoSearchListener = duckDuckGoSearchListener; + } + + @Autowired + public void setLoggerListener(LoggerListener loggerListener) { + this.loggerListener = loggerListener; + } + + @Autowired + public void setAdminListener(AdminListener adminListener) { + this.adminListener = adminListener; + } + + @Autowired + public void setStatisticsListener(StatisticsListener statisticsListener) { + this.statisticsListener = statisticsListener; + } } diff --git a/src/main/java/ru/bvn13/jircbot/config/JircBotConfiguration.java b/src/main/java/ru/bvn13/jircbot/config/JircBotConfiguration.java index 38be726..3abb1a3 100644 --- a/src/main/java/ru/bvn13/jircbot/config/JircBotConfiguration.java +++ b/src/main/java/ru/bvn13/jircbot/config/JircBotConfiguration.java @@ -23,10 +23,13 @@ public class JircBotConfiguration { private static Logger logger = LoggerFactory.getLogger(JircBotConfiguration.class); - - @Value("${config}") + @Value("${jircbot.config}") private String configFileName; + @Getter + @Value("${jircbot.url.main}") + private String mainUrl; + @Getter private List connections = new ArrayList<>(); @@ -135,4 +138,5 @@ public class JircBotConfiguration { return sets; } + } diff --git a/src/main/java/ru/bvn13/jircbot/documentation/DocumentationProvider.java b/src/main/java/ru/bvn13/jircbot/documentation/DocumentationProvider.java index 5f0e694..972daa2 100644 --- a/src/main/java/ru/bvn13/jircbot/documentation/DocumentationProvider.java +++ b/src/main/java/ru/bvn13/jircbot/documentation/DocumentationProvider.java @@ -5,6 +5,8 @@ import org.modelmapper.internal.util.Lists; import org.springframework.stereotype.Component; import java.util.*; +import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; /** * Created by bvn13 on 28.10.2018. @@ -29,4 +31,18 @@ public class DocumentationProvider { return descriptors.getOrDefault(moduleName, null); } + public Optional findByCommand(final String command) { + AtomicReference description = new AtomicReference<>(null); + + descriptors.forEach((name, dp) -> { + dp.getDescription().getCommandDescriptionOpt(command).ifPresent(description::set); + }); + + return Optional.ofNullable(description.get()); + } + + public String getAllCommands() { + return descriptors.values().stream().map(dp -> dp.getDescription().getCommandNamesJoined()).filter(s -> s != null && !s.isEmpty()).collect(Collectors.joining(",")); + } + } diff --git a/src/main/java/ru/bvn13/jircbot/documentation/ListenerDescription.java b/src/main/java/ru/bvn13/jircbot/documentation/ListenerDescription.java index 305909d..e10c391 100644 --- a/src/main/java/ru/bvn13/jircbot/documentation/ListenerDescription.java +++ b/src/main/java/ru/bvn13/jircbot/documentation/ListenerDescription.java @@ -7,6 +7,8 @@ import org.modelmapper.internal.util.Lists; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; /** * Created by bvn13 on 28.10.2018. @@ -54,14 +56,19 @@ public class ListenerDescription { return this; } + public String getCommandNamesJoined() { + return Lists.from(commandsDescription.keySet().iterator()).stream().sorted().collect(Collectors.joining(",")); + } + + public Optional getCommandDescriptionOpt(String command) { + return Optional.ofNullable(commandsDescription.getOrDefault(command, null)); + } + public List getCommandNames() { - List names = Lists.from(commandsDescription.keySet().iterator()); - names.sort(String.CASE_INSENSITIVE_ORDER); - return names; + return Lists.from(commandsDescription.keySet().iterator()); } public CommandDescription getCommandDescription(String command) { return commandsDescription.getOrDefault(command, null); } - } diff --git a/src/main/java/ru/bvn13/jircbot/listeners/AdminListener.java b/src/main/java/ru/bvn13/jircbot/listeners/AdminListener.java index 57fa23f..b621b38 100644 --- a/src/main/java/ru/bvn13/jircbot/listeners/AdminListener.java +++ b/src/main/java/ru/bvn13/jircbot/listeners/AdminListener.java @@ -32,10 +32,8 @@ public class AdminListener extends ImprovedListenerAdapter implements Descriptio private static final String COMMAND = "?"; - @Autowired private JircBotConfiguration configuration; - @Autowired private ChannelSettingsService channelSettingsService; @Autowired @@ -386,4 +384,13 @@ public class AdminListener extends ImprovedListenerAdapter implements Descriptio } } + @Autowired + public void setConfiguration(JircBotConfiguration configuration) { + this.configuration = configuration; + } + + @Autowired + public void setChannelSettingsService(ChannelSettingsService channelSettingsService) { + this.channelSettingsService = channelSettingsService; + } } diff --git a/src/main/java/ru/bvn13/jircbot/listeners/AutoRejoinListener.java b/src/main/java/ru/bvn13/jircbot/listeners/AutoRejoinListener.java index 844bc47..bc6ecbf 100644 --- a/src/main/java/ru/bvn13/jircbot/listeners/AutoRejoinListener.java +++ b/src/main/java/ru/bvn13/jircbot/listeners/AutoRejoinListener.java @@ -18,7 +18,6 @@ import ru.bvn13.jircbot.listeners.advices.AdviceEngine; @Component public class AutoRejoinListener extends ImprovedListenerAdapter { - @Autowired private ChannelSettingsService channelSettingsService; private Boolean wasKicked = false; @@ -56,4 +55,9 @@ public class AutoRejoinListener extends ImprovedListenerAdapter { } } + + @Autowired + public void setChannelSettingsService(ChannelSettingsService channelSettingsService) { + this.channelSettingsService = channelSettingsService; + } } diff --git a/src/main/java/ru/bvn13/jircbot/listeners/BashOrgListener.java b/src/main/java/ru/bvn13/jircbot/listeners/BashOrgListener.java index 810b22b..67de033 100644 --- a/src/main/java/ru/bvn13/jircbot/listeners/BashOrgListener.java +++ b/src/main/java/ru/bvn13/jircbot/listeners/BashOrgListener.java @@ -18,6 +18,8 @@ import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import static ru.bvn13.jircbot.documentation.ListenerDescription.CommandDescription; @@ -30,7 +32,8 @@ public class BashOrgListener extends ImprovedListenerAdapter implements Descript private static final String COMMAND = "?bash"; private static final String USER_AGENT = "Mozilla/5.0"; - @Autowired + private static final Pattern PATTERN_CHARSET = Pattern.compile(".*charset=(.*)$"); + private ChannelSettingsService channelSettingsService; @Autowired @@ -70,14 +73,14 @@ public class BashOrgListener extends ImprovedListenerAdapter implements Descript try { event.respond(getRandomBashQuote()); } catch (Exception e) { - event.respond("ОШИБКА: "+e.getMessage()); + event.respond("ERROR: "+e.getMessage()); e.printStackTrace(); } } private String getDataFromConnection(HttpURLConnection con) throws Exception { - BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream(), "windows-1251")); + BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); String inputLine; StringBuilder response = new StringBuilder(); @@ -89,13 +92,14 @@ public class BashOrgListener extends ImprovedListenerAdapter implements Descript } private String getRandomBashQuote() throws Exception { - URL obj = new URL("http://bash.im/random"); + URL obj = new URL("https://bash.im/random"); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); // optional default is GET con.setRequestMethod("GET"); //add request header + con.setRequestProperty("Accept-Charset", "utf-8"); con.setRequestProperty("User-Agent", USER_AGENT); //con.setRequestProperty("X-Requested-With", "XMLHttpRequest"); @@ -103,10 +107,17 @@ public class BashOrgListener extends ImprovedListenerAdapter implements Descript if (responseCode != 200) { throw new Exception("Could not get a random quote!"); } + + String contentType = con.getContentType(); + Matcher matcher = PATTERN_CHARSET.matcher(contentType); + String charset = "utf-8"; + if (matcher.find()) { + charset = matcher.group(1); + } String response = getDataFromConnection(con); Document doc = Jsoup.parse(response); - Elements quotes = doc.select(".quote .text"); + Elements quotes = doc.select("article.quote .quote__body"); if (quotes.size() == 0) { throw new Exception("Nothing was received from bash.org!"); @@ -114,9 +125,13 @@ public class BashOrgListener extends ImprovedListenerAdapter implements Descript Element quote = quotes.get(0); - return quote.text(); + return quote.text().replace("\n", ""); } + @Autowired + public void setChannelSettingsService(ChannelSettingsService channelSettingsService) { + this.channelSettingsService = channelSettingsService; + } } diff --git a/src/main/java/ru/bvn13/jircbot/listeners/DeferredMessagesListener.java b/src/main/java/ru/bvn13/jircbot/listeners/DeferredMessagesListener.java index e831640..39c06c2 100644 --- a/src/main/java/ru/bvn13/jircbot/listeners/DeferredMessagesListener.java +++ b/src/main/java/ru/bvn13/jircbot/listeners/DeferredMessagesListener.java @@ -32,10 +32,8 @@ public class DeferredMessagesListener extends ImprovedListenerAdapter implements private static SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - @Autowired private ChannelSettingsService channelSettingsService; - @Autowired private DeferredMessageService deferredMessageService; @Autowired @@ -160,4 +158,13 @@ public class DeferredMessagesListener extends ImprovedListenerAdapter implements } + @Autowired + public void setChannelSettingsService(ChannelSettingsService channelSettingsService) { + this.channelSettingsService = channelSettingsService; + } + + @Autowired + public void setDeferredMessageService(DeferredMessageService deferredMessageService) { + this.deferredMessageService = deferredMessageService; + } } diff --git a/src/main/java/ru/bvn13/jircbot/listeners/DuckDuckGoSearchListener.java b/src/main/java/ru/bvn13/jircbot/listeners/DuckDuckGoSearchListener.java index 7b6a311..47d268a 100644 --- a/src/main/java/ru/bvn13/jircbot/listeners/DuckDuckGoSearchListener.java +++ b/src/main/java/ru/bvn13/jircbot/listeners/DuckDuckGoSearchListener.java @@ -26,10 +26,8 @@ public class DuckDuckGoSearchListener extends ImprovedListenerAdapter implements private static final String COMMAND = "?s"; - @Autowired private InternetAccessor internetAccessor; - @Autowired private ChannelSettingsService channelSettingsService; @Autowired @@ -95,4 +93,13 @@ public class DuckDuckGoSearchListener extends ImprovedListenerAdapter implements } + @Autowired + public void setInternetAccessor(InternetAccessor internetAccessor) { + this.internetAccessor = internetAccessor; + } + + @Autowired + public void setChannelSettingsService(ChannelSettingsService channelSettingsService) { + this.channelSettingsService = channelSettingsService; + } } diff --git a/src/main/java/ru/bvn13/jircbot/listeners/GoogleSearchListener.java b/src/main/java/ru/bvn13/jircbot/listeners/GoogleSearchListener.java deleted file mode 100644 index 4984d92..0000000 --- a/src/main/java/ru/bvn13/jircbot/listeners/GoogleSearchListener.java +++ /dev/null @@ -1,118 +0,0 @@ -package ru.bvn13.jircbot.listeners; - -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; -import org.pircbotx.hooks.events.MessageEvent; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import ru.bvn13.jircbot.bot.ImprovedListenerAdapter; -import ru.bvn13.jircbot.bot.JircBot; -import ru.bvn13.jircbot.database.services.ChannelSettingsService; -import ru.bvn13.jircbot.documentation.DescriptionProvided; -import ru.bvn13.jircbot.documentation.DocumentationProvider; -import ru.bvn13.jircbot.documentation.ListenerDescription; -import ru.bvn13.jircbot.services.InternetAccessor; - -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.net.URLEncoder; - -import static ru.bvn13.jircbot.documentation.ListenerDescription.CommandDescription; - - -/** - * Created by bvn13 on 06.02.2018. - */ -@Component -public class GoogleSearchListener extends ImprovedListenerAdapter implements DescriptionProvided { - - private static final String COMMAND = "?gs"; - - @Autowired - private InternetAccessor internetAccessor; - - @Autowired - private ChannelSettingsService channelSettingsService; - - @Autowired - public GoogleSearchListener(DocumentationProvider documentationProvider) { - this.registerDescription(documentationProvider); - } - - @Override - public ListenerDescription getDescription() { - return ListenerDescription.create() - .setModuleName("GoogleSearchListener") - .setModuleDescription("Make a search in Google for you") - .addCommand(CommandDescription.builder() - .command("gs") - .description("Search it") - .example("?gs [WHAT YOU WANT TO SEARCH]") - .build() - ); - } - - - @Override - public void onMessage(final MessageEvent event) throws Exception { - - super.onMessage(event); - - if (!channelSettingsService.getChannelSettings(JircBot.extractServer(event.getBot().getServerHostname()), this.getChannelName(event)).getGoogleSearchEnabled()) { - return; - } - - if (event.getUser() != null && event.getBot().getUserBot().getNick().equals(event.getUser().getNick())) { - return; - } - - if (!event.getMessage().startsWith(COMMAND)) { - return; - } - - String message = event.getMessage().replace(COMMAND, "").trim(); - - String result = search(message); - - event.respond(result); - } - - - private String search(String phrase) throws UnsupportedEncodingException { - - String encodedPhrase = URLEncoder.encode(phrase.replaceAll(" ", "+"), "utf-8"); - String link = "https://google.ru/search?q="+encodedPhrase; - String queryPage = internetAccessor.retrieveContentByLink(link); - - Document doc = Jsoup.parse(queryPage); - - Elements searchResults = doc.select("#res #search #ires .g"); - Element firstResult = searchResults.first(); - Element descrElement = firstResult.select(".s .st").first(); - String description = descrElement.text(); - Element linkToRedirectPage = firstResult.select(".r a").first(); - String linkTitle = linkToRedirectPage.text(); - String redirectPage = internetAccessor.retrieveContentByLink("https://google.ru"+linkToRedirectPage.attr("href")); - String destinationUrl = null; - try { - Document redirectDoc = Jsoup.parse(redirectPage); - destinationUrl = redirectDoc.select("._jFe a").first().attr("href"); - } catch (Exception e) { - try { - destinationUrl = internetAccessor.getLastUrl("https://google.ru"+linkToRedirectPage.attr("href")); - if (destinationUrl == null || destinationUrl.isEmpty()) { - destinationUrl = "https://google.ru"+linkToRedirectPage.attr("href"); - } - } catch (Exception e1) { - destinationUrl = "https://google.ru"+linkToRedirectPage.attr("href"); - } - } - - - - return String.format("%s / %s / %s", URLDecoder.decode(destinationUrl, "utf-8"), linkTitle, description); - } - -} diff --git a/src/main/java/ru/bvn13/jircbot/listeners/GrammarCorrectorListener.java b/src/main/java/ru/bvn13/jircbot/listeners/GrammarCorrectorListener.java index 5198062..0817d62 100644 --- a/src/main/java/ru/bvn13/jircbot/listeners/GrammarCorrectorListener.java +++ b/src/main/java/ru/bvn13/jircbot/listeners/GrammarCorrectorListener.java @@ -28,10 +28,8 @@ public class GrammarCorrectorListener extends ImprovedListenerAdapter { private static SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - @Autowired private ChannelSettingsService channelSettingsService; - @Autowired private GrammarCorrectionService grammarCorrectionService; @@ -133,4 +131,14 @@ public class GrammarCorrectorListener extends ImprovedListenerAdapter { return "syntax: ?correct add > | ?correct remove > | ?correct show"; } + + @Autowired + public void setChannelSettingsService(ChannelSettingsService channelSettingsService) { + this.channelSettingsService = channelSettingsService; + } + + @Autowired + public void setGrammarCorrectionService(GrammarCorrectionService grammarCorrectionService) { + this.grammarCorrectionService = grammarCorrectionService; + } } diff --git a/src/main/java/ru/bvn13/jircbot/listeners/HelloOnJoinListener.java b/src/main/java/ru/bvn13/jircbot/listeners/HelloOnJoinListener.java index 929380d..3994e1a 100644 --- a/src/main/java/ru/bvn13/jircbot/listeners/HelloOnJoinListener.java +++ b/src/main/java/ru/bvn13/jircbot/listeners/HelloOnJoinListener.java @@ -20,9 +20,14 @@ import static ru.bvn13.jircbot.documentation.ListenerDescription.CommandDescript @Component public class HelloOnJoinListener extends ImprovedListenerAdapter implements DescriptionProvided { - @Autowired private ChannelSettingsService channelSettingsService; + + @Autowired + public HelloOnJoinListener(DocumentationProvider documentationProvider) { + registerDescription(documentationProvider); + } + @Override public void onJoin(final JoinEvent event) throws Exception { @@ -45,10 +50,6 @@ public class HelloOnJoinListener extends ImprovedListenerAdapter implements Desc } } - @Autowired - public HelloOnJoinListener(DocumentationProvider documentationProvider) { - registerDescription(documentationProvider); - } @Override public ListenerDescription getDescription() { @@ -59,4 +60,8 @@ public class HelloOnJoinListener extends ImprovedListenerAdapter implements Desc ; } + @Autowired + public void setChannelSettingsService(ChannelSettingsService channelSettingsService) { + this.channelSettingsService = channelSettingsService; + } } diff --git a/src/main/java/ru/bvn13/jircbot/listeners/HelpListener.java b/src/main/java/ru/bvn13/jircbot/listeners/HelpListener.java new file mode 100644 index 0000000..c7b2af8 --- /dev/null +++ b/src/main/java/ru/bvn13/jircbot/listeners/HelpListener.java @@ -0,0 +1,90 @@ +package ru.bvn13.jircbot.listeners; + +import org.pircbotx.hooks.events.MessageEvent; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import ru.bvn13.jircbot.bot.ImprovedListenerAdapter; +import ru.bvn13.jircbot.config.JircBotConfiguration; +import ru.bvn13.jircbot.documentation.DocumentationProvider; +import ru.bvn13.jircbot.documentation.ListenerDescription; + +import javax.annotation.PostConstruct; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; + +/** + * Created by bvn13 on 15.03.2019. + */ +@Component +public class HelpListener extends ImprovedListenerAdapter { + + private static final List COMMAND = Arrays.asList("?help", "?h"); + + private JircBotConfiguration configuration; + private DocumentationProvider documentationProvider; + + private String adviceToFolowMainUrl; + + @PostConstruct + private void init() { + adviceToFolowMainUrl = String.format("see all docs: %s/docs", configuration.getMainUrl()); + } + + @Override + public void onMessage(MessageEvent event) throws Exception { + super.onMessage(event); + + if (event.getUser() != null && event.getBot().getUserBot().getNick().equals(event.getUser().getNick())) { + return; + } + + boolean isHelp = false; + String command = ""; + for (String c : COMMAND) { + if (event.getMessage().startsWith(c)) { + isHelp = true; + command = c; + break; + } + } + + if (!isHelp) { + return; + } + + String message = event.getMessage().replace(command, "").trim(); + + if (message.isEmpty()) { + event.respond(adviceToFolowMainUrl); + } else { + answerWithHelp(event, message); + } + + } + + private void answerWithHelp(MessageEvent event, String message) { + String[] words = message.replace(" ", "").split(" "); + if (words.length > 1) { + event.respond(String.format("help syntax: ?help | ?help | Commands: %s", documentationProvider.getAllCommands())); + } else { + Optional description = documentationProvider.findByCommand(words[0]); + if (description.isPresent()) { + ListenerDescription.CommandDescription d = description.get(); + event.respond(String.format("COMMAND: %s, DESCRIPTION: %s, EXAMPLE: %s", d.getCommand(), d.getDescription(), d.getExample())); + } else { + event.respond(String.format("wrong command %s. %s%s", words[0], adviceToFolowMainUrl.substring(0, 1).toUpperCase(), adviceToFolowMainUrl.substring(1))); + } + } + } + + @Autowired + public void setDocumentationProvider(DocumentationProvider documentationProvider) { + this.documentationProvider = documentationProvider; + } + + @Autowired + public void setConfiguration(JircBotConfiguration configuration) { + this.configuration = configuration; + } +} diff --git a/src/main/java/ru/bvn13/jircbot/listeners/LinkPreviewListener.java b/src/main/java/ru/bvn13/jircbot/listeners/LinkPreviewListener.java index 74653d8..acfc54e 100644 --- a/src/main/java/ru/bvn13/jircbot/listeners/LinkPreviewListener.java +++ b/src/main/java/ru/bvn13/jircbot/listeners/LinkPreviewListener.java @@ -25,12 +25,10 @@ import static ru.bvn13.jircbot.documentation.ListenerDescription.CommandDescript @Component public class LinkPreviewListener extends ImprovedListenerAdapter implements DescriptionProvided { - @Autowired private InternetAccessor internetAccessor; private static final Pattern REGEX = Pattern.compile("(?i)(?:(?:https?|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))\\.?)(?::\\d{2,5})?(?:[/?#]\\S*)?"); - @Autowired private ChannelSettingsService channelSettingsService; @Autowired @@ -155,4 +153,14 @@ public class LinkPreviewListener extends ImprovedListenerAdapter implements Desc } return null; } + + @Autowired + public void setInternetAccessor(InternetAccessor internetAccessor) { + this.internetAccessor = internetAccessor; + } + + @Autowired + public void setChannelSettingsService(ChannelSettingsService channelSettingsService) { + this.channelSettingsService = channelSettingsService; + } } diff --git a/src/main/java/ru/bvn13/jircbot/listeners/LoggerListener.java b/src/main/java/ru/bvn13/jircbot/listeners/LoggerListener.java index d186bd7..e26d9e5 100644 --- a/src/main/java/ru/bvn13/jircbot/listeners/LoggerListener.java +++ b/src/main/java/ru/bvn13/jircbot/listeners/LoggerListener.java @@ -25,10 +25,8 @@ import static ru.bvn13.jircbot.documentation.ListenerDescription.CommandDescript public class LoggerListener extends ImprovedListenerAdapter implements DescriptionProvided { - @Autowired private ChannelSettingsService channelSettingsService; - @Autowired private IrcMessageService ircMessageService; private Map> onlineUsers = new HashMap<>(); @@ -198,4 +196,14 @@ public class LoggerListener extends ImprovedListenerAdapter implements Descripti ircMessageService.save(msg); } + + @Autowired + public void setChannelSettingsService(ChannelSettingsService channelSettingsService) { + this.channelSettingsService = channelSettingsService; + } + + @Autowired + public void setIrcMessageService(IrcMessageService ircMessageService) { + this.ircMessageService = ircMessageService; + } } diff --git a/src/main/java/ru/bvn13/jircbot/listeners/RegexCheckerListener.java b/src/main/java/ru/bvn13/jircbot/listeners/RegexCheckerListener.java index bf27877..66927f0 100644 --- a/src/main/java/ru/bvn13/jircbot/listeners/RegexCheckerListener.java +++ b/src/main/java/ru/bvn13/jircbot/listeners/RegexCheckerListener.java @@ -26,7 +26,6 @@ public class RegexCheckerListener extends ImprovedListenerAdapter implements Des private static final Map usersState = new HashMap<>(); - @Autowired private ChannelSettingsService channelSettingsService; @Autowired @@ -119,4 +118,8 @@ public class RegexCheckerListener extends ImprovedListenerAdapter implements Des } + @Autowired + public void setChannelSettingsService(ChannelSettingsService channelSettingsService) { + this.channelSettingsService = channelSettingsService; + } } diff --git a/src/main/java/ru/bvn13/jircbot/listeners/StatisticsListener.java b/src/main/java/ru/bvn13/jircbot/listeners/StatisticsListener.java index 3e736f2..623df00 100644 --- a/src/main/java/ru/bvn13/jircbot/listeners/StatisticsListener.java +++ b/src/main/java/ru/bvn13/jircbot/listeners/StatisticsListener.java @@ -31,7 +31,6 @@ public class StatisticsListener extends ImprovedListenerAdapter implements Descr Date dateStart; } - @Autowired private IrcMessageService ircMessageService; @Autowired @@ -198,4 +197,9 @@ public class StatisticsListener extends ImprovedListenerAdapter implements Descr private void sendHelp(MessageEvent event) { event.respond("syntax: ?stats [d(ay)|m(onth)|y(ear)|a(ll)] [all]"); } + + @Autowired + public void setIrcMessageService(IrcMessageService ircMessageService) { + this.ircMessageService = ircMessageService; + } } diff --git a/src/main/java/ru/bvn13/jircbot/listeners/YandexSearchListener.java b/src/main/java/ru/bvn13/jircbot/listeners/YandexSearchListener.java deleted file mode 100644 index af14a0c..0000000 --- a/src/main/java/ru/bvn13/jircbot/listeners/YandexSearchListener.java +++ /dev/null @@ -1,63 +0,0 @@ -package ru.bvn13.jircbot.listeners; - -import org.pircbotx.hooks.ListenerAdapter; -import org.pircbotx.hooks.types.GenericMessageEvent; -import ru.bvn13.jircbot.services.YandexSearchService; -import ru.bvn13.jircbot.config.JircBotConfiguration; -import ru.bvn13.jircbot.model.YandexSearchSettings; - -import static ru.bvn13.jircbot.config.JircBotConfiguration.KEY_YANDEX_SEARCH; - -public class YandexSearchListener extends ListenerAdapter { - - private static final String COMMAND = "?search "; - - - private YandexSearchSettings config; - - private YandexSearchService yandexSearchService; - - public YandexSearchListener(JircBotConfiguration config, YandexSearchService yandexSearchService) { - this.config = (YandexSearchSettings) config.getListenersSettings().get(KEY_YANDEX_SEARCH); - this.yandexSearchService = yandexSearchService; - this.yandexSearchService.setKey(this.config.getKey()); - this.yandexSearchService.setUser(this.config.getUser()); - this.yandexSearchService.setUrl(this.config.getUrl()); - } - - - @Override - public void onGenericMessage(final GenericMessageEvent event) throws Exception { - super.onGenericMessage(event); - - if (event.getUser() != null && event.getBot().getUserBot().getNick().equals(event.getUser().getNick())) { - return; - } - - if (!event.getMessage().startsWith(COMMAND)) { - return; - } - - String message = event.getMessage().substring(COMMAND.length()).trim(); - - try { - final YandexSearchService.YaPage result = this.yandexSearchService.loadYaPage(message, 0); - int i = 0; - for (YandexSearchService.YaItem item : result.getYaItems()) { - if (i++ == 0) { - event.respond(String.format("%s - %s (%s)", item.getUrl(), item.getTitle(), item.getDescription())); - //event.respond("Next entries were sended privately."); - } else { - event.respondPrivateMessage(String.format("%d. %s - %s (%s)", (i - 1), item.getUrl(), item.getTitle(), item.getDescription())); - } - } - if (i == 0) { - event.respond("Not found"); - } - } catch (Exception exp) { - exp.printStackTrace(); - event.respond("ERROR has been occurred. Try again later."); - } - } - -} diff --git a/src/main/java/ru/bvn13/jircbot/services/YandexSearchService.java b/src/main/java/ru/bvn13/jircbot/services/YandexSearchService.java deleted file mode 100644 index 8dbebf3..0000000 --- a/src/main/java/ru/bvn13/jircbot/services/YandexSearchService.java +++ /dev/null @@ -1,248 +0,0 @@ -package ru.bvn13.jircbot.services; - -import lombok.Getter; -import lombok.Setter; -import org.springframework.stereotype.Service; -import org.xml.sax.Attributes; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -import org.xml.sax.XMLReader; -import org.xml.sax.helpers.DefaultHandler; -import org.xml.sax.helpers.XMLReaderFactory; - -import java.io.CharArrayWriter; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.List; - -@Service -public class YandexSearchService { - - public static final String ENC = "UTF-8"; - public static final String AND = "&"; - - public static class YaPage { - - public static final int ITEMS_PER_PAGE = 10; - - private String keyword; - private int pageNumber; - private List yaItems = new ArrayList(); - - /** - * Constructor - * @param keyword keyword for searching - * @param pageNumber number of page - */ - public YaPage(final String keyword, final int pageNumber) { - this.keyword = keyword; - this.pageNumber = pageNumber; - } - - public List getYaItems() { - return yaItems; - } - - /** - * Add one SERP item to collection (page) - * @param item one SERP item - */ - public void addYaItem(final YaItem item) { - - final int position = (pageNumber * ITEMS_PER_PAGE) + yaItems.size() + 1; - item.setPosition(position); - yaItems.add(item); - } - } - - public static class YaItem { - - private int position; - @Getter - private String url; - private String domain; - @Getter - private String title; - @Getter - private String description = ""; - private String passages = ""; - - /** - * Constructor - * @param url url of current item - */ - public YaItem(final String url) { - this.url = url; - } - - /* Тут набор getter-ов для приватных полей класса... */ - - public void setPosition(final int position) { - this.position = position; - } - - public void setDomain(final String domain) { - this.domain = domain; - } - - public void setTitle(final String title) { - this.title = title; - } - - public void setDescription(final String description) { - this.description = description; - } - - public void addPassage(final String passage) { - passages += passage; - } - - @Override - public String toString() { - return "YaItem{" + - "position=" + position + - ", url='" + url + '\'' + - ", domain='" + domain + '\'' + - ", title='" + title + '\'' + - ", description='" + description + '\'' + - ", passages='" + passages + '\'' + - '}'; - } - } - - public static class YaHandler extends DefaultHandler { - - private static final String IGNORE_TAG = "hlword"; - - private final CharArrayWriter buffer = new CharArrayWriter(); - private YaItem currentItem; - private YaPage yaPage; - - /** - * Constructor - * @param yaPage yandex page that will be filled with SERP items - */ - public YaHandler(final YaPage yaPage) { - this.yaPage = yaPage; - } - - @Override - public void startElement( - final String uri, - final String localName, - final String qName, - final Attributes attr - ) throws SAXException { - super.startElement(uri, localName, qName, attr); - if (!IGNORE_TAG.equals(qName)) { - buffer.reset(); - } - } - - @Override - public void endElement( - final String uri, - final String localName, - final String qName - ) throws SAXException { - - super.endElement(uri, localName, qName); - if ("error".equals(qName)) { - throw new IllegalArgumentException("Bad request: " + buffer.toString()); - } else if ("url".equals(qName)) { - currentItem = new YaItem(buffer.toString()); - } else if ("domain".equals(qName) && currentItem != null) { - currentItem.setDomain(buffer.toString()); - } else if ("title".equals(qName) && currentItem != null) { - currentItem.setTitle(clearFromTags(buffer.toString())); - } else if ("headline".equals(qName) && currentItem != null) { - currentItem.setDescription(clearFromTags(buffer.toString())); - } else if ("passage".equals(qName) && currentItem != null) { - currentItem.addPassage(clearFromTags(buffer.toString())); - } else if ("group".equals(qName) && currentItem != null) { - yaPage.addYaItem(currentItem); - } - } - - @Override - public void characters(final char[] chars, final int start, final int length) - throws SAXException { - super.characters(chars, start, length); - buffer.write(chars, start, length); - } - - /** - * Clear text from unwanted tags - * @param text text to clear - * @return cleared text - */ - private String clearFromTags(final String text) { - return text.replaceAll("<" + IGNORE_TAG +">", "") - .replaceAll("", ""); - } - } - - @Getter - @Setter - private String user; - - @Getter - @Setter - private String key; - - @Getter - @Setter - private String url; - - - - - /** - * Retrieve Yandex.XML response stream via GET request - * @param query search query - * @param pageNumber number of search page - * @return Yandex.XML response stream - * @throws IOException input/output exception - */ - public InputStream retrieveResponseViaGetRequest( - final String query, - final int pageNumber - ) throws IOException { - - final StringBuilder address = new StringBuilder(this.url); - address.append("user=").append(user).append(AND) - .append("key=").append(key).append(AND) - .append("query=").append(URLEncoder.encode(query, ENC)).append(AND) - .append("page=").append(pageNumber); - final URL url = new URL(address.toString()); - return url.openStream(); - } - - - /** - * Load parsed yandex page from Yandex.XML service - * @param query query for searching - * @param pageNumber number of page - * @return parsed result of searching - * @throws IOException input/output exception - * @throws SAXException parsing exception - */ - public YaPage loadYaPage(final String query, final int pageNumber) - throws IOException, SAXException { - - final YaPage result = new YaPage(query, pageNumber); - final XMLReader xmlReader = XMLReaderFactory.createXMLReader(); - xmlReader.setContentHandler(new YaHandler(result)); - xmlReader.parse( - new InputSource( - this.retrieveResponseViaGetRequest(query, pageNumber) - ) - ); - return result; - } - - -} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index a22c91b..8ff784b 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,8 +1,10 @@ -name=jircbot -bot.version=@bot.version@ +jircbot.version=@bot.version@ + +jircbot.config=config.json + +jircbot.url.main=http://localhost:8002 -config=config.json spring.profiles.active=production