NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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())