mirror of
https://github.com/jlu5/PyLink.git
synced 2024-11-30 14:49:28 +01:00
Modularize our import hacks, make Irc() take a conf object again
This commit is contained in:
parent
9e07949730
commit
e84a2d1025
@ -9,7 +9,6 @@ import hashlib
|
|||||||
from copy import deepcopy
|
from copy import deepcopy
|
||||||
|
|
||||||
from log import log
|
from log import log
|
||||||
from conf import conf
|
|
||||||
import world
|
import world
|
||||||
import utils
|
import utils
|
||||||
|
|
||||||
@ -63,7 +62,7 @@ class Irc():
|
|||||||
self.uplink = None
|
self.uplink = None
|
||||||
self.start_ts = int(time.time())
|
self.start_ts = int(time.time())
|
||||||
|
|
||||||
def __init__(self, netname, proto):
|
def __init__(self, netname, proto, conf):
|
||||||
# Initialize some variables
|
# Initialize some variables
|
||||||
self.name = netname.lower()
|
self.name = netname.lower()
|
||||||
self.conf = conf
|
self.conf = conf
|
||||||
|
1
conf.py
1
conf.py
@ -60,6 +60,7 @@ def loadConf(fname):
|
|||||||
if world.testing:
|
if world.testing:
|
||||||
conf = testconf
|
conf = testconf
|
||||||
confname = 'testconf'
|
confname = 'testconf'
|
||||||
|
fname = None
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
# Get the config name from the command line, falling back to config.yml
|
# Get the config name from the command line, falling back to config.yml
|
||||||
|
@ -7,9 +7,10 @@ import gc
|
|||||||
|
|
||||||
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||||
import utils
|
import utils
|
||||||
from conf import conf
|
import conf
|
||||||
from log import log
|
from log import log
|
||||||
import world
|
import world
|
||||||
|
import classes
|
||||||
|
|
||||||
@utils.add_cmd
|
@utils.add_cmd
|
||||||
def status(irc, source, args):
|
def status(irc, source, args):
|
||||||
@ -37,8 +38,8 @@ def identify(irc, source, args):
|
|||||||
irc.msg(source, 'Error: Not enough arguments.')
|
irc.msg(source, 'Error: Not enough arguments.')
|
||||||
return
|
return
|
||||||
# Usernames are case-insensitive, passwords are NOT.
|
# Usernames are case-insensitive, passwords are NOT.
|
||||||
if username.lower() == conf['login']['user'].lower() and password == conf['login']['password']:
|
if username.lower() == irc.conf['login']['user'].lower() and password == irc.conf['login']['password']:
|
||||||
realuser = conf['login']['user']
|
realuser = irc.conf['login']['user']
|
||||||
irc.users[source].identified = realuser
|
irc.users[source].identified = realuser
|
||||||
irc.msg(source, 'Successfully logged in as %s.' % realuser)
|
irc.msg(source, 'Successfully logged in as %s.' % realuser)
|
||||||
log.info("(%s) Successful login to %r by %s.",
|
log.info("(%s) Successful login to %r by %s.",
|
||||||
@ -220,7 +221,7 @@ def load(irc, source, args):
|
|||||||
irc.msg(irc.called_by, "Error: %r is already loaded." % name)
|
irc.msg(irc.called_by, "Error: %r is already loaded." % name)
|
||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
world.plugins[name] = pl = __import__(name)
|
world.plugins[name] = pl = utils.loadModuleFromFolder(name, world.plugins_folder)
|
||||||
except ImportError as e:
|
except ImportError as e:
|
||||||
if str(e) == ('No module named %r' % name):
|
if str(e) == ('No module named %r' % name):
|
||||||
log.exception('Failed to load plugin %r: The plugin could not be found.', name)
|
log.exception('Failed to load plugin %r: The plugin could not be found.', name)
|
||||||
|
21
pylink
21
pylink
@ -12,11 +12,11 @@ world.testing = False
|
|||||||
import conf
|
import conf
|
||||||
from log import log
|
from log import log
|
||||||
import classes
|
import classes
|
||||||
|
import utils
|
||||||
import coreplugin
|
import coreplugin
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
log.info('PyLink %s starting...', world.version)
|
log.info('PyLink %s starting...', world.version)
|
||||||
protocols_folder = [os.path.join(os.getcwd(), 'protocols')]
|
|
||||||
|
|
||||||
# Write a PID file.
|
# Write a PID file.
|
||||||
with open('%s.pid' % conf.confname, 'w') as f:
|
with open('%s.pid' % conf.confname, 'w') as f:
|
||||||
@ -25,14 +25,11 @@ if __name__ == '__main__':
|
|||||||
# Import plugins first globally, because they can listen for events
|
# Import plugins first globally, because they can listen for events
|
||||||
# that happen before the connection phase.
|
# that happen before the connection phase.
|
||||||
to_load = conf.conf['plugins']
|
to_load = conf.conf['plugins']
|
||||||
plugins_folder = [os.path.join(os.getcwd(), 'plugins')]
|
|
||||||
# Here, we override the module lookup and import the plugins
|
# Here, we override the module lookup and import the plugins
|
||||||
# dynamically depending on which were configured.
|
# dynamically depending on which were configured.
|
||||||
for plugin in to_load:
|
for plugin in to_load:
|
||||||
try:
|
try:
|
||||||
moduleinfo = imp.find_module(plugin, plugins_folder)
|
world.plugins[plugin] = pl = utils.loadModuleFromFolder(plugin, world.plugins_folder)
|
||||||
pl = imp.load_source(plugin, moduleinfo[1])
|
|
||||||
world.plugins[plugin] = pl
|
|
||||||
except ImportError as e:
|
except ImportError as e:
|
||||||
if str(e) == ('No module named %r' % plugin):
|
if str(e) == ('No module named %r' % plugin):
|
||||||
log.error('Failed to load plugin %r: The plugin could not be found.', plugin)
|
log.error('Failed to load plugin %r: The plugin could not be found.', plugin)
|
||||||
@ -44,17 +41,7 @@ if __name__ == '__main__':
|
|||||||
pl.main()
|
pl.main()
|
||||||
|
|
||||||
for network in conf.conf['servers']:
|
for network in conf.conf['servers']:
|
||||||
protoname = conf.conf['servers'][network]['protocol']
|
proto = utils.getProtoModule(conf.conf['servers'][network]['protocol'])
|
||||||
try:
|
world.networkobjects[network] = classes.Irc(network, proto, conf.conf)
|
||||||
moduleinfo = imp.find_module(protoname, protocols_folder)
|
|
||||||
proto = imp.load_source(protoname, moduleinfo[1])
|
|
||||||
except ImportError as e:
|
|
||||||
if str(e) == ('No module named %r' % protoname):
|
|
||||||
log.critical('Failed to load protocol module %r: The file could not be found.', protoname)
|
|
||||||
else:
|
|
||||||
log.critical('Failed to load protocol module: ImportError: %s', protoname, str(e))
|
|
||||||
sys.exit(2)
|
|
||||||
else:
|
|
||||||
world.networkobjects[network] = classes.Irc(network, proto)
|
|
||||||
world.started.set()
|
world.started.set()
|
||||||
log.info("loaded plugins: %s", world.plugins)
|
log.info("loaded plugins: %s", world.plugins)
|
||||||
|
11
utils.py
11
utils.py
@ -1,6 +1,7 @@
|
|||||||
import string
|
import string
|
||||||
import re
|
import re
|
||||||
import inspect
|
import inspect
|
||||||
|
import imp
|
||||||
|
|
||||||
from log import log
|
from log import log
|
||||||
import world
|
import world
|
||||||
@ -497,3 +498,13 @@ def getHostmask(irc, user):
|
|||||||
except AttributeError:
|
except AttributeError:
|
||||||
host = '<unknown host>'
|
host = '<unknown host>'
|
||||||
return '%s!%s@%s' % (nick, ident, host)
|
return '%s!%s@%s' % (nick, ident, host)
|
||||||
|
|
||||||
|
def loadModuleFromFolder(name, folder):
|
||||||
|
"""Attempts an import of name from a specific folder, returning the resulting module."""
|
||||||
|
moduleinfo = imp.find_module(name, folder)
|
||||||
|
m = imp.load_source(name, moduleinfo[1])
|
||||||
|
return m
|
||||||
|
|
||||||
|
def getProtoModule(protoname):
|
||||||
|
"""Imports and returns the protocol module requested."""
|
||||||
|
return loadModuleFromFolder(protoname, world.protocols_folder)
|
||||||
|
4
world.py
4
world.py
@ -3,6 +3,7 @@
|
|||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
import threading
|
import threading
|
||||||
import subprocess
|
import subprocess
|
||||||
|
import os
|
||||||
|
|
||||||
# Global variable to indicate whether we're being ran directly, or imported
|
# Global variable to indicate whether we're being ran directly, or imported
|
||||||
# for a testcase.
|
# for a testcase.
|
||||||
@ -18,6 +19,9 @@ plugins = {}
|
|||||||
whois_handlers = []
|
whois_handlers = []
|
||||||
started = threading.Event()
|
started = threading.Event()
|
||||||
|
|
||||||
|
plugins_folder = [os.path.join(os.getcwd(), 'plugins')]
|
||||||
|
protocols_folder = [os.path.join(os.getcwd(), 'protocols')]
|
||||||
|
|
||||||
version = "<unknown>"
|
version = "<unknown>"
|
||||||
source = "https://github.com/GLolol/PyLink" # CHANGE THIS IF YOU'RE FORKING!!
|
source = "https://github.com/GLolol/PyLink" # CHANGE THIS IF YOU'RE FORKING!!
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user