async def main(): nas = nnas.NNASClient() nas.set_device(DEVICE_ID, SERIAL_NUMBER, SYSTEM_VERSION) nas.set_title(MK8.TITLE_ID_EUR, MK8.LATEST_VERSION) nas.set_locale(REGION_ID, COUNTRY_NAME, LANGUAGE) access_token = await nas.login(USERNAME, PASSWORD) nex_token = await nas.get_nex_token(access_token.token, MK8.GAME_SERVER_ID) s = settings.default() s.configure(MK8.ACCESS_KEY, MK8.NEX_VERSION) async with backend.connect(s, nex_token.host, nex_token.port) as be: async with be.login(str(nex_token.pid), nex_token.password) as client: ranking_client = ranking.RankingClient(client) order_param = ranking.RankingOrderParam() order_param.order_calc = ranking.RankingOrderCalc.ORDINAL order_param.offset = 499 #Start at 500th place order_param.count = 20 #Download 20 highscores rankings = await ranking_client.get_ranking( ranking.RankingMode.GLOBAL, TRACK_ID, order_param, 0, 0 ) ranking_stats = await ranking_client.get_stats( TRACK_ID, order_param, ranking.RankingStatFlags.ALL ) names = await nas.get_nnids([data.pid for data in rankings.data]) #Print some interesting stats stats = ranking_stats.stats print("Total:", int(stats[0])) print("Total time:", format_time(stats[1])) print("Lowest time:", format_time(stats[2])) print("Highest time:", format_time(stats[3])) print("Average time:", format_time(stats[4])) print("Rankings:") for rankdata in rankings.data: time = format_time(rankdata.score) print("\t%5i %20s %s" %(rankdata.rank, names[rankdata.pid], time)) #Let's download the replay file of whoever is in 500th place store = datastore.DataStoreClient(client) rankdata = rankings.data[0] get_param = datastore.DataStorePrepareGetParam() get_param.persistence_target.owner_id = rankdata.pid get_param.persistence_target.persistence_id = TRACK_ID - 16 get_param.extra_data = ["WUP", str(REGION_ID), REGION_NAME, str(COUNTRY_ID), COUNTRY_NAME, ""] req_info = await store.prepare_get_object(get_param) headers = {header.key: header.value for header in req_info.headers} response = await http.get(req_info.url, headers=headers) response.raise_if_error() with open("replay.bin", "wb") as f: f.write(response.body)
async def main(): nas = nnas.NNASClient() nas.set_device(DEVICE_ID, SERIAL_NUMBER, SYSTEM_VERSION) nas.set_title(DKCTF.TITLE_ID_EUR, DKCTF.LATEST_VERSION) nas.set_locale(REGION, COUNTRY, LANGUAGE) access_token = await nas.login(USERNAME, PASSWORD) nex_token = await nas.get_nex_token(access_token.token, DKCTF.GAME_SERVER_ID) s = settings.default() s.configure(DKCTF.ACCESS_KEY, DKCTF.NEX_VERSION) async with backend.connect(s, nex_token.host, nex_token.port) as be: async with be.login(str(nex_token.pid), nex_token.password) as client: order_param = ranking.RankingOrderParam() order_param.offset = 0 #Start with the world record order_param.count = 20 #Download 20 highscores ranking_client = ranking.RankingClient(client) rankings = await ranking_client.get_ranking( ranking.RankingMode.GLOBAL, #Get the global leaderboard 0x893EB726, #Category, this is 3-A (Magrove Cove) order_param, 0, 0) print("Total:", rankings.total) print("Rankings:") for rankdata in rankings.data: seconds = (rankdata.score >> 1) / 60 time = "%i:%02i.%02i" % (seconds / 60, seconds % 60, (seconds * 100) % 100) damage = " Damaged " if rankdata.score & 1 else "No damage" kong = ["No Kong", "Diddy", "Dixie", "Cranky"][rankdata.groups[1]] name = rankdata.common_data.decode("ascii")[:-1] print("\t%2i %20s %s (%s) %s" % (rankdata.rank, name, time, damage, kong)) #Now download the world record replay file if available world_record = rankings.data[0] if world_record.param: #If world record has a replay file store = datastore.DataStoreClient(client) get_param = datastore.DataStorePrepareGetParam() get_param.data_id = world_record.param req_info = await store.prepare_get_object(get_param) headers = { header.key: header.value for header in req_info.headers } response = await http.get(req_info.url, headers=headers) response.raise_if_error() with open("replay.bin", "wb") as f: f.write(response.body)
from nintendo.nex import backend, authentication, ranking from nintendo.games import MK8Deluxe TRACK_ID = 10 #Sunshine airport HOST = "g%08x-lp1.s.n.srv.nintendo.net" % MK8Deluxe.GAME_SERVER_ID PORT = 443 backend = backend.BackEndClient(MK8Deluxe.ACCESS_KEY, MK8Deluxe.NEX_VERSION, backend.Settings("switch.cfg")) backend.connect(HOST, PORT) backend.login_guest() order_param = ranking.RankingOrderParam() order_param.order_calc = ranking.RankingOrderCalc.ORDINAL order_param.offset = 0 #Start with world record order_param.count = 20 #Download 20 highscores ranking_client = ranking.RankingClient(backend.secure_client) rankings = ranking_client.get_ranking(ranking.RankingMode.GLOBAL, TRACK_ID, order_param, 0, 0) stats = ranking_client.get_stats(TRACK_ID, order_param, ranking.RankingStatFlags.ALL).stats def format_time(score): millisec = score % 1000 seconds = score // 1000 % 60 minutes = score // 1000 // 60 return "%i:%02i.%03i" % (minutes, seconds, millisec)
HOST = "g%08x-lp1.s.n.srv.nintendo.net" %MK8Deluxe.GAME_SERVER_ID PORT = 443 backend = backend.BackEndClient( MK8Deluxe.ACCESS_KEY, MK8Deluxe.NEX_VERSION, backend.Settings("switch.cfg") ) backend.connect(HOST, PORT) backend.login_guest() ranking_client = ranking.RankingClient(backend) rankings = ranking_client.get_ranking( ranking.RankingClient.MODE_GLOBAL, TRACK_ID, ranking.RankingOrderParam( ranking.RankingOrderParam.ORDINAL, #"1234" ranking 0xFF, 0, 2, 0, 20 #Download top 20 ), 0, 0 ) stats = ranking_client.get_stats( TRACK_ID, ranking.RankingOrderParam( ranking.RankingOrderParam.ORDINAL, 0xFF, 0, 2, 0, 0 ) ) def format_time(score): millisec = score % 1000 seconds = score // 1000 % 60 minutes = score // 1000 // 60
nex_token = api.get_nex_token(MK8.GAME_SERVER_ID) backend = backend.BackEndClient(MK8.ACCESS_KEY, MK8.NEX_VERSION) backend.connect(nex_token.host, nex_token.port) backend.login( nex_token.username, nex_token.password, authentication.AuthenticationInfo(nex_token.token, MK8.SERVER_VERSION)) ranking_client = ranking.RankingClient(backend) rankings = ranking_client.get_ranking( ranking.RankingClient.MODE_GLOBAL, TRACK_ID, ranking.RankingOrderParam( ranking.RankingOrderParam.ORDINAL, #"1234" ranking 0xFF, 0, 2, 499, 20 #Download 500th to 520th place ), 0, 0) stats = ranking_client.get_stats( TRACK_ID, ranking.RankingOrderParam(ranking.RankingOrderParam.ORDINAL, 0xFF, 0, 2, 0, 0)) def format_time(score): millisec = score % 1000 seconds = score // 1000 % 60 minutes = score // 1000 // 60
#Each game server has its own game server id and access token nex_token = api.get_nex_token(DKCTF.GAME_SERVER_ID) backend = backend.BackEndClient(DKCTF.ACCESS_KEY, DKCTF.NEX_VERSION) backend.connect(nex_token.host, nex_token.port) backend.login( nex_token.username, nex_token.password, authentication.AuthenticationInfo(nex_token.token, DKCTF.SERVER_VERSION)) ranking_client = ranking.RankingClient(backend) rankings = ranking_client.get_ranking( ranking.RankingClient.MODE_GLOBAL, #Get the global leaderboard 0x893EB726, #Category, this is 3-A (Magrove Cove) ranking.RankingOrderParam( ranking.RankingOrderParam.STANDARD, #"1224" ranking 0, 13, 2, 0, 20 #Download 20 highscores, starting at the world record ), 0, 0 #Unknown ) print("Total:", rankings.total) print("Rankings:") for rankdata in rankings.datas: seconds = (rankdata.score >> 1) / 60 time = "%i:%02i.%02i" % (seconds / 60, seconds % 60, (seconds * 100) % 100) damage = " Damaged " if rankdata.score & 1 else "No damage" kong = ["No Kong", "Diddy", "Dixie", "Cranky"][rankdata.groups[1]] name = rankdata.common_data.decode("ascii")[:-1]