diff options
Diffstat (limited to 'module/plugins/Account.py')
-rw-r--r-- | module/plugins/Account.py | 101 |
1 files changed, 71 insertions, 30 deletions
diff --git a/module/plugins/Account.py b/module/plugins/Account.py index f731eac17..5e86488d7 100644 --- a/module/plugins/Account.py +++ b/module/plugins/Account.py @@ -17,7 +17,7 @@ @author: mkaay """ -from random import randrange +from random import choice import re class Account(): @@ -32,71 +32,112 @@ class Account(): self.manager = manager self.core = manager.core self.accounts = {} - self.register = {} + self.infos = {} # cache for account information self.setAccounts(accounts) - + def login(self, user, data): pass - + + def _login(self, user, data): + try: + self.login(user, data) + except Exception, e: + self.core.log.warning(_("Could not login with account %s | %s") % (user, e)) + data["valid"] = False + if self.core.debug: + from traceback import print_exc + print_exc() + def setAccounts(self, accounts): self.accounts = accounts for user, data in self.accounts.iteritems(): - self.login(user, data) + self._login(user, data) def updateAccounts(self, user, password, options): if self.accounts.has_key(user): self.accounts[user]["password"] = password self.accounts[user]["options"] = options + self.accounts[user]["valid"] = True else: - self.accounts[user] = {"password" : password, "options": options} - - self.login(user, self.accounts[user]) + self.accounts[user] = {"password" : password, "options": options, "valid": True} + + self._login(user, self.accounts[user]) def removeAccount(self, user): if self.accounts.has_key(user): del self.accounts[user] + if self.infos.has_key(user): + del self.infos[user] - def getAccountInfo(self, name): + def getAccountInfo(self, name, force=False): + """ return dict with infos, do not overwrite this method! """ + data = Account.loadAccountInfo(self, name) + if not self.infos.has_key(name) or force: + self.core.log.debug("Get Account Info for %s" % name) + try: + infos = self.loadAccountInfo(name) + except Exception, e: + infos = {"error": str(e)} + self.core.log.debug("Account Info: %s" % str(infos)) + self.infos[name] = infos + data.update(infos) + return data + else: + data.update(self.infos[name]) + return data + + def loadAccountInfo(self, name): return { "validuntil": None, # -1 for unlimited "login": name, #"password": self.accounts[name]["password"], #@XXX: security "options": self.accounts[name]["options"], + "valid": self.accounts[name]["valid"], "trafficleft": None, # -1 for unlimited "maxtraffic": None, "type": self.__name__, } + + def getAllAccounts(self, force=False): + return [self.getAccountInfo(user, force) for user, data in self.accounts.iteritems()] - def getAllAccounts(self): - return [self.getAccountInfo(user) for user, data in self.accounts.iteritems()] - - def getAccountRequest(self, plugin): - user, data = self.getAccountData(plugin) + def getAccountRequest(self, user=None): + if not user: + user, data = self.selectAccount() req = self.core.requestFactory.getRequest(self.__name__, user) return req - - def getAccountData(self, plugin): - if not len(self.accounts): - return None - if not self.register.has_key(plugin): - account = self.selectAccount(plugin) - self.register[plugin] = account - else: - account = self.register[plugin] - return account - - def selectAccount(self, plugin): - account = self.accounts.items()[randrange(0, len(self.accounts), 1)] - return account + + def getAccountCookies(self, user=None): + if not user: + user, data = self.selectAccount() + cj = self.core.requestFactory.getCookieJar(self.__name__, user) + return cj + + def getAccountData(self, user): + return self.accounts[user] + + def selectAccount(self): + """ returns an valid and account name""" + usable = [] + for user,data in self.accounts: + if not data["valid"]: continue + for option, value in data["options"]: + pass + #@TODO comparate time option + + usable.append((user, data)) + + if not usable: return None + return choice(usable) def canUse(self): - return len(self.accounts) + return True if self.selectAccount() else False def parseTraffic(self, string): #returns kbyte string = string.strip().lower() p = re.compile(r"(\d+[\.,]\d+)(.*)") m = p.match(string) - if m: + if m: traffic = float(m.group(1).replace(",", ".")) unit = m.group(2).strip() if unit == "gb" or unit == "gig" or unit == "gbyte" or unit == "gigabyte": |