mirror of
https://github.com/jlu5/PyLink.git
synced 2024-11-23 19: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"
|
||||
# Autojoin channels
|
||||
channels: ["#pylink"]
|
||||
protocol: "inspircd"
|
||||
|
||||
# Plugins to load (omit the .py extension)
|
||||
plugins:
|
||||
|
27
main.py
27
main.py
@ -7,14 +7,9 @@ import time
|
||||
import sys
|
||||
|
||||
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():
|
||||
def __init__(self):
|
||||
def __init__(self, proto):
|
||||
# Initialize some variables
|
||||
self.socket = socket.socket()
|
||||
self.connected = False
|
||||
@ -32,6 +27,7 @@ class Irc():
|
||||
|
||||
self.socket = socket.socket()
|
||||
self.socket.connect((ip, port))
|
||||
self.proto = proto
|
||||
proto.connect(self)
|
||||
self.loaded = []
|
||||
self.load_plugins()
|
||||
@ -74,9 +70,24 @@ class Irc():
|
||||
if str(e).startswith('No module named'):
|
||||
print('Failed to load plugin %r: the plugin could not be found.' % plugin)
|
||||
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)
|
||||
|
||||
if __name__ == '__main__':
|
||||
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
|
||||
import sys, os
|
||||
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
import proto
|
||||
import utils
|
||||
|
||||
class NotAuthenticatedError(Exception):
|
||||
@ -28,7 +27,7 @@ def spawnclient(irc, source, args):
|
||||
except ValueError:
|
||||
utils.msg(irc, source, "Error: not enough arguments. Needs 3: nick, user, host.")
|
||||
return
|
||||
proto.spawnClient(irc, nick, ident, host)
|
||||
irc.proto.spawnClient(irc, nick, ident, host)
|
||||
|
||||
@utils.add_cmd
|
||||
def quitclient(irc, source, args):
|
||||
@ -43,7 +42,7 @@ def quitclient(irc, source, args):
|
||||
return
|
||||
u = utils.nickToUid(irc, nick)
|
||||
quitmsg = ' '.join(args[1:]) or 'Client quit'
|
||||
proto.quitClient(irc, u, quitmsg)
|
||||
irc.proto.quitClient(irc, u, quitmsg)
|
||||
|
||||
@utils.add_cmd
|
||||
def joinclient(irc, source, args):
|
||||
@ -61,7 +60,7 @@ def joinclient(irc, source, args):
|
||||
if not channel.startswith('#'):
|
||||
utils.msg(irc, source, "Error: channel names must start with #.")
|
||||
return
|
||||
proto.joinClient(irc, u, channel)
|
||||
irc.proto.joinClient(irc, u, channel)
|
||||
|
||||
@utils.add_cmd
|
||||
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.")
|
||||
return
|
||||
u = utils.nickToUid(irc, nick)
|
||||
proto.nickClient(irc, u, newnick)
|
||||
irc.proto.nickClient(irc, u, newnick)
|
||||
|
||||
@utils.add_cmd
|
||||
def partclient(irc, source, args):
|
||||
@ -90,7 +89,7 @@ def partclient(irc, source, args):
|
||||
if not channel.startswith('#'):
|
||||
utils.msg(irc, source, "Error: channel names must start with #.")
|
||||
return
|
||||
proto.partClient(irc, u, channel, reason)
|
||||
irc.proto.partClient(irc, u, channel, reason)
|
||||
|
||||
@utils.add_cmd
|
||||
def kickclient(irc, source, args):
|
||||
@ -108,4 +107,21 @@ def kickclient(irc, source, args):
|
||||
if not channel.startswith('#'):
|
||||
utils.msg(irc, source, "Error: channel names must start with #.")
|
||||
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
|
||||
import sys, os
|
||||
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
import proto
|
||||
import utils
|
||||
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
|
||||
def debug(irc, source, args):
|
||||
print('user index: %s' % irc.users)
|
||||
|
@ -1,6 +1,8 @@
|
||||
import socket
|
||||
import time
|
||||
import sys
|
||||
import os
|
||||
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
from utils import *
|
||||
from copy import copy
|
||||
import traceback
|
3
utils.py
3
utils.py
@ -1,5 +1,4 @@
|
||||
import string
|
||||
import proto
|
||||
|
||||
global bot_commands
|
||||
# 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):
|
||||
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):
|
||||
if name is None:
|
||||
|
Loading…
Reference in New Issue
Block a user