MBHaxe/src/Leaderboards.hx
RandomityGuy 4e53213c4e - try to make it case insensitive
- escape all text derived from user input
- fix various race condition issues
- make scrolling smooth for touch controls
- fix leaderboards count
- fix potential crash when joining MP
- clamp input
- fix replay clock when stopped time
- also update ci to only run when tagged
2026-03-30 18:03:40 +01:00

80 lines
2.2 KiB
Haxe

package src;
import net.Net;
import haxe.Json;
import src.Http;
import src.Console;
import src.Settings;
typedef LBScore = {
name:String,
has_rec:Int,
score:Float,
platform:Int,
rewind:Int,
}
enum abstract LeaderboardsKind(Int) {
var All;
var Rewind;
var NoRewind;
}
class Leaderboards {
static var host = "https://lb.randomityguy.me";
static var game = "Platinum";
public static function submitScore(mission:String, score:Float, rewindUsed:Bool, needsReplayCb:(Bool, Int) -> Void) {
if (!StringTools.startsWith(mission, "data/"))
mission = "data/" + mission;
Http.post('${host}/api/submit', Json.stringify({
mission: mission,
score: score,
game: game,
name: Settings.highscoreName,
uid: Settings.userId,
rewind: rewindUsed ? 1 : 0,
platform: Net.getPlatform()
}), (b) -> {
var s = b.toString();
var jd = Json.parse(s);
var status = jd.status;
Console.log("Score submitted");
needsReplayCb(status == "new_record", status == "new_record" ? jd.rowid : 0);
}, (e) -> {
Console.log("Score submission failed: " + e);
});
}
public static function getScores(mission:String, kind:LeaderboardsKind, cb:Array<LBScore>->Void) {
if (!StringTools.startsWith(mission, "data/"))
mission = "data/" + mission;
return Http.get('${host}/api/scores?mission=${StringTools.urlEncode(mission)}&game=${game}&view=${kind}&count=5', (b) -> {
var s = b.toString();
var scores:Array<LBScore> = Json.parse(s).scores;
cb(scores);
}, (e) -> {
Console.log("Failed to get scores: " + e);
cb([]);
});
}
public static function submitReplay(ref:Int, replay:haxe.io.Bytes) {
return Http.uploadFile('${host}/api/record?ref=${ref}', replay, (b) -> {
Console.log("Replay submitted");
}, (e) -> {
Console.log("Replay submission failed: " + e);
});
}
public static function watchTopReplay(mission:String, kind:LeaderboardsKind, cb:haxe.io.Bytes->Void) {
if (!StringTools.startsWith(mission, "data/"))
mission = "data/" + mission;
return Http.get('${host}/api/replay?mission=${StringTools.urlEncode(mission)}&game=${game}&view=${kind}', (b) -> {
cb(b);
}, (e) -> {
Console.log("Failed to get replay: " + e);
cb(null);
});
}
}