# -*- coding: utf-8 -*- """ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, see . @author: RaNaN """ from module.Api import InteractionTask as BaseInteractionTask from module.Api import Input, Output #noinspection PyUnresolvedReferences class InteractionTask(BaseInteractionTask): """ General Interaction Task extends ITask defined by thrift with additional fields and methods. """ #: Plugins can put needed data here storage = None #: Timestamp when task expires waitUntil = 0 #: Default data to be used, or True if preset should be used default = None #: The received result as string representation result = None #: List of registered handles handler = None #: Callback functions callbacks = None #: Error Message error = None #: Status string status = None def __init__(self, *args, **kwargs): BaseInteractionTask.__init__(self, *args, **kwargs) # additional internal attributes self.storage = {} self.default = [] self.handler = [] self.callbacks = [] class CaptchaTask: def __init__(self, id, img, format, file, result_type='textual'): self.id = str(id) self.captchaImg = img self.captchaFormat = format self.captchaFile = file self.captchaResultType = result_type self.handler = [] #the hook plugins that will take care of the solution self.result = None self.waitUntil = None self.error = None #error message self.status = "init" self.data = {} #handler can store data here def getCaptcha(self): return self.captchaImg, self.captchaFormat, self.captchaResultType def setResult(self, text): if self.isTextual(): self.result = text if self.isPositional(): try: parts = text.split(',') self.result = (int(parts[0]), int(parts[1])) except: self.result = None def getResult(self): try: res = self.result.encode("utf8", "replace") except: res = self.result return res def getStatus(self): return self.status def setWaiting(self, sec): """ let the captcha wait secs for the solution """ self.waitUntil = max(time() + sec, self.waitUntil) self.status = "waiting" def isWaiting(self): if self.result or self.error or time() > self.waitUntil: return False return True def isTextual(self): """ returns if text is written on the captcha """ return self.captchaResultType == 'textual' def isPositional(self): """ returns if user have to click a specific region on the captcha """ return self.captchaResultType == 'positional' def setWatingForUser(self, exclusive): if exclusive: self.status = "user" else: self.status = "shared-user" def timedOut(self): return time() > self.waitUntil def invalid(self): """ indicates the captcha was not correct """ [x.captchaInvalid(self) for x in self.handler] def correct(self): [x.captchaCorrect(self) for x in self.handler] def __str__(self): return "" % self.id