80 lines
2.5 KiB
Python
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()
|