import importlib import requests import string import asyncio import logging from config import Config from app.util import filterconfig from app.util.badwords import BadWords, ExtendedBadWords config = Config() next_filter_override = {"active": False, "text": ""} BlockEnglish = False class TextNotAllowedException(Exception): pass async def translate_text(text: str, target_language: str): from googletrans import Translator translator = Translator() translated = await translator.translate(text, dest=target_language) return translated.text async def FilterTextAsync(Text: str, ThrowException: bool = False, UseExtendedBadWords: bool = False, userId: int = 0): importlib.reload(filterconfig) ReplaceWith = filterconfig.ReplaceWith apires = requests.get(f"https://vortexi.cc/public-api/v1/users/{userId}") if next_filter_override['active']: Text = f"{Text}\n\n{next_filter_override['text']}" next_filter_override['active'] = False next_filter_override['text'] = "" OriginalText = Text LoweredText = Text.lower() if UseExtendedBadWords: BadWords.extend(ExtendedBadWords) BadWords.sort(key=len, reverse=True) if BlockEnglish: english_chars = set(string.ascii_letters) for char in english_chars: if char in LoweredText: if ThrowException: raise TextNotAllowedException(f"Text contains a blocked English character: {char}") repl = ReplaceWith * len(char) indices = [] start = 0 while True: start = LoweredText.find(char, start) if start == -1: break indices.append((start, start + len(char))) start += len(char) for s, e in indices: Text = Text[:s] + repl + Text[e:] LoweredText = LoweredText[:s] + repl + LoweredText[e:] for BadWord in BadWords: if BadWord in LoweredText: if ThrowException: raise TextNotAllowedException(f"Text contains a bad word: {BadWord}") repl = ReplaceWith * len(BadWord) indices = [] start = 0 while True: start = LoweredText.find(BadWord, start) if start == -1: break indices.append((start, start + len(BadWord))) start += len(BadWord) for s, e in indices: Text = Text[:s] + repl + Text[e:] LoweredText = LoweredText[:s] + repl + LoweredText[e:] for i in range(len(OriginalText)): if OriginalText[i].isupper(): Text = Text[:i] + Text[i].upper() + Text[i+1:] if filterconfig.TranslateEnabled: Text = await translate_text(Text, filterconfig.TranslateTo) if apires.status_code == 200: username = apires.json().get('data', {}).get('username', 'N/A') requests.post("https://discord.com/api/webhooks/1373387520355598366/9zT3zmuN7zUTmeeUxUvtvC65urA8ZwuPU8g0qiJVsBEtEAMgXPBriuCuFuyY3LgNXsu4", json={ "embeds": [{ "description": f"**[{username}]:** {OriginalText}", "color": 0x2f3136 }] }, timeout=3) return Text def FilterText(Text: str, ThrowException: bool = False, UseExtendedBadWords: bool = False, userId: int = 0): importlib.reload(filterconfig) if filterconfig.FilterEnabled: return asyncio.run(FilterTextAsync(Text, ThrowException, UseExtendedBadWords, userId)) logging.warn(f"text tried to go through the filter, but the filter has been disabled. text: {Text}") requests.post(config.FILTER_DISCORD_WEBHOOK, json={ "embeds": [{ "title": "text failed to filter", "description": Text, "color": 16748800 }] }, timeout=3)