2018-12-16 17:27:44 +03:00
|
|
|
package InnaIrcBot.LogDriver;
|
|
|
|
|
|
|
|
import java.io.File;
|
|
|
|
import java.io.FileWriter;
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.time.LocalDate;
|
|
|
|
import java.time.LocalTime;
|
|
|
|
import java.time.format.DateTimeFormatter;
|
|
|
|
import java.util.regex.Pattern;
|
|
|
|
|
|
|
|
public class BotFilesWorker implements Worker {
|
2020-10-20 03:37:20 +03:00
|
|
|
private final String channel;
|
|
|
|
private String filePath;
|
|
|
|
private final DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("HH:mm:ss");
|
|
|
|
private LocalDate dateOnFile;
|
2018-12-16 17:27:44 +03:00
|
|
|
private FileWriter fileWriter;
|
|
|
|
|
2020-10-20 03:37:20 +03:00
|
|
|
private boolean consistent;
|
2019-01-25 06:44:06 +03:00
|
|
|
|
2018-12-16 17:27:44 +03:00
|
|
|
public BotFilesWorker(String server, String[] driverParameters, String channel){
|
2020-10-20 03:37:20 +03:00
|
|
|
this.channel = channel.replaceAll(File.separator, ",");
|
2019-01-25 06:44:06 +03:00
|
|
|
|
2020-10-20 03:37:20 +03:00
|
|
|
formatFilePath(server, driverParameters);
|
2019-01-25 06:44:06 +03:00
|
|
|
|
|
|
|
try {
|
2020-10-20 03:37:20 +03:00
|
|
|
createServerFolder();
|
|
|
|
createFileWriter();
|
|
|
|
consistent = true;
|
2019-01-25 06:44:06 +03:00
|
|
|
} catch (Exception e){
|
2020-10-20 03:37:20 +03:00
|
|
|
System.out.println("BotFilesWorker (@"+server+")->constructor(): Failure:\n" + e.getMessage());
|
2018-12-16 17:27:44 +03:00
|
|
|
}
|
2020-10-20 03:37:20 +03:00
|
|
|
}
|
2018-12-16 17:27:44 +03:00
|
|
|
|
2020-10-20 03:37:20 +03:00
|
|
|
private void formatFilePath(String server, String[] driverParameters){
|
|
|
|
String dirLocation = driverParameters[0].trim(); // TODO: MOVE trim() out of here
|
|
|
|
|
|
|
|
if (! dirLocation.endsWith(File.separator))
|
|
|
|
dirLocation += File.separator;
|
|
|
|
|
|
|
|
this.filePath = dirLocation+server+File.separator;
|
2018-12-16 17:27:44 +03:00
|
|
|
}
|
2020-10-20 03:37:20 +03:00
|
|
|
|
|
|
|
private void createServerFolder() throws Exception{
|
|
|
|
final File file = new File(filePath);
|
2018-12-16 17:27:44 +03:00
|
|
|
|
2020-10-20 03:37:20 +03:00
|
|
|
if (file.exists()){
|
|
|
|
if (file.isDirectory())
|
|
|
|
return;
|
|
|
|
else
|
|
|
|
throw new Exception("BotFilesWorker->createServerFolder() "+filePath+" is file while directory expected.");
|
2018-12-16 17:27:44 +03:00
|
|
|
}
|
2020-10-20 03:37:20 +03:00
|
|
|
|
|
|
|
if (file.mkdirs())
|
|
|
|
return;
|
|
|
|
|
|
|
|
throw new Exception("BotFilesWorker->createServerFolder() Can't create directory: "+filePath);
|
2018-12-16 17:27:44 +03:00
|
|
|
}
|
2020-10-20 03:37:20 +03:00
|
|
|
|
|
|
|
private void resetFileWriter() throws IOException{
|
|
|
|
fileWriter.close();
|
|
|
|
createFileWriter();
|
|
|
|
}
|
|
|
|
private void createFileWriter() throws IOException{
|
|
|
|
dateOnFile = LocalDate.now();
|
|
|
|
File newFile = new File(filePath+channel+"_"+ dateOnFile +".txt");
|
|
|
|
fileWriter = new FileWriter(newFile);
|
|
|
|
}
|
|
|
|
|
2018-12-16 17:27:44 +03:00
|
|
|
@Override
|
|
|
|
public boolean isConsistent() {
|
|
|
|
return consistent;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* argument[0] should be always 'from whom'
|
|
|
|
* argument[1] should be always 'subject'
|
|
|
|
* */
|
|
|
|
@Override
|
2020-10-20 03:37:20 +03:00
|
|
|
public boolean logAdd(String event, String initiator, String message) {
|
2018-12-16 17:27:44 +03:00
|
|
|
switch (event){
|
|
|
|
case "PRIVMSG":
|
2020-10-20 03:37:20 +03:00
|
|
|
PRIVMSG(initiator, message);
|
2018-12-16 17:27:44 +03:00
|
|
|
break;
|
|
|
|
case "JOIN":
|
2020-10-20 03:37:20 +03:00
|
|
|
JOIN(initiator, message);
|
2018-12-16 17:27:44 +03:00
|
|
|
break;
|
|
|
|
case "MODE":
|
2020-10-20 03:37:20 +03:00
|
|
|
MODE(initiator, message);
|
2018-12-16 17:27:44 +03:00
|
|
|
break;
|
|
|
|
case "KICK":
|
2020-10-20 03:37:20 +03:00
|
|
|
KICK(initiator, message);
|
2018-12-16 17:27:44 +03:00
|
|
|
break;
|
|
|
|
case "PART":
|
2020-10-20 03:37:20 +03:00
|
|
|
PART(initiator, message);
|
2018-12-16 17:27:44 +03:00
|
|
|
break;
|
|
|
|
case "QUIT":
|
2020-10-20 03:37:20 +03:00
|
|
|
QUIT(initiator, message);
|
2018-12-16 17:27:44 +03:00
|
|
|
break;
|
|
|
|
case "NICK":
|
2020-10-20 03:37:20 +03:00
|
|
|
NICK(initiator, message);
|
2018-12-16 17:27:44 +03:00
|
|
|
break;
|
|
|
|
case "TOPIC":
|
2020-10-20 03:37:20 +03:00
|
|
|
TOPIC(initiator, message);
|
2018-12-16 17:27:44 +03:00
|
|
|
break;
|
|
|
|
default:
|
2020-10-20 03:37:20 +03:00
|
|
|
prettyPrint("["+LocalTime.now().format(dateFormat)+"] "+event+" "+initiator+" "+message+"\n"); // TODO: QA @ big data
|
2018-12-16 17:27:44 +03:00
|
|
|
break;
|
|
|
|
}
|
2019-01-25 06:44:06 +03:00
|
|
|
return consistent;
|
2018-12-16 17:27:44 +03:00
|
|
|
}
|
|
|
|
private void prettyPrint(String string){
|
2020-10-20 03:37:20 +03:00
|
|
|
try {
|
|
|
|
if (LocalDate.now().isAfter(dateOnFile)) {
|
|
|
|
resetFileWriter();
|
2019-01-25 06:44:06 +03:00
|
|
|
}
|
2020-10-20 03:37:20 +03:00
|
|
|
fileWriter.write(string);
|
|
|
|
fileWriter.flush();
|
|
|
|
} catch (Exception e){
|
|
|
|
System.out.println("BotFilesWorker->prettyPrint() failed\n" +
|
|
|
|
"\tUnable to write logs to " + this.filePath + " "+e.getMessage());
|
|
|
|
close();
|
|
|
|
consistent = false;
|
|
|
|
}
|
2018-12-16 17:27:44 +03:00
|
|
|
}
|
2020-10-20 03:37:20 +03:00
|
|
|
private String getCurrentTimestamp(){
|
2018-12-16 17:27:44 +03:00
|
|
|
return "["+LocalTime.now().format(dateFormat)+"] ";
|
|
|
|
}
|
2020-10-20 03:37:20 +03:00
|
|
|
private String getUserNameOnly(String userNameFull){
|
|
|
|
return userNameFull.replaceAll("!.+$", "");
|
|
|
|
}
|
|
|
|
private String getUserNameAndHost(String userNameFull){
|
|
|
|
return userNameFull.replaceAll("!.+$", "")+" [!"+userNameFull.replaceAll("^.+!", "")+"] ";
|
|
|
|
}
|
2018-12-16 17:27:44 +03:00
|
|
|
|
|
|
|
private void PRIVMSG(String initiatorArg, String messageArg){
|
|
|
|
String msg = messageArg.substring(messageArg.indexOf(":")+1);
|
2020-10-20 03:37:20 +03:00
|
|
|
|
|
|
|
if (Pattern.matches("^\\u0001ACTION .+\\u0001", msg)){
|
|
|
|
prettyPrint(getCurrentTimestamp()+getUserNameOnly(initiatorArg)+msg.replaceAll("(^\\u0001ACTION)|(\\u0001$)","")+"\n");
|
|
|
|
return;
|
2018-12-16 17:27:44 +03:00
|
|
|
}
|
2020-10-20 03:37:20 +03:00
|
|
|
prettyPrint(getCurrentTimestamp()+"<"+getUserNameOnly(initiatorArg)+"> "+msg+"\n");
|
2018-12-16 17:27:44 +03:00
|
|
|
}
|
|
|
|
private void JOIN(String initiatorArg, String messageArg){
|
2020-10-20 03:37:20 +03:00
|
|
|
prettyPrint(getCurrentTimestamp()+">> "+getUserNameAndHost(initiatorArg)+"joined "+messageArg+"\n");
|
2018-12-16 17:27:44 +03:00
|
|
|
}
|
|
|
|
private void MODE(String initiatorArg, String messageArg){
|
|
|
|
String initiatorChain;
|
|
|
|
if (initiatorArg.contains("!"))
|
|
|
|
initiatorChain = getUserNameAndHost(initiatorArg)+"set";
|
|
|
|
else
|
|
|
|
initiatorChain = initiatorArg+" set";
|
2020-10-20 03:37:20 +03:00
|
|
|
|
|
|
|
prettyPrint(getCurrentTimestamp()+"-!- "+initiatorChain + messageArg.substring(messageArg.indexOf(" "))+"\n");
|
2018-12-16 17:27:44 +03:00
|
|
|
}
|
|
|
|
private void KICK(String initiatorArg, String messageArg){
|
2020-10-20 03:37:20 +03:00
|
|
|
prettyPrint(getCurrentTimestamp()+"!<< "+messageArg.replaceAll("(^.+?\\s)|(\\s.+$)", "")+
|
2018-12-16 17:27:44 +03:00
|
|
|
" kicked by "+getUserNameAndHost(initiatorArg)+"with reason: "+messageArg.replaceAll("^.+?:", "")+"\n");
|
|
|
|
}
|
|
|
|
private void PART(String initiatorArg, String messageArg){
|
2020-10-20 03:37:20 +03:00
|
|
|
prettyPrint(getCurrentTimestamp()+"<< "+getUserNameAndHost(initiatorArg)+"parted: "
|
|
|
|
+ messageArg.replaceAll("^.+?:","")+"\n");
|
2018-12-16 17:27:44 +03:00
|
|
|
}
|
|
|
|
private void QUIT(String initiatorArg, String messageArg){
|
2020-10-20 03:37:20 +03:00
|
|
|
prettyPrint(getCurrentTimestamp()+"<< "+getUserNameAndHost(initiatorArg)+"quit: "
|
|
|
|
+ messageArg.replaceAll("^.+?:","")+"\n");
|
2018-12-16 17:27:44 +03:00
|
|
|
}
|
|
|
|
private void NICK(String initiatorArg, String messageArg){
|
2020-10-20 03:37:20 +03:00
|
|
|
prettyPrint(getCurrentTimestamp()+"-!- "+getUserNameAndHost(initiatorArg)+"changed nick to: "+messageArg+"\n");
|
2018-12-16 17:27:44 +03:00
|
|
|
}
|
|
|
|
private void TOPIC(String initiatorArg, String messageArg) {
|
2020-10-20 03:37:20 +03:00
|
|
|
prettyPrint(getCurrentTimestamp()+"-!- "+getUserNameAndHost(initiatorArg)+"has changed topic to: "
|
|
|
|
+ messageArg.replaceAll("^.+?:", "")+"\n");
|
2018-12-16 17:27:44 +03:00
|
|
|
}
|
2019-01-25 06:44:06 +03:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public void close() {
|
|
|
|
try {
|
2020-10-20 03:37:20 +03:00
|
|
|
fileWriter.close();
|
2019-01-25 06:44:06 +03:00
|
|
|
}
|
2020-10-20 03:37:20 +03:00
|
|
|
catch (NullPointerException ignore) {}
|
|
|
|
catch (IOException e){
|
|
|
|
System.out.println("BotFilesWorker->close() failed\n" +
|
|
|
|
"\tUnable to properly close file: "+this.filePath); // Live with it.
|
2019-01-25 06:44:06 +03:00
|
|
|
}
|
|
|
|
this.consistent = false;
|
|
|
|
}
|
2018-12-16 17:27:44 +03:00
|
|
|
}
|