mirror of https://github.com/bvn13/JIrcBot.git
implemented listeners:
- Google Doodle - Pin-Pong - Regexp checker - Url retrieverpull/2/head
parent
acde85d823
commit
4e6f8655d7
|
@ -51,6 +51,12 @@ dependencies {
|
|||
// Calculator
|
||||
compile 'net.objecthunter:exp4j:0.4.8'
|
||||
|
||||
// HTML parser
|
||||
compile 'org.jsoup:jsoup:1.10.3'
|
||||
|
||||
// Google API
|
||||
compile 'com.google.apis:google-api-services-customsearch:v1-rev57-1.23.0'
|
||||
|
||||
// Logging
|
||||
compile 'ch.qos.logback:logback-classic:1.2.3'
|
||||
compile 'org.slf4j:slf4j-api:1.7.25'
|
||||
|
|
17
config.json
17
config.json
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"version" : "1.0"
|
||||
"version" : "1.0",
|
||||
"connections" : [
|
||||
{
|
||||
"enabled" : true,
|
||||
|
@ -8,5 +8,18 @@
|
|||
"channelName" : "#voidforum",
|
||||
"botName" : "jircbot"
|
||||
}
|
||||
]
|
||||
],
|
||||
"settings" : {
|
||||
"doodle" : {
|
||||
"mainUrl" : "https://www.google.com",
|
||||
"checkUrl" : "https://www.google.com/doodles",
|
||||
"linkSelector" : "li.latest-doodle.on .container a",
|
||||
"titleSelector" : "li.latest-doodle.on .container input.title",
|
||||
"dateSelector" : "li.latest-doodle.on .container input.tag"
|
||||
},
|
||||
"search" : {
|
||||
"uuid" : "YOUR_UUID",
|
||||
"appKey" : "YOUR_APP_KEY"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -11,8 +11,7 @@ import org.slf4j.LoggerFactory;
|
|||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
import ru.bvn13.jircbot.config.JircBotConfiguration;
|
||||
import ru.bvn13.jircbot.listeners.CalculatorListener;
|
||||
import ru.bvn13.jircbot.listeners.TestListener;
|
||||
import ru.bvn13.jircbot.listeners.*;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
|
@ -54,7 +53,12 @@ public class JircBot extends ListenerAdapter {
|
|||
String.format("%s/%s", c.getServer(), c.getChannelName()),
|
||||
new PircBotX(templateConfig
|
||||
.setName(c.getBotName())
|
||||
.addListener(new PingPongListener())
|
||||
.addListener(new CalculatorListener()) //This class is a listener, so add it to the bots known listeners
|
||||
.addListener(new GoogleDoodleListener(this.config))
|
||||
.addListener(new GoogleSearchListener(this.config))
|
||||
.addListener(new UrlRetrieverListener())
|
||||
.addListener(new RegexCheckerListener())
|
||||
.setServers(servers)
|
||||
.setAutoReconnect(true)
|
||||
.addAutoJoinChannel(c.getChannelName()) //Join the official #pircbotx channel
|
||||
|
|
|
@ -9,16 +9,18 @@ import org.slf4j.Logger;
|
|||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import ru.bvn13.jircbot.listeners.GoogleDoodleListener;
|
||||
import ru.bvn13.jircbot.model.Config;
|
||||
import ru.bvn13.jircbot.model.GoogleDoodleSettings;
|
||||
import ru.bvn13.jircbot.model.GoogleSearchSettings;
|
||||
import ru.bvn13.jircbot.model.ListenerSettings;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.io.Reader;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
|
||||
@Configuration
|
||||
public class JircBotConfiguration {
|
||||
|
@ -32,6 +34,11 @@ public class JircBotConfiguration {
|
|||
@Getter
|
||||
private List<Config> connections = new ArrayList<>();
|
||||
|
||||
public static final String KEY_GOOGLE_DOODLE = "google-doodle";
|
||||
public static final String KEY_GOOGLE_SEARCH = "google-search";
|
||||
|
||||
@Getter
|
||||
private Map<String, ListenerSettings> listenersSettings = new HashMap<>();
|
||||
|
||||
@PostConstruct
|
||||
public void readConfigFile() {
|
||||
|
@ -55,6 +62,10 @@ public class JircBotConfiguration {
|
|||
this.connections.add(config);
|
||||
}
|
||||
|
||||
JSONObject lstnrSettings = (JSONObject) jsonObject.get("settings");
|
||||
this.listenersSettings.put(KEY_GOOGLE_DOODLE, this.readGoogleDoodleSettins(lstnrSettings));
|
||||
this.listenersSettings.put(KEY_GOOGLE_SEARCH, this.readGoogleSearchSettings(lstnrSettings));
|
||||
|
||||
} catch (FileNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
throw new InternalError("Config file not found: "+this.configFileName);
|
||||
|
@ -78,4 +89,22 @@ public class JircBotConfiguration {
|
|||
return config;
|
||||
}
|
||||
|
||||
private ListenerSettings readGoogleDoodleSettins(JSONObject settings) {
|
||||
GoogleDoodleSettings sets = new GoogleDoodleSettings();
|
||||
JSONObject googleSets = (JSONObject) settings.get("doodle");
|
||||
sets.setMainUrl((String) googleSets.get("mainUrl"));
|
||||
sets.setCheckUrl((String) googleSets.get("checkUrl"));
|
||||
sets.setLinkSelector((String) googleSets.get("linkSelector"));
|
||||
sets.setTitleSelector((String) googleSets.get("titleSelector"));
|
||||
sets.setDateSelector((String) googleSets.get("dateSelector"));
|
||||
return sets;
|
||||
}
|
||||
|
||||
private ListenerSettings readGoogleSearchSettings(JSONObject settings) {
|
||||
GoogleSearchSettings sets = new GoogleSearchSettings();
|
||||
JSONObject searchSets = (JSONObject) settings.get("search");
|
||||
sets.setUuid((String) searchSets.get("uuid"));
|
||||
return sets;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@ import org.pircbotx.hooks.types.GenericMessageEvent;
|
|||
|
||||
public class CalculatorListener extends ListenerAdapter {
|
||||
|
||||
private static final String COMMAND = "?calc";
|
||||
private static final String COMMAND = "?calc ";
|
||||
|
||||
|
||||
@Override
|
||||
|
@ -21,7 +21,7 @@ public class CalculatorListener extends ListenerAdapter {
|
|||
return;
|
||||
}
|
||||
|
||||
if (!event.getMessage().startsWith(COMMAND)) {
|
||||
if (!event.getMessage().startsWith(COMMAND.trim())) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -83,8 +83,6 @@ public class CalculatorListener extends ListenerAdapter {
|
|||
} else {
|
||||
currentEvent.respond(this.helpMessage());
|
||||
}
|
||||
} else {
|
||||
currentEvent.respond("Command must be started with: "+COMMAND);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,68 @@
|
|||
package ru.bvn13.jircbot.listeners;
|
||||
|
||||
import org.jsoup.Jsoup;
|
||||
import org.jsoup.nodes.Document;
|
||||
import org.jsoup.nodes.Element;
|
||||
import org.pircbotx.hooks.ListenerAdapter;
|
||||
import org.pircbotx.hooks.types.GenericMessageEvent;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import ru.bvn13.jircbot.config.JircBotConfiguration;
|
||||
import ru.bvn13.jircbot.model.GoogleDoodleSettings;
|
||||
|
||||
import static ru.bvn13.jircbot.config.JircBotConfiguration.KEY_GOOGLE_DOODLE;
|
||||
|
||||
public class GoogleDoodleListener extends ListenerAdapter {
|
||||
|
||||
private static final String COMMAND = "?doodle";
|
||||
|
||||
private JircBotConfiguration config;
|
||||
|
||||
public GoogleDoodleListener(JircBotConfiguration config) {
|
||||
this.config = config;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onGenericMessage(final GenericMessageEvent event) throws Exception {
|
||||
|
||||
if (event.getUser().getNick().equals(event.getBot().getNick())) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!event.getMessage().startsWith(COMMAND)) {
|
||||
return;
|
||||
}
|
||||
|
||||
GoogleDoodleSettings settings = (GoogleDoodleSettings) this.config.getListenersSettings().get(KEY_GOOGLE_DOODLE);
|
||||
|
||||
Document doc = null;
|
||||
try {
|
||||
doc = Jsoup.connect(settings.getCheckUrl()).get();
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
event.respond("ERROR retrieving url: "+settings.getCheckUrl());
|
||||
return;
|
||||
}
|
||||
|
||||
Element elUrl = null;
|
||||
Element elTitle = null;
|
||||
Element elDate = null;
|
||||
try {
|
||||
elUrl = doc.select(settings.getLinkSelector()).first();
|
||||
elTitle = doc.select(settings.getTitleSelector()).first();
|
||||
elDate = doc.select(settings.getDateSelector()).first();
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
event.respond("ERROR: check selectors: ");
|
||||
return;
|
||||
}
|
||||
|
||||
event.respond(String.format("Today: %s - %s (%s%s)",
|
||||
elDate.val(),
|
||||
elTitle.val(),
|
||||
settings.getMainUrl(),
|
||||
elUrl.attr("href")));
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,79 @@
|
|||
package ru.bvn13.jircbot.listeners;
|
||||
|
||||
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
|
||||
import com.google.api.client.json.jackson2.JacksonFactory;
|
||||
import com.google.api.services.customsearch.Customsearch;
|
||||
import com.google.api.services.customsearch.CustomsearchRequestInitializer;
|
||||
import com.google.api.services.customsearch.model.Result;
|
||||
import com.google.api.services.customsearch.model.Search;
|
||||
import org.pircbotx.hooks.ListenerAdapter;
|
||||
import org.pircbotx.hooks.types.GenericMessageEvent;
|
||||
import ru.bvn13.jircbot.config.JircBotConfiguration;
|
||||
import ru.bvn13.jircbot.model.GoogleSearchSettings;
|
||||
|
||||
import static ru.bvn13.jircbot.config.JircBotConfiguration.KEY_GOOGLE_SEARCH;
|
||||
|
||||
public class GoogleSearchListener extends ListenerAdapter {
|
||||
|
||||
private static final String COMMAND = "?search ";
|
||||
|
||||
private JircBotConfiguration config;
|
||||
|
||||
public GoogleSearchListener(JircBotConfiguration config) {
|
||||
this.config = config;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onGenericMessage(final GenericMessageEvent event) throws Exception {
|
||||
|
||||
if (event.getUser().getNick().equals(event.getBot().getNick())) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!event.getMessage().startsWith(COMMAND.trim())) {
|
||||
return;
|
||||
}
|
||||
|
||||
Customsearch.Cse.List list = null;
|
||||
|
||||
try {
|
||||
GoogleSearchSettings settings = (GoogleSearchSettings) this.config.getListenersSettings().get(KEY_GOOGLE_SEARCH);
|
||||
|
||||
String query = event.getMessage().substring(COMMAND.length()).trim(); //The query to search
|
||||
String uuid = settings.getUuid(); //Your search engine
|
||||
String appKey = settings.getAppKey(); //Your application key
|
||||
|
||||
//Instance Customsearch
|
||||
Customsearch customSearch = new Customsearch.Builder(GoogleNetHttpTransport.newTrustedTransport(), JacksonFactory.getDefaultInstance(), null)
|
||||
.setApplicationName("JIrcBot")
|
||||
.setGoogleClientRequestInitializer(new CustomsearchRequestInitializer(uuid))
|
||||
.build();
|
||||
|
||||
//Set search parameter
|
||||
list = customSearch.cse().list(query).setCx(uuid);
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
event.respond("ERROR is occured while initialization, sorry.");
|
||||
return;
|
||||
}
|
||||
|
||||
//Execute search
|
||||
Search result = null;
|
||||
try {
|
||||
result = list.execute();
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
event.respond("ERROR is occured while searching, sorry.");
|
||||
return;
|
||||
}
|
||||
if (result.getItems() != null) {
|
||||
Result first = result.getItems().get(0);
|
||||
event.respond(String.format("FOUND: %s (%s)", first.getTitle(), first.getLink()));
|
||||
} else {
|
||||
event.respond("NOT FOUND");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
package ru.bvn13.jircbot.listeners;
|
||||
|
||||
import org.pircbotx.hooks.ListenerAdapter;
|
||||
import org.pircbotx.hooks.types.GenericMessageEvent;
|
||||
|
||||
public class PingPongListener extends ListenerAdapter {
|
||||
|
||||
private static final String COMMAND = "?ping";
|
||||
|
||||
@Override
|
||||
public void onGenericMessage(final GenericMessageEvent event) throws Exception {
|
||||
|
||||
if (event.getUser().getNick().equals(event.getBot().getNick())) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!event.getMessage().startsWith(COMMAND)) {
|
||||
return;
|
||||
}
|
||||
|
||||
event.respond("pong!");
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,84 @@
|
|||
package ru.bvn13.jircbot.listeners;
|
||||
|
||||
import org.pircbotx.hooks.ListenerAdapter;
|
||||
import org.pircbotx.hooks.WaitForQueue;
|
||||
import org.pircbotx.hooks.events.MessageEvent;
|
||||
import org.pircbotx.hooks.types.GenericMessageEvent;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public class RegexCheckerListener extends ListenerAdapter {
|
||||
|
||||
private static final String COMMAND = "?regex ";
|
||||
|
||||
private static final Map<String, Boolean> usersState = new HashMap<>();
|
||||
|
||||
@Override
|
||||
public void onGenericMessage(final GenericMessageEvent event) throws Exception {
|
||||
|
||||
if (event.getUser().getNick().equals(event.getBot().getNick())) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!event.getMessage().startsWith(COMMAND)) {
|
||||
return;
|
||||
}
|
||||
|
||||
String message = event.getMessage().substring(COMMAND.length()).trim();
|
||||
|
||||
if (message.isEmpty()) {
|
||||
event.respond("REGEX: expression is needed");
|
||||
return;
|
||||
}
|
||||
|
||||
synchronized (usersState) {
|
||||
if (usersState.containsKey(event.getUser().getIdent()) && usersState.get(event.getUser().getIdent())) {
|
||||
return;
|
||||
}
|
||||
usersState.put(event.getUser().getIdent(), true);
|
||||
}
|
||||
|
||||
String patternString = message;
|
||||
|
||||
event.respond("EXPRESSION: "+message);
|
||||
WaitForQueue queue = new WaitForQueue(event.getBot());
|
||||
while (true) {
|
||||
|
||||
MessageEvent currentEvent = queue.waitFor(MessageEvent.class);
|
||||
|
||||
if (currentEvent.getMessage().startsWith(COMMAND)) {
|
||||
message = currentEvent.getMessage().substring(COMMAND.length()).trim();
|
||||
if (!message.isEmpty()) {
|
||||
if (message.equalsIgnoreCase("done")) {
|
||||
synchronized (usersState) {
|
||||
usersState.put(event.getUser().getIdent(), false);
|
||||
}
|
||||
currentEvent.respond("REGEX: done");
|
||||
queue.close();
|
||||
return;
|
||||
}
|
||||
Pattern pattern = Pattern.compile(patternString);
|
||||
if (pattern.matcher(message).matches()) {
|
||||
Matcher matcher = pattern.matcher(message);
|
||||
currentEvent.respond("FIND: "+pattern.matcher(message).find());
|
||||
currentEvent.respond("GROUPS COUNT: "+pattern.matcher(message).groupCount());
|
||||
int i = 0;
|
||||
while (matcher.find()) {
|
||||
currentEvent.respond(String.format("GROUP %d: %s\n", i++, matcher.group()));
|
||||
}
|
||||
if (i==0) {
|
||||
currentEvent.respond("Matches, but groups were not found: " + message);
|
||||
}
|
||||
} else {
|
||||
currentEvent.respond("Does not match: " + message);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,106 @@
|
|||
package ru.bvn13.jircbot.listeners;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.jsoup.Jsoup;
|
||||
import org.jsoup.nodes.Document;
|
||||
import org.jsoup.nodes.Element;
|
||||
import org.pircbotx.hooks.ListenerAdapter;
|
||||
import org.pircbotx.hooks.types.GenericMessageEvent;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public class UrlRetrieverListener extends ListenerAdapter {
|
||||
|
||||
private static final String PATTERN = "(?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*)?";
|
||||
//"(?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*)?$";
|
||||
|
||||
|
||||
public static class UrlInfo {
|
||||
@Getter
|
||||
@Setter
|
||||
private String url = "";
|
||||
@Getter
|
||||
@Setter
|
||||
private String title = "";
|
||||
@Getter
|
||||
@Setter
|
||||
private String description = "";
|
||||
@Getter
|
||||
@Setter
|
||||
private Boolean error = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onGenericMessage(final GenericMessageEvent event) throws Exception {
|
||||
|
||||
if (event.getUser().getNick().equals(event.getBot().getNick())) {
|
||||
return;
|
||||
}
|
||||
|
||||
List<String> foundUrls = this.findUrl(event.getMessage().trim());
|
||||
if (foundUrls.size() == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (String url : foundUrls) {
|
||||
UrlInfo info = this.checkUrl(url);
|
||||
if (info.getError()) {
|
||||
event.respondWith(info.getDescription());
|
||||
} else {
|
||||
event.respondWith(String.format("%s (%s)", info.getTitle(), info.getDescription()));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
private List<String> findUrl(String message) {
|
||||
List<String> result = new ArrayList<>();
|
||||
try {
|
||||
Pattern pattern = Pattern.compile(PATTERN);
|
||||
Matcher matcher = pattern.matcher(message);
|
||||
while (matcher.find()) {
|
||||
result.add(matcher.group());
|
||||
}
|
||||
} catch (RuntimeException rte) {
|
||||
rte.printStackTrace();
|
||||
return result;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private UrlInfo checkUrl(String url) {
|
||||
UrlInfo info = new UrlInfo();
|
||||
info.setUrl(url);
|
||||
|
||||
Document doc = null;
|
||||
try {
|
||||
doc = Jsoup.connect(url).get();
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
info.setError(true);
|
||||
info.setDescription("ERROR retrieving url: "+url);
|
||||
}
|
||||
try {
|
||||
Element title = doc.head().select("title").first();
|
||||
info.setTitle(title.text());
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
info.setError(true);
|
||||
info.setDescription("ERROR retrieving title: "+url);
|
||||
}
|
||||
try {
|
||||
Element descr = doc.head().select("meta[name=\"description\"]").first();
|
||||
info.setDescription(descr.attr("content").trim());
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
|
||||
return info;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
package ru.bvn13.jircbot.model;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class GoogleDoodleSettings implements ListenerSettings {
|
||||
|
||||
private String mainUrl;
|
||||
private String checkUrl;
|
||||
private String linkSelector;
|
||||
private String titleSelector;
|
||||
private String dateSelector;
|
||||
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
package ru.bvn13.jircbot.model;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class GoogleSearchSettings implements ListenerSettings {
|
||||
|
||||
private String uuid;
|
||||
private String appKey;
|
||||
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
package ru.bvn13.jircbot.model;
|
||||
|
||||
public interface ListenerSettings {
|
||||
}
|
Loading…
Reference in New Issue