mirror of
https://github.com/LmeSzinc/StarRailCopilot.git
synced 2024-11-30 11:19:30 +00:00
69 lines
1.8 KiB
Python
69 lines
1.8 KiB
Python
|
from functools import wraps
|
||
|
|
||
|
import numpy as np
|
||
|
|
||
|
from module.logger import logger
|
||
|
|
||
|
|
||
|
class Config:
|
||
|
"""
|
||
|
Decorator that calls different function with a same name according to config.
|
||
|
|
||
|
func_list likes:
|
||
|
func_list = {
|
||
|
'func1': [
|
||
|
{'options': {'ENABLE': True}, 'func': 1},
|
||
|
{'options': {'ENABLE': False}, 'func': 1}
|
||
|
]
|
||
|
}
|
||
|
"""
|
||
|
func_list = {}
|
||
|
|
||
|
@classmethod
|
||
|
def when(cls, **kwargs):
|
||
|
"""
|
||
|
Args:
|
||
|
**kwargs: Any option in AzurLaneConfig.
|
||
|
|
||
|
Examples:
|
||
|
@Config.when(USE_ONE_CLICK_RETIREMENT=True)
|
||
|
def retire_ships(self, amount=None, rarity=None):
|
||
|
pass
|
||
|
|
||
|
@Config.when(USE_ONE_CLICK_RETIREMENT=False)
|
||
|
def retire_ships(self, amount=None, rarity=None):
|
||
|
pass
|
||
|
"""
|
||
|
options = kwargs
|
||
|
|
||
|
def decorate(func):
|
||
|
name = func.__name__
|
||
|
data = {'options': options, 'func': func}
|
||
|
if name not in cls.func_list:
|
||
|
cls.func_list[name] = [data]
|
||
|
else:
|
||
|
cls.func_list[name].append(data)
|
||
|
|
||
|
@wraps(func)
|
||
|
def wrapper(self, *args, **kwargs):
|
||
|
"""
|
||
|
Args:
|
||
|
self: ModuleBase instance.
|
||
|
*args:
|
||
|
**kwargs:
|
||
|
"""
|
||
|
for record in cls.func_list[name]:
|
||
|
|
||
|
flag = [self.config.__getattribute__(key) == value for key, value in record['options'].items()]
|
||
|
if not np.all(flag):
|
||
|
continue
|
||
|
|
||
|
return record['func'](self, *args, **kwargs)
|
||
|
|
||
|
logger.warning(f'No option fits for {name}, using the last define func.')
|
||
|
return func(self, *args, **kwargs)
|
||
|
|
||
|
return wrapper
|
||
|
|
||
|
return decorate
|