Skip to content

Commit

Permalink
Implement persisted map scores & cooldowns (#1470)
Browse files Browse the repository at this point in the history
Signed-off-by: Pablo Herrera <[email protected]>
  • Loading branch information
Pablete1234 authored Jan 2, 2025
1 parent df8e82e commit 003a76e
Show file tree
Hide file tree
Showing 11 changed files with 428 additions and 68 deletions.
26 changes: 26 additions & 0 deletions core/src/main/java/tc/oc/pgm/api/Datastore.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package tc.oc.pgm.api;

import java.util.Collection;
import java.util.Map;
import java.util.UUID;
import tc.oc.pgm.api.map.MapActivity;
import tc.oc.pgm.api.map.MapData;
import tc.oc.pgm.api.player.Username;
import tc.oc.pgm.api.setting.Settings;
import tc.oc.pgm.rotation.pools.VotingPool;
import tc.oc.pgm.util.skin.Skin;

/** A fast, persistent datastore that provides synchronous responses. */
Expand Down Expand Up @@ -49,6 +53,28 @@ public interface Datastore {
*/
MapActivity getMapActivity(String poolName);

/**
* Get the data related to a map
*
* @param mapId the map id or slug
* @param score default score if no map data exists
* @return A {@link MapData}
*/
MapData getMapData(String mapId, double score);

/**
* Get the data related to several maps in bulk
*
* @param mapIds The map ids wanted
* @param score default score if no map data exists
* @return A map containing at least all maps in {@param mapIds}, potentially more
*/
Map<String, ? extends MapData> getMapData(Collection<String> mapIds, double score);

void tickMapScores(VotingPool.VoteConstants constants);

void refreshMapData();

/** Cleans up any resources or connections. */
void close();
}
20 changes: 20 additions & 0 deletions core/src/main/java/tc/oc/pgm/api/map/MapData.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package tc.oc.pgm.api.map;

import java.time.Duration;
import java.time.Instant;
import tc.oc.pgm.api.match.Match;

public interface MapData {

String getId();

Instant lastPlayed();

Duration lastDuration();

double score();

void setScore(double score, boolean update);

void saveMatch(Match match, double score);
}
87 changes: 50 additions & 37 deletions core/src/main/java/tc/oc/pgm/db/CacheDatastore.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,15 @@
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import java.util.Collection;
import java.util.Map;
import java.util.UUID;
import tc.oc.pgm.api.Datastore;
import tc.oc.pgm.api.map.MapActivity;
import tc.oc.pgm.api.map.MapData;
import tc.oc.pgm.api.player.Username;
import tc.oc.pgm.api.setting.Settings;
import tc.oc.pgm.rotation.pools.VotingPool;
import tc.oc.pgm.util.skin.Skin;

@SuppressWarnings({"UnstableApiUsage"})
Expand All @@ -21,43 +25,32 @@ public class CacheDatastore implements Datastore {

public CacheDatastore(Datastore datastore) {
this.datastore = datastore;
this.usernames =
CacheBuilder.newBuilder()
.softValues()
.build(
new CacheLoader<UUID, Username>() {
@Override
public Username load(UUID id) {
return datastore.getUsername(id);
}
});
this.settings =
CacheBuilder.newBuilder()
.build(
new CacheLoader<UUID, Settings>() {
@Override
public Settings load(UUID id) {
return datastore.getSettings(id);
}
});
this.skins =
CacheBuilder.newBuilder()
.build(
new CacheLoader<UUID, Skin>() {
@Override
public Skin load(UUID id) {
return datastore.getSkin(id);
}
});
this.activities =
CacheBuilder.newBuilder()
.build(
new CacheLoader<String, MapActivity>() {
@Override
public MapActivity load(String name) {
return datastore.getMapActivity(name);
}
});
this.usernames = CacheBuilder.newBuilder()
.softValues()
.build(new CacheLoader<UUID, Username>() {
@Override
public Username load(UUID id) {
return datastore.getUsername(id);
}
});
this.settings = CacheBuilder.newBuilder().build(new CacheLoader<UUID, Settings>() {
@Override
public Settings load(UUID id) {
return datastore.getSettings(id);
}
});
this.skins = CacheBuilder.newBuilder().build(new CacheLoader<UUID, Skin>() {
@Override
public Skin load(UUID id) {
return datastore.getSkin(id);
}
});
this.activities = CacheBuilder.newBuilder().build(new CacheLoader<String, MapActivity>() {
@Override
public MapActivity load(String name) {
return datastore.getMapActivity(name);
}
});
}

@Override
Expand Down Expand Up @@ -85,6 +78,26 @@ public MapActivity getMapActivity(String poolName) {
return activities.getUnchecked(poolName);
}

@Override
public MapData getMapData(String mapId, double score) {
return datastore.getMapData(mapId, score);
}

@Override
public Map<String, ? extends MapData> getMapData(Collection<String> mapIds, double score) {
return datastore.getMapData(mapIds, score);
}

@Override
public void tickMapScores(VotingPool.VoteConstants constants) {
datastore.tickMapScores(constants);
}

@Override
public void refreshMapData() {
datastore.refreshMapData();
}

@Override
public void close() {
datastore.close();
Expand Down
63 changes: 63 additions & 0 deletions core/src/main/java/tc/oc/pgm/db/MapDataImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package tc.oc.pgm.db;

import java.time.Duration;
import java.time.Instant;
import tc.oc.pgm.api.map.MapData;

abstract class MapDataImpl implements MapData {
protected final String id;
protected Instant lastPlayed = Instant.EPOCH;
protected Duration lastDuration = Duration.ZERO;
protected double score;

public MapDataImpl(String id, double defaultScore) {
this.id = id;
this.score = defaultScore;
}

@Override
public String getId() {
return id;
}

@Override
public Instant lastPlayed() {
return lastPlayed;
}

@Override
public Duration lastDuration() {
return lastDuration;
}

@Override
public double score() {
return score;
}

@Override
public void setScore(double score, boolean update) {
this.score = score;
}

@Override
public int hashCode() {
return id.hashCode();
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof MapData mapData)) return false;
return getId().equals(mapData.getId());
}

@Override
public String toString() {
return "MapDataImpl{" + "id='"
+ id + '\'' + ", lastPlayed="
+ lastPlayed + ", lastDuration="
+ lastDuration + ", score="
+ score + '}';
}
}
Loading

0 comments on commit 003a76e

Please sign in to comment.