lots of nonworking code
This commit is contained in:
parent
ed2eefb9cd
commit
d330df5711
9 changed files with 75 additions and 34 deletions
|
@ -3,6 +3,7 @@ from core import bot
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
import time
|
||||||
import signal
|
import signal
|
||||||
|
|
||||||
# check python version
|
# check python version
|
||||||
|
@ -30,9 +31,15 @@ signal.signal(signal.SIGINT, exit_gracefully)
|
||||||
cloudbot = bot.Bot()
|
cloudbot = bot.Bot()
|
||||||
|
|
||||||
cloudbot.run()
|
cloudbot.run()
|
||||||
|
|
||||||
|
# wait for the bot loop to stop
|
||||||
|
|
||||||
if cloudbot.do_restart:
|
if cloudbot.do_restart:
|
||||||
# this kills the bot
|
# this kills the bot
|
||||||
# TODO: make it not just kill the bot
|
# TODO: make it not just kill the bot
|
||||||
|
time.sleep(2)
|
||||||
sys.exit()
|
sys.exit()
|
||||||
else:
|
else:
|
||||||
|
print "wtf"
|
||||||
|
time.sleep(2)
|
||||||
sys.exit()
|
sys.exit()
|
||||||
|
|
32
core/bot.py
32
core/bot.py
|
@ -8,7 +8,9 @@ import collections
|
||||||
from sqlalchemy.orm import scoped_session, sessionmaker
|
from sqlalchemy.orm import scoped_session, sessionmaker
|
||||||
from sqlalchemy import create_engine
|
from sqlalchemy import create_engine
|
||||||
|
|
||||||
from core import config, irc, main, loader
|
from core import config, irc, main
|
||||||
|
from core.permissions import PermissionManager
|
||||||
|
from core.loader import PluginLoader
|
||||||
|
|
||||||
|
|
||||||
def clean_name(n):
|
def clean_name(n):
|
||||||
|
@ -49,29 +51,36 @@ class Bot(object):
|
||||||
self.start_time = time.time()
|
self.start_time = time.time()
|
||||||
self.running = True
|
self.running = True
|
||||||
self.do_restart = False
|
self.do_restart = False
|
||||||
|
self.connections = []
|
||||||
|
|
||||||
# set up config and logging
|
# set up config and logging
|
||||||
self.setup()
|
self.setup()
|
||||||
self.logger.debug("Bot setup completed.")
|
self.logger.debug("Bot setup completed.")
|
||||||
|
|
||||||
# start IRC connections
|
# start IRC connections
|
||||||
self.connections = {}
|
|
||||||
self.connect()
|
self.connect()
|
||||||
|
print self.connections
|
||||||
|
|
||||||
|
for conn in self.connections:
|
||||||
|
conn.permissions = PermissionManager(self, conn)
|
||||||
|
print conn
|
||||||
|
|
||||||
# run plugin loader
|
# run plugin loader
|
||||||
self.plugins = collections.defaultdict(list)
|
self.plugins = collections.defaultdict(list)
|
||||||
self.threads = {}
|
self.threads = {}
|
||||||
self.loader = loader.PluginLoader(self)
|
|
||||||
|
self.loader = PluginLoader(self)
|
||||||
|
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""recieves input from the IRC engine and processes it"""
|
"""recieves input from the IRC engine and processes it"""
|
||||||
self.logger.info("Starting main thread.")
|
self.logger.info("Starting main thread.")
|
||||||
while self.running:
|
while self.running:
|
||||||
for conn in self.connections.itervalues():
|
for conn in self.connections:
|
||||||
try:
|
try:
|
||||||
incoming = conn.parsed_queue.get_nowait()
|
incoming = conn.parsed_queue.get_nowait()
|
||||||
if incoming == StopIteration:
|
if incoming == StopIteration:
|
||||||
|
print "StopIteration"
|
||||||
# IRC engine has signalled timeout, so reconnect (ugly)
|
# IRC engine has signalled timeout, so reconnect (ugly)
|
||||||
conn.connection.reconnect()
|
conn.connection.reconnect()
|
||||||
main.main(self, conn, incoming)
|
main.main(self, conn, incoming)
|
||||||
|
@ -79,7 +88,7 @@ class Bot(object):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# if no messages are in the incoming queue, sleep
|
# if no messages are in the incoming queue, sleep
|
||||||
while all(connection.parsed_queue.empty() for connection in self.connections.itervalues()):
|
while self.running and all(c.parsed_queue.empty() for c in self.connections):
|
||||||
time.sleep(.1)
|
time.sleep(.1)
|
||||||
|
|
||||||
|
|
||||||
|
@ -97,7 +106,7 @@ class Bot(object):
|
||||||
self.logger.debug("Created data folder.")
|
self.logger.debug("Created data folder.")
|
||||||
|
|
||||||
# config
|
# config
|
||||||
self.config = config.Config(self.logger)
|
self.config = config.Config(self)
|
||||||
self.logger.debug("Config object created.")
|
self.logger.debug("Config object created.")
|
||||||
|
|
||||||
# db
|
# db
|
||||||
|
@ -118,13 +127,13 @@ class Bot(object):
|
||||||
self.logger.debug("({}) Creating connection to {}.".format(name, server))
|
self.logger.debug("({}) Creating connection to {}.".format(name, server))
|
||||||
|
|
||||||
if conf['connection'].get('ssl'):
|
if conf['connection'].get('ssl'):
|
||||||
self.connections[name] = irc.SSLIRC(name, server, nick, conf = conf,
|
self.connections.append(irc.SSLIRC(name, server, nick, config = conf,
|
||||||
port = port, channels = conf['channels'],
|
port = port, channels = conf['channels'],
|
||||||
ignore_certificate_errors=conf['connection'].get('ignore_cert', True))
|
ignore_certificate_errors=conf['connection'].get('ignore_cert', True)))
|
||||||
self.logger.debug("({}) Created SSL connection.".format(name))
|
self.logger.debug("({}) Created SSL connection.".format(name))
|
||||||
else:
|
else:
|
||||||
self.connections[name] = irc.IRC(name, server, nick, conf = conf,
|
self.connections.append(irc.IRC(name, server, nick, config = conf,
|
||||||
port = port, channels = conf['channels'])
|
port = port, channels = conf['channels']))
|
||||||
self.logger.debug("({}) Created connection.".format(name))
|
self.logger.debug("({}) Created connection.".format(name))
|
||||||
|
|
||||||
|
|
||||||
|
@ -153,9 +162,6 @@ class Bot(object):
|
||||||
|
|
||||||
self.running = False
|
self.running = False
|
||||||
|
|
||||||
# wait for the bot loop to stop
|
|
||||||
time.sleep(1)
|
|
||||||
|
|
||||||
|
|
||||||
def restart(self, reason=None):
|
def restart(self, reason=None):
|
||||||
"""shuts the bot down and restarts it"""
|
"""shuts the bot down and restarts it"""
|
||||||
|
|
|
@ -8,10 +8,11 @@ from watchdog.tricks import Trick
|
||||||
|
|
||||||
|
|
||||||
class Config(dict):
|
class Config(dict):
|
||||||
def __init__(self, logger, *args, **kwargs):
|
def __init__(self, bot, *args, **kwargs):
|
||||||
self.filename = "config.json"
|
self.filename = "config.json"
|
||||||
self.path = os.path.abspath(self.filename)
|
self.path = os.path.abspath(self.filename)
|
||||||
self.logger = logger
|
self.bot = bot
|
||||||
|
self.logger = bot.logger
|
||||||
self.update(*args, **kwargs)
|
self.update(*args, **kwargs)
|
||||||
|
|
||||||
# populate self with config data
|
# populate self with config data
|
||||||
|
@ -35,6 +36,12 @@ class Config(dict):
|
||||||
self.update(json.load(f))
|
self.update(json.load(f))
|
||||||
self.logger.info("Config loaded from file.")
|
self.logger.info("Config loaded from file.")
|
||||||
|
|
||||||
|
# reload permissions
|
||||||
|
if self.bot.connections:
|
||||||
|
for conn in self.bot.connections:
|
||||||
|
conn.permissions.reload()
|
||||||
|
|
||||||
|
|
||||||
def save_config(self):
|
def save_config(self):
|
||||||
"""saves the contents of the config dict to the config file"""
|
"""saves the contents of the config dict to the config file"""
|
||||||
json.dump(self, open(self.path, 'w'), sort_keys=True, indent=2)
|
json.dump(self, open(self.path, 'w'), sort_keys=True, indent=2)
|
||||||
|
|
15
core/irc.py
15
core/irc.py
|
@ -4,6 +4,8 @@ import time
|
||||||
import threading
|
import threading
|
||||||
import Queue
|
import Queue
|
||||||
|
|
||||||
|
from core import permissions
|
||||||
|
|
||||||
from ssl import wrap_socket, CERT_NONE, CERT_REQUIRED, SSLError
|
from ssl import wrap_socket, CERT_NONE, CERT_REQUIRED, SSLError
|
||||||
|
|
||||||
irc_prefix_rem = re.compile(r'(.*?) (.*?) (.*)').match
|
irc_prefix_rem = re.compile(r'(.*?) (.*?) (.*)').match
|
||||||
|
@ -203,10 +205,10 @@ class SSLIRCConnection(IRCConnection):
|
||||||
class IRC(object):
|
class IRC(object):
|
||||||
"""handles the IRC protocol"""
|
"""handles the IRC protocol"""
|
||||||
|
|
||||||
def __init__(self, name, server, nick, port=6667, channels=[], conf={}):
|
def __init__(self, name, server, nick, port=6667, channels=[], config={}):
|
||||||
self.name = name
|
self.name = name
|
||||||
self.channels = channels
|
self.channels = channels
|
||||||
self.conf = conf
|
self.config = config
|
||||||
self.server = server
|
self.server = server
|
||||||
self.port = port
|
self.port = port
|
||||||
self.nick = nick
|
self.nick = nick
|
||||||
|
@ -224,10 +226,10 @@ class IRC(object):
|
||||||
self.connection = self.create_connection()
|
self.connection = self.create_connection()
|
||||||
self.connection.connect()
|
self.connection.connect()
|
||||||
|
|
||||||
self.set_pass(self.conf.get('server_password'))
|
self.set_pass(self.config.get('server_password'))
|
||||||
self.set_nick(self.nick)
|
self.set_nick(self.nick)
|
||||||
self.cmd("USER",
|
self.cmd("USER",
|
||||||
[self.conf.get('user', 'cloudbot'), "3", "*", self.conf.get('realname',
|
[self.config.get('user', 'cloudbot'), "3", "*", self.config.get('realname',
|
||||||
'CloudBot - http://git.io/cloudbot')])
|
'CloudBot - http://git.io/cloudbot')])
|
||||||
|
|
||||||
self.parse_thread = ParseThread(self.input_queue, self.output_queue,
|
self.parse_thread = ParseThread(self.input_queue, self.output_queue,
|
||||||
|
@ -235,6 +237,7 @@ class IRC(object):
|
||||||
self.parse_thread.daemon = True
|
self.parse_thread.daemon = True
|
||||||
self.parse_thread.start()
|
self.parse_thread.start()
|
||||||
|
|
||||||
|
|
||||||
def create_connection(self):
|
def create_connection(self):
|
||||||
return IRCConnection(self.name, self.server, self.port,
|
return IRCConnection(self.name, self.server, self.port,
|
||||||
self.input_queue, self.output_queue)
|
self.input_queue, self.output_queue)
|
||||||
|
@ -282,10 +285,10 @@ class IRC(object):
|
||||||
|
|
||||||
|
|
||||||
class SSLIRC(IRC):
|
class SSLIRC(IRC):
|
||||||
def __init__(self, name, server, nick, port=6667, channels=[], conf={},
|
def __init__(self, name, server, nick, port=6667, channels=[], config={},
|
||||||
ignore_certificate_errors=True):
|
ignore_certificate_errors=True):
|
||||||
self.ignore_cert_errors = ignore_certificate_errors
|
self.ignore_cert_errors = ignore_certificate_errors
|
||||||
IRC.__init__(self, name, server, nick, port, channels, conf)
|
IRC.__init__(self, name, server, nick, port, channels, config)
|
||||||
|
|
||||||
def create_connection(self):
|
def create_connection(self):
|
||||||
return SSLIRCConnection(self.name, self.server, self.port, self.input_queue,
|
return SSLIRCConnection(self.name, self.server, self.port, self.input_queue,
|
||||||
|
|
|
@ -64,7 +64,7 @@ class PluginLoader(object):
|
||||||
namespace = {}
|
namespace = {}
|
||||||
eval(code, namespace)
|
eval(code, namespace)
|
||||||
except Exception:
|
except Exception:
|
||||||
self.bot.logger.error("Error compiling {}.".format(filename))
|
self.bot.logger.error("Error compiling {}:".format(filename))
|
||||||
self.bot.logger.error(traceback.format_exc())
|
self.bot.logger.error(traceback.format_exc())
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
|
@ -132,7 +132,7 @@ def dispatch(bot, input, kind, func, args, autohelp=False):
|
||||||
return
|
return
|
||||||
|
|
||||||
if not (not autohelp or not args.get('autohelp', True) or input.inp or not (func.__doc__ is not None)):
|
if not (not autohelp or not args.get('autohelp', True) or input.inp or not (func.__doc__ is not None)):
|
||||||
input.notice(input.conn.conf["command_prefix"] + func.__doc__)
|
input.notice(input.conn.config["command_prefix"] + func.__doc__)
|
||||||
return
|
return
|
||||||
|
|
||||||
if func._thread:
|
if func._thread:
|
||||||
|
@ -156,7 +156,7 @@ def match_command(bot, command):
|
||||||
|
|
||||||
def main(bot, conn, out):
|
def main(bot, conn, out):
|
||||||
inp = Input(bot, conn, *out)
|
inp = Input(bot, conn, *out)
|
||||||
command_prefix = conn.conf.get('command_prefix', '.')
|
command_prefix = conn.config.get('command_prefix', '.')
|
||||||
|
|
||||||
# EVENTS
|
# EVENTS
|
||||||
for func, args in bot.events[inp.command] + bot.events['*']:
|
for func, args in bot.events[inp.command] + bot.events['*']:
|
||||||
|
|
18
core/permissions.py
Normal file
18
core/permissions.py
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
class PermissionManager(object):
|
||||||
|
def __init__(self, bot, conn):
|
||||||
|
self.logger = bot.logger
|
||||||
|
|
||||||
|
self.logger.info("Creating permission manager for {}.".format(conn.name))
|
||||||
|
|
||||||
|
# stuff
|
||||||
|
self.bot = bot
|
||||||
|
self.conn = conn
|
||||||
|
self.config = conn.config
|
||||||
|
|
||||||
|
self.group_perms = {}
|
||||||
|
|
||||||
|
self.reload()
|
||||||
|
|
||||||
|
def reload(self):
|
||||||
|
self.logger.error("reload perms stub")
|
||||||
|
pass
|
|
@ -12,7 +12,7 @@ nick_re = re.compile(":(.+?)!")
|
||||||
# Auto-join on Invite (Configurable, defaults to True)
|
# Auto-join on Invite (Configurable, defaults to True)
|
||||||
@hook.event('INVITE')
|
@hook.event('INVITE')
|
||||||
def invite(paraml, conn=None):
|
def invite(paraml, conn=None):
|
||||||
invite_join = conn.conf.get('invite_join', True)
|
invite_join = conn.config.get('invite_join', True)
|
||||||
if invite_join:
|
if invite_join:
|
||||||
conn.join(paraml[-1])
|
conn.join(paraml[-1])
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ def invite(paraml, conn=None):
|
||||||
@hook.event('004')
|
@hook.event('004')
|
||||||
def onjoin(paraml, conn=None, bot=None):
|
def onjoin(paraml, conn=None, bot=None):
|
||||||
bot.logger.info("ONJOIN hook triggered.")
|
bot.logger.info("ONJOIN hook triggered.")
|
||||||
nickserv = conn.conf.get('nickserv')
|
nickserv = conn.config.get('nickserv')
|
||||||
if nickserv:
|
if nickserv:
|
||||||
nickserv_password = nickserv.get('nickserv_password', '')
|
nickserv_password = nickserv.get('nickserv_password', '')
|
||||||
nickserv_name = nickserv.get('nickserv_name', 'nickserv')
|
nickserv_name = nickserv.get('nickserv_name', 'nickserv')
|
||||||
|
@ -38,7 +38,7 @@ def onjoin(paraml, conn=None, bot=None):
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
|
||||||
# Set bot modes
|
# Set bot modes
|
||||||
mode = conn.conf.get('mode')
|
mode = conn.config.get('mode')
|
||||||
if mode:
|
if mode:
|
||||||
bot.logger.info('Setting bot mode: "{}"'.format(mode))
|
bot.logger.info('Setting bot mode: "{}"'.format(mode))
|
||||||
conn.cmd('MODE', [conn.nick, mode])
|
conn.cmd('MODE', [conn.nick, mode])
|
||||||
|
@ -57,7 +57,7 @@ def onkick(paraml, conn=None, chan=None):
|
||||||
# if the bot has been kicked, remove from the channel list
|
# if the bot has been kicked, remove from the channel list
|
||||||
if paraml[1] == conn.nick:
|
if paraml[1] == conn.nick:
|
||||||
conn.channels.remove(chan)
|
conn.channels.remove(chan)
|
||||||
auto_rejoin = conn.conf.get('auto_rejoin', False)
|
auto_rejoin = conn.config.get('auto_rejoin', False)
|
||||||
if auto_rejoin:
|
if auto_rejoin:
|
||||||
conn.join(paraml[0])
|
conn.join(paraml[0])
|
||||||
|
|
||||||
|
@ -74,7 +74,7 @@ def onnick(paraml, bot=None, conn=None, raw=None):
|
||||||
@hook.singlethread
|
@hook.singlethread
|
||||||
@hook.event('004')
|
@hook.event('004')
|
||||||
def keep_alive(paraml, conn=None):
|
def keep_alive(paraml, conn=None):
|
||||||
keepalive = conn.conf.get('keep_alive', False)
|
keepalive = conn.config.get('keep_alive', False)
|
||||||
if keepalive:
|
if keepalive:
|
||||||
while True:
|
while True:
|
||||||
conn.cmd('PING', [conn.nick])
|
conn.cmd('PING', [conn.nick])
|
||||||
|
|
|
@ -12,16 +12,16 @@ def sieve_suite(bot, input, func, kind, args):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
if kind == "command":
|
if kind == "command":
|
||||||
disabled_commands = conn.conf.get('disabled_plugins', [])
|
disabled_commands = conn.config.get('disabled_plugins', [])
|
||||||
if input.trigger in disabled_commands:
|
if input.trigger in disabled_commands:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
fn = re.match(r'^plugins.(.+).py$', func._filename)
|
fn = re.match(r'^plugins.(.+).py$', func._filename)
|
||||||
disabled = conn.conf.get('disabled_plugins', [])
|
disabled = conn.config.get('disabled_plugins', [])
|
||||||
if fn and fn.group(1).lower() in disabled:
|
if fn and fn.group(1).lower() in disabled:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
acl = conn.conf.get('acls', {}).get(func.__name__)
|
acl = conn.config.get('acls', {}).get(func.__name__)
|
||||||
if acl:
|
if acl:
|
||||||
if 'deny-except' in acl:
|
if 'deny-except' in acl:
|
||||||
allowed_channels = map(unicode.lower, acl['deny-except'])
|
allowed_channels = map(unicode.lower, acl['deny-except'])
|
||||||
|
@ -37,7 +37,7 @@ def sieve_suite(bot, input, func, kind, args):
|
||||||
args["permissions"] = ["adminonly"]
|
args["permissions"] = ["adminonly"]
|
||||||
|
|
||||||
if args.get('permissions', False):
|
if args.get('permissions', False):
|
||||||
groups = conn.conf.get("permissions", [])
|
groups = conn.config.get("permissions", [])
|
||||||
|
|
||||||
allowed_permissions = args.get('permissions', [])
|
allowed_permissions = args.get('permissions', [])
|
||||||
allowed_groups = []
|
allowed_groups = []
|
||||||
|
@ -58,7 +58,7 @@ def sieve_suite(bot, input, func, kind, args):
|
||||||
mask = input.mask.lower()
|
mask = input.mask.lower()
|
||||||
|
|
||||||
for group in allowed_groups:
|
for group in allowed_groups:
|
||||||
group_users = conn.conf.get("permissions", {}).get(group, [])["users"]
|
group_users = conn.conig.get("permissions", {}).get(group, [])["users"]
|
||||||
group_users = [_mask.lower() for _mask in group_users]
|
group_users = [_mask.lower() for _mask in group_users]
|
||||||
for pattern in group_users:
|
for pattern in group_users:
|
||||||
if fnmatch(mask, pattern):
|
if fnmatch(mask, pattern):
|
||||||
|
|
Reference in a new issue