80 lines
3 KiB
Python
80 lines
3 KiB
Python
|
from otp.ai.MagicWordGlobal import *
|
||
|
from toontown.toonbase import TTLocalizer
|
||
|
import RaceGlobals, operator, time
|
||
|
|
||
|
class LeaderboardMgrAI:
|
||
|
|
||
|
def __init__(self, air):
|
||
|
self.air = air
|
||
|
if self.air.dbConn:
|
||
|
self.air.dbGlobalCursor.leaderboards.ensure_index([('ai', 1)])
|
||
|
shard = {'ai': self.air.districtId}
|
||
|
doc = self.air.dbGlobalCursor.leaderboards.find_one(shard)
|
||
|
if not doc:
|
||
|
self.database = ({})
|
||
|
else:
|
||
|
self.database = doc.get('database', ({}))
|
||
|
|
||
|
else:
|
||
|
self.database = simbase.backups.load('leaderboard', (self.air.districtId,), default=({}))
|
||
|
|
||
|
def getDatabase(self):
|
||
|
return self.database
|
||
|
|
||
|
def saveDatabase(self):
|
||
|
if self.air.dbConn:
|
||
|
shard = {'ai': self.air.districtId}
|
||
|
self.air.dbGlobalCursor.leaderboards.update(shard,
|
||
|
{'$setOnInsert': shard,
|
||
|
'$set': {'database': self.database}},
|
||
|
upsert = True)
|
||
|
else:
|
||
|
simbase.backups.save('leaderboard', (self.air.districtId,), self.database)
|
||
|
messenger.send('goofyLeaderboardChange')
|
||
|
|
||
|
def trimList(self, list):
|
||
|
return list[:RaceGlobals.NumRecordsPerPeriod]
|
||
|
|
||
|
def clearRace(self, race):
|
||
|
if race in self.database:
|
||
|
del self.database[race]
|
||
|
self.saveDatabase()
|
||
|
|
||
|
def submitRace(self, raceId, name, timestamp):
|
||
|
for i in xrange(len(TTLocalizer.RecordPeriodStrings)):
|
||
|
race = '%s, %s' % (raceId, i)
|
||
|
|
||
|
if race in self.database:
|
||
|
originalRace = self.database[race][1]
|
||
|
newRace = list(originalRace)
|
||
|
|
||
|
newRace.append([name, timestamp])
|
||
|
sortedRace = self.trimList(sorted(newRace, key=operator.itemgetter(1)))
|
||
|
|
||
|
if originalRace != sortedRace:
|
||
|
self.database[race][1] = sortedRace
|
||
|
self.saveDatabase()
|
||
|
else:
|
||
|
self.database[race] = [time.time(), [(name, timestamp)]]
|
||
|
self.saveDatabase()
|
||
|
|
||
|
@magicWord(category=CATEGORY_PROGRAMMER, types=[str, int, int, str, int])
|
||
|
def leaderboard(command, raceId=0, type=0, name='', time=0):
|
||
|
command = command.lower()
|
||
|
race = '%s, %s' % (raceId, type)
|
||
|
|
||
|
if command == 'clear':
|
||
|
simbase.air.leaderboardMgr.clearRace(race)
|
||
|
return 'Cleared race %s!' % race
|
||
|
elif command == 'submit':
|
||
|
simbase.air.leaderboardMgr.submitRace(raceId, name, time)
|
||
|
return 'Submitted race %s for %s with %s seconds!' % (raceId, name, time)
|
||
|
elif command == 'refresh':
|
||
|
messenger.send('goofyLeaderboardChange')
|
||
|
return 'Refreshed leaderboards!'
|
||
|
elif command == 'change':
|
||
|
messenger.send('goofyLeaderboardDisplay', [raceId])
|
||
|
return 'Made all leaderboards show %s!' % raceId
|
||
|
else:
|
||
|
return 'Unknown command! Commands:\n- clear\n- submit\n- refresh\n- change'
|