package io.mazenmc.skypebot.stat;
import com.samczsun.skype4j.chat.messages.ReceivedMessage;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class StatisticsManager {
private static final StatisticsManager INSTANCE = new StatisticsManager();
private Map<String, MessageStatistic> statistics = new ConcurrentHashMap<>();
public static StatisticsManager instance() {
return INSTANCE;
}
public void logMessage(ReceivedMessage message) {
String senderId = message.getSender().getUsername();
if (!statistics.containsKey(senderId))
statistics.put(senderId, new MessageStatistic(senderId));
try {
statistics.get(senderId).addMessage(message);
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void removeStat(String id) {
statistics.remove(id);
}
public String ownerFor(MessageStatistic statistic) {
for (Map.Entry<String, MessageStatistic> entry : statistics.entrySet()) {
if (entry.getValue().equals(statistic))
return entry.getKey();
}
return null;
}
public Map<String, MessageStatistic> statistics() {
return statistics;
}
public void loadStatistics() {
StringBuilder source = new StringBuilder();
try {
for (String s : Files.readAllLines(Paths.get("statistics.json"))) {
source.append(s)
.append("\n");
}
} catch (IOException ex) {
ex.printStackTrace();
}
try {
JSONObject object = new JSONObject(source.toString());
object.keys().forEachRemaining((obj) -> {
if (!(obj instanceof String)) {
return;
}
String key = (String) obj;
try {
statistics.put(key, new MessageStatistic(key, object.getJSONArray(key)));
} catch (JSONException ex) {
ex.printStackTrace();
}
});
} catch (JSONException ex) {
ex.printStackTrace();
}
}
public void saveStatistics() {
JSONObject object = new JSONObject();
for (Map.Entry<String, MessageStatistic> entry : statistics.entrySet()) {
try {
JSONArray array = new JSONArray();
entry.getValue().messages().forEach((m) -> {
try {
JSONObject obj = new JSONObject();
obj.put("contents", m.contents());
obj.put("time", m.time());
array.put(obj);
} catch (JSONException ignored) {
}
});
object.put(entry.getKey(), array);
} catch (JSONException ex) {
ex.printStackTrace();
}
}
try {
Files.write(Paths.get("statistics.json"), object.toString().getBytes("UTF-8"));
} catch (UnsupportedEncodingException ignored) {
} catch (IOException ex) {
ex.printStackTrace();
}
}
}