open-toontown/toontown/ai/ServerEventBuffer.py

80 lines
2.5 KiB
Python

"""ServerEventBuffer: buffers up information for multiple server events and writes single event"""
class ServerEventBuffer:
"""Buffers up events that you want to be logged in the server event log."""
def __init__(self, air, name, avId, period=None):
# name is the name of the event that we'll be writing to the server
# period in minutes
self.air = air
self.name = name
self.avId = avId
if period is None:
# every 6 hours
period = 6*60.
self.period = period
self.lastFlushTime = None
def destroy(self):
self.flush()
def flush(self):
# subclasses, override this and call down
self.lastFlushTime = None
def writeEvent(self, msg):
self.air.writeServerEvent(self.name, self.avId, msg)
def considerFlush(self):
# if we haven't logged in a while, don't immediately flush out the
# first event
if self.lastFlushTime is None:
self.lastFlushTime = globalClock.getFrameTime()
elif ((globalClock.getFrameTime() - self.lastFlushTime) >
(self.period*60.)):
self.flush()
class ServerEventAccumulator(ServerEventBuffer):
# counts # of times a particular event occurs
def __init__(self, air, name, avId, period=None):
ServerEventBuffer.__init__(self, air, name, avId, period)
self.count = 0
def flush(self):
ServerEventBuffer.flush(self)
if not self.count:
return
self.writeEvent("%s" % self.count)
self.count = 0
def addEvent(self):
self.count += 1
self.considerFlush()
class ServerEventMultiAccumulator(ServerEventBuffer):
# counts # of times multiple related events occur
def __init__(self, air, name, avId, period=None):
ServerEventBuffer.__init__(self, air, name, avId, period)
# eventName:count
self.events = {}
def flush(self):
ServerEventBuffer.flush(self)
if not len(self.events):
return
msg = ""
eventNames = list(self.events.keys())
eventNames.sort()
for eventName in eventNames:
msg += "%s:%s" % (eventName, self.events[eventName])
if eventName != eventNames[-1]:
msg += ','
self.writeEvent(msg)
self.events = {}
def addEvent(self, eventName):
self.events.setdefault(eventName, 0)
self.events[eventName] += 1
self.considerFlush()