innaircbot/src/main/java/InnaIrcBot/logging/WorkerFiles.java

189 lines
6.8 KiB
Java
Raw Normal View History

2020-10-20 18:19:20 +03:00
package InnaIrcBot.logging;
2018-12-16 17:27:44 +03:00
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;
2020-10-20 18:19:20 +03:00
public class WorkerFiles 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
2020-10-20 18:19:20 +03:00
public WorkerFiles(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
}