Загрузка...

Script Script for the convening of chat participants in Telegram

Thread in Python created by vendues Jun 10, 2025. 211 views

  1. vendues
    vendues Topic starter Jun 10, 2025 1 Mar 22, 2020




    Этот Python-скрипт реализует команду /zov для Telegram-бота, которая позволяет модераторам и администраторам созывать всех или только неактивных участников чата. Скрипт использует библиотеку python-telegram-bot для взаимодействия с Telegram API и SQLite для хранения данных о пользователях. Скрипт требует доработки, но структура рабочая
    1. Созыв участников: Возможность вызывать всех участников чата или только неактивных (кто не писал в чат более 24 часов)
    2. Гибкое управление: Указание причины созыва и фильтрация по статусу регистрации
    3. Красивые упоминания: Участники упоминаются с использованием случайных тематических смайликов
    4. Безопасность: Проверка прав доступа перед выполнением команды
    5. Статистика: Отображение количества упомянутых участников в итоговом сообщении
    Скрипт подходит для управления крупными чатами, где требуется привлекать внимание участников к важным обсуждениям или объявлениям.


    Python
    from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
    from telegram.ext import ContextTypes
    import sqlite3
    import asyncio
    import random
    from datetime import datetime

    # Инициализация базы данных
    def init_db():
    conn = sqlite3.connect('chat_members.db')
    cursor = conn.cursor()
    cursor.execute('''
    CREATE TABLE IF NOT EXISTS chat_members (
    chat_id TEXT,
    user_id TEXT,
    username TEXT,
    role TEXT,
    PRIMARY KEY (chat_id, user_id)
    )
    ''')
    conn.commit()
    return conn

    async def zov_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """Созыв всех участников чата с возможностью указать причину"""
    # Инициализация базы данных
    conn = init_db()
    cursor = conn.cursor()

    user_id = str(update.message.from_user.id)
    if not has_moderation_access(user_id):
    await update.message.reply_text("Эта команда доступна только модераторам и администраторам.")
    return

    chat_id = update.message.chat_id
    args = context.args or []
    target = "всех"
    reason = " ".join(args[1:]) if len(args) > 1 else ""

    # Проверяем, указан ли тип созыва (всех или неактивных)
    if args and args[0].lower() in ["неактивных", "неактивные"]:
    target = "неактивных"
    reason = " ".join(args[1:]) if len(args) > 1 else ""
    else:
    reason = " ".join(args) if args else ""

    try:
    # Отправляем начальное сообщение с причиной, если она есть
    caller_name = get_user_display_name(update.message.from_user)
    role = "Администратор" if is_admin(user_id) else "Модератор"

    header_text = (
    f" <b>Созыв {target} участников!</b>\n\n"
    f" {role} {caller_name} созывает чат!"
    )

    if reason:
    header_text += f"\n\n Причина: {reason}"

    header_text += "\n\nПодождите, упоминания загружаются..."

    header_message = await context.bot.send_message(
    chat_id=chat_id,
    text=header_text,
    parse_mode='HTML'
    )

    # Получаем список участников чата из базы данных
    cursor.execute("SELECT user_id, username FROM chat_members WHERE chat_id = ?", (str(chat_id),))
    db_members = cursor.fetchall()
    members = [(uid, username) for uid, username in db_members if uid != str(context.bot.id)]

    # Если нужны только неактивные - фильтруем
    if target == "неактивных":
    twenty_four_hours_ago = datetime.now().timestamp() - 86400
    active_users = set()

    if str(chat_id) in daily_stats:
    for uid, data in daily_stats[str(chat_id)].items():
    if data["last_message"] >= twenty_four_hours_ago:
    active_users.add(uid)

    members = [m for m in members if m[0] not in active_users]
    if not members:
    await header_message.edit_text("Нет неактивных участников для созыва.")
    return

    # Фильтруем участников по статусу регистрации
    members = [m for m in members if user_registration.get(m[0], True)]

    if not members:
    await header_message.edit_text("Нет участников с активными упоминаниями для созыва.")
    return

    # Список смайликов для упоминаний
    smi = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", ""]
    random.shuffle(smi)

    # Отправляем упоминания группами по 5 смайликов
    for i in range(0, len(members), 5):
    group = members[i:i+5]
    mentions = []

    for j, (user_id, username) in enumerate(group):
    username = username.lstrip('@') if username else f"ID{user_id}"
    mentions.append(f'<a href="tg://user?id={user_id}">{smi[j % len(smi)]}</a>')

    # Отправляем группу смайликов-упоминаний
    await context.bot.send_message(
    chat_id=chat_id,
    text=" ".join(mentions),
    parse_mode='HTML',
    reply_to_message_id=header_message.message_id
    )
    await asyncio.sleep(1) # Небольшая задержка между группами

    # Обновляем заголовочное сообщение
    final_text = (
    f" <b>Созыв {target} участников завершен!</b>\n\n"
    f" {role} {caller_name} созвал чат!"
    )

    if reason:
    final_text += f"\n\n Причина: {reason}"

    final_text += f"\n\nУпомянуто участников: {len(members)}"

    await header_message.edit_text(
    final_text,
    parse_mode='HTML'
    )

    except Exception as e:
    logger.error(f"Ошибка в команде zov: {e}", exc_info=True)
    try:
    await context.bot.send_message(
    chat_id=chat_id,
    text="Произошла ошибка при выполнении команды."
    )
    except:
    pass
    finally:
    conn.close()

    # Вспомогательные функции (нужно будет добавить их реализацию)
    def has_moderation_access(user_id: str) -> bool:
    """Проверяет, есть ли у пользователя права модерации"""
    pass

    def is_admin(user_id: str) -> bool:
    """Проверяет, является ли пользователь администратором"""
    pass

    def get_user_display_name(user) -> str:
    """Возвращает отображаемое имя пользователя"""
    pass
     
    1. Элейна
  2. Элейна
    Элейна Jun 10, 2025 4660 Aug 16, 2019
     
    1. vendues Topic starter
      Элейна, концепция дальнейшей доработки, бля че приебался дружище, хочу гитару ставлю, могу ебальник отца своего вложить
Top
Loading...