changed logs uri, implemented admin bot control via commands

pull/6/head
Vyacheslav N. Boyko 2018-03-27 13:55:54 +03:00
parent 18b8f8bbe7
commit a834ba1f68
12 changed files with 239 additions and 44 deletions

View File

@ -1,12 +1,12 @@
{
"version" : "1.0",
"connections" : [
{
"enabled" : true,
"server" : "irc.freenode.net",
"port" : 6667,
"channelsNames" : ["#voidforum"],
"botName" : "jircbot-test"
"botName" : "jircbot-test",
"masterNick" : "bvn13"
}
]
}

View File

@ -5,7 +5,7 @@ After=network.target
[Service]
User=bvn13
WorkingDirectory=/srv/jircbot
ExecStart=/usr/bin/java -jar /srv/jircbot/jircbot-1.1.6.jar
ExecStart=/usr/bin/java -jar /srv/jircbot/jircbot-1.1.7.jar
SuccessExitStatus=143
[Install]

View File

@ -6,7 +6,7 @@
<groupId>ru.bvn13</groupId>
<artifactId>jircbot</artifactId>
<version>1.1.6</version>
<version>1.1.8</version>
<packaging>jar</packaging>

View File

@ -82,6 +82,9 @@ public class JircBot extends ListenerAdapter {
@Autowired
private LoggerListener loggerListener;
@Autowired
private AdminListener adminListener;
@PostConstruct
public void postConstruct() {
this.executorService = Executors.newSingleThreadScheduledExecutor();
@ -112,6 +115,7 @@ public class JircBot extends ListenerAdapter {
String.format("%s/%s", c.getServer(), "1"),
new PircBotX(templateConfig
.setName(c.getBotName())
.addListener(adminListener)
.addListener(pingPongListener)
.addListener(calculatorListener)
.addListener(regexCheckerListener)

View File

@ -48,8 +48,6 @@ public class JircBotConfiguration {
Object jsonObj = parser.parse(reader);
JSONObject jsonObject = (JSONObject) jsonObj;
logger.debug("CONFIG VERSION: "+jsonObject.get("version"));
JSONArray settings = (JSONArray) jsonObject.get("connections");
Iterator<JSONObject> iterator = settings.iterator();
@ -99,6 +97,8 @@ public class JircBotConfiguration {
//config.setChannelName((String);
config.setBotName((String)data.get("botName"));
config.setMasterNick((String)data.get("masterNick"));
return config;
}

View File

@ -14,72 +14,49 @@ import javax.persistence.UniqueConstraint;
*/
@Entity
@Table(name = "channel_settings", uniqueConstraints = {@UniqueConstraint(columnNames = {"channelName"}, name = "uniq_channel_settings_channel_name")})
@Getter @Setter
public class ChannelSettings extends BaseModel {
@Getter
@Setter
@Column(nullable = false)
private String channelName;
@Getter
@Setter
@Column(nullable = false)
private Boolean calculatorEnabled = false;
@Getter
@Setter
@Column(nullable = false)
private Boolean regexCheckerEnabled = false;
@Getter
@Setter
@Column(nullable = false)
private Boolean advicesEnabled = false;
@Getter
@Setter
@Column(nullable = false)
private Boolean quizEnabled = false;
@Getter
@Setter
@Column(nullable = false)
private Boolean bashOrgEnabled = false;
@Getter
@Setter
@Column(nullable = false)
private Boolean autoRejoinEnabled = false;
@Getter
@Setter
@Column(nullable = false)
private Boolean linkPreviewEnabled = false;
@Getter
@Setter
@Column(nullable = false)
private Boolean helloOnJoinEnabled = false;
@Getter
@Setter
@Column(nullable = false)
private Boolean deferredMessagesEnabled = false;
@Getter
@Setter
@Column(nullable = false, columnDefinition = "Boolean DEFAULT False")
private Boolean grammarCorrectionEnabled = false;
@Getter
@Setter
@Column(nullable = false, columnDefinition = "Boolean DEFAULT False")
private Boolean googleSearchEnabled = false;
@Getter
@Setter
@Column(nullable = false, columnDefinition = "Boolean DEFAULT False")
private Boolean loggingEnabled = false;
@Column(nullable = false, columnDefinition = "varchar(255) default ''")
private String onJoinMessage = "";
}

View File

@ -19,4 +19,8 @@ public interface IrcMessageRepository extends JpaRepository<IrcMessage, Long> {
@Query("SELECT m FROM IrcMessage m WHERE m.serverHost = :serverHost AND (m.channelName = CONCAT('#', :channelName) OR m.channelName = CONCAT('##', :channelName)) AND m.dtCreated >= :dtFrom AND m.dtCreated <= :dtTo ORDER BY m.dtCreated")
List<IrcMessage> findAllByServerHostAndChannelNameAndDay(@Param("serverHost") String serverHost, @Param("channelName") String channelName, @Param("dtFrom") Date dtFrom, @Param("dtTo") Date dtTo);
@Query("SELECT m FROM IrcMessage m WHERE m.serverHost = :serverHost AND (m.channelName = :channelName) AND m.dtCreated >= :dtFrom AND m.dtCreated <= :dtTo ORDER BY m.dtCreated")
List<IrcMessage> findAllByServerHostAndRealChannelNameAndDay(@Param("serverHost") String serverHost, @Param("channelName") String channelName, @Param("dtFrom") Date dtFrom, @Param("dtTo") Date dtTo);
}

View File

@ -19,9 +19,21 @@ public class ChannelSettingsService {
if (settings == null) {
settings = new ChannelSettings();
settings.setChannelName(channelName);
channelSettingsRepository.save(settings);
}
return settings;
}
public void creaateChannelSettings(String channelName) {
ChannelSettings settings = channelSettingsRepository.getFirstByChannelName(channelName);
if (settings == null) {
settings = new ChannelSettings();
settings.setChannelName(channelName);
channelSettingsRepository.save(settings);
}
}
public void save(ChannelSettings settings) {
channelSettingsRepository.save(settings);
}
}

View File

@ -40,19 +40,21 @@ public class IrcMessageService {
LocalDateTime dtFrom = localDateTime.with(LocalTime.MIN);
LocalDateTime dtTo = localDateTime.with(LocalTime.MAX);
return ircMessageRepository.findAllByServerHostAndChannelNameAndDay(
String realChannelName = channelName;
String prefix = "";
while (realChannelName.substring(0, 1).equals("_")) {
prefix += "#";
realChannelName = realChannelName.substring(1);
}
realChannelName = prefix + realChannelName;
return ircMessageRepository.findAllByServerHostAndRealChannelNameAndDay(
serverHost,
channelName,
realChannelName,
DateTimeUtility.localDateTimeToDate(dtFrom),
DateTimeUtility.localDateTimeToDate(dtTo)
);
/*return ircMessageRepository.findAllByServerHostAndChannelNameAndDtCreatedGreaterThanEqualAndDtCreatedIsLessThanEqual(
serverHost,
channelName,
DateTimeUtility.localDateTimeToDate(dtFrom),
DateTimeUtility.localDateTimeToDate(dtTo)
);*/
}
}

View File

@ -0,0 +1,184 @@
package ru.bvn13.jircbot.listeners;
import org.pircbotx.hooks.events.JoinEvent;
import org.pircbotx.hooks.events.PrivateMessageEvent;
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.database.entities.ChannelSettings;
import ru.bvn13.jircbot.database.services.ChannelSettingsService;
import ru.bvn13.jircbot.model.Config;
import java.util.concurrent.atomic.AtomicReference;
/**
* Created by bvn13 on 27.03.2018.
*/
@Component
public class AdminListener extends ImprovedListenerAdapter {
private static final String COMMAND = "?";
@Autowired
private JircBotConfiguration configuration;
@Autowired
private ChannelSettingsService channelSettingsService;
@Override
public void onJoin(JoinEvent event) throws Exception {
if (event.getChannel().getName().startsWith("#")) {
channelSettingsService.creaateChannelSettings(event.getChannel().getName());
}
}
@Override
public void onPrivateMessage(PrivateMessageEvent event) throws Exception {
AtomicReference<Config> aConfig = new AtomicReference<>(null);
configuration.getConnections().forEach(c -> {
if (sameServer(event.getUser().getServer(), c.getServer())) {
aConfig.set(c);
}
});
if (aConfig.get() == null) {
return;
}
Config config = aConfig.get();
if (event.getUser().isVerified()
&& !config.getMasterNick().isEmpty()
&& config.getMasterNick().equals(event.getUser().getNick())) {
if (event.getMessage().startsWith(COMMAND)) {
String command = event.getMessage().substring(COMMAND.length());
String commands[] = command.trim().split(" ", 2);
if (commands.length != 2) {
event.respondPrivateMessage("Wrong command");
return;
}
switch (commands[0].toLowerCase()) {
case "join" :
event.getBot().sendIRC().joinChannel(commands[1]); event.respondPrivateMessage("done"); break;
case "leave" :
event.getBot().sendRaw().rawLine("PART "+commands[1]); event.respondPrivateMessage("done"); break;
case "cmd" :
event.getBot().sendRaw().rawLine(command); event.respondPrivateMessage("done"); break;
case "set" :
try {
String args[] = commands[1].split(" ", 3); // set, channel, mode/hello-message
changeSettings(args[1], args[0], args[2]);
event.respondPrivateMessage("done");
} catch (Exception e) {
event.respondPrivateMessage(e.getMessage());
}
break;
default:
event.respondPrivateMessage("Command not supported");
}
}
}
}
private boolean sameServer(String s1, String s2) {
String d1[] = s1.split("[\\.]");
String d2[] = s2.split("[\\.]");
if (d1.length >= 2 && d2.length >= 2) {
if (d1[d1.length - 1].equals(d2[d2.length - 1])
&& d1[d1.length - 2].equals(d2[d2.length - 2])) {
return true;
}
}
return false;
}
private void changeSettings(String channelName, String set, String modeStr) {
if (set.equals("hello-message") || set.equals("hello-msg")) {
ChannelSettings settings = channelSettingsService.getChannelSettings(channelName);
settings.setOnJoinMessage(modeStr);
channelSettingsService.save(settings);
} else {
if (!modeStr.equals("off") && !modeStr.equals("on")) {
throw new RuntimeException("Wrong mode. Variants: on, off");
}
Boolean mode = modeStr.equals("on");
ChannelSettings settings = channelSettingsService.getChannelSettings(channelName);
switch (set.toLowerCase()) {
case "autorejoin":
case "auto-rejoin":
settings.setAutoRejoinEnabled(mode);
break;
case "bash":
case "bashorg":
settings.setBashOrgEnabled(mode);
break;
case "defferedmessages":
case "deffered-messages":
settings.setDeferredMessagesEnabled(mode);
break;
case "gs":
case "googlesearch":
case "google-search":
settings.setGoogleSearchEnabled(mode);
break;
case "grammar":
case "grammarcorrection":
case "grammar-correction":
settings.setGrammarCorrectionEnabled(mode);
break;
case "hello":
case "helloonjoin":
case "hello-on-join":
settings.setHelloOnJoinEnabled(mode);
break;
case "links":
case "linkpreview":
case "links-preview":
settings.setLinkPreviewEnabled(mode);
break;
case "logging":
case "log":
settings.setLoggingEnabled(mode);
break;
case "regex":
case "regexp":
case "regexchecker":
case "regexpchecker":
case "regex-checker":
case "regexp-checker":
settings.setRegexCheckerEnabled(mode);
break;
case "advice":
case "advices":
settings.setAdvicesEnabled(mode);
break;
case "calc":
case "calculator":
settings.setCalculatorEnabled(mode);
break;
case "quiz":
settings.setQuizEnabled(mode);
break;
default:
throw new RuntimeException("Setting " + set + " not exist");
}
channelSettingsService.save(settings);
}
}
}

View File

@ -6,6 +6,7 @@ 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.database.entities.ChannelSettings;
import ru.bvn13.jircbot.database.services.ChannelSettingsService;
/**
@ -20,7 +21,9 @@ public class HelloOnJoinListener extends ImprovedListenerAdapter {
@Override
public void onJoin(final JoinEvent event) throws Exception {
if (!channelSettingsService.getChannelSettings(getChannelName(event)).getHelloOnJoinEnabled()) {
ChannelSettings channelSettings = channelSettingsService.getChannelSettings(getChannelName(event));
if (!channelSettings.getHelloOnJoinEnabled()) {
return;
}
@ -28,8 +31,11 @@ public class HelloOnJoinListener extends ImprovedListenerAdapter {
return;
}
event.respond("Привет, "+event.getUser().getNick()+"!");
//this.sendNotice(event, "Привет, "+event.getUser().getNick()+"!");
if (channelSettings.getOnJoinMessage() != null && !channelSettings.getOnJoinMessage().isEmpty()) {
event.respond(channelSettings.getOnJoinMessage().replace("%nick%", event.getUser().getNick()));
} else {
event.respond("Привет, " + event.getUser().getNick() + "!");
}
}

View File

@ -1,10 +1,14 @@
package ru.bvn13.jircbot.model;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Data
//@Getter
//@Setter
public class Config {
private Boolean enabled = false;
@ -17,4 +21,6 @@ public class Config {
private List<String> channelsNames;
private String masterNick;
}