""" Send User's info. """ from urllib import parse from urllib.error import URLError from urllib.request import urlopen from emoji import is_emoji from telebot import types from .constants import ( NON_GRATA, ADMIN_ID, ONLY_RUS_LETTERS, ONLY_ENG_LETTERS, RULES_TEXT, SYMBOLS ) from .models import session, BadWord WARNS: dict[int, int] = {} def has_warnings(user_id: int) -> bool: return user_id in WARNS def warn_user(user_id: int): if user_id not in WARNS: WARNS[user_id] = 0 WARNS[user_id] += 1 def warnings_count(user_id: int) -> int: return WARNS.get(user_id, 0) def is_url_reachable(url: str) -> bool: try: return urlopen(url).status == 200 except URLError: return False def is_too_much_emojis(text: str) -> bool: """ Проверяет, что первые 15 символов текста содержат много (5) эмодзи, или текст длиннее 8 символов и половина - это эмодзи """ if len(text) < 8: return False limit = 5 if len(text) > 15 else len(text) // 2 return len([1 for e in text[:15] if is_emoji(e)]) >= limit def is_spam(message_text: str) -> bool: """ Проверяет текст на спам - сначала проверка смешанного алфавита, потом на константный набор спам-слов """ if is_mixed(message_text) or is_too_much_emojis(message_text): return True return any(bad_word.word.casefold() in message_text.casefold() for bad_word in session.query(BadWord).all()) def is_mixed(text: str) -> bool: """ Разбивает текст на слова и проверяет на смешанный алфавит, спамеры используют его. Слово допускается только полностью на русском или русский + знаки пунктуации """ for word in cleaned_text(text).split(): word = word.strip() if not word: continue if any(e in ONLY_RUS_LETTERS for e in word) and any(e in ONLY_ENG_LETTERS for e in word): return True return False def cleaned_text(text: str) -> str: return ''.join(letter.lower() if letter not in SYMBOLS else ' ' for letter in text) def remove_spaces(text: str) -> str: return ' '.join(word.strip() for word in text.split() if word.strip()) def is_in_not_allowed(word_list: list, msg: str) -> bool: for word in word_list: if word in msg.casefold(): return False return True def is_ban_words_in_caption(caption: str) -> bool: return is_spam(caption) def is_nongrata(type_message: types.Message) -> bool: for phrase in NON_GRATA: if phrase in type_message.text.casefold(): return True return False def is_admin(message: types.Message) -> bool: return message.from_user.id == ADMIN_ID def has_no_letters(text: str) -> bool: text = text.lower() letters = f'{ONLY_RUS_LETTERS}{ONLY_ENG_LETTERS}' return not any(letter in text for letter in letters) def my_ip(): ip_service = "https://icanhazip.com" ip = urlopen(ip_service) return ip.read().decode("utf-8") def me(message: types.Message): msg = f"Telegram ID: {message.from_user.id}\n\ ├ Is bot: {message.from_user.is_bot}\n\ ├ First name: {message.from_user.first_name}\n" if message.from_user.last_name: msg += f" ├ Last name: {message.from_user.last_name}\n" if message.from_user.username: msg += f" ├ Username: {message.from_user.username}\n" msg += f" ├ Language code: {message.from_user.language_code}\n" if message.from_user.is_premium is True: msg += f" ├ Is Premium: ⭐️\n" else: msg += f" ├ Is Premium: No\n" msg += f" ├ Chat ID: {message.chat.id}" return msg def short_user_data(from_user: types.User) -> dict: info = {'first_name': from_user.first_name, 'last_name': from_user.last_name, 'username': from_user.username, 'full_name': from_user.full_name, 'id': from_user.id, 'code': from_user.language_code, 'is_bot': from_user.is_bot, 'is_premium': from_user.is_premium} return info def represent_as_get(message: types.Message): return parse.quote_plus(detect_args(message)) def detect_args(message: types.Message): if message.reply_to_message and message.reply_to_message.text: if len(message.text.split()) == 1: # Есть цитата, нет аргументов: ищем текст из цитаты. return (message.quote and message.quote.text) or message.reply_to_message.text elif len(message.text.split()) > 1: # Есть цитата, есть аргументы: ищем текст из аргументов. return " ".join(message.text.split()[1:]) elif len(message.text.split()) > 1: # Нет цитаты, есть аргументы: ищем текст из аргументов. return " ".join(message.text.split()[1:]) def fetch_rule(index: int) -> str: length = len(RULES_TEXT) if index in range(1, length + 1): return RULES_TEXT[index - 1] else: return "Пока не придумали" def has_links(body: str) -> bool: return "https://" in body or "http://" in body or "t.me/" in body