164 lines
6.5 KiB
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");
|
||
|
}
|
||
|
}
|