Implement query notifications and recognise ZNC's messages

This commit is contained in:
Mark Veidemanis 2018-05-07 19:58:19 +01:00
parent 2e2e35cad7
commit 66e7785f6f
8 changed files with 74 additions and 19 deletions

View File

@ -13,6 +13,9 @@ class Add:
if length > 1:
name = spl[1]
if name.isdigit():
failure("Network name is all numbers. This will break things.")
return
else:
incUsage("add")
return
@ -71,9 +74,7 @@ class Add:
failure("Protocol must be ssl or plain, not %s" % protocol)
return
try:
int(port)
except:
if not port.isdigit():
failure("Port must be an integer, not %s" % port)
return

View File

@ -10,7 +10,7 @@ class Delete:
if not spl[1] in main.pool.keys():
failure("Name does not exist: %s" % spl[1])
return
del pool[spl[1]]
del main.pool[spl[1]]
if spl[1] in main.ReactorPool.keys():
if spl[1] in main.FactoryPool.keys():
main.FactoryPool[spl[1]].stopTrying()

View File

@ -48,7 +48,7 @@ class Key:
return
else:
if not spl[2] in spl[3]:
failure("Keyword %s not in exception %s. This won't work" % (spl[2], spl[3]))
failure("Keyword %s not in exception %s. This won't work." % (spl[2], spl[3]))
return
main.keyconf["KeywordsExcept"][spl[2]] = []

25
commands/msg.py Normal file
View File

@ -0,0 +1,25 @@
import main
class Msg:
def __init__(self, register):
register("msg", self.msg)
def msg(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length):
if authed:
if length >= 4:
if not spl[1] in main.pool.keys():
failure("Name does not exist: %s" % spl[1])
return
if not spl[1] in main.IRCPool.keys():
failure("Name has no instance: %s" % spl[1])
return
if not spl[2] in main.IRCPool[spl[1]].channels:
info("Bot not on channel: %s" % spl[2])
main.IRCPool[spl[1]].msg(spl[2], " ".join(spl[3:]))
success("Sent %s to %s on %s" % (" ".join(spl[3:]), spl[2], spl[1]))
return
else:
incUsage("msg")
return
else:
incUsage(None)

View File

@ -8,14 +8,25 @@
},
"UsePassword": true,
"ConnectOnCreate": false,
"HighlightNotifications": true,
"ConnectionNotifications": true,
"Notifications": {
"Highlight": true,
"Connection": true,
"Query": true
},
"Compat": {
"ZNC": true
},
"Dist": {
"Enabled": true,
"SendOutput": false,
"File": "conf/dist.sh"
},
"Password": "s",
"Tweaks": {
"ZNC": {
"Prefix": "*"
}
},
"Default": {
"host": null,
"port": null,

View File

@ -6,7 +6,7 @@
"mod": "mod <name> [<key>] [<value>]",
"default": "default [<key>] [<value>]",
"get": "get <name> <variable>",
"key": "key <master|show|add|del|except|unexcept|showexcept|monitor> [<name>] [<target>] [<key>] [<on|off>]",
"key": "key <master|show|add|del|except|unexcept|showexcept|monitor> [<name>] [<target>] [<key...>] [<on|off>]",
"who": "who <nick>",
"join": "join <name> <channel> [<key>]",
"enable": "enable <name>",
@ -16,5 +16,6 @@
"save": "save <config|keyconf|pool|help|wholist|counters|masterbuf|all>",
"load": "load <config|keyconf|pool|help|wholist|counters|masterbuf|all>",
"dist": "dist",
"loadmod": "loadmod <module>"
}
"loadmod": "loadmod <module>",
"msg": "msg <name> <target> <message...>"
}

View File

@ -220,7 +220,7 @@ class IRCBot(IRCClient):
def signedOn(self):
self.connected = True
log("signed on: %s" % self.name)
if main.config["ConnectionNotifications"]:
if main.config["Notifications"]["Connection"]:
keyword.sendMaster("SIGNON: %s" % self.name)
if self.authtype == "ns":
self.msg(self.authentity, "IDENTIFY %s" % self.nspass)
@ -316,7 +316,7 @@ class IRCBotFactory(ReconnectingClientFactory):
error = reason.getErrorMessage()
log("%s: connection lost: %s" % (self.name, error))
sendAll("%s: connection lost: %s" % (self.name, error))
if main.config["ConnectionNotifications"]:
if main.config["Notifications"]["Connection"]:
keyword.sendMaster("CONNLOST %s: %s" % (self.name, error))
self.retry(connector)
#ReconnectingClientFactory.clientConnectionLost(self, connector, reason)
@ -328,7 +328,7 @@ class IRCBotFactory(ReconnectingClientFactory):
error = reason.getErrorMessage()
log("%s: connection failed: %s" % (self.name, error))
sendAll("%s: connection failed: %s" % (self.name, error))
if main.config["ConnectionNotifications"]:
if main.config["Notifications"]["Connection"]:
keyword.sendMaster("CONNFAIL %s: %s" % (self.name, error))
self.retry(connector)
#ReconnectingClientFactory.clientConnectionFailed(self, connector, reason)

View File

@ -75,13 +75,30 @@ def actKeyword(user, channel, message, nickname, actType, name):
if name == main.config["Master"][0] and channel == main.config["Master"][1]:
pass
else:
if main.config["HighlightNotifications"]:
msgLower = message.lower()
nickLower = nickname.lower()
if nickLower in msgLower:
msgLower = msgLower.replace(nickLower, "{"+nickLower+"}")
msgLower = message.lower()
nickLower = nickname.lower()
if nickLower in msgLower: # Someone has said the bot's nickname
msgLower = msgLower.replace(nickLower, "{"+nickLower+"}")
count.event(name, "nickhighlight")
if main.config["Notifications"]["Highlight"]:
sendMaster("NICK %s %s (T:%s): (%s/%s) %s" % (actType, name, msgLower.count(nickLower), user, channel, msgLower))
count.event(name, "nickhighlight")
if not channel == None:
chanLower = channel.lower()
if nickLower == chanLower: # I received a message directed only at me
ZNCAlreadySent = False
if main.config["Notifications"]["Query"]:
if user == main.config["Tweaks"]["ZNC"]["Prefix"] + "status!znc@znc.in":
if main.config["Compat"]["ZNC"]:
sendMaster("ZNC %s %s: (%s/%s) %s" % (actType, name, user, channel, msgLower))
ZNCAlreadySent = True
else:
sendMaster("QUERY %s %s: (%s) %s" % (actType, name, user, msgLower))
else:
sendMaster("QUERY %s %s: (%s) %s" % (actType, name, user, msgLower))
if not ZNCAlreadySent == True:
if main.config["Compat"]["ZNC"]:
if user == main.config["Tweaks"]["ZNC"]["Prefix"] + "status!znc@znc.in":
sendMaster("ZNC %s %s: (%s/%s) %s" % (actType, name, user, channel, msgLower))
if toSend:
sendMaster("MATCH %s %s (U:%s T:%s): (%s/%s) %s" % (actType, name, toSend[1], toSend[2], user, channel, toSend[0]))
count.event(name, "keymatch")