Implement alternative keyword notifications and move the per-instance wholist into the global namespace

This commit is contained in:
Mark Veidemanis 2017-12-24 21:04:48 +00:00
parent 96dd71bbdd
commit fc8a115e17
3 changed files with 65 additions and 8 deletions

View File

@ -7,6 +7,7 @@
"UsePassword": true, "UsePassword": true,
"ConnectOnCreate": false, "ConnectOnCreate": false,
"HighlightNotifications": true, "HighlightNotifications": true,
"Debugger": false,
"DistEnabled": true, "DistEnabled": true,
"SendDistOutput": false, "SendDistOutput": false,
"Password": "s", "Password": "s",

View File

@ -5,7 +5,7 @@
"del": "del <name>", "del": "del <name>",
"mod": "mod <name> [<key>] [<value>]", "mod": "mod <name> [<key>] [<value>]",
"get": "get <name> <variable>", "get": "get <name> <variable>",
"key": "key <master|show|add|del|except|unexcept|showexcept> [<name>] [<target>] [<key>]", "key": "key <master|show|add|del|except|unexcept|showexcept|monitor> [<name>] [<target>] [<key>] [<on|off>]",
"join": "join <name> <channel> [<key>]", "join": "join <name> <channel> [<key>]",
"enable": "enable <name", "enable": "enable <name",
"disable": "disable <name>", "disable": "disable <name>",

View File

@ -6,14 +6,24 @@ from twisted.internet.protocol import Protocol, Factory
from twisted.internet.endpoints import SSL4ClientEndpoint, TCP4ClientEndpoint, connectProtocol from twisted.internet.endpoints import SSL4ClientEndpoint, TCP4ClientEndpoint, connectProtocol
from twisted.words.protocols.irc import IRCClient from twisted.words.protocols.irc import IRCClient
#from twisted.python import log
#from sys import stdout
#log.startLogging(stdout)
from json import load, dump, loads from json import load, dump, loads
from sys import exit from sys import exit
from subprocess import run, PIPE from subprocess import run, PIPE
numbers = "0123456789"
listener = None listener = None
connections = {} connections = {}
IRCPool = {} IRCPool = {}
MonitorPool = []
wholist = {}
def log(data): def log(data):
print("[LOG]", data) print("[LOG]", data)
@ -60,7 +70,6 @@ class IRCBot(IRCClient):
self._who = {} self._who = {}
self._getWho = {} self._getWho = {}
self.wholist = {}
self.authtype = instance["authtype"] self.authtype = instance["authtype"]
if self.authtype == "ns": if self.authtype == "ns":
@ -180,7 +189,8 @@ class IRCBot(IRCClient):
del self._who[channel] del self._who[channel]
def got_who(self, whoinfo): def got_who(self, whoinfo):
self.wholist[whoinfo[0]] = whoinfo[1] global wholist
helper.setWho(self.name, whoinfo[1])
def signedOn(self): def signedOn(self):
self.connected = True self.connected = True
@ -235,11 +245,8 @@ class Base(Protocol):
if "\n" in data: if "\n" in data:
splitData = [x for x in data.split("\n") if x] splitData = [x for x in data.split("\n") if x]
if "\n" in data: if "\n" in data:
#timePlus = 0.0
for i in splitData: for i in splitData:
helper.parseCommand(self.addr, self.authed, i) helper.parseCommand(self.addr, self.authed, i)
#reactor.callLater(timePlus, lambda: helper.parseCommand(self.addr, self.authed, i))
#timePlus += 0.01
return return
helper.parseCommand(self.addr, self.authed, data) helper.parseCommand(self.addr, self.authed, data)
@ -248,7 +255,7 @@ class Base(Protocol):
self.send("Hello.") self.send("Hello.")
def connectionLost(self, reason): def connectionLost(self, reason):
global connections global connections, MonitorPool
self.authed = False self.authed = False
log("Connection lost from %s:%s -- %s" % (self.addr.host, self.addr.port, reason.getErrorMessage())) log("Connection lost from %s:%s -- %s" % (self.addr.host, self.addr.port, reason.getErrorMessage()))
if not listener == None: if not listener == None:
@ -258,6 +265,8 @@ class Base(Protocol):
warn("Tried to remove a non-existant connection.") warn("Tried to remove a non-existant connection.")
else: else:
warn("Tried to remove a connection from a listener that wasn't running.") warn("Tried to remove a connection from a listener that wasn't running.")
if self.addr in MonitorPool:
MonitorPool.remove(self.addr)
class BaseFactory(Factory): class BaseFactory(Factory):
def buildProtocol(self, addr): def buildProtocol(self, addr):
@ -289,6 +298,23 @@ class Helper(object):
else: else:
error("Mandatory values missing from config") error("Mandatory values missing from config")
def setWho(self, network, newObjects):
global wholist
network = "".join([x for x in network if not x in numbers])
if not network in wholist.keys():
wholist[network] = {}
for i in newObjects.keys():
wholist[network][i] = newObjects[i]
return
def setWhoSingle(self, network, nick, ident, host):
global wholist
network = "".join([x for x in network if not x in numbers])
if network in wholist.keys():
if nick in wholist[network].keys():
wholist[network][nick][1] = ident
wholist[network][nick][2] = host
def saveConfig(self): def saveConfig(self):
global config global config
@ -344,6 +370,8 @@ class Helper(object):
def sendMaster(self, data): def sendMaster(self, data):
if config["Master"][0] in IRCPool.keys(): if config["Master"][0] in IRCPool.keys():
IRCPool[config["Master"][0]].msg(config["Master"][1], data) IRCPool[config["Master"][0]].msg(config["Master"][1], data)
for i in MonitorPool:
connections[i].send(data)
def isKeyword(self, msg): def isKeyword(self, msg):
message = msg.lower() message = msg.lower()
@ -428,7 +456,7 @@ class Helper(object):
return True return True
def parseCommand(self, addr, authed, data): def parseCommand(self, addr, authed, data):
global pool global pool, MonitorPool
spl = data.split() spl = data.split()
if addr in connections.keys(): if addr in connections.keys():
obj = connections[addr] obj = connections[addr]
@ -672,8 +700,29 @@ class Helper(object):
helper.saveKeywordConfig() helper.saveKeywordConfig()
success("Successfully removed exception list of %s" % spl[2]) success("Successfully removed exception list of %s" % spl[2])
return return
elif spl[1] == "monitor":
if spl[2] == "on":
if not obj.addr in MonitorPool:
MonitorPool.append(obj.addr)
success("Keyword monitoring enabled")
return
else:
failure("Keyword monitoring is already enabled")
return
elif spl[2] == "off":
if obj.addr in MonitorPool:
MonitorPool.remove(obj.addr)
success("Keyword monitoring disabled")
return
else:
failure("Keyword monitoring is already disabled")
return
else: else:
incUsage("key") incUsage("key")
return
else:
incUsage("key")
return
elif length == 2: elif length == 2:
if spl[1] == "show": if spl[1] == "show":
info(",".join(keyconf["Keywords"])) info(",".join(keyconf["Keywords"]))
@ -690,6 +739,13 @@ class Helper(object):
elif spl[1] == "master": elif spl[1] == "master":
info(" - ".join(config["Master"])) info(" - ".join(config["Master"]))
return return
elif spl[1] == "monitor":
if obj.addr in MonitorPool:
info("Keyword monitoring is enabled on this connection")
return
else:
info("Keyword monitoring is disabled on this connection")
return
else: else:
incUsage("key") incUsage("key")
return return