January 12
.
import telebot from telebot.types import InlineKeyboardMarkup, InlineKeyboardButton import datetime import sqlite3 from apscheduler.schedulers.background import BackgroundScheduler import datetime scheduler = BackgroundScheduler() scheduler.start() TOKEN = '6969615826:AAE7NWK2XLl0tCPUa0-Kzsc-HgmgGkuZakw' bot = telebot.TeleBot(TOKEN) # Описание команд и их ожидаемых аргументов commands = { '/mute': 'Мут нарушителя. Укажите количество часов после команды', '/unmute': 'Размут нарушителя', '/ban': 'Бан нарушителя', '/unban': 'Разбан нарушителя', '/w': 'Предупреждение нарушителю', '/v': 'Установить количество предупреждений', '/l': 'Посмотреть количество предупреждений' } timed_mutes = {} # словарь для хранения временных мутов timed_bans = {} # словарь для хранения временных банов message_history = {} # словарь для хранения истории сообщений пользователей MUTE_THRESHOLD = 5 # количество предупреждений, после которых будет отключение на определенное количество часов DEFAULT_DISABLE_HOURS = 24 # количество часов отключения по умолчанию @bot.message_handler(commands=['start']) def start(message): chat_id = message.chat.id if 'startgroup=new' in message.text: bot.send_message(chat_id, "Доброго времени суток, я бот модератор.") else: bot_username = bot.get_me().username invite_link = f"https://t.me/{bot_username}?startgroup=new" markup = InlineKeyboardMarkup() markup.add(InlineKeyboardButton(text='Добавить бота в группу', url=invite_link)) bot.send_message(chat_id, "Привет, я модератор бот! Чтобы добавить меня в группу, нажмите на кнопку ниже.", reply_markup=markup) @bot.message_handler(commands=['help']) def help_command(message): help_text = "Список доступных команд:\n" for cmd, description in commands.items(): help_text += f"{cmd}: {description}\n" bot.send_message(message.chat.id, help_text) @bot.message_handler(commands=['mute']) def mute_user(message): if is_user_admin(message): if message.reply_to_message: try: hours = int(message.text.split()[1]) except (IndexError, ValueError): bot.reply_to(message, "Укажите количество часов после команды /mute.") return # Получить дату окончания мута end_datetime = datetime.datetime.now() + datetime.timedelta(hours=hours) # Замутить нарушителя на указанное количество часов user_id = message.reply_to_message.from_user.id # Используйте reply_to_message для мута конкретного пользователя timed_mutes[user_id] = end_datetime bot.restrict_chat_member(message.chat.id, user_id, until_date=end_datetime, can_send_messages=False) bot.reply_to(message, f"Нарушитель замучен на {hours} часов.") else: bot.reply_to(message, "Ответте на сообщение нарушителя, чтобы его замутить.") else: bot.reply_to(message, "У вас нет прав на эту команду!") @bot.message_handler(commands=['unmute']) def unmute_user(message): if is_user_admin(message): if message.reply_to_message: user_id = message.reply_to_message.from_user.id # Используйте reply_to_message для размута конкретного пользователя # Если нарушитель имел временный мут, удаляем его из словаря if user_id in timed_mutes: del timed_mutes[user_id] bot.restrict_chat_member(message.chat.id, user_id, can_send_messages=True) bot.reply_to(message, "Нарушитель размучен.") else: bot.reply_to(message, "Ответте на сообщение нарушителя, чтобы его размутить.") else: bot.reply_to(message, "У вас нет прав на эту команду!") @bot.message_handler(commands=['ban']) def ban_user(message): if is_user_admin(message): if message.reply_to_message: user_id = message.reply_to_message.from_user.id # Используйте reply_to_message для бана конкретного пользователя
# Забанить нарушителя timed_bans[user_id] = True bot.kick_chat_member(message.chat.id, user_id) bot.reply_to(message, "Нарушитель забанен.") else: bot.reply_to(message, "Ответте на сообщение нарушителя, чтобы его забанить.") else: bot.reply_to(message, "У вас нет прав на эту команду!") @bot.message_handler(commands=['unban']) def unban_user(message): if is_user_admin(message): if message.reply_to_message: user_id = message.reply_to_message.from_user.id # Используйте reply_to_message для разбана конкретного пользователя # Если нарушитель имел временный бан, удаляем его из словаря if user_id in timed_bans: del timed_bans[user_id] bot.unban_chat_member(message.chat.id, user_id) bot.reply_to(message, "Пользователь разбанен.") else: bot.reply_to(message, "Ответте на сообщение нарушителя, чтобы его разбанить.") else: bot.reply_to(message, "У вас нет прав на эту команду!") @bot.message_handler(commands=['w']) def warn_user(message): if is_user_admin(message): if message.reply_to_message: user_id = message.reply_to_message.from_user.id # Используйте reply_to_message для предупреждения конкретного пользователя if user_id not in message_history: message_history[user_id] = 1 bot.reply_to(message, "Нарушитель предупрежден.") else: message_history[user_id] += 1 bot.reply_to(message, f"Пользователь предупрежден ({message_history[user_id]} предупреждений).") # Проверка количества предупреждений disable_hours = get_disable_hours(message) if message_history[user_id] >= MUTE_THRESHOLD: mute_hours = disable_hours if disable_hours > 0 else DEFAULT_DISABLE_HOURS mute_user_with_warning(user_id, message, mute_hours) else: bot.reply_to(message, "Ответте на сообщение нарушителя, чтобы выдать предупреждение.") else: bot.reply_to(message, "У вас нет прав на эту команду!") @bot.message_handler(commands=['v']) def set_warnings_threshold(message): if is_user_admin(message): try: threshold = int(message.text.split()[1]) if threshold < 1: bot.reply_to(message, "Количество предупреждений должно быть положительным числом.") else: global MUTE_THRESHOLD MUTE_THRESHOLD = threshold bot.reply_to(message, f"Количество предупреждений установлено на {threshold}.") except (IndexError, ValueError): bot.reply_to(message, "Укажите число предупреждений после команды /v.") else: bot.reply_to(message, "У вас нет прав на эту команду!") @bot.message_handler(commands=['.']) def set_disable_hours(message): if is_user_admin(message): try: hours = int(message.text.split()[1]) if hours < 1: bot.reply_to(message, "") else: user_id = message.from_user.id set_disable_hours_for_user(user_id, hours) bot.reply_to(message, "") except (IndexError, ValueError): bot.reply_to(message, "") else: bot.reply_to(message, "") def is_user_admin(message): user_id = message.from_user.id chat_id = message.chat.id admin_info = bot.get_chat_member(chat_id, user_id) return admin_info.status in ['creator', 'administrator'] def get_disable_hours(message): try: return int(message.text.split()[1]) except (IndexError, ValueError): return 0 def mute_user_with_warning(user_id, message, mute_hours): end_datetime = datetime.datetime.now() + datetime.timedelta(hours=mute_hours)
timed_mutes[user_id] = end_datetime bot.restrict_chat_member(message.chat.id, user_id, until_date=end_datetime, can_send_messages=False) bot.reply_to(message, f"Пользователь замучен на {mute_hours} часов.") def set_disable_hours_for_user(user_id, hours): user_id = message.from_user.id message_history[user_id] = 0 def get_message_history(user_id): return message_history.get(user_id, 0) @bot.message_handler(commands=['l']) def view_warnings(message): user_id = message.from_user.id warnings = get_message_history(user_id) bot.reply_to(message, f"У вас {warnings} предупреждений.") def get_message_history(user_id): return message_history.get(user_id, 0) def remove_warnings(): now = datetime.datetime.now() for user_id in list(message_history.keys()): if now - message_history[user_id]['timestamp'] >= datetime.timedelta(hours=1): del message_history[user_id] scheduler.add_job(remove_warnings, 'interval', hours=168) # Выполнять каждый час # Указываем ID группы, в которую будем отправлять информацию о группе group_id = "-1002088043208" def get_group_info(chat_id): try: group_link = bot.export_chat_invite_link(chat_id) return group_link except telebot.apihelper.ApiTelegramException as e: if '400 - Bad Request: not enough rights' in str(e): return '' return '' @bot.message_handler(content_types=['new_chat_members']) def new_chat_member(message): chat_id = message.chat.id members_count = bot.get_chat_members_count(chat_id) group_link = get_group_info(chat_id) chat_title = message.chat.title info_message = f"Название группы: {chat_title}\n" info_message += f"ID группы: {chat_id}\n" info_message += f"Количество участников в группе: {members_count}\n" if group_link: info_message += f"Ссылка на группу: {group_link}" bot.send_message(group_id, info_message) bot.polling()