maybe fixed pp? honestly, no idea
All checks were successful
Deploy to Dokku / docker (ubuntu-latest) (push) Successful in 1m43s

This commit is contained in:
Lee 2024-08-01 01:00:34 +01:00
parent 49e223a8b9
commit 1efab2ed08
6 changed files with 86 additions and 84 deletions

@ -39,5 +39,7 @@ public class Main {
// Start the app // Start the app
SpringApplication.run(Main.class, args); SpringApplication.run(Main.class, args);
} }
} }

@ -10,12 +10,18 @@ import lombok.Getter;
@Getter @Getter
public class CurvePoint { public class CurvePoint {
/** /**
* The x value of the curve point. * The acc at the curve point.
* <p>
* Acc is divided by 100 to get the actual value.
* </p>
*/ */
private final double x; private final double acc;
/** /**
* The y value of the curve point. * The multiplier of the curve point.
* <p>
* This is the multiplier for the pp calculation.
* </p>
*/ */
private final double y; private final double multiplier;
} }

@ -49,13 +49,24 @@ public abstract class Platform {
} }
} }
/**
* Gets the curve points for a curve version.
*
* @param curveVersion the curve version to get the curve points for
* @return the curve points
*/
public CurvePoint[] getCurve(int curveVersion) {
this.checkCurveVersion(curveVersion);
return curvePoints.get(curveVersion);
}
/** /**
* Gets the PP amount from the star count. * Gets the PP amount from the star count.
* *
* @param stars the amount of stars * @param stars the amount of stars
* @return the pp amount * @return the pp amount
*/ */
public abstract double getPp(int curveVersion, double stars, double accuracy); public abstract double getPp(double stars, double accuracy);
/** /**
* Called every 10 minutes to update * Called every 10 minutes to update

@ -35,7 +35,7 @@ public class ScoreSaberPlatform extends Platform {
/** /**
* The base multiplier for stars. * The base multiplier for stars.
*/ */
private final double starMultiplier = 42.11; private final double starMultiplier = 42.114296;
/** /**
* The ScoreSaber service to use * The ScoreSaber service to use
@ -66,42 +66,43 @@ public class ScoreSaberPlatform extends Platform {
@NonNull TrackedScoreService trackedScoreService) { @NonNull TrackedScoreService trackedScoreService) {
super(Platforms.SCORESABER, 1, Map.of( super(Platforms.SCORESABER, 1, Map.of(
1, new CurvePoint[]{ 1, new CurvePoint[]{
new CurvePoint(1.0, 5.367394282890631), new CurvePoint(0, 0),
new CurvePoint(0.9995, 5.019543595874787),
new CurvePoint(0.999, 4.715470646416203),
new CurvePoint(0.99825, 4.325027383589547),
new CurvePoint(0.9975, 3.996793606763322),
new CurvePoint(0.99625, 3.5526145337555373),
new CurvePoint(0.995, 3.2022017597337955),
new CurvePoint(0.99375, 2.9190155639254955),
new CurvePoint(0.99125, 2.4902905794106913),
new CurvePoint(0.99, 2.324506282149922),
new CurvePoint(0.9875, 2.058947159052738),
new CurvePoint(0.985, 1.8563887693647105),
new CurvePoint(0.9825, 1.697536248647543),
new CurvePoint(0.98, 1.5702410055532239),
new CurvePoint(0.9775, 1.4664726399289512),
new CurvePoint(0.975, 1.3807102743105126),
new CurvePoint(0.9725, 1.3090333065057616),
new CurvePoint(0.97, 1.2485807759957321),
new CurvePoint(0.965, 1.1552120359501035),
new CurvePoint(0.96, 1.0871883573850478),
new CurvePoint(0.955, 1.0388633331418984),
new CurvePoint(0.95, 1.0),
new CurvePoint(0.94, 0.9417362980580238),
new CurvePoint(0.93, 0.9039994071865736),
new CurvePoint(0.92, 0.8728710341448851),
new CurvePoint(0.91, 0.8488375988124467),
new CurvePoint(0.9, 0.825756123560842),
new CurvePoint(0.875, 0.7816934560296046),
new CurvePoint(0.85, 0.7462290664143185),
new CurvePoint(0.825, 0.7150465663454271),
new CurvePoint(0.8, 0.6872268862950283),
new CurvePoint(0.75, 0.6451808210101443),
new CurvePoint(0.7, 0.6125565959114954),
new CurvePoint(0.65, 0.5866010012767576),
new CurvePoint(0.6, 0.18223233667439062), new CurvePoint(0.6, 0.18223233667439062),
new CurvePoint(0.0, 0.0) new CurvePoint(0.65, 0.5866010012767576),
new CurvePoint(0.7, 0.6125565959114954),
new CurvePoint(0.75, 0.6451808210101443),
new CurvePoint(0.8, 0.6872268862950283),
new CurvePoint(0.825, 0.7150465663454271),
new CurvePoint(0.85, 0.7462290664143185),
new CurvePoint(0.875, 0.7816934560296046),
new CurvePoint(0.9, 0.825756123560842),
new CurvePoint(0.91, 0.8488375988124467),
new CurvePoint(0.92, 0.8728710341448851),
new CurvePoint(0.93, 0.9039994071865736),
new CurvePoint(0.94, 0.9417362980580238),
new CurvePoint(0.95, 1),
new CurvePoint(0.955, 1.0388633331418984),
new CurvePoint(0.96, 1.0871883573850478),
new CurvePoint(0.965, 1.1552120359501035),
new CurvePoint(0.97, 1.2485807759957321),
new CurvePoint(0.9725, 1.3090333065057616),
new CurvePoint(0.975, 1.3807102743105126),
new CurvePoint(0.9775, 1.4664726399289512),
new CurvePoint(0.98, 1.5702410055532239),
new CurvePoint(0.9825, 1.697536248647543),
new CurvePoint(0.985, 1.8563887693647105),
new CurvePoint(0.9875, 2.058947159052738),
new CurvePoint(0.99, 2.324506282149922),
new CurvePoint(0.99125, 2.4902905794106913),
new CurvePoint(0.9925, 2.685667856592722),
new CurvePoint(0.99375, 2.9190155639254955),
new CurvePoint(0.995, 3.2022017597337955),
new CurvePoint(0.99625, 3.5526145337555373),
new CurvePoint(0.9975, 3.996793606763322),
new CurvePoint(0.99825, 4.325027383589547),
new CurvePoint(0.999, 4.715470646416203),
new CurvePoint(0.9995, 5.019543595874787),
new CurvePoint(1, 5.367394282890631),
} }
)); ));
this.scoreSaberService = scoreSaberService; this.scoreSaberService = scoreSaberService;
@ -116,26 +117,35 @@ public class ScoreSaberPlatform extends Platform {
* @param accuracy The accuracy. * @param accuracy The accuracy.
* @return The modifier. * @return The modifier.
*/ */
public double getModifier(int curveVersion, double accuracy) { public double getModifier(double accuracy) {
accuracy = MathUtils.clamp(accuracy, 0, 100) / 100; accuracy = MathUtils.clamp(accuracy, 0, 100) / 100;
CurvePoint[] curve = this.getCurve(this.getCurrentCurveVersion());
if (accuracy <= 0) {
return 0;
}
CurvePoint prev = this.getCurvePoints().get(curveVersion)[1]; if (accuracy >= 1) {
for (CurvePoint point : this.getCurvePoints().get(curveVersion)) { return curve[curve.length - 1].getMultiplier();
if (point.getX() <= accuracy) {
double distance = (prev.getX() - accuracy) / (prev.getX() - point.getX());
return MathUtils.lerp(prev.getY(), point.getY(), distance);
} }
prev = point;
for (int i = 0; i < curve.length - 1; i++) {
CurvePoint point = curve[i];
CurvePoint nextPoint = curve[i + 1];
if (accuracy >= point.getAcc() && accuracy <= nextPoint.getAcc()) {
return MathUtils.lerp(point.getMultiplier(), nextPoint.getMultiplier(), (accuracy - point.getAcc()) / (nextPoint.getAcc() - point.getAcc()));
} }
}
return 0; return 0;
} }
@Override @Override
public double getPp(int curveVersion, double stars, double accuracy) { public double getPp(double stars, double accuracy) {
this.checkCurveVersion(curveVersion); // Check if the curve version exists if (accuracy <= 1) { // Convert the accuracy to a percentage
accuracy *= 100;
}
double pp = stars * this.starMultiplier; double pp = stars * this.starMultiplier;
double modifier = this.getModifier(curveVersion, accuracy); return this.getModifier(accuracy) * pp;
return modifier * pp;
} }
@Override @Override
@ -201,13 +211,13 @@ public class ScoreSaberPlatform extends Platform {
return false; return false;
} }
double oldPp = score.getPp(); double oldPp = score.getPp();
double pp = this.getPp(this.getCurrentCurveVersion(), leaderboard.getStars(), score.getAccuracy()); double pp = this.getPp(leaderboard.getStars(), score.getAccuracy());
log.info("Leaderboard: {}, Old PP: {}, New PP: {}", leaderboard.getSongName(), oldPp, pp); log.info("Leaderboard: {}, Old PP: {}, New PP: {}", leaderboard.getSongName(), oldPp, pp);
return pp != score.getPp(); // Check if the pp has changed return pp != score.getPp(); // Check if the pp has changed
}).toList(); }).toList();
for (TrackedScore score : toUpdate) { // Update the scores for (TrackedScore score : toUpdate) { // Update the scores
double pp = this.getPp(this.getCurrentCurveVersion(), leaderboard.getStars(), score.getAccuracy()); double pp = this.getPp(leaderboard.getStars(), score.getAccuracy());
score.setPp(pp); score.setPp(pp);
} }

@ -7,7 +7,6 @@ import cc.fascinated.model.token.ScoreSaberLeaderboardToken;
import cc.fascinated.model.user.User; import cc.fascinated.model.user.User;
import cc.fascinated.repository.mongo.ScoreSaberLeaderboardRepository; import cc.fascinated.repository.mongo.ScoreSaberLeaderboardRepository;
import kong.unirest.core.HttpResponse; import kong.unirest.core.HttpResponse;
import kong.unirest.core.Unirest;
import lombok.NonNull; import lombok.NonNull;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;

@ -10,10 +10,6 @@ import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.client.standard.StandardWebSocketClient; import org.springframework.web.socket.client.standard.StandardWebSocketClient;
import org.springframework.web.socket.handler.TextWebSocketHandler; import org.springframework.web.socket.handler.TextWebSocketHandler;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
/** /**
* @author Fascinated (fascinated7) * @author Fascinated (fascinated7)
*/ */
@ -35,31 +31,10 @@ public abstract class Websocket extends TextWebSocketHandler {
*/ */
private WebSocketSession webSocketSession; private WebSocketSession webSocketSession;
/**
* The last message received
*/
private Date lastMessage;
public Websocket(@NonNull String name, @NonNull String url) { public Websocket(@NonNull String name, @NonNull String url) {
this.name = name; this.name = name;
this.url = url; this.url = url;
connectWebSocket(); // Connect to the WebSocket. connectWebSocket(); // Connect to the WebSocket.
new Timer().scheduleAtFixedRate(new TimerTask() {
@Override @SneakyThrows
public void run() {
if (lastMessage == null) {
return;
}
long difference = new Date().getTime() - lastMessage.getTime();
if (difference > 10000) {
log.error("The {} WebSocket has not received a message in over 10 seconds, reconnecting...", getName());
webSocketSession.close(); // Close the WebSocket session.
connectWebSocket(); // Reconnect to the WebSocket.
}
}
}, 0, 5000);
} }
/** /**
@ -71,7 +46,6 @@ public abstract class Websocket extends TextWebSocketHandler {
@Override @Override
protected final void handleTextMessage(@NonNull WebSocketSession session, @NonNull TextMessage message) { protected final void handleTextMessage(@NonNull WebSocketSession session, @NonNull TextMessage message) {
this.lastMessage = new Date();
this.handleMessage(message); this.handleMessage(message);
} }
@ -79,7 +53,7 @@ public abstract class Websocket extends TextWebSocketHandler {
* Connects to the ScoreSaber WebSocket. * Connects to the ScoreSaber WebSocket.
*/ */
@SneakyThrows @SneakyThrows
private final void connectWebSocket() { private void connectWebSocket() {
log.info("Connecting to the {}", this.getName()); log.info("Connecting to the {}", this.getName());
this.webSocketSession = new StandardWebSocketClient().execute(this, this.getUrl()).get(); this.webSocketSession = new StandardWebSocketClient().execute(this, this.getUrl()).get();
} }