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.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.ThreadLocalRandom; import java.util.stream.Collectors; import java.util.stream.IntStream; public class MessageStatistic { private final String name; private final List<Message> messages; MessageStatistic(String name) { this.name = name; messages = new ArrayList<>(); } MessageStatistic(String name, JSONArray messages) { this(name); IntStream.range(0, messages.length()).forEach((i) -> { try { JSONObject object = messages.getJSONObject(i); this.messages.add(new Message(object.getString("contents"), object.getLong("time"))); } catch (JSONException ex) { ex.printStackTrace(); } }); if (this.messages.isEmpty()) { this.messages.add(new Message("<never sent message>", System.currentTimeMillis())); } } public String name() { return name; } public List<String> words() { List<String> words = new ArrayList<>(); messages.stream() .map((s) -> s.contents().split(" ")) .forEach((s) -> words.addAll(Arrays.asList(s))); return words; } public String mostCommonWord() { return words().stream() .collect(Collectors.groupingBy(w -> w, Collectors.counting())) .entrySet().stream() .sorted((e, e1) -> (int) (e1.getValue() - e.getValue())) .findFirst().get() .getKey(); } public int wordCount() { return messages.stream() .mapToInt((m) -> m.contents().split(" ").length) .filter(i -> i > 2) .sum(); } public int letterCount() { return messages.stream() .mapToInt((m) -> m.contents().chars().filter((i) -> ((char) i) != ' ').sum()) .sum(); } public double averageWords() { return wordCount() / messageAmount(); } public int messageAmount() { return messages.size(); } public Message randomMessage() { return messages.get(ThreadLocalRandom.current().nextInt(messages.size())); } public int commandCount() { return (int) messages.stream() .map(Message::contents) .filter((s) -> s.startsWith("@")) .count(); } public double commandPercent() { return ((double) commandCount() / (double) messageAmount()) * 100; } public void addMessage(ReceivedMessage message) { messages.add(new Message(message.getContent().asPlaintext(), System.currentTimeMillis())); } public void addMessage(Message message) { messages.add(message); } public List<Message> messages() { return messages; } @Override public boolean equals(Object obj) { return obj instanceof MessageStatistic && messages.equals(((MessageStatistic) obj).messages); } }