from telegram import Update, ChatPermissions
from telegram.ext import Application, CommandHandler, MessageHandler, filters, ContextTypes
from datetime import datetime, timedelta
from collections import defaultdict
# Токен бота и ID чатов
TOKEN = 'пап'
MODERATION_CHAT_ID = щ # Чат для модерирования
REPORT_CHAT_ID = -щ # Чат для отчетов
# Словари для отслеживания предупреждений и сообщений пользователей
user_warnings = defaultdict(int)
user_messages = defaultdict(list)
# Текст правил
RULES_TEXT = """
Правила чата:
1. Запрещены спам, флуд и провокации, направленные на нарушения.
2. Запрещены попрошайничество и вымогательство.
3. Запрещена публикация материалов оскорбительного, насильственного, жестокого и экстремистского характера.
4. Недопустимо унижать и оскорблять других пользователей.
5. Запрещено выдавать себя за представителей администрации или модерации.
6. Запрещено отправлять потенциально опасные ссылки и файлы.
7. Обман администрации или модерации строго запрещен.
8. Запрещен пиар других групп, YouTube-каналов и любых сторонних ресурсов.
9. Запрещен контент 18+.
10. Запрещены оскорбления на национальной почве и любые проявления фашизма и ненависти.
"""
# Функция для отправки правил новому пользователю
async def welcome(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
new_member = update.message.new_chat_members[0]
if update.message.chat_id == MODERATION_CHAT_ID:
welcome_message = await update.message.reply_text(
f"Привет, {new_member.mention_html()}! Добро пожаловать в чат! Вот наши правила:\n{RULES_TEXT}",
parse_mode="HTML"
)
# Удаляем сообщение с правилами через минуту
await context.job_queue.run_once(lambda _: welcome_message.delete(), timedelta(minutes=1))
# Проверка на спам и дудос
async def monitor_activity(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
# Проверяем, что update.message существует и чат является целевым
if update.message and update.message.chat_id == MODERATION_CHAT_ID:
user_id = update.message.from_user.id
chat_id = update.message.chat_id
current_time = datetime.now()
# Записываем время сообщения
user_messages[user_id].append(current_time)
# Очищаем старые сообщения
user_messages[user_id] = [msg_time for msg_time in user_messages[user_id] if current_time - msg_time < timedelta(seconds=10)]
# Если больше 5 сообщений за 10 секунд — мутим и предупреждаем
if len(user_messages[user_id]) > 5:
if user_warnings[user_id] < 10:
user_warnings[user_id] += 1
await update.message.reply_text(f"Предупреждение {user_warnings[user_id]}/10. Пожалуйста, не спамьте.")
await context.bot.restrict_chat_member(
chat_id, user_id, permissions=ChatPermissions(can_send_messages=False), until_date=current_time + timedelta(minutes=1)
)
await context.bot.send_message(chat_id, f"{update.message.from_user.mention_html()}, вы получили мут на 1 минуту за подозрительную активность. Причина: спам. Модератор: Бот", parse_mode="HTML")
await context.bot.send_message(REPORT_CHAT_ID, f"Пользователь {update.message.from_user.mention_html()} получил мут на 1 минуту за подозрительную активность.", parse_mode="HTML")
else:
await update.message.reply_text("Вы забанены за систематические нарушения.")
await context.bot.ban_chat_member(chat_id, user_id)
await context.bot.send_message(chat_id, f"{update.message.from_user.mention_html()}, вы забанены за превышение лимита предупреждений. Модератор: Бот", parse_mode="HTML")
await context.bot.send_message(REPORT_CHAT_ID, f"Пользователь {update.message.from_user.mention_html()} забанен за превышение лимита предупреждений.", parse_mode="HTML")
# Проверка на ключевую фразу "Guarding Fiira's Ass"
async def respond_to_keyphrase(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
if update.message.chat_id == MODERATION_CHAT_ID and "Guarding Fiira's Ass" in update.message.text:
await update.message.reply_text("Лучшая система защиты жопы приветствует вас!")
await context.bot.send_message(REPORT_CHAT_ID, "Пользователь использовал фразу 'Guarding Fiira's Ass'. Отправлено приветствие.")
# Команда /ban для администраторов
async def ban(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
if update.message.chat_id == MODERATION_CHAT_ID and update.message.reply_to_message:
if update.message.chat.get_member(update.message.from_user.id).status in ['administrator', 'creator']:
user = update.message.reply_to_message.from_user
await context.bot.ban_chat_member(update.message.chat_id, user.id)
await update.message.reply_text(f"{user.mention_html()} забанен.", parse_mode="HTML")
await context.bot.send_message(REPORT_CHAT_ID, f"Пользователь {user.mention_html()} был забанен администратором {update.message.from_user.mention_html()}.", parse_mode="HTML")
await context.bot.send_message(update.message.chat_id, f"{user.mention_html()}, вы были забанены. Модератор: {update.message.from_user.mention_html()}", parse_mode="HTML")
# Команда /mute для администраторов
async def mute(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
if update.message.chat_id == MODERATION_CHAT_ID and update.message.reply_to_message:
if update.message.chat.get_member(update.message.from_user.id).status in ['administrator', 'creator']:
user = update.message.reply_to_message.from_user
await context.bot.restrict_chat_member(
update.message.chat_id, user.id, permissions=ChatPermissions(can_send_messages=False), until_date=datetime.now() + timedelta(minutes=1)
)
await update.message.reply_text(f"{user.mention_html()} получил мут на 1 минуту.", parse_mode="HTML")
await context.bot.send_message(REPORT_CHAT_ID, f"Пользователь {user.mention_html()} был замучен администратором {update.message.from_user.mention_html()}.", parse_mode="HTML")
await context.bot.send_message(update.message.chat_id, f"{user.mention_html()}, вы получили мут на 1 минуту. Модератор: {update.message.from_user.mention_html()}", parse_mode="HTML")
# Команда /kick для администраторов
async def kick(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
if update.message.chat_id == MODERATION_CHAT_ID and update.message.reply_to_message:
if update.message.chat.get_member(update.message.from_user.id).status in ['administrator', 'creator']:
user = update.message.reply_to_message.from_user
await context.bot.kick_chat_member(update.message.chat_id, user.id)
await update.message.reply_text(f"{user.mention_html()} был кикнут из чата.", parse_mode="HTML")
await context.bot.send_message(REPORT_CHAT_ID, f"Пользователь {user.mention_html()} был кикнут администратором {update.message.from_user.mention_html()}.", parse_mode="HTML")
await context.bot.send_message(update.message.chat_id, f"{user.mention_html()}, вы были кикнуты. Модератор: {update.message.from_user.mention_html()}", parse_mode="HTML")
def main():
application = Application.builder().token(TOKEN).build()
# Обработчики команд
application.add_handler(CommandHandler("ban", ban))
application.add_handler(CommandHandler("mute", mute))
application.add_handler(CommandHandler("kick", kick))
# Обработчик для новых пользователей
application.add_handler(MessageHandler(filters.StatusUpdate.NEW_CHAT_MEMBERS, welcome))
# Обработчик для сообщений с ключевой фразой
application.add_handler(MessageHandler(filters.TEXT & filters.Regex("Guarding Fiira's Ass"), respond_to_keyphrase))
# Обработчик для спама и дудоса
application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, monitor_activity))
application.run_polling()
if __name__ == '__main__':
main()