Ejemplo n.º 1
0
class Delegate():
    def __init__(self, config) -> None:
        self.config = config
        self.last_missed = 0
        self.total_missed = 0
        self.init_config()

    def init_config(self):
        self.api = FeedApi(self.config)
        self.interval = int(self.config['delegate']['interval']) * 60
        self.max_miss = int(self.config['delegate']['max_miss'])
        self.keys = self.config['delegate']['keys']

    def get_key(self, key):
        new_key = None
        for k in self.keys:
            if k == key:
                continue
            new_key = k
            break
        return new_key

    async def check_task(self):
        try:
            while True:
                result = self.api.get_witness_info()
                # print(result)
                if result is not None:
                    missed = int(result['total_missed'])
                    if self.total_missed == 0:
                        self.total_missed = missed
                        await asyncio.sleep(self.interval)
                        continue
                    if missed - self.total_missed >= self.max_miss:
                        self.total_missed = missed
                        key = self.get_key(result['signing_key'])
                        self.api.update_witness(self.config['witness'], key)
                await asyncio.sleep(self.interval)
        except Exception as e:
            print("Error: ", e)

    def run_tasks(self, loop):
        return [loop.create_task(self.check_task())]