Telegram: PSYCHOTICAI Этот Python-скрипт реализует команду /zov для Telegram-бота, которая позволяет модераторам и администраторам созывать всех или только неактивных участников чата. Скрипт использует библиотеку python-telegram-bot для взаимодействия с Telegram API и SQLite для хранения данных о пользователях. Скрипт требует доработки, но структура рабочая Созыв участников: Возможность вызывать всех участников чата или только неактивных (кто не писал в чат более 24 часов) Гибкое управление: Указание причины созыва и фильтрация по статусу регистрации Красивые упоминания: Участники упоминаются с использованием случайных тематических смайликов Безопасность: Проверка прав доступа перед выполнением команды Статистика: Отображение количества упомянутых участников в итоговом сообщении Скрипт подходит для управления крупными чатами, где требуется привлекать внимание участников к важным обсуждениям или объявлениям. 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 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
Элейна, концепция дальнейшей доработки, бля че приебался дружище, хочу гитару ставлю, могу ебальник отца своего вложить