A simple python script that sends ugly notifications when something happens on a jschan imageboard that you moderate.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

30 lines
1.2 KiB

import logging
import re
from abc import ABC, abstractmethod
from urlextract import URLExtract
class Evaluator(ABC):
@abstractmethod
def eval(self, text, *args, **kwargs):
raise NotImplementedError
class PostEvaluator(Evaluator):
def __init__(self, blacklist=(), url_whitelist=()):
self.blacklist_re = re.compile('|'.join(blacklist), re.IGNORECASE) if blacklist else None
if url_whitelist:
self.url_blacklist_re = re.compile(f'(?!{"|".join(url_whitelist)})', re.IGNORECASE)
self._url_extractor = URLExtract(extract_localhost=False)
else:
self.url_blacklist_re = None
logging.debug(f'Compiled regex\nblacklist:{self.blacklist_re}\nurl blacklist:{self.url_blacklist_re}')
def eval(self, text, *args, **kwargs):
trigger_urls = [
*filter(self.url_blacklist_re.match, self._url_extractor.find_urls(text, only_unique=True))
] if self.url_blacklist_re and text else []
trigger_entries = re.findall(self.blacklist_re, text) if self.blacklist_re and text else []
logging.debug(f'Evaluated text:{text}\ntrigger urls:{trigger_urls}\ntrigger entries:{trigger_entries}')
return trigger_urls, trigger_entries