# -*- 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: mkaay
@interface-version: 0.2
"""
from traceback import print_exc
from Plugin import Base
class Expose(object):
""" used for decoration to declare rpc services """
def __new__(cls, f, *args, **kwargs):
hookManager.addRPC(f.__module__, f.func_name, f.func_doc)
return f
def threaded(f):
def run(*args,**kwargs):
hookManager.startThread(f, *args, **kwargs)
return run
class Hook(Base):
"""
Base class for hook plugins.
"""
__name__ = "Hook"
__version__ = "0.2"
__type__ = "hook"
__threaded__ = []
__config__ = [ ("name", "type", "desc" , "default") ]
__description__ = """interface for hook"""
__author_name__ = ("mkaay", "RaNaN")
__author_mail__ = ("mkaay@mkaay.de", "RaNaN@pyload.org")
#: automatically register event listeners for functions, attribute will be deleted dont use it yourself
event_map = None
# Alternative to event_map
#: List of events the plugin can handle, name the functions exactly like eventname.
event_list = None # dont make duplicate entries in event_map
#: periodic call interval in secondc
interval = 60
def __init__(self, core, manager):
Base.__init__(self, core)
#: Provide information in dict here, usable by API `getInfo`
self.info = None
#: Callback of periodical job task, used by hookmanager
self.cb = None
#: `HookManager`
self.manager = manager
#register events
if self.event_map:
for event, funcs in self.event_map.iteritems():
if type(funcs) in (list, tuple):
for f in funcs:
self.manager.addEvent(event, getattr(self,f))
else:
self.manager.addEvent(event, getattr(self,funcs))
#delete for various reasons
self.event_map = None
if self.event_list:
for f in self.event_list:
self.manager.addEvent(f, getattr(self,f))
self.event_list = None
self.initPeriodical()
self.setup()
def initPeriodical(self):
if self.interval >=1:
self.cb = self.core.scheduler.addJob(0, self._periodical, threaded=False)
def _periodical(self):
try:
if self.isActivated(): self.periodical()
except Exception, e:
self.core.log.error(_("Error executing hooks: %s") % str(e))
if self.core.debug:
print_exc()
self.cb = self.core.scheduler.addJob(self.interval, self._periodical, threaded=False)
def __repr__(self):
return "" % self.__name__
def setup(self):
""" more init stuff if needed """
pass
def unload(self):
""" called when hook was deactivated """
pass
def isActivated(self):
""" checks if hook is activated"""
return self.config.getPlugin(self.__name__, "activated")
#event methods - overwrite these if needed
def coreReady(self):
pass
def coreExiting(self):
pass
def downloadPreparing(self, pyfile):
pass
def downloadFinished(self, pyfile):
pass
def downloadFailed(self, pyfile):
pass
def packageFinished(self, pypack):
pass
def beforeReconnecting(self, ip):
pass
def afterReconnecting(self, ip):
pass
def periodical(self):
pass
def newCaptchaTask(self, task):
""" new captcha task for the plugin, it MUST set the handler and timeout or will be ignored """
pass
def captchaCorrect(self, task):
pass
def captchaInvalid(self, task):
pass