Files
copyrighttxt 05211f73ef add web
2026-07-06 13:28:00 -04:00

107 lines
3.9 KiB
Python

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)