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); + } +}