innaircbot/src/main/java/InnaIrcBot/LogDriver/BotFilesWorker.java

164 lines
6.5 KiB
Java

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 {
private String filePath;
private boolean consistent = false;
private DateTimeFormatter dateFormat;
private LocalDate fileWriterDay;
private FileWriter fileWriter;
public BotFilesWorker(String server, String[] driverParameters, String channel){
if (System.getProperty("os.name").startsWith("Windows")){
channel = channel.replaceAll("\",",",");
}
else {
channel = channel.replaceAll("/",",");
}
driverParameters[0] = driverParameters[0].trim(); //Consider parameters[0] as dirLocation
String dirLocation;
if (driverParameters[0].endsWith(File.separator))
dirLocation = driverParameters[0]+server;
else
dirLocation = driverParameters[0]+File.separator+server;
File dir = new File(dirLocation);
dir.mkdirs();
if (!dir.exists()) {
System.out.println("Unable to create directory to store files: " + dirLocation); //TODO: notify requester
this.consistent = false;
}
this.filePath = dirLocation+File.separator+channel;
dateFormat = DateTimeFormatter.ofPattern("HH:mm:ss");
if (resetFileWriter(false))
this.consistent = true;
}
private boolean resetFileWriter(boolean reassign){
try {
if (reassign)
this.fileWriter.close();
this.fileWriterDay = LocalDate.now();
this.fileWriter = new FileWriter(this.filePath+"_"+LocalDate.now().toString()+".txt", true);
return true;
}
catch (java.io.IOException e){
System.out.println("Internal issue: BotFilesWorker->constructor() can't create file to store logs: "+this.filePath);
return false;
}
}
@Override
public boolean isConsistent() {
return consistent;
}
/**
* argument[0] should be always 'from whom'
* argument[1] should be always 'subject'
* */
@Override
public void logAdd(String event, String initiatorArg, String messageArg) {
switch (event){
case "PRIVMSG":
PRIVMSG(initiatorArg, messageArg);
break;
case "JOIN":
JOIN(initiatorArg, messageArg);
break;
case "MODE":
MODE(initiatorArg, messageArg);
break;
case "KICK":
KICK(initiatorArg, messageArg);
break;
case "PART":
PART(initiatorArg, messageArg);
break;
case "QUIT":
QUIT(initiatorArg, messageArg);
break;
case "NICK":
NICK(initiatorArg, messageArg);
break;
case "TOPIC":
TOPIC(initiatorArg, messageArg);
break;
default:
this.prettyPrint("["+LocalTime.now().format(dateFormat)+"] "+event+" "+initiatorArg+" "+messageArg+"\n"); // TODO: QA @ big data
break;
}
}
@Override
public void close() {
try {
fileWriter.close();
}
catch (java.io.IOException e){
System.out.println("Internal issue: BotFilesWorker->close() failed\n\tUnable to properly close file: "+this.filePath); // Live with it.
}
}
private void prettyPrint(String string){
if (LocalDate.now().isAfter(fileWriterDay))
resetFileWriter(true);
try {
fileWriter.write(string);
fileWriter.flush();
} catch (IOException e) {
System.out.println("Internal issue: BotFilesWorker->prettyPrint() failed\n\tUnable to write logs of "+this.filePath+" because of internal failure in LocalTime representation.");
consistent = false;
}
}
private String genDate(){
return "["+LocalTime.now().format(dateFormat)+"] ";
}
private String getUserNameOnly(String userNameFull){return userNameFull.replaceAll("!.+$", "");}
private String getUserNameAndHost(String userNameFull){return userNameFull.replaceAll("!.+$", "")+" [!"+userNameFull.replaceAll("^.+!", "")+"] ";}
private void PRIVMSG(String initiatorArg, String messageArg){
String msg = messageArg.substring(messageArg.indexOf(":")+1);
if (!Pattern.matches("^\\u0001ACTION .+\\u0001", msg)){
this.prettyPrint(genDate()+"<"+getUserNameOnly(initiatorArg)+"> "+msg+"\n");
}
else {
this.prettyPrint(genDate()+getUserNameOnly(initiatorArg)+msg.replaceAll("(^\\u0001ACTION)|(\\u0001$)","")+"\n");
}
}
private void JOIN(String initiatorArg, String messageArg){
this.prettyPrint(genDate()+">> "+getUserNameAndHost(initiatorArg)+"joined "+messageArg+"\n");
}
private void MODE(String initiatorArg, String messageArg){
String initiatorChain;
if (initiatorArg.contains("!"))
initiatorChain = getUserNameAndHost(initiatorArg)+"set";
else
initiatorChain = initiatorArg+" set";
this.prettyPrint(genDate()+"-!- "+initiatorChain+messageArg.substring(messageArg.indexOf(" "))+"\n");
}
private void KICK(String initiatorArg, String messageArg){
this.prettyPrint(genDate()+"!<< "+messageArg.replaceAll("(^.+?\\s)|(\\s.+$)", "")+
" kicked by "+getUserNameAndHost(initiatorArg)+"with reason: "+messageArg.replaceAll("^.+?:", "")+"\n");
}
private void PART(String initiatorArg, String messageArg){
this.prettyPrint(genDate()+"<< "+getUserNameAndHost(initiatorArg)+"parted: "+messageArg.replaceAll("^.+?:","")+"\n");
}
private void QUIT(String initiatorArg, String messageArg){
this.prettyPrint(genDate()+"<< "+getUserNameAndHost(initiatorArg)+" quit: "+messageArg.replaceAll("^.+?:","")+"\n");
}
private void NICK(String initiatorArg, String messageArg){
this.prettyPrint(genDate()+"-!- "+getUserNameAndHost(initiatorArg)+"changed nick to: "+messageArg+"\n");
}
private void TOPIC(String initiatorArg, String messageArg) {
this.prettyPrint(genDate()+"-!- "+getUserNameAndHost(initiatorArg)+"has changed topic to: "+messageArg.replaceAll("^.+?:", "")+"\n");
}
}