package funkin.api.newgrounds; #if FEATURE_NEWGROUNDS import io.newgrounds.Call.CallError; import io.newgrounds.components.ScoreBoardComponent; import io.newgrounds.objects.Score; import io.newgrounds.objects.ScoreBoard as LeaderboardData; import io.newgrounds.objects.User; import io.newgrounds.objects.events.Outcome; import io.newgrounds.utils.ScoreBoardList; @:nullSafety class Leaderboards { public static function listLeaderboardData():Map { var leaderboardList:Null = NewgroundsClient.instance.leaderboards; if (leaderboardList == null) { trace('[NEWGROUNDS] Not logged in, cannot fetch medal data!'); return []; } return @:privateAccess leaderboardList._map?.copy() ?? []; } /** * Submit a score to Newgrounds. * @param leaderboard The leaderboard to submit to. * @param score The score to submit. * @param tag An optional tag to attach to the score. */ public static function submitScore(leaderboard:Leaderboard, score:Int, ?tag:String):Void { // Silently reject submissions for unknown leaderboards. if (leaderboard == Leaderboard.Unknown) return; if (NewgroundsClient.instance.isLoggedIn()) { var leaderboardList = NewgroundsClient.instance.leaderboards; if (leaderboardList == null) return; var leaderboardData:Null = leaderboardList.get(leaderboard.getId()); if (leaderboardData != null) { leaderboardData.postScore(score, function(outcome:Outcome):Void { switch (outcome) { case SUCCESS: trace('[NEWGROUNDS] Submitted score!'); case FAIL(error): trace('[NEWGROUNDS] Failed to submit score!'); trace(error); } }); } } } /** * Request to receive scores from Newgrounds. * @param leaderboard The leaderboard to fetch scores from. * @param params Additional parameters for fetching the score. */ public static function requestScores(leaderboard:Leaderboard, ?params:RequestScoresParams) { // Silently reject retrieving scores from unknown leaderboards. if (leaderboard == Leaderboard.Unknown) return; var leaderboardList = NewgroundsClient.instance.leaderboards; if (leaderboardList == null) return; var leaderboardData:Null = leaderboardList.get(leaderboard.getId()); if (leaderboardData == null) return; var user:Null = null; if ((params?.useCurrentUser ?? false) && NewgroundsClient.instance.isLoggedIn()) user = NewgroundsClient.instance.user; leaderboardData.requestScores(params?.limit ?? 10, params?.skip ?? 0, params?.period ?? ALL, params?.social ?? false, params?.tag, user, function(outcome:Outcome):Void { switch (outcome) { case SUCCESS: trace('[NEWGROUNDS] Fetched scores!'); if (params != null && params.onComplete != null) params.onComplete(leaderboardData.scores); case FAIL(error): trace('[NEWGROUNDS] Failed to fetch scores!'); trace(error); if (params != null && params.onFail != null) params.onFail(); } }); } /** * Submit a score for a Story Level to Newgrounds. */ public static function submitLevelScore(levelId:String, difficultyId:String, score:Int):Void { var tag = '${difficultyId}'; Leaderboards.submitScore(Leaderboard.getLeaderboardByLevel(levelId), score, tag); } /** * Submit a score for a song to Newgrounds. */ public static function submitSongScore(songId:String, difficultyId:String, score:Int):Void { var tag = '${difficultyId}'; Leaderboards.submitScore(Leaderboard.getLeaderboardBySong(songId, difficultyId), score, tag); } } /** * Wrapper for `Leaderboards` that prevents submitting scores. */ @:nullSafety class LeaderboardsSandboxed { public static function getLeaderboardBySong(songId:String, difficultyId:String) { return Leaderboard.getLeaderboardBySong(songId, difficultyId); } public static function getLeaderboardByLevel(levelId:String) { return Leaderboard.getLeaderboardByLevel(levelId); } public function requestScores(leaderboard:Leaderboard, params:RequestScoresParams) { Leaderboards.requestScores(leaderboard, params); } } /** * Additional parameters for `Leaderboards.requestScores()` */ typedef RequestScoresParams = { /** * How many scores to include in a list. * @default `10` */ var ?limit:Int; /** * How many scores to skip before starting the list. * @default `0` */ var ?skip:Int; /** * The time-frame to pull the scores from. * @default `Period.ALL` */ var ?period:Period; /** * If true, only scores by the user and their friends will be loaded. Ignored if no user is set. * @default `false` */ var ?social:Bool; /** * An optional tag to filter the results by. * @default `null` */ var ?tag:String; /** * If true, only the scores from the currently logged in user will be loaded. * Additionally, if `social` is set to true, the scores of the user's friend will be loaded. * @default `false` */ var ?useCurrentUser:Bool; var ?onComplete:Array->Void; var ?onFail:Void->Void; } #end enum abstract Leaderboard(Int) from Int to Int { /** * Represents an undefined or invalid leaderboard. */ var Unknown = -1; // // STORY LEVELS // var StoryWeek1 = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 14239 #else 9615 #end; var StoryWeek2 = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 14240 #else 9616 #end; var StoryWeek3 = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 14242 #else 9767 #end; var StoryWeek4 = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 14241 #else 9866 #end; var StoryWeek5 = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 14243 #else 9956 #end; var StoryWeek6 = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 14244 #else 9957 #end; var StoryWeek7 = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 14245 #else 14682 #end; var StoryWeekend1 = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 14237 #else 14683 #end; // // SONGS // // Tutorial var Tutorial = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 14249 #else 14684 #end; // Week 1 var Bopeebo = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 14246 #else 9603 #end; var BopeeboErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14685 #end; var BopeeboPicoMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14686 #end; var Fresh = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 14247 #else 9602 #end; var FreshErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14687 #end; var FreshPicoMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14688 #end; var DadBattle = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 14248 #else 9605 #end; var DadBattleErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14689 #end; var DadBattlePicoMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14690 #end; // Week 2 var Spookeez = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 9604 #end; var SpookeezErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14691 #end; var SpookeezPicoMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14692 #end; var South = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 9606 #end; var SouthErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14693 #end; var SouthPicoMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14694 #end; var Monster = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14703 #end; // Week 3 var Pico = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 9766 #end; var PicoErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14695 #end; var PicoPicoMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14696 #end; var PhillyNice = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 9769 #end; var PhillyNiceErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14697 #end; var PhillyNicePicoMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14698 #end; var Blammed = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 9768 #end; var BlammedErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14704 #end; var BlammedPicoMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14705 #end; // Week 4 var SatinPanties = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 9869 #end; var SatinPantiesErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14701 #end; var High = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 9867 #end; var HighErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14699 #end; var MILF = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 9868 #end; // Week 5 var Cocoa = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14706 #end; var CocoaErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14707 #end; var CocoaPicoMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14708 #end; var Eggnog = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14709 #end; var EggnogErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14711 #end; var EggnogPicoMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14710 #end; var WinterHorrorland = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14712 #end; // Week 6 var Senpai = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 9958 #end; var SenpaiErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14713 #end; var SenpaiPicoMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14716 #end; var Roses = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 9959 #end; var RosesErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14714 #end; var RosesPicoMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14717 #end; var Thorns = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 9960 #end; var ThornsErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14715 #end; // Week 7 var Ugh = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14718 #end; var UghErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14722 #end; var UghPicoMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14721 #end; var Guns = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14719 #end; var GunsPicoMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14723 #end; var Stress = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14720 #end; var StressPicoMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14724 #end; // Weekend 1 var Darnell = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14725 #end; var DarnellErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14727 #end; var DarnellBFMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14726 #end; var LitUp = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14728 #end; var LitUpBFMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14729 #end; var TwoHot = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14730 #end; // Variable names can't start with a number! var Blazin = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14731 #end; public function getId():Int { return this; } /** * Get the leaderboard for a given level and difficulty. * @param levelId The ID for the story level. * @param difficulty The current difficulty. * @return The Leaderboard ID for the given level and difficulty. */ public static function getLeaderboardByLevel(levelId:String):Leaderboard { switch (levelId) { case "week1": return StoryWeek1; case "week2": return StoryWeek2; case "week3": return StoryWeek3; case "week4": return StoryWeek4; case "week5": return StoryWeek5; case "week6": return StoryWeek6; case "week7": return StoryWeek7; case "weekend1": return StoryWeekend1; default: return Unknown; } } /** * Get the leaderboard for a given level and difficulty. * @param levelId The ID for the story level. * @param difficulty The current difficulty, suffixed with the variation, like `easy-pico` or `nightmare`. * @return The Leaderboard ID for the given level and difficulty. */ public static function getLeaderboardBySong(songId:String, difficulty:String):Leaderboard { var variation = Constants.DEFAULT_VARIATION; var difficultyParts = difficulty.split('-'); if (difficultyParts.length >= 2) { variation = difficultyParts[difficultyParts.length - 1]; } else if (Constants.DEFAULT_DIFFICULTY_LIST_ERECT.contains(difficulty)) { variation = "erect"; } switch (variation) { case "pico": switch (songId) { case "bopeebo": return BopeeboPicoMix; case "fresh": return FreshPicoMix; case "dadbattle": return DadBattlePicoMix; case "spookeez": return SpookeezPicoMix; case "south": return SouthPicoMix; case "pico": return PicoPicoMix; case "philly-nice": return PhillyNicePicoMix; case "blammed": return BlammedPicoMix; case "cocoa": return CocoaPicoMix; case "eggnog": return EggnogPicoMix; case "senpai": return SenpaiPicoMix; case "roses": return RosesPicoMix; case "ugh": return UghPicoMix; case "guns": return GunsPicoMix; case "stress": return StressPicoMix; default: return Unknown; } case "bf": switch (songId) { case "darnell": return DarnellBFMix; case "lit-up": return LitUpBFMix; default: return Unknown; } case "erect": switch (songId) { case "bopeebo": return BopeeboErect; case "fresh": return FreshErect; case "dadbattle": return DadBattleErect; case "spookeez": return SpookeezErect; case "south": return SouthErect; case "pico": return PicoErect; case "philly-nice": return PhillyNiceErect; case "blammed": return BlammedErect; case "satin-panties": return SatinPantiesErect; case "high": return HighErect; case "cocoa": return CocoaErect; case "eggnog": return EggnogErect; case "senpai": return SenpaiErect; case "roses": return RosesErect; case "thorns": return ThornsErect; case "ugh": return UghErect; case "darnell": return DarnellErect; default: return Unknown; } case "default": switch (songId) { case "tutorial": return Tutorial; case "bopeebo": return Bopeebo; case "fresh": return Fresh; case "dadbattle": return DadBattle; case "spookeez": return Spookeez; case "south": return South; case "monster": return Monster; case "pico": return Pico; case "philly-nice": return PhillyNice; case "blammed": return Blammed; case "satin-panties": return SatinPanties; case "high": return High; case "milf": return MILF; case "cocoa": return Cocoa; case "eggnog": return Eggnog; case "winter-horrorland": return WinterHorrorland; case "senpai": return Senpai; case "roses": return Roses; case "thorns": return Thorns; case "ugh": return Ugh; case "guns": return Guns; case "stress": return Stress; case "darnell": return Darnell; case "lit-up": return LitUp; case "2hot": return TwoHot; case "blazin": return Blazin; default: return Unknown; } default: return Unknown; } } }