mirror of
https://github.com/jlu5/PyLink.git
synced 2024-11-27 21:19:31 +01:00
parent
bbedd38703
commit
07fe7202aa
@ -2,6 +2,8 @@
|
||||
import sys
|
||||
import os
|
||||
from time import ctime
|
||||
import itertools
|
||||
import gc
|
||||
|
||||
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
import utils
|
||||
@ -203,3 +205,107 @@ def echo(irc, source, args):
|
||||
|
||||
Echoes the text given."""
|
||||
irc.msg(irc.called_by, ' '.join(args))
|
||||
|
||||
def load(irc, source, args):
|
||||
"""<plugin name>.
|
||||
|
||||
Loads a plugin from the plugin folder."""
|
||||
utils.checkAuthenticated(irc, source, allowOper=False)
|
||||
try:
|
||||
name = args[0]
|
||||
except IndexError:
|
||||
irc.msg(irc.called_by, "Error: Not enough arguments. Needs 1: plugin name.")
|
||||
return
|
||||
try:
|
||||
world.plugins[name] = pl = __import__(name)
|
||||
except ImportError as e:
|
||||
if str(e) == ('No module named %r' % name):
|
||||
log.exception('Failed to load plugin %r: The plugin could not be found.', name)
|
||||
else:
|
||||
log.exception('Failed to load plugin %r: ImportError.', name)
|
||||
raise
|
||||
else:
|
||||
if hasattr(pl, 'main'):
|
||||
log.debug('Calling main() function of plugin %r', pl)
|
||||
pl.main(irc)
|
||||
irc.msg(irc.called_by, "Loaded plugin %r." % name)
|
||||
utils.add_cmd(load)
|
||||
|
||||
def unload(irc, source, args):
|
||||
"""<plugin name>.
|
||||
|
||||
Unloads a currently loaded plugin."""
|
||||
utils.checkAuthenticated(irc, source, allowOper=False)
|
||||
try:
|
||||
name = args[0]
|
||||
except IndexError:
|
||||
irc.msg(irc.called_by, "Error: Not enough arguments. Needs 1: plugin name.")
|
||||
return
|
||||
if name == 'commands':
|
||||
irc.msg(irc.called_by, "Error: Cannot unload the commands plugin!")
|
||||
return
|
||||
elif name in world.plugins:
|
||||
pl = world.plugins[name]
|
||||
log.debug('sys.getrefcount of plugin %s is %s', pl, sys.getrefcount(pl))
|
||||
# Remove any command functions set by the plugin.
|
||||
for cmdname, cmdfuncs in world.commands.copy().items():
|
||||
log.debug('cmdname=%s, cmdfuncs=%s', cmdname, cmdfuncs)
|
||||
for cmdfunc in cmdfuncs:
|
||||
log.debug('__module__ of cmdfunc %s is %s', cmdfunc, cmdfunc.__module__)
|
||||
if cmdfunc.__module__ == name:
|
||||
log.debug('Removing %s from world.commands[%s]', cmdfunc, cmdname)
|
||||
world.commands[cmdname].remove(cmdfunc)
|
||||
# If the cmdfunc list is empty, remove it.
|
||||
if not cmdfuncs:
|
||||
log.debug("Removing world.commands[%s] (it's empty now)", cmdname)
|
||||
del world.commands[cmdname]
|
||||
|
||||
# Remove any command hooks set by the plugin.
|
||||
for hookname, hookfuncs in world.hooks.copy().items():
|
||||
for hookfunc in hookfuncs:
|
||||
if hookfunc.__module__ == name:
|
||||
world.hooks[hookname].remove(hookfunc)
|
||||
# If the hookfuncs list is empty, remove it.
|
||||
if not hookfuncs:
|
||||
del world.hooks[hookname]
|
||||
|
||||
# Remove whois handlers too.
|
||||
for f in world.whois_handlers:
|
||||
if f.__module__ == name:
|
||||
world.whois_handlers.remove(f)
|
||||
|
||||
# Call the die() function in the plugin, if present.
|
||||
if hasattr(pl, 'die'):
|
||||
try:
|
||||
pl.die(irc)
|
||||
except: # But don't allow it to crash the server.
|
||||
log.exception('(%s) Error occurred in die() of plugin %s, skipping...', irc.name, pl)
|
||||
|
||||
# Delete it from memory (hopefully).
|
||||
del world.plugins[name]
|
||||
if name in sys.modules:
|
||||
del sys.modules[name]
|
||||
if name in globals():
|
||||
del globals()[name]
|
||||
|
||||
# Garbage collect.
|
||||
gc.collect()
|
||||
|
||||
irc.msg(irc.called_by, "Unloaded plugin %r." % name)
|
||||
return True # We succeeded, make it clear (this status is used by reload() below)
|
||||
else:
|
||||
irc.msg(irc.called_by, "Unknown plugin %r." % name)
|
||||
utils.add_cmd(unload)
|
||||
|
||||
@utils.add_cmd
|
||||
def reload(irc, source, args):
|
||||
"""<plugin name>.
|
||||
|
||||
Loads a plugin from the plugin folder."""
|
||||
try:
|
||||
name = args[0]
|
||||
except IndexError:
|
||||
irc.msg(irc.called_by, "Error: Not enough arguments. Needs 1: plugin name.")
|
||||
return
|
||||
if unload(irc, source, args):
|
||||
load(irc, source, args)
|
||||
|
Loading…
Reference in New Issue
Block a user