summaryrefslogtreecommitdiffstats
path: root/module/plugins/Account.py
diff options
context:
space:
mode:
Diffstat (limited to 'module/plugins/Account.py')
-rw-r--r--module/plugins/Account.py101
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":