mirror of
https://github.com/jlu5/PyLink.git
synced 2024-11-27 21:19:31 +01:00
Allow dynamic protocol loading again, and make proto an attribute of Irc()
This should remove the need for plugins, etc. to import proto directly, which wouldn't work because of dynamic naming.
This commit is contained in:
parent
4d763288e5
commit
f40cb7954a
@ -24,6 +24,7 @@ server:
|
|||||||
sid: "0AL"
|
sid: "0AL"
|
||||||
# Autojoin channels
|
# Autojoin channels
|
||||||
channels: ["#pylink"]
|
channels: ["#pylink"]
|
||||||
|
protocol: "inspircd"
|
||||||
|
|
||||||
# Plugins to load (omit the .py extension)
|
# Plugins to load (omit the .py extension)
|
||||||
plugins:
|
plugins:
|
||||||
|
27
main.py
27
main.py
@ -7,14 +7,9 @@ import time
|
|||||||
import sys
|
import sys
|
||||||
|
|
||||||
from conf import conf
|
from conf import conf
|
||||||
import proto
|
|
||||||
|
|
||||||
if conf['login']['password'] == 'changeme':
|
|
||||||
print("You have not set the login details correctly! Exiting...")
|
|
||||||
sys.exit(2)
|
|
||||||
|
|
||||||
class Irc():
|
class Irc():
|
||||||
def __init__(self):
|
def __init__(self, proto):
|
||||||
# Initialize some variables
|
# Initialize some variables
|
||||||
self.socket = socket.socket()
|
self.socket = socket.socket()
|
||||||
self.connected = False
|
self.connected = False
|
||||||
@ -32,6 +27,7 @@ class Irc():
|
|||||||
|
|
||||||
self.socket = socket.socket()
|
self.socket = socket.socket()
|
||||||
self.socket.connect((ip, port))
|
self.socket.connect((ip, port))
|
||||||
|
self.proto = proto
|
||||||
proto.connect(self)
|
proto.connect(self)
|
||||||
self.loaded = []
|
self.loaded = []
|
||||||
self.load_plugins()
|
self.load_plugins()
|
||||||
@ -74,9 +70,24 @@ class Irc():
|
|||||||
if str(e).startswith('No module named'):
|
if str(e).startswith('No module named'):
|
||||||
print('Failed to load plugin %r: the plugin could not be found.' % plugin)
|
print('Failed to load plugin %r: the plugin could not be found.' % plugin)
|
||||||
else:
|
else:
|
||||||
print('Failed to load plugin %r: import error %s' (plugin, str(e)))
|
print('Failed to load plugin %r: import error %s' % (plugin, str(e)))
|
||||||
print("loaded plugins: %s" % self.loaded)
|
print("loaded plugins: %s" % self.loaded)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
print('PyLink starting...')
|
print('PyLink starting...')
|
||||||
irc_obj = Irc()
|
if conf['login']['password'] == 'changeme':
|
||||||
|
print("You have not set the login details correctly! Exiting...")
|
||||||
|
sys.exit(2)
|
||||||
|
|
||||||
|
protoname = conf['server']['protocol']
|
||||||
|
protocols_folder = [os.path.join(os.getcwd(), 'protocols')]
|
||||||
|
try:
|
||||||
|
moduleinfo = imp.find_module(protoname, protocols_folder)
|
||||||
|
proto = imp.load_source(protoname, moduleinfo[1])
|
||||||
|
except ImportError as e:
|
||||||
|
if str(e).startswith('No module named'):
|
||||||
|
print('Failed to load protocol module %r: the file could not be found.' % protoname)
|
||||||
|
else:
|
||||||
|
print('Failed to load protocol module: import error %s' % (protoname, str(e)))
|
||||||
|
else:
|
||||||
|
irc_obj = Irc(proto)
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
# admin.py: PyLink administrative commands
|
# admin.py: PyLink administrative commands
|
||||||
import sys, os
|
import sys, os
|
||||||
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 proto
|
|
||||||
import utils
|
import utils
|
||||||
|
|
||||||
class NotAuthenticatedError(Exception):
|
class NotAuthenticatedError(Exception):
|
||||||
@ -28,7 +27,7 @@ def spawnclient(irc, source, args):
|
|||||||
except ValueError:
|
except ValueError:
|
||||||
utils.msg(irc, source, "Error: not enough arguments. Needs 3: nick, user, host.")
|
utils.msg(irc, source, "Error: not enough arguments. Needs 3: nick, user, host.")
|
||||||
return
|
return
|
||||||
proto.spawnClient(irc, nick, ident, host)
|
irc.proto.spawnClient(irc, nick, ident, host)
|
||||||
|
|
||||||
@utils.add_cmd
|
@utils.add_cmd
|
||||||
def quitclient(irc, source, args):
|
def quitclient(irc, source, args):
|
||||||
@ -43,7 +42,7 @@ def quitclient(irc, source, args):
|
|||||||
return
|
return
|
||||||
u = utils.nickToUid(irc, nick)
|
u = utils.nickToUid(irc, nick)
|
||||||
quitmsg = ' '.join(args[1:]) or 'Client quit'
|
quitmsg = ' '.join(args[1:]) or 'Client quit'
|
||||||
proto.quitClient(irc, u, quitmsg)
|
irc.proto.quitClient(irc, u, quitmsg)
|
||||||
|
|
||||||
@utils.add_cmd
|
@utils.add_cmd
|
||||||
def joinclient(irc, source, args):
|
def joinclient(irc, source, args):
|
||||||
@ -61,7 +60,7 @@ def joinclient(irc, source, args):
|
|||||||
if not channel.startswith('#'):
|
if not channel.startswith('#'):
|
||||||
utils.msg(irc, source, "Error: channel names must start with #.")
|
utils.msg(irc, source, "Error: channel names must start with #.")
|
||||||
return
|
return
|
||||||
proto.joinClient(irc, u, channel)
|
irc.proto.joinClient(irc, u, channel)
|
||||||
|
|
||||||
@utils.add_cmd
|
@utils.add_cmd
|
||||||
def nickclient(irc, source, args):
|
def nickclient(irc, source, args):
|
||||||
@ -73,7 +72,7 @@ def nickclient(irc, source, args):
|
|||||||
utils.msg(irc, source, "Error: not enough arguments. Needs 2: nick, newnick.")
|
utils.msg(irc, source, "Error: not enough arguments. Needs 2: nick, newnick.")
|
||||||
return
|
return
|
||||||
u = utils.nickToUid(irc, nick)
|
u = utils.nickToUid(irc, nick)
|
||||||
proto.nickClient(irc, u, newnick)
|
irc.proto.nickClient(irc, u, newnick)
|
||||||
|
|
||||||
@utils.add_cmd
|
@utils.add_cmd
|
||||||
def partclient(irc, source, args):
|
def partclient(irc, source, args):
|
||||||
@ -90,7 +89,7 @@ def partclient(irc, source, args):
|
|||||||
if not channel.startswith('#'):
|
if not channel.startswith('#'):
|
||||||
utils.msg(irc, source, "Error: channel names must start with #.")
|
utils.msg(irc, source, "Error: channel names must start with #.")
|
||||||
return
|
return
|
||||||
proto.partClient(irc, u, channel, reason)
|
irc.proto.partClient(irc, u, channel, reason)
|
||||||
|
|
||||||
@utils.add_cmd
|
@utils.add_cmd
|
||||||
def kickclient(irc, source, args):
|
def kickclient(irc, source, args):
|
||||||
@ -108,4 +107,21 @@ def kickclient(irc, source, args):
|
|||||||
if not channel.startswith('#'):
|
if not channel.startswith('#'):
|
||||||
utils.msg(irc, source, "Error: channel names must start with #.")
|
utils.msg(irc, source, "Error: channel names must start with #.")
|
||||||
return
|
return
|
||||||
proto.kickClient(irc, u, channel, targetu, reason)
|
irc.proto.kickClient(irc, u, channel, targetu, reason)
|
||||||
|
|
||||||
|
@utils.add_cmd
|
||||||
|
def tell(irc, source, args):
|
||||||
|
checkauthenticated(irc, source)
|
||||||
|
try:
|
||||||
|
source, target, text = args[0], args[1], ' '.join(args[2:])
|
||||||
|
except IndexError:
|
||||||
|
utils.msg(irc, source, 'Error: not enough arguments.')
|
||||||
|
return
|
||||||
|
targetuid = utils.nickToUid(irc, target)
|
||||||
|
if targetuid is None:
|
||||||
|
utils.msg(irc, source, 'Error: unknown user %r' % target)
|
||||||
|
return
|
||||||
|
if not text:
|
||||||
|
utils.msg(irc, source, "Error: can't send an empty message!")
|
||||||
|
return
|
||||||
|
utils.msg(irc, target, text, notice=True)
|
||||||
|
@ -1,26 +1,9 @@
|
|||||||
# commands.py: base PyLink commands
|
# commands.py: base PyLink commands
|
||||||
import sys, os
|
import sys, os
|
||||||
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 proto
|
|
||||||
import utils
|
import utils
|
||||||
from conf import conf
|
from conf import conf
|
||||||
|
|
||||||
@utils.add_cmd
|
|
||||||
def tell(irc, source, args):
|
|
||||||
try:
|
|
||||||
target, text = args[0], ' '.join(args[1:])
|
|
||||||
except IndexError:
|
|
||||||
utils.msg(irc, source, 'Error: not enough arguments.')
|
|
||||||
return
|
|
||||||
targetuid = utils.nickToUid(irc, target)
|
|
||||||
if targetuid is None:
|
|
||||||
utils.msg(irc, source, 'Error: unknown user %r' % target)
|
|
||||||
return
|
|
||||||
if not text:
|
|
||||||
utils.msg(irc, source, "Error: can't send an empty message!")
|
|
||||||
return
|
|
||||||
utils.msg(irc, target, text, notice=True)
|
|
||||||
|
|
||||||
@utils.add_cmd
|
@utils.add_cmd
|
||||||
def debug(irc, source, args):
|
def debug(irc, source, args):
|
||||||
print('user index: %s' % irc.users)
|
print('user index: %s' % irc.users)
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
import socket
|
import socket
|
||||||
import time
|
import time
|
||||||
import sys
|
import sys
|
||||||
|
import os
|
||||||
|
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||||
from utils import *
|
from utils import *
|
||||||
from copy import copy
|
from copy import copy
|
||||||
import traceback
|
import traceback
|
3
utils.py
3
utils.py
@ -1,5 +1,4 @@
|
|||||||
import string
|
import string
|
||||||
import proto
|
|
||||||
|
|
||||||
global bot_commands
|
global bot_commands
|
||||||
# This should be a mapping of command names to functions
|
# This should be a mapping of command names to functions
|
||||||
@ -19,7 +18,7 @@ def next_uid(sid, level=-1):
|
|||||||
|
|
||||||
def msg(irc, target, text, notice=False):
|
def msg(irc, target, text, notice=False):
|
||||||
command = 'NOTICE' if notice else 'PRIVMSG'
|
command = 'NOTICE' if notice else 'PRIVMSG'
|
||||||
proto._sendFromUser(irc, irc.pseudoclient.uid, '%s %s :%s' % (command, target, text))
|
irc.proto._sendFromUser(irc, irc.pseudoclient.uid, '%s %s :%s' % (command, target, text))
|
||||||
|
|
||||||
def add_cmd(func, name=None):
|
def add_cmd(func, name=None):
|
||||||
if name is None:
|
if name is None:
|
||||||
|
Loading…
Reference in New Issue
Block a user