limit.py (1996B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\dogma\attributes\limit.py 2 import collections 3 LIMIT_WINDOW_LENGTH = 20 4 5 def LimitAttributeOnItem(item, timestamp, limiting_attribute_id, value): 6 discarded_value = 0 7 if item is None: 8 return (value, discarded_value) 9 limit_per_second = item.GetValue(limiting_attribute_id) 10 if not limit_per_second: 11 return (value, discarded_value) 12 history = _GetHistory(item, limiting_attribute_id) 13 return _AccumulateValueWithinRollingLimit(history, timestamp, limit_per_second, value) 14 15 16 def GetAccumulatedAttributeOnItem(item, timestamp, limiting_attribute_id): 17 if item: 18 history = _GetHistory(item, limiting_attribute_id) 19 return _GetAccumulatedValue(history, timestamp) 20 21 22 def _GetHistory(item, limiting_attribute_id): 23 try: 24 return item.rollingHistory[limiting_attribute_id] 25 except AttributeError: 26 item.rollingHistory = collections.defaultdict(collections.OrderedDict) 27 return item.rollingHistory[limiting_attribute_id] 28 29 30 def _AccumulateValueWithinRollingLimit(history, timestamp, limit_per_second, value): 31 discarded_value = 0 32 if not limit_per_second or not value: 33 return (value, discarded_value) 34 current_accumulated_value = _GetAccumulatedValue(history, timestamp) 35 max_allowed_accumulated_value = limit_per_second * LIMIT_WINDOW_LENGTH 36 value_to_add = min(value, max(max_allowed_accumulated_value - current_accumulated_value, 0)) 37 discarded_value = max(0, value - value_to_add) 38 if value_to_add == 0: 39 return (0, discarded_value) 40 history[int(timestamp)] = value_to_add + history.get(int(timestamp), 0) 41 return (value_to_add, discarded_value) 42 43 44 def _GetAccumulatedValue(history, timestamp): 45 oldest = int(timestamp) - LIMIT_WINDOW_LENGTH 46 for key in history.keys(): 47 if key < oldest: 48 del history[key] 49 else: 50 break 51 52 return sum(history.itervalues())