87 lines
2.8 KiB
Java
87 lines
2.8 KiB
Java
package InnaIrcBot.ProvidersConsumers;
|
|
|
|
import InnaIrcBot.GlobalData;
|
|
import InnaIrcBot.logging.WorkerSystem;
|
|
|
|
import java.time.LocalDateTime;
|
|
import java.time.ZonedDateTime;
|
|
import java.time.format.DateTimeFormatter;
|
|
|
|
public class SystemCTCP {
|
|
private final String server;
|
|
private LocalDateTime lastReplyTime;
|
|
private final int cooldownTime;
|
|
private final WorkerSystem writerWorker;
|
|
|
|
SystemCTCP(String server, int cooldownTime, WorkerSystem writerWorker){
|
|
this.server = server;
|
|
this.lastReplyTime = LocalDateTime.now();
|
|
this.cooldownTime = cooldownTime;
|
|
this.writerWorker = writerWorker;
|
|
}
|
|
|
|
void replyCTCP(String sender, String message) {
|
|
if (isTooManyRequests())
|
|
return;
|
|
|
|
lastReplyTime = LocalDateTime.now();
|
|
|
|
switch (message) {
|
|
case "\u0001VERSION\u0001":
|
|
replyVersion(sender);
|
|
log("CTCP VERSION from", sender);
|
|
return;
|
|
case "\u0001CLIENTINFO\u0001":
|
|
replyClientInfo(sender);
|
|
log("CTCP CLIENTINFO from", sender);
|
|
return;
|
|
case "\u0001TIME\u0001":
|
|
replyTime(sender);
|
|
log( "CTCP TIME from", sender);
|
|
return;
|
|
case "\u0001SOURCE\u0001":
|
|
replySource(sender);
|
|
log( "CTCP TIME from", sender);
|
|
return;
|
|
}
|
|
if (message.startsWith("\u0001PING ") && message.endsWith("\u0001")) {
|
|
replyPing(sender, message);
|
|
log( "CTCP PING from", sender);
|
|
return;
|
|
}
|
|
log( "CTCP not supported: \"" + message + "\" from ", sender);
|
|
}
|
|
|
|
private boolean isTooManyRequests(){
|
|
return lastReplyTime.isAfter(LocalDateTime.now().minusSeconds(cooldownTime));
|
|
}
|
|
|
|
private void replyVersion(String sender){
|
|
reply("NOTICE " + sender + " :\u0001VERSION " + GlobalData.getAppVersion() + "\u0001");
|
|
}
|
|
private void replyClientInfo(String sender){
|
|
reply("NOTICE " + sender + " :\u0001CLIENTINFO ACTION PING VERSION TIME CLIENTINFO SOURCE\u0001");
|
|
}
|
|
private void replyTime(String sender){
|
|
reply("NOTICE " + sender + " :\u0001TIME " + timeStamp() + "\u0001");
|
|
}
|
|
private void replySource(String sender){
|
|
reply("NOTICE " + sender + " :\u0001SOURCE " + GlobalData.applicationHomePage + "\u0001");
|
|
}
|
|
private void replyPing(String sender, String message){
|
|
reply("NOTICE " + sender + " :" + message);
|
|
}
|
|
|
|
private void reply(String message){
|
|
StreamProvider.writeToStream(server, message);
|
|
}
|
|
|
|
private void log(String event, String sender){
|
|
writerWorker.log(event, sender);
|
|
}
|
|
|
|
private String timeStamp(){
|
|
return ZonedDateTime.now().format(DateTimeFormatter.RFC_1123_DATE_TIME);
|
|
}
|
|
}
|