rework double filter

This commit is contained in:
Bastian Schroll 2018-02-03 16:09:56 +01:00
parent c89e6ef28c
commit 4f72691c65
2 changed files with 44 additions and 21 deletions

View file

@ -27,33 +27,56 @@ logging.debug("- %s loaded", __name__)
class DoubleFilter:
"""!Double Filter Class"""
def __init__(self, scanWord):
def __init__(self):
"""!init"""
self._config = Config()
self._filterList = []
self._scanWord = scanWord
self._filterLists = {}
def check(self, bwPacket):
def filter(self, bwPacket):
self._deleteTooOld()
if bwPacket.get("mode") is "fms":
scanWord = "fms"
elif bwPacket.get("mode") is "pocsag":
scanWord = "ric"
elif bwPacket.get("mode") is "zvei":
scanWord = "zvei"
else:
logging.error("No Filter for '%s'", bwPacket)
return False
for listPacket in self._filterList:
if listPacket.get(self._scanWord) is bwPacket.get(self._scanWord):
self._filterList.remove(listPacket)
logging.debug("found duplicate: %s", bwPacket.get(self._scanWord))
if not bwPacket.get("mode") in self._filterLists:
logging.debug("create new doubleFilter list for '%s'", bwPacket.get("mode"))
self._filterLists[bwPacket.get("mode")] = []
self._filterList.insert(0, bwPacket)
self._deleteTooMuch()
# for debug
print(len(self._filterLists[bwPacket.get("mode")]))
def _deleteTooOld(self):
logging.debug("scanWord for '%s' is '%s'", bwPacket.get("mode"), scanWord)
return self.check(bwPacket, scanWord)
def check(self, bwPacket, scanWord):
self._filterLists[bwPacket.get("mode")].insert(0, bwPacket)
# delete entrys that are to old
counter = 0
for listPacket in self._filterList:
for listPacket in self._filterLists[bwPacket.get("mode")][1:]: # [1:] skip first entry, thats the new one
print(str(listPacket.get("timestamp")), str(time.time() - self._config.getInt("doubleFilter", "IgnoreTime", "serverConfig")))
if listPacket.get("timestamp") < (time.time() - self._config.getInt("doubleFilter", "IgnoreTime", "serverConfig")):
self._filterList.remove(listPacket)
counter += 1
self._filterLists[bwPacket.get("mode")].remove(listPacket)
counter += 1
if counter:
logging.debug("%d old entry removed", counter)
logging.debug("%d old entry(s) removed", counter)
def _deleteTooMuch(self):
if len(self._filterList) > self._config.getInt("doubleFilter", "MaxEntry", "serverConfig"):
self._filterList.pop()
# delete last entry if list is to big
if len(self._filterLists[bwPacket.get("mode")]) > self._config.getInt("doubleFilter", "MaxEntry", "serverConfig"):
logging.debug("MaxEntry reached - delete oldest")
self._filterLists[bwPacket.get("mode")].pop()
for listPacket in self._filterLists[bwPacket.get("mode")][1:]: # [1:] skip first entry, thats the new one
if listPacket.get(scanWord) is bwPacket.get(scanWord):
logging.debug("found duplicate: %s", bwPacket.get(scanWord))
return False
print("OK!")
return True

View file

@ -35,7 +35,7 @@ class Packet:
else:
logging.debug("create bwPacket from string")
try:
self._packet = eval(bwPacket.strip())
self._packet = eval(str(bwPacket.strip()))
except:
# todo can we repair the packet anyway?
logging.exception("error while create packet from string")
@ -49,7 +49,7 @@ class Packet:
@param fieldName: Name of the data to set
@param value: Value to set"""
self._packet[fieldName] = str(value)
self._packet[fieldName] = value
def get(self, fieldName):
"""!Returns the value from a single field.