возможность работать в группах

This commit is contained in:
vrubelroman 2025-12-10 20:35:38 +03:00
parent 5d597d199f
commit 5acd8fd9db
2 changed files with 31 additions and 9 deletions

34
bot.py
View file

@ -161,6 +161,14 @@ def detect_video_source(url: str) -> str:
return 'unknown'
def extract_urls_from_text(text: str) -> list[str]:
"""Извлекает все URL из текста сообщения"""
# Регулярное выражение для поиска URL (http/https)
url_pattern = r'https?://[^\s<>"{}|\\^`\[\]]+'
urls = re.findall(url_pattern, text)
return urls
def _safe_filename(title: str, chat_id: int) -> str:
"""Создает безопасное имя файла"""
safe_title = re.sub(r'[<>:"/\\|?*]', '', title)[:100]
@ -642,16 +650,20 @@ async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
if not update.message or not update.message.text:
return
url = update.message.text.strip()
text = update.message.text.strip()
chat_id = update.message.chat_id
chat_type = update.message.chat.type # 'private', 'group', 'supergroup'
username = update.message.from_user.username if update.message.from_user else None
first_name = update.message.from_user.first_name if update.message.from_user else None
# Добавляем пользователя в статистику при первом взаимодействии
add_user(chat_id, username, first_name)
# Проверяем, является ли сообщение URL
if not (url.startswith('http://') or url.startswith('https://')):
# Извлекаем все URL из текста
urls = extract_urls_from_text(text)
# Если это личный чат и нет ссылок, отправляем инструкцию
if not urls and chat_type == 'private':
await update.message.reply_text(
"Пожалуйста, отправьте ссылку на видео.\n"
"Поддерживаемые источники:\n"
@ -662,10 +674,19 @@ async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
)
return
# Если нет ссылок в группе, просто игнорируем сообщение
if not urls:
return
# Обрабатываем первую найденную ссылку
url = urls[0]
# Проверяем источник до начала обработки
source = detect_video_source(url)
if source == 'unknown':
await update.message.reply_text("Пардон, не умеем работать с этим источником 😅")
# В группах не отвечаем на неподдерживаемые источники, чтобы не спамить
if chat_type == 'private':
await update.message.reply_text("Пардон, не умеем работать с этим источником 😅")
return
# Отправляем сообщение о начале обработки
@ -698,13 +719,14 @@ async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
except Exception as e:
logger.warning(f"Не удалось удалить файл {video_path}: {e}")
# Удаляем сообщение со ссылкой и статусное сообщение
# Удаляем статусное сообщение и исходное сообщение со ссылкой
try:
await status_message.delete()
await update.message.delete()
logger.info(f"Удалено сообщение пользователя с ссылкой (chat_id: {chat_id})")
logger.info(f"Удалено сообщение пользователя с ссылкой (chat_id: {chat_id}, тип чата: {chat_type})")
except Exception as e:
logger.warning(f"Не удалось удалить сообщение: {e}")
# Если не удалось удалить (нет прав), просто логируем
except Exception as e:
logger.error(f"Ошибка: {e}")