Add error checking in places, set up automatic relay provisioning and fix starting bots
This commit is contained in:
72
core/bot.py
72
core/bot.py
@@ -14,6 +14,7 @@ from modules import monitor
|
||||
|
||||
from core.relay import sendRelayNotification
|
||||
from utils.dedup import dedup
|
||||
from utils.getrelay import getRelay
|
||||
|
||||
import main
|
||||
from utils.logging.log import *
|
||||
@@ -21,33 +22,34 @@ from utils.logging.send import *
|
||||
|
||||
from twisted.internet.ssl import DefaultOpenSSLContextFactory
|
||||
|
||||
def deliverRelayCommands(relay, relayCommands, user=None, stage2=None):
|
||||
def deliverRelayCommands(num, relayCommands, user=None, stage2=None):
|
||||
# where relay is a dictionary extracted from the Network object
|
||||
keyFN = main.certPath+main.config["Key"]
|
||||
certFN = main.certPath+main.config["Certificate"]
|
||||
contextFactory = DefaultOpenSSLContextFactory(keyFN.encode("utf-8", "replace"),
|
||||
certFN.encode("utf-8", "replace"))
|
||||
bot = IRCBotFactory(None, relay, relayCommands, user, stage2)
|
||||
rct = reactor.connectSSL(relay["host"],
|
||||
int(relay["port"]),
|
||||
bot = IRCBotFactory(net=None, num=num, relayCommands=relayCommands, user=user, stage2=stage2)
|
||||
host, port = getRelay(num)
|
||||
rct = reactor.connectSSL(host,
|
||||
port,
|
||||
bot, contextFactory)
|
||||
|
||||
class IRCRelay(IRCClient):
|
||||
def __init__(self, relay, relayCommands, user, stage2):
|
||||
def __init__(self, num, relayCommands, user, stage2):
|
||||
self.connected = False
|
||||
self.buffer = ""
|
||||
if user == None:
|
||||
self.user = relay["user"]
|
||||
self.user = main.config["Relay"]["User"]
|
||||
else:
|
||||
self.user = user
|
||||
password = relay["password"]
|
||||
self.nickname = self.user
|
||||
self.realname = self.user
|
||||
password = main.config["Relay"]["Password"]
|
||||
self.nickname = "relay"
|
||||
self.realname = "relay"
|
||||
self.username = self.user
|
||||
self.password = self.user+":"+password
|
||||
|
||||
self.relayCommands = relayCommands
|
||||
self.relay = relay
|
||||
self.num = num
|
||||
self.stage2 = stage2
|
||||
|
||||
def parsen(self, user):
|
||||
@@ -67,15 +69,16 @@ class IRCRelay(IRCClient):
|
||||
if nick[0] == main.config["Tweaks"]["ZNC"]["Prefix"]:
|
||||
nick = nick[1:]
|
||||
if nick in self.relayCommands.keys():
|
||||
sendAll("[%s] %s -> %s" % (self.relay, nick, msg))
|
||||
sendAll("[%s] %s -> %s" % (self.num, nick, msg))
|
||||
|
||||
def irc_ERR_PASSWDMISMATCH(self, prefix, params):
|
||||
log("%s: relay password mismatch" % self.relay)
|
||||
sendAll("%s: relay password mismatch" % self.relay)
|
||||
print(', '.join("%s: %s" % item for item in vars(self).items()))
|
||||
log("%s: relay password mismatch" % self.num)
|
||||
sendAll("%s: relay password mismatch" % self.num)
|
||||
|
||||
def signedOn(self):
|
||||
self.connected = True
|
||||
log("signed on as a relay: %s" % self.relay)
|
||||
log("signed on as a relay: %s" % self.num)
|
||||
#sendRelayNotification("Relay", {"type": "conn", "status": "connected"}) nobody actually cares
|
||||
for i in self.relayCommands.keys():
|
||||
for x in self.relayCommands[i]:
|
||||
@@ -85,25 +88,24 @@ class IRCRelay(IRCClient):
|
||||
user = self.stage2[0].pop(0)
|
||||
commands = self.stage2[0].pop(0)
|
||||
del self.stage2[0]
|
||||
deliverRelayCommands(self.relay, commands, user, self.stage2)
|
||||
deliverRelayCommands(self.num, commands, user, self.stage2)
|
||||
deferLater(reactor, 1, self.transport.loseConnection)
|
||||
return
|
||||
|
||||
class IRCBot(IRCClient):
|
||||
def __init__(self, name, relay):
|
||||
def __init__(self, net, num):
|
||||
self.connected = False
|
||||
self.channels = []
|
||||
self.net = "".join([x for x in name if not x in digits])
|
||||
if self.net == "":
|
||||
error("Network with all numbers: %s" % name)
|
||||
self.net = net
|
||||
self.num = num
|
||||
self.buffer = ""
|
||||
self.name = name
|
||||
alias = relay["alias"]
|
||||
|
||||
self.name = net + str(num)
|
||||
alias = main.network[self.net].aliases[num]
|
||||
relay = main.network[self.net].relays[num]
|
||||
self.nickname = alias["nick"]
|
||||
self.realname = alias["realname"]
|
||||
self.username = alias["nick"]+"/"+relay["net"]
|
||||
self.password = relay["password"]
|
||||
self.password = main.config["Relay"]["Password"]
|
||||
self.userinfo = None
|
||||
self.fingerReply = None
|
||||
self.versionName = None
|
||||
@@ -445,26 +447,30 @@ class IRCBot(IRCClient):
|
||||
self.event(type="mode", muser=user, target=channel, modes=m, status=toset, modeargs=a)
|
||||
|
||||
class IRCBotFactory(ReconnectingClientFactory):
|
||||
def __init__(self, name, relay=None, relayCommands=None, user=None, stage2=None):
|
||||
if not name == None:
|
||||
self.name = name
|
||||
self.net = "".join([x for x in self.name if not x in digits])
|
||||
def __init__(self, net, num=None, relayCommands=None, user=None, stage2=None):
|
||||
if net == None:
|
||||
self.num = num
|
||||
self.name = "Relay to %i" % num
|
||||
self.relay = True
|
||||
else:
|
||||
self.name = "Relay to "+relay["net"]+relay["id"]
|
||||
self.name = net + str(num)
|
||||
self.num = num
|
||||
self.net = net
|
||||
self.relay = False
|
||||
self.client = None
|
||||
self.maxDelay = main.config["Tweaks"]["Delays"]["MaxDelay"]
|
||||
self.initialDelay = main.config["Tweaks"]["Delays"]["InitialDelay"]
|
||||
self.factor = main.config["Tweaks"]["Delays"]["Factor"]
|
||||
self.jitter = main.config["Tweaks"]["Delays"]["Jitter"]
|
||||
|
||||
self.relay, self.relayCommands, self.user, self.stage2 = relay, relayCommands, user, stage2
|
||||
self.relayCommands, self.user, self.stage2 = relayCommands, user, stage2
|
||||
|
||||
def buildProtocol(self, addr):
|
||||
if self.relay == None:
|
||||
entry = IRCBot(self.name, self.relay)
|
||||
main.IRCPool[self.name] = entry
|
||||
if self.net == None:
|
||||
entry = IRCRelay(self.num, self.relayCommands, self.user, self.stage2)
|
||||
else:
|
||||
entry = IRCRelay(self.relay, self.relayCommands, self.user, self.stage2)
|
||||
entry = IRCBot(self.net, self.num)
|
||||
main.IRCPool[self.name] = entry
|
||||
|
||||
self.client = entry
|
||||
return entry
|
||||
|
||||
Reference in New Issue
Block a user