babili-bot/bot/responses.py

81 lines
3.0 KiB
Python

import re
from datetime import datetime
class Responses:
def __init__(self, bot):
self.bot = bot
self.triggers = {
"name": dict(),
"source": dict(),
"response": dict()
}
def add_trigger(self, trigger_type, pattern, callback):
if trigger_type in self.triggers:
self.triggers[trigger_type][pattern] = callback
def allowed(self, name, source):
memories = self.bot.memories
users = memories["users"]
if name not in users:
return False
last_response = 0
if "last_response" in self.bot.memories["users"][name]:
last_response = self.bot.memories["users"][name]["last_response"]
now = datetime.now().timestamp()
author = self.bot.author
wait = 1
if name != author and last_response > 0 and now - last_response < wait:
reason = "Auto-banished"
self.bot.memories["users"][name]["blacklist"] = {
"reason": reason,
"when": now
}
message = "is ignoring {} for reason '{}'".format(name, reason)
self.bot.send_action(source, message)
return False
return True
def parse(self, name, source, response):
users = self.bot.memories["users"]
if name not in users:
return False
check = response.lower().strip()
trig = {
"name": name,
"source": source,
"response": response.lower().strip()
}
for trigger in list(self.triggers.keys()):
for pattern, callback in self.triggers[trigger].items():
if pattern[0] != "/" and pattern[-1] != "/":
if pattern == check:
if self.allowed(name, source):
callback(self, name, source, response)
elif "blacklist" in users[name]:
reason = users[name]["blacklist"]["reason"]
message = "You were banished for reason '{}'"
message = message.format(reason)
#self.bot.send_message(name, message)
return False
else:
regex = re.compile(pattern[1:-1])
if regex.match(trig[trigger]) is not None:
if self.allowed(name, source):
callback(self, name, source, response)
elif "blacklist" in users[name]:
reason = users[name]["blacklist"]["reason"]
message = "You were banished for reason '{}'"
message = message.format(reason)
#self.bot.send_message(name, message)
return False
now = datetime.now().timestamp()
self.bot.memories["users"][name]["last_response"] = now