# -*- coding: utf-8 -*- # @author: mkaay from time import time from pyload.utils import uniqify class PullManager(object): def __init__(self, core): self.core = core self.clients = [] def newClient(self, uuid): self.clients.append(Client(uuid)) def clean(self): for n, client in enumerate(self.clients): if client.lastActive + 30 < time(): del self.clients[n] def getEvents(self, uuid): events = [] validUuid = False for client in self.clients: if client.uuid == uuid: client.lastActive = time() validUuid = True while client.newEvents(): events.append(client.popEvent().toList()) break if not validUuid: self.newClient(uuid) events = [ReloadAllEvent("queue").toList(), ReloadAllEvent("collector").toList()] return uniqify(events) def addEvent(self, event): for client in self.clients: client.addEvent(event) class Client(object): def __init__(self, uuid): self.uuid = uuid self.lastActive = time() self.events = [] def newEvents(self): return len(self.events) > 0 def popEvent(self): if not len(self.events): return None return self.events.pop(0) def addEvent(self, event): self.events.append(event) class UpdateEvent(object): def __init__(self, itype, iid, destination): assert itype == "pack" or itype == "file" assert destination == "queue" or destination == "collector" self.type = itype self.id = iid self.destination = destination def toList(self): return ["update", self.destination, self.type, self.id] class RemoveEvent(object): def __init__(self, itype, iid, destination): assert itype == "pack" or itype == "file" assert destination == "queue" or destination == "collector" self.type = itype self.id = iid self.destination = destination def toList(self): return ["remove", self.destination, self.type, self.id] class InsertEvent(object): def __init__(self, itype, iid, after, destination): assert itype == "pack" or itype == "file" assert destination == "queue" or destination == "collector" self.type = itype self.id = iid self.after = after self.destination = destination def toList(self): return ["insert", self.destination, self.type, self.id, self.after] class ReloadAllEvent(object): def __init__(self, destination): assert destination == "queue" or destination == "collector" self.destination = destination def toList(self): return ["reload", self.destination] class AccountUpdateEvent(object): def toList(self): return ["account"] class ConfigUpdateEvent(object): def toList(self): return ["config"]