From 5dd2d4392e826a44e68a0554e4bfba18c385c947 Mon Sep 17 00:00:00 2001
From: Aurora Lahtela <24460436+AuroraLS3@users.noreply.github.com>
Date: Fri, 27 May 2022 20:13:12 +0300
Subject: [PATCH] Groundwork for #1050
---
.../plan/delivery/domain/TimeSegment.java | 75 +++++++++++++++++++
.../domain/mutators/SessionsMutator.java | 5 ++
.../domain/mutators/TimeSegmentsMutator.java | 59 +++++++++++++++
3 files changed, 139 insertions(+)
create mode 100644 Plan/common/src/main/java/com/djrapitops/plan/delivery/domain/TimeSegment.java
create mode 100644 Plan/common/src/main/java/com/djrapitops/plan/delivery/domain/mutators/TimeSegmentsMutator.java
diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/domain/TimeSegment.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/domain/TimeSegment.java
new file mode 100644
index 000000000..8e0c46f71
--- /dev/null
+++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/domain/TimeSegment.java
@@ -0,0 +1,75 @@
+/*
+ * This file is part of Player Analytics (Plan).
+ *
+ * Plan is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License v3 as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Plan is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Plan. If not, see .
+ */
+package com.djrapitops.plan.delivery.domain;
+
+import java.util.Comparator;
+import java.util.Objects;
+
+public class TimeSegment {
+
+ private final long start;
+ private final long end;
+ private final T value;
+
+ public TimeSegment(long start, long end, T value) {
+ this.start = start;
+ this.end = end;
+ this.value = value;
+ }
+
+ public static Comparator> earliestStartFirstComparator() {
+ return Comparator.comparingLong(segment -> segment.start);
+ }
+
+ public static Comparator> earliestEndFirstComparator() {
+ return Comparator.comparingLong(segment -> segment.end);
+ }
+
+ public long getStart() {
+ return start;
+ }
+
+ public long getEnd() {
+ return end;
+ }
+
+ public T getValue() {
+ return value;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ TimeSegment> that = (TimeSegment>) o;
+ return getStart() == that.getStart() && getEnd() == that.getEnd() && Objects.equals(getValue(), that.getValue());
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(getStart(), getEnd(), getValue());
+ }
+
+ @Override
+ public String toString() {
+ return "TimeSegment{" +
+ "start=" + start +
+ ", end=" + end +
+ ", value=" + value +
+ '}';
+ }
+}
diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/domain/mutators/SessionsMutator.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/domain/mutators/SessionsMutator.java
index cbeabdd3d..855c848cf 100644
--- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/domain/mutators/SessionsMutator.java
+++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/domain/mutators/SessionsMutator.java
@@ -31,6 +31,7 @@ import com.djrapitops.plan.gathering.domain.event.JoinAddress;
import com.djrapitops.plan.identification.ServerUUID;
import com.djrapitops.plan.settings.config.WorldAliasSettings;
import com.djrapitops.plan.utilities.analysis.Median;
+import com.djrapitops.plan.utilities.comparators.DateHolderOldestComparator;
import com.djrapitops.plan.utilities.java.Lists;
import java.util.*;
@@ -102,6 +103,10 @@ public class SessionsMutator {
return sessions;
}
+ public TimeSegmentsMutator onlineTimeSegments() {
+ return TimeSegmentsMutator.sessionClockSegments(sort(new DateHolderOldestComparator()).all());
+ }
+
public SessionsMutator filterPlayedOnServer(ServerUUID serverUUID) {
return filterBy(session ->
session.getServerUUID().equals(serverUUID)
diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/domain/mutators/TimeSegmentsMutator.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/domain/mutators/TimeSegmentsMutator.java
new file mode 100644
index 000000000..248ca2c29
--- /dev/null
+++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/domain/mutators/TimeSegmentsMutator.java
@@ -0,0 +1,59 @@
+/*
+ * This file is part of Player Analytics (Plan).
+ *
+ * Plan is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License v3 as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Plan is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Plan. If not, see .
+ */
+package com.djrapitops.plan.delivery.domain.mutators;
+
+import com.djrapitops.plan.delivery.domain.DateObj;
+import com.djrapitops.plan.delivery.domain.TimeSegment;
+import com.djrapitops.plan.gathering.domain.FinishedSession;
+import com.djrapitops.plan.utilities.comparators.DateHolderOldestComparator;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+public class TimeSegmentsMutator {
+
+ List> segments;
+
+ public TimeSegmentsMutator(List> segments) {
+ this.segments = segments;
+ }
+
+ public static TimeSegmentsMutator sessionClockSegments(List sessions) {
+ List> changes = new ArrayList<>();
+
+ for (FinishedSession session : sessions) {
+ long startTime = (session.getStart()) % TimeUnit.DAYS.toMillis(1);
+ long endTime = (session.getEnd()) % TimeUnit.DAYS.toMillis(1);
+ changes.add(new DateObj<>(startTime, 1));
+ changes.add(new DateObj<>(endTime, -1));
+ }
+
+ changes.sort(new DateHolderOldestComparator());
+
+ int count = 0;
+ long previousTime = 0L;
+ List> segments = new ArrayList<>();
+ for (DateObj change : changes) {
+ segments.add(new TimeSegment<>(previousTime, change.getDate(), count));
+ count += change.getValue();
+ previousTime = change.getDate();
+ }
+
+ return new TimeSegmentsMutator<>(segments);
+ }
+}