97 lines
2.7 KiB

# -*- coding: utf-8 -*-
import sys
import logging
logging = logging.getLogger()
import os.path
import importlib
from os import listdir
class Plugin(object):
Proto type of plugin class. Only subclasses are valid plugins.
__command = ''
def get_module():
return Plugin.__module
def get_command():
return Plugin.__command
def get_description():
return Plugin.__description
def __init__(self, callback):
self.callback = callback
def help(self):
return 'Sorry ... Help is unavailable at the moment'
def run(self, msg):
self.callback('Sorry ... Run is unavailable at the moment')
class PluginManager():
Handles the plugins. Optional becomes a directory for search plugins.
def __init__(self, plug_dir=None):
Initialize callback function and plugin directory. If no callback is
given it returns imediality. If no plugin directory is given it uses
actual directory.
if plug_dir is None:
self.plugin_dir = './plugins'
else: self.plugin_dir = plug_dir
def collect_plugins(self):
Find all files in plugin directory and grabs filename, provided
command and short description.
self.plugins = {}
search_dir = os.path.realpath(self.plugin_dir)
sys.path.insert(0, search_dir)
logging.debug('Search plugins in {}'.format(search_dir))
files = [x[:-3] for x in os.listdir(search_dir) if x.endswith('.py')]
for filename in files:
plugin = self.import_plugin(filename)
if plugin is False:
command = plugin.Plugin.get_command()
self.plugins[command] = plugin
return self.plugins
def import_plugin(self, filename):
Imports or reimports a module depending its known or not. It's
tested by the command provided by the plugin. (Not best praxis but
the easyst way. And i dont know, what a trouble is causes, if a
module ist moved.)
param 1: string
plugin = importlib.import_module(filename)
except Exception as e:
logging.error('Cant import module: {}'.format(filename))
logging.error('Exception: {}'.format(e))
return False
if not issubclass(plugin.Plugin, Plugin):
logging.error('Not a valid plugin: {}'.format(filename))
return False
logging.debug('Found plugin {}.'.format(filename))
return plugin