83 lines
3.0 KiB
Python
83 lines
3.0 KiB
Python
from copy import deepcopy
|
|
from json import dumps
|
|
|
|
import main
|
|
from core.relay import sendRelayNotification
|
|
|
|
def testNetTarget(name, target):
|
|
called = False
|
|
for i in main.monitor.keys():
|
|
if "sources" in main.monitor[i].keys():
|
|
if name in main.monitor[i]["sources"]:
|
|
if main.monitor[i]["sources"][name] == True:
|
|
yield i
|
|
called = True
|
|
elif target in main.monitor[i]["sources"][name]:
|
|
yield i
|
|
called = True
|
|
else:
|
|
yield i
|
|
called = True
|
|
if not called:
|
|
return False
|
|
|
|
def contained_in(x, y):
|
|
if x is None or y is None:
|
|
return False
|
|
elif x == y:
|
|
return True
|
|
else:
|
|
return y in x
|
|
|
|
def is_in(k, vs, A):
|
|
return any(contained_in(A.get(k), vp) for vp in vs)
|
|
|
|
def matches(A, B):
|
|
return all(is_in(k, vs, A) for (k, vs) in B.items())
|
|
|
|
def magicFunction(A, B):
|
|
isInside = False
|
|
if "send" in B.keys():
|
|
del B["send"]
|
|
if "sources" in B.keys():
|
|
del B["sources"]
|
|
if "inside" in B.keys():
|
|
if B["inside"] == True:
|
|
isInside = True
|
|
del B["inside"]
|
|
if isInside:
|
|
return matches(A, B)
|
|
else:
|
|
return all(A[k] in B[k] for k in set(A) & set(B)) and set(B) <= set(A)
|
|
|
|
def event(name, cast, event=None):
|
|
if "target" in cast.keys():
|
|
target = cast["target"]
|
|
else:
|
|
target = None
|
|
if set(["nick", "ident", "host", "message"]).issubset(set(cast)):
|
|
if main.config["Compat"]["ZNC"] and "message" in cast.keys():
|
|
if cast["nick"][0] == main.config["Tweaks"]["ZNC"]["Prefix"] and cast["ident"] == "znc" and cast["host"] == "znc.in":
|
|
sendRelayNotification(name, {"type": "znc", "message": cast["message"]})
|
|
return
|
|
|
|
sendRelayNotification(name, cast)
|
|
monitorGroups = testNetTarget(name, target)
|
|
if monitorGroups == False:
|
|
return
|
|
for monitorGroup in monitorGroups:
|
|
matcher = magicFunction(deepcopy(cast), deepcopy(main.monitor[monitorGroup]))
|
|
if matcher == True:
|
|
cast["monitor"] = True
|
|
if "send" in main.monitor[monitorGroup].keys():
|
|
for i in main.monitor[monitorGroup]["send"].keys():
|
|
if isinstance(main.monitor[monitorGroup]["send"][i], bool):
|
|
sendRelayNotification(name, {"type": "err", "name": name, "target": target, "message": cast, "reason": "errdeliv"})
|
|
continue
|
|
if not i in main.pool.keys():
|
|
sendRelayNotification(name, {"type": "err", "name": name, "target": target, "message": cast, "reason": "noname"})
|
|
if not i in main.IRCPool.keys():
|
|
sendRelayNotification(name, {"type": "err", "name": name, "target": target, "message": cast, "reason": "noinstance"})
|
|
for x in main.monitor[monitorGroup]["send"][i]:
|
|
main.IRCPool[i].msg(x, "monitor [%s] (%s) %s" % (monitorGroup, name, cast))
|