diff --git a/dist/ba_root/mods/bcs_plugin.py b/dist/ba_root/mods/bcs_plugin.py new file mode 100644 index 0000000..cada620 --- /dev/null +++ b/dist/ba_root/mods/bcs_plugin.py @@ -0,0 +1,143 @@ +# -*- coding: utf-8 -*- +# coding: utf-8 + +# ba_meta require api 6 +from typing import Optional, Any, Dict, List, Type, Sequence +from ba._gameactivity import GameActivity +import ba,_ba +import psutil as p +import json +import os +import _thread +# from stats import mystats +os.environ['FLASK_APP'] = 'bombsquadflaskapi.py' +os.environ['FLASK_ENV'] = 'development' +from stats import mystats + +stats={} +leaderboard={} +top200={} + +class BsDataThread(object): + def __init__(self): + self.Timer = ba.Timer( 8,ba.Call(self.refreshStats),timetype = ba.TimeType.REAL,repeat = True) + self.Timerr = ba.Timer( 10,ba.Call(self.startThread),timetype = ba.TimeType.REAL,repeat = True) + + def startThread(self): + _thread.start_new_thread(self.refreshLeaderboard,()) + + def refreshLeaderboard(self): + global leaderboard + global top200 + _t200={} + + lboard=mystats.get_all_stats() + leaderboard=lboard + entries = [(a['scores'], a['kills'], a['deaths'], a['games'], a['name'], a['aid']) for a in lboard.values()] + + entries.sort(reverse=True) + rank=0 + for entry in entries: + rank+=1 + if rank >201: + break + _t200[entry[5]]={"rank":rank,"scores":int(entry[0]),"games":int(entry[3]),"kills":int(entry[1]),"deaths":int(entry[2]),"name_html":entry[4],"last_seen":"entry[6]"} + top200=_t200 + + def refreshStats(self): + + liveplayers={} + nextMap='' + currentMap='' + global stats + for i in _ba.get_game_roster(): + + + try: + liveplayers[i['account_id']]={'name':i['players'][0]['name_full'],'client_id':i['client_id'],'device_id':i['display_string']} + except: + liveplayers[i['account_id']]={'name':"",'clientid':i['client_id'],'device_id':i['display_string']} + try: + nextMap=_ba.get_foreground_host_session().get_next_game_description().evaluate() + + current_game_spec=_ba.get_foreground_host_session()._current_game_spec + gametype: Type[GameActivity] =current_game_spec['resolved_type'] + + currentMap=gametype.get_settings_display_string(current_game_spec).evaluate() + except: + pass + minigame={'current':currentMap,'next':nextMap} + system={'cpu':p.cpu_percent(),'ram':p.virtual_memory().percent} + #system={'cpu':80,'ram':34} + stats['system']=system + stats['roster']=liveplayers + stats['chats']=_ba.get_chat_messages() + stats['playlist']=minigame + stats['teamInfo']=self.getTeamInfo() + + #print(self.getTeamInfo()); + + def getTeamInfo(self): + data={} + + session=_ba.get_foreground_host_session() + data['sessionType']=type(session).__name__ + teams=session.sessionteams + for team in teams: + data[team.id]={'name':team.name.evaluate(), + 'color':list(team.color), + 'score':team.customdata['score'], + 'players':[] + } + for player in team.players: + teamplayer={'name':player.getname(), + 'device_id':player.inputdevice.get_account_name(True), + 'inGame':player.in_game, + 'character':player.character, + 'account_id':player.get_account_id() + } + data[team.id]['players'].append(teamplayer) + + return data + + + +BsDataThread() + + + +import flask +from flask import request, jsonify + +app = flask.Flask(__name__) +app.config["DEBUG"] = False + + +@app.route('/', methods=['GET']) +def home(): + return '''Nothing here :)''' + + +# A route to return all of the available entries in our catalog. +@app.route('/getStats', methods=['GET']) +def api_all(): + return json.dumps(stats) + +@app.route('/getLeaderboard',methods=['GET']) +def get_l(): + return json.dumps(leaderboard) + +@app.route('/getTop200',methods=['GET']) +def get_top200(): + return json.dumps(top200) + + +# ba_meta export plugin +class InitalRun(ba.Plugin): + def __init__(self): + print("start flask") + flask_run = _thread.start_new_thread(app.run, ("0.0.0.0",80,False )) + + +# SAMPLE OUTPUT +# {'system': {'cpu': 80, 'ram': 34}, 'roster': {}, 'chats': [], 'playlist': {'current': 'Meteor Shower @ Rampage', 'next': 'Assault @ Step Right Up'}, 'teamInfo': {'sessionType': 'DualTeamSession', 0: {'name': 'Blue', 'color': (0.1, 0.25, 1.0), 'score': 1, 'players': [{'name': 'Jolly', 'device_id': '\ue030PC295588', 'inGame': True, 'character': 'xmas', 'account_id': 'pb-IF4TVWwZUQ=='}]}, 1: {'name': 'Red', 'color': (1.0, 0.25, 0.2), 'score': 0, 'players': []}}} \ No newline at end of file diff --git a/dist/ba_root/mods/stats/mystats.py b/dist/ba_root/mods/stats/mystats.py index efdda02..f0f2feb 100644 --- a/dist/ba_root/mods/stats/mystats.py +++ b/dist/ba_root/mods/stats/mystats.py @@ -69,7 +69,7 @@ def get_all_stats(): global seasonStartDate if os.path.exists(statsfile): renameFile=False - with open(statsfile, 'r') as f: + with open(statsfile, 'r',encoding='utf8') as f: jsonData=json.loads(f.read()) try: stats=jsonData["stats"] @@ -80,7 +80,8 @@ def get_all_stats(): seasonStartDate=datetime.datetime.now() return statsDefault return stats - except: + except OSError as e: + print(e) return jsonData else: return {} @@ -96,8 +97,8 @@ def dump_stats(s: dict): seasonStartDate=datetime.datetime.now() s={"startDate":seasonStartDate.strftime("%d-%m-%Y") , "stats":s} if os.path.exists(statsfile): - with open(statsfile, 'w') as f: - f.write(json.dumps(s, indent=4)) + with open(statsfile, 'w',encoding='utf8') as f: + f.write(json.dumps(s, indent=4,ensure_ascii=False)) f.close() else: print('Stats file not found!') @@ -198,6 +199,7 @@ def update(score_set): store. """ # look at score-set entries to tally per-account kills for this round + account_kills = {} account_deaths = {} @@ -230,7 +232,7 @@ class UpdateThread(threading.Thread): def run(self): # pull our existing stats from disk - + import datetime try: stats=get_all_stats() except: @@ -244,14 +246,11 @@ class UpdateThread(threading.Thread): # (we only do this when first creating the entry to save time, # though it may be smart to refresh it periodically since # it may change) - '''url = 'http://bombsquadgame.com/accountquery?id=' + account_id - response = json.loads( - urllib.request.urlopen(urllib.Request(url)).read()) - print('response variable from mystats.py line 183:') - print(response) - name_html = response['name_html']''' + + + stats[account_id] = {'rank': 0, - 'name': "default", + 'name': "deafult name", 'scores': 0, 'total_damage': 0, 'kills': 0, @@ -259,17 +258,29 @@ class UpdateThread(threading.Thread): 'games': 0, 'kd': 0, 'avg_score': 0, + 'last_seen':str(datetime.datetime.now()), 'aid': str(account_id)} #Temporary codes to change 'name_html' to 'name' - if 'name_html' in stats[account_id]: - stats[account_id].pop('name_html') - stats[account_id]['name'] = 'default' - + # if 'name_html' in stats[account_id]: + # stats[account_id].pop('name_html') + # stats[account_id]['name'] = 'default' + url="http://bombsquadgame.com/bsAccountInfo?buildNumber=20258&accountID="+account_id + data=urllib.request.urlopen(url) + if data is not None: + try: + name=json.loads(data.read())["profileDisplayString"] + except ValueError: + stats[account_id]['name']= "???" + else: + stats[account_id]['name']= name + # now increment their kills whether they were already there or not + stats[account_id]['kills'] += kill_count stats[account_id]['deaths'] += self.account_deaths[account_id] stats[account_id]['scores'] += self.account_scores[account_id] + stats[account_id]['last_seen'] = str(datetime.datetime.now()) # also incrementing the games played and adding the id stats[account_id]['games'] += 1 stats[account_id]['aid'] = str(account_id) diff --git a/dist/ba_root/mods/stats/stats.json b/dist/ba_root/mods/stats/stats.json index bb3d200..230bcb5 100644 --- a/dist/ba_root/mods/stats/stats.json +++ b/dist/ba_root/mods/stats/stats.json @@ -1,854 +1,17 @@ { - "pb-IF4VAk4a": { - "rank": 65, - "name": "pb-IF4VAk4a", - "scores": 0, - "total_damage": 0.0, - "kills": 0, - "deaths": 0, - "games": 18, - "kd": 0.0, - "avg_score": 0.0, - "aid": "pb-IF4VAk4a" - }, - "pb-IF4TVWwZUQ==": { - "rank": 5, - "name": "\ue030PC295588", - "scores": 610, - "total_damage": 0.0, - "kills": 1, - "deaths": 73, - "games": 55, - "kd": 0.013, - "avg_score": 11.09, - "aid": "pb-IF4TVWwZUQ==" - }, - "pb-JiNJARBaXEFBVF9HFkNXXF1EF0ZaRlZE": { - "rank": 11, - "name": "\ue020HeySmoothy", - "scores": 342, - "total_damage": 0.0, - "kills": 12, - "deaths": 42, - "games": 14, - "kd": 0.285, - "avg_score": 24.428, - "aid": "pb-JiNJARBaXEFBVF9HFkNXXF1EF0ZaRlZE" - }, - "pb-IF4uVW8bMw==": { - "rank": 10, - "name": "\ue020BurnedMedusa35646", - "scores": 396, - "total_damage": 0.0, - "kills": 31, - "deaths": 22, - "games": 6, - "kd": 1.409, - "avg_score": 66.0, - "aid": "pb-IF4uVW8bMw==" - }, - "pb-IF4eVUooAw==": { - "rank": 24, - "name": "\ue030Android51971883", - "scores": 159, - "total_damage": 0.0, - "kills": 15, - "deaths": 21, - "games": 6, - "kd": 0.714, - "avg_score": 26.5, - "aid": "pb-IF4eVUooAw==" - }, - "pb-IF4iVUc5Cg==": { - "rank": 3, - "name": "\ue020PicturesquePond10", - "scores": 851, - "total_damage": 0.0, - "kills": 51, - "deaths": 56, - "games": 10, - "kd": 0.91, - "avg_score": 85.1, - "aid": "pb-IF4iVUc5Cg==" - }, - "pb-IF4rV0MoFA==": { - "rank": 17, - "name": "\ue030Android31875021", - "scores": 188, - "total_damage": 0.0, - "kills": 12, - "deaths": 14, - "games": 3, - "kd": 0.857, - "avg_score": 62.666, - "aid": "pb-IF4rV0MoFA==" - }, - "pb-IF43VU0aVQ==": { - "rank": 14, - "name": "\ue020HARSHALgaming8992", - "scores": 253, - "total_damage": 0.0, - "kills": 12, - "deaths": 50, - "games": 6, - "kd": 0.24, - "avg_score": 42.166, - "aid": "pb-IF43VU0aVQ==" - }, - "pb-IF4LVU0KKQ==": { - "rank": 9, - "name": "\ue020SHAMANT1111", - "scores": 434, - "total_damage": 0.0, - "kills": 28, - "deaths": 54, - "games": 6, - "kd": 0.518, - "avg_score": 72.333, - "aid": "pb-IF4LVU0KKQ==" - }, - "pb-IF4VVUgJVw==": { - "rank": 20, - "name": "\ue020WobblyLining33", - "scores": 182, - "total_damage": 0.0, - "kills": 10, - "deaths": 27, - "games": 4, - "kd": 0.37, - "avg_score": 45.5, - "aid": "pb-IF4VVUgJVw==" - }, - "pb-IF4gVU0BCg==": { - "rank": 53, - "name": "\ue020Dewanggaming", - "scores": 43, - "total_damage": 0.0, - "kills": 3, - "deaths": 9, - "games": 3, - "kd": 0.333, - "avg_score": 14.333, - "aid": "pb-IF4gVU0BCg==" - }, - "pb-IF4FVXkZDQ==": { - "rank": 27, - "name": "\ue020lllBOLTlll", - "scores": 151, - "total_damage": 0.0, - "kills": 9, - "deaths": 15, - "games": 3, - "kd": 0.6, - "avg_score": 50.333, - "aid": "pb-IF4FVXkZDQ==" - }, - "pb-IF42VUpaDg==": { - "rank": 7, - "name": "\ue020EasterlyArtillery29", - "scores": 468, - "total_damage": 0.0, - "kills": 25, - "deaths": 37, - "games": 4, - "kd": 0.675, - "avg_score": 117.0, - "aid": "pb-IF42VUpaDg==" - }, - "pb-IF4iVUNSIw==": { - "rank": 48, - "name": "default", - "scores": 56, - "total_damage": 0.0, - "kills": 2, - "deaths": 5, - "games": 1, - "kd": 0.4, - "avg_score": 56.0, - "aid": "pb-IF4iVUNSIw==" - }, - "pb-IF4PVGcSJw==": { - "rank": 42, - "name": "\ue030Android29104233", - "scores": 84, - "total_damage": 0.0, - "kills": 7, - "deaths": 9, - "games": 2, - "kd": 0.777, - "avg_score": 42.0, - "aid": "pb-IF4PVGcSJw==" - }, - "pb-IF4eVVMkMw==": { - "rank": 30, - "name": "\ue030Android52887552", - "scores": 101, - "total_damage": 0.0, - "kills": 0, - "deaths": 18, - "games": 6, - "kd": 0.0, - "avg_score": 16.833, - "aid": "pb-IF4eVVMkMw==" - }, - "pb-IF4vNnMJ": { - "rank": 4, - "name": "\ue020XXRGEXX2", - "scores": 674, - "total_damage": 0.0, - "kills": 25, - "deaths": 15, - "games": 10, - "kd": 1.666, - "avg_score": 67.4, - "aid": "pb-IF4vNnMJ" - }, - "pb-IF4qV3c8Hw==": { - "rank": 63, - "name": "\ue020kankeisan1284578554", - "scores": 0, - "total_damage": 0.0, - "kills": 0, - "deaths": 1, - "games": 1, - "kd": 0.0, - "avg_score": 0.0, - "aid": "pb-IF4qV3c8Hw==" - }, - "pb-IF4mVHFcLQ==": { - "rank": 23, - "name": "\ue030Android39744744", - "scores": 174, - "total_damage": 0.0, - "kills": 9, - "deaths": 14, - "games": 5, - "kd": 0.642, - "avg_score": 34.8, - "aid": "pb-IF4mVHFcLQ==" - }, - "pb-IF4PVVIeHw==": { - "rank": 69, - "name": "\ue020VoraceMan", - "scores": 0, - "total_damage": 0.0, - "kills": 0, - "deaths": 0, - "games": 1, - "kd": 0.0, - "avg_score": 0.0, - "aid": "pb-IF4PVVIeHw==" - }, - "pb-IF4AVXAmPA==": { - "rank": 50, - "name": "\ue020ESZ\u4e5bOptimusOp\u4e44", - "scores": 56, - "total_damage": 0.0, - "kills": 0, - "deaths": 0, - "games": 2, - "kd": 0.0, - "avg_score": 28.0, - "aid": "pb-IF4AVXAmPA==" - }, - "pb-IF4AVVEPNw==": { - "rank": 31, - "name": "\ue020StealthyFelicity14", - "scores": 96, - "total_damage": 0.0, - "kills": 0, - "deaths": 2, - "games": 1, - "kd": 0.0, - "avg_score": 96.0, - "aid": "pb-IF4AVVEPNw==" - }, - "pb-IF4SVU4MFw==": { - "rank": 66, - "name": "\ue020K\u211da\u03c4o\u0eae", - "scores": 0, - "total_damage": 0.0, - "kills": 0, - "deaths": 0, - "games": 2, - "kd": 0.0, - "avg_score": 0.0, - "aid": "pb-IF4SVU4MFw==" - }, - "pb-IF4DVEkPEg==": { - "rank": 16, - "name": "\ue020StormyCliff19", - "scores": 192, - "total_damage": 0.0, - "kills": 0, - "deaths": 7, - "games": 3, - "kd": 0.0, - "avg_score": 64.0, - "aid": "pb-IF4DVEkPEg==" - }, - "pb-IF4TVVNeMg==": { - "rank": 46, - "name": "\ue030Android52880740", - "scores": 61, - "total_damage": 0.0, - "kills": 0, - "deaths": 1, - "games": 2, - "kd": 0.0, - "avg_score": 30.5, - "aid": "pb-IF4TVVNeMg==" - }, - "pb-IF4yVUcgBg==": { - "rank": 15, - "name": "\ue020RagedRibik28", - "scores": 225, - "total_damage": 0.0, - "kills": 1, - "deaths": 5, - "games": 4, - "kd": 0.2, - "avg_score": 56.25, - "aid": "pb-IF4yVUcgBg==" - }, - "pb-IF4IVUUJMg==": { - "rank": 40, - "name": "\ue030Android51464300", - "scores": 90, - "total_damage": 0.0, - "kills": 0, - "deaths": 0, - "games": 2, - "kd": 0.0, - "avg_score": 45.0, - "aid": "pb-IF4IVUUJMg==" - }, - "pb-IF4tVUwGVA==": { - "rank": 19, - "name": "\ue030Android52246284", - "scores": 183, - "total_damage": 0.0, - "kills": 9, - "deaths": 13, - "games": 3, - "kd": 0.692, - "avg_score": 61.0, - "aid": "pb-IF4tVUwGVA==" - }, - "pb-IF48NmQO": { - "rank": 59, - "name": "default", - "scores": 6, - "total_damage": 0.0, - "kills": 0, - "deaths": 1, - "games": 1, - "kd": 0.0, - "avg_score": 6.0, - "aid": "pb-IF48NmQO" - }, - "pb-IF4UVUQaAw==": { - "rank": 41, - "name": "\ue020LikelyTour25", - "scores": 85, - "total_damage": 0.0, - "kills": 11, - "deaths": 8, - "games": 2, - "kd": 1.375, - "avg_score": 42.5, - "aid": "pb-IF4UVUQaAw==" - }, - "pb-IF4wVRECLg==": { - "rank": 62, - "name": "\ue020gogugu", - "scores": 0, - "total_damage": 0.0, - "kills": 0, - "deaths": 1, - "games": 2, - "kd": 0.0, - "avg_score": 0.0, - "aid": "pb-IF4wVRECLg==" - }, - "pb-JiNJARBcV0FDXV1DGU5ZXV1FEUFWRVJC": { - "rank": 68, - "name": "\ue020appyfizz510", - "scores": 0, - "total_damage": 0.0, - "kills": 0, - "deaths": 0, - "games": 1, - "kd": 0.0, - "avg_score": 0.0, - "aid": "pb-JiNJARBcV0FDXV1DGU5ZXV1FEUFWRVJC" - }, - "pb-IF4OVVMsDQ==": { - "rank": 49, - "name": "\ue030Android52893090", - "scores": 56, - "total_damage": 0.0, - "kills": 0, - "deaths": 0, - "games": 2, - "kd": 0.0, - "avg_score": 28.0, - "aid": "pb-IF4OVVMsDQ==" - }, - "pb-IF5VVU4aFg==": { - "rank": 71, - "name": "default", - "scores": 0, - "total_damage": 0.0, - "kills": 0, - "deaths": 0, - "games": 1, - "kd": 0.0, - "avg_score": 0.0, - "aid": "pb-IF5VVU4aFg==" - }, - "pb-IF4SVW9dEg==": { - "rank": 51, - "name": "\ue020PROFFESOR9", - "scores": 48, - "total_damage": 0.0, - "kills": 0, - "deaths": 1, - "games": 5, - "kd": 0.0, - "avg_score": 9.6, - "aid": "pb-IF4SVW9dEg==" - }, - "pb-IF4SVVMtDg==": { - "rank": 38, - "name": "\ue020OrtigozaRafa2000", - "scores": 92, - "total_damage": 0.0, - "kills": 4, - "deaths": 14, - "games": 4, - "kd": 0.285, - "avg_score": 23.0, - "aid": "pb-IF4SVVMtDg==" - }, - "pb-IF4cVVMhKg==": { - "rank": 29, - "name": "\ue020jonyteoba100", - "scores": 106, - "total_damage": 0.0, - "kills": 2, - "deaths": 13, - "games": 4, - "kd": 0.153, - "avg_score": 26.5, - "aid": "pb-IF4cVVMhKg==" - }, - "pb-IF4gVRlbXQ==": { - "rank": 12, - "name": "\ue020MyopicTour17", - "scores": 295, - "total_damage": 0.0, - "kills": 5, - "deaths": 5, - "games": 4, - "kd": 1.0, - "avg_score": 73.75, - "aid": "pb-IF4gVRlbXQ==" - }, - "pb-IF4dVVAMUg==": { - "rank": 39, - "name": "\ue030Android52657984", - "scores": 91, - "total_damage": 0.0, - "kills": 0, - "deaths": 0, - "games": 2, - "kd": 0.0, - "avg_score": 45.5, - "aid": "pb-IF4dVVAMUg==" - }, - "pb-JiNJVxFfUEFDWFtCFEdXVl1FF0FaTllC": { - "rank": 58, - "name": "default", - "scores": 10, - "total_damage": 0.0, - "kills": 1, - "deaths": 0, - "games": 1, - "kd": 0.0, - "avg_score": 10.0, - "aid": "pb-JiNJVxFfUEFDWFtCFEdXVl1FF0FaTllC" - }, - "pb-IF40VU4TAQ==": { - "rank": 36, - "name": "default", - "scores": 96, - "total_damage": 0.0, - "kills": 0, - "deaths": 0, - "games": 1, - "kd": 0.0, - "avg_score": 96.0, - "aid": "pb-IF40VU4TAQ==" - }, - "pb-IF5QVVUkLw==": { - "rank": 13, - "name": "\ue030Android52849403", - "scores": 258, - "total_damage": 0.0, - "kills": 7, - "deaths": 23, - "games": 5, - "kd": 0.304, - "avg_score": 51.6, - "aid": "pb-IF5QVVUkLw==" - }, - "pb-IF5RVUkZKg==": { - "rank": 57, - "name": "\ue020ThreateningOddball34", - "scores": 16, - "total_damage": 0.0, - "kills": 1, - "deaths": 11, - "games": 2, - "kd": 0.09, - "avg_score": 8.0, - "aid": "pb-IF5RVUkZKg==" - }, - "pb-IF5VVVEnVQ==": { - "rank": 47, - "name": "\ue030Android52446817", - "scores": 59, - "total_damage": 0.0, - "kills": 2, - "deaths": 7, - "games": 2, - "kd": 0.285, - "avg_score": 29.5, - "aid": "pb-IF5VVVEnVQ==" - }, - "pb-JiNJARBaVUpHWl1BGUBVVFZAEkZeR1FE": { - "rank": 33, - "name": "\ue020CreepyJourney52261", - "scores": 96, - "total_damage": 0.0, - "kills": 0, - "deaths": 0, - "games": 1, - "kd": 0.0, - "avg_score": 96.0, - "aid": "pb-JiNJARBaVUpHWl1BGUBVVFZAEkZeR1FE" - }, - "pb-IF5QVVZTAA==": { - "rank": 45, - "name": "default", - "scores": 64, - "total_damage": 0.0, - "kills": 0, - "deaths": 0, - "games": 1, - "kd": 0.0, - "avg_score": 64.0, - "aid": "pb-IF5QVVZTAA==" - }, - "pb-IF5dVU0tPw==": { - "rank": 37, - "name": "\ue030Android52110513", - "scores": 93, - "total_damage": 0.0, - "kills": 0, - "deaths": 4, - "games": 2, - "kd": 0.0, - "avg_score": 46.5, - "aid": "pb-IF5dVU0tPw==" - }, - "pb-IF4PVUovCQ==": { - "rank": 55, - "name": "\ue020Phriedbean", - "scores": 20, - "total_damage": 0.0, - "kills": 2, - "deaths": 1, - "games": 2, - "kd": 2.0, - "avg_score": 10.0, - "aid": "pb-IF4PVUovCQ==" - }, - "pb-IF4sVRU8IA==": { - "rank": 61, - "name": "\ue02099\u30e1KAMY", - "scores": 0, - "total_damage": 0.0, - "kills": 0, - "deaths": 5, - "games": 1, - "kd": 0.0, - "avg_score": 0.0, - "aid": "pb-IF4sVRU8IA==" - }, - "pb-IF4zVUYjPA==": { - "rank": 26, - "name": "\ue030Android51693156", - "scores": 152, - "total_damage": 0.0, - "kills": 0, - "deaths": 0, - "games": 3, - "kd": 0.0, - "avg_score": 50.666, - "aid": "pb-IF4zVUYjPA==" - }, - "pb-IF4PVVJSNg==": { - "rank": 35, - "name": "default", - "scores": 96, - "total_damage": 0.0, - "kills": 0, - "deaths": 0, - "games": 1, - "kd": 0.0, - "avg_score": 96.0, - "aid": "pb-IF4PVVJSNg==" - }, - "pb-IF4qVVMuIA==": { - "rank": 32, - "name": "\ue020TacitAnthropology26", - "scores": 96, - "total_damage": 0.0, - "kills": 0, - "deaths": 0, - "games": 1, - "kd": 0.0, - "avg_score": 96.0, - "aid": "pb-IF4qVVMuIA==" - }, - "pb-IF4nVVFaEA==": { - "rank": 22, - "name": "\ue020023alan", - "scores": 178, - "total_damage": 0.0, - "kills": 0, - "deaths": 6, - "games": 4, - "kd": 0.0, - "avg_score": 44.5, - "aid": "pb-IF4nVVFaEA==" - }, - "pb-IF4-VWItPA==": { - "rank": 60, - "name": "default", - "scores": 0, - "total_damage": 0.0, - "kills": 0, - "deaths": 6, - "games": 1, - "kd": 0.0, - "avg_score": 0.0, - "aid": "pb-IF4-VWItPA==" - }, - "pb-IF5VVxI5Fg==": { - "rank": 44, - "name": "\ue020JinaYumnam1234", - "scores": 76, - "total_damage": 0.0, - "kills": 0, - "deaths": 0, - "games": 1, - "kd": 0.0, - "avg_score": 76.0, - "aid": "pb-IF5VVxI5Fg==" - }, - "pb-IF4lVUskVg==": { - "rank": 67, - "name": "\ue030Android52111807", - "scores": 0, - "total_damage": 0.0, - "kills": 0, - "deaths": 0, - "games": 1, - "kd": 0.0, - "avg_score": 0.0, - "aid": "pb-IF4lVUskVg==" - }, - "pb-IF4vVVAiKw==": { - "rank": 34, - "name": "default", - "scores": 96, - "total_damage": 0.0, - "kills": 0, - "deaths": 0, - "games": 1, - "kd": 0.0, - "avg_score": 96.0, - "aid": "pb-IF4vVVAiKw==" - }, - "pb-IF5RVU0vKg==": { - "rank": 6, - "name": "\ue020noobgamingyt2468", - "scores": 476, - "total_damage": 0.0, - "kills": 36, - "deaths": 93, - "games": 17, - "kd": 0.387, - "avg_score": 28.0, - "aid": "pb-IF5RVU0vKg==" - }, - "pb-IF4JVWseCg==": { - "rank": 43, - "name": "\ue020CapillaryJaguar7", - "scores": 77, - "total_damage": 0.0, - "kills": 7, - "deaths": 10, - "games": 3, - "kd": 0.7, - "avg_score": 25.666, - "aid": "pb-IF4JVWseCg==" - }, - "pb-IF4HVVAkEg==": { - "rank": 21, - "name": "\ue020GlobalDoorway16", - "scores": 178, - "total_damage": 0.0, - "kills": 3, - "deaths": 4, - "games": 3, - "kd": 0.75, - "avg_score": 59.333, - "aid": "pb-IF4HVVAkEg==" - }, - "pb-JiNJARFTUUBCXFhJE0NUVFdCEERbT1dK": { - "rank": 56, - "name": "\ue020snehil7701", - "scores": 20, - "total_damage": 0.0, - "kills": 2, - "deaths": 0, - "games": 1, - "kd": 0.0, - "avg_score": 20.0, - "aid": "pb-JiNJARFTUUBCXFhJE0NUVFdCEERbT1dK" - }, - "pb-IF43VUwlAg==": { - "rank": 2, - "name": "\ue020EmperialX987", - "scores": 1021, - "total_damage": 0.0, - "kills": 34, - "deaths": 33, - "games": 11, - "kd": 1.03, - "avg_score": 92.818, - "aid": "pb-IF43VUwlAg==" - }, - "pb-IF4uVUwsVQ==": { - "rank": 70, - "name": "\ue020VindictivePick10", - "scores": 0, - "total_damage": 0.0, - "kills": 0, - "deaths": 0, - "games": 1, - "kd": 0.0, - "avg_score": 0.0, - "aid": "pb-IF4uVUwsVQ==" - }, - "pb-IF4NVVNZMw==": { - "rank": 18, - "name": "\ue030Android52956999", - "scores": 186, - "total_damage": 0.0, - "kills": 8, - "deaths": 30, - "games": 7, - "kd": 0.266, - "avg_score": 26.571, - "aid": "pb-IF4NVVNZMw==" - }, - "pb-IF40VVMMPA==": { - "rank": 64, - "name": "\ue020SAM1133g1", - "scores": 0, - "total_damage": 0.0, - "kills": 0, - "deaths": 1, - "games": 1, - "kd": 0.0, - "avg_score": 0.0, - "aid": "pb-IF40VVMMPA==" - }, - "pb-IF4vKWgc": { - "rank": 8, - "name": "\ue020MechanizedHydra59524", - "scores": 452, - "total_damage": 0.0, - "kills": 16, - "deaths": 9, - "games": 3, - "kd": 1.777, - "avg_score": 150.666, - "aid": "pb-IF4vKWgc" - }, - "pb-IF5cVEMNNA==": { - "rank": 25, - "name": "\ue020KDevil2512", - "scores": 153, - "total_damage": 0.0, - "kills": 5, - "deaths": 16, - "games": 3, - "kd": 0.312, - "avg_score": 51.0, - "aid": "pb-IF5cVEMNNA==" - }, - "pb-IF4PVEEnBA==": { - "rank": 28, - "name": "\ue020Deadly\u30c4TusKeR", - "scores": 128, - "total_damage": 0.0, - "kills": 3, - "deaths": 14, - "games": 3, - "kd": 0.214, - "avg_score": 42.666, - "aid": "pb-IF4PVEEnBA==" - }, - "pb-IF4RVVMDVQ==": { - "rank": 54, - "name": "\ue030Android52942930", - "scores": 37, - "total_damage": 0.0, - "kills": 1, - "deaths": 5, - "games": 1, - "kd": 0.2, - "avg_score": 37.0, - "aid": "pb-IF4RVVMDVQ==" - }, - "pb-IF43VVJSAg==": { - "rank": 52, - "name": "\ue020RANDOMGOD2011", - "scores": 44, - "total_damage": 0.0, - "kills": 3, - "deaths": 4, - "games": 2, - "kd": 0.75, - "avg_score": 22.0, - "aid": "pb-IF43VVJSAg==" - }, - "pb-IF5XUm9eAg==": { - "rank": 1, - "name": "\ue030PC402015", - "scores": 2167, - "total_damage": 0.0, - "kills": 8, - "deaths": 193, - "games": 136, - "kd": 0.041, - "avg_score": 15.933, - "aid": "pb-IF5XUm9eAg==" + "startDate": "26-02-2022", + "stats": { + "pb-IF4VAk4a": { + "rank": 1, + "name": "pb-IF4VAk4a", + "scores": 0, + "total_damage": 0.0, + "kills": 0, + "deaths": 0, + "games": 18, + "kd": 0.0, + "avg_score": 0.0, + "aid": "pb-IF4VAk4a" + } } } \ No newline at end of file