#!/usr/bin/env python3
"""
СБОРЩИК НИКОВ ИЗ ЧАТА - ПРОСТОЙ ПАРСИНГ

Собирает ники авторов последних N сообщений из группы обсуждений канала.
БЕЗ привязки к постам - просто последние активные пользователи!

Работает через MTProto API (Telethon)
"""

import asyncio
from telethon import TelegramClient
from datetime import datetime

# === КОНФИГУРАЦИЯ ===
API_ID = 27637277  # API ключи из проекта miniapp (cloneyou)
API_HASH = '8d1655ab08162698e7bfce8afe9fc73a'

# ID группы обсуждений канала @applifegame
DISCUSSION_GROUP_ID = -1001592654869  # Или укажите username: '@имя_группы'

# Количество последних сообщений для анализа
MESSAGES_TO_ANALYZE = 822  # Парсим 822 сообщения

# Файл для сохранения результатов
OUTPUT_FILE = '/var/www/wsalesite.ru/avatar/chat_users_list.txt'


async def main():
    print("=" * 70)
    print("🚀 СБОРЩИК НИКОВ ИЗ ЧАТА - ПАРСИНГ ПОСЛЕДНИХ СООБЩЕНИЙ")
    print("=" * 70)
    print(f"💬 Группа обсуждений ID: {DISCUSSION_GROUP_ID}")
    print(f"📊 Количество сообщений: {MESSAGES_TO_ANALYZE}")
    print("=" * 70 + "\n")
    
    # Подключаемся к Telegram
    async with TelegramClient('avatar_chat_session', API_ID, API_HASH) as client:
        me = await client.get_me()
        print(f"✅ Подключено к Telegram")
        print(f"   Ваш аккаунт: {me.first_name} (@{me.username or 'без username'})\n")
        
        # Получаем информацию о группе
        try:
            chat = await client.get_entity(DISCUSSION_GROUP_ID)
            chat_title = getattr(chat, 'title', 'Неизвестно')
            members_count = getattr(chat, 'participants_count', 'N/A')
            
            print(f"✅ Группа найдена: {chat_title}")
            print(f"   ID: {chat.id}")
            print(f"   Участников: {members_count}\n")
        except Exception as e:
            print(f"❌ ОШИБКА: Не удалось получить группу")
            print(f"   {e}")
            print(f"\n💡 Убедитесь, что:")
            print(f"   1. ID группы корректен: {DISCUSSION_GROUP_ID}")
            print(f"   2. Ваш аккаунт является участником этой группы")
            return
        
        # ПАРСИМ последние сообщения
        print(f"🔍 Парсинг последних {MESSAGES_TO_ANALYZE} сообщений...")
        print("-" * 70)
        
        users_dict = {}  # user_id -> {username, first_name, last_name, message_count}
        processed = 0
        
        try:
            async for message in client.iter_messages(
                entity=DISCUSSION_GROUP_ID,
                limit=MESSAGES_TO_ANALYZE
            ):
                processed += 1
                
                # Показываем прогресс каждые 100 сообщений
                if processed % 100 == 0:
                    print(f"   Обработано: {processed}/{MESSAGES_TO_ANALYZE} сообщений...")
                
                # Пропускаем служебные сообщения
                if not message.sender:
                    continue
                
                sender = message.sender
                user_id = sender.id
                
                # Если пользователь уже встречался, увеличиваем счётчик
                if user_id in users_dict:
                    users_dict[user_id]['message_count'] += 1
                else:
                    # Добавляем нового пользователя
                    users_dict[user_id] = {
                        'username': sender.username,
                        'first_name': getattr(sender, 'first_name', ''),
                        'last_name': getattr(sender, 'last_name', ''),
                        'message_count': 1,
                        'is_bot': getattr(sender, 'bot', False)
                    }
            
            print(f"   ✅ Обработано всего: {processed} сообщений\n")
            
        except Exception as e:
            print(f"   ❌ Ошибка при парсинге: {e}\n")
            if processed == 0:
                return
        
        if not users_dict:
            print("⚠️  Не найдено сообщений с авторами!")
            return
        
        # Формируем результаты
        print("💾 Формирование результатов...")
        print("-" * 70 + "\n")
        
        output = f"# Ники пользователей из группы обсуждений канала @applifegame\n"
        output += f"# Дата сбора: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n"
        output += f"# Метод: Парсинг последних {MESSAGES_TO_ANALYZE} сообщений\n"
        output += f"# Обработано сообщений: {processed}\n"
        output += f"# Уникальных пользователей: {len(users_dict)}\n"
        output += "=" * 70 + "\n\n"
        
        # Сортируем пользователей по количеству сообщений (самые активные первые)
        sorted_users = sorted(
            users_dict.items(),
            key=lambda x: x[1]['message_count'],
            reverse=True
        )
        
        # === РАЗДЕЛ 1: Список с количеством сообщений ===
        output += "## ПОЛЬЗОВАТЕЛИ ПО АКТИВНОСТИ (от самых активных)\n"
        output += "=" * 70 + "\n\n"
        
        for user_id, user_data in sorted_users:
            # Формируем идентификатор
            if user_data['username']:
                identifier = f"@{user_data['username']}"
            else:
                first = user_data['first_name'] or ''
                last = user_data['last_name'] or ''
                full_name = f"{first} {last}".strip()
                identifier = full_name if full_name else f"ID:{user_id}"
            
            # Отмечаем ботов
            bot_mark = " [БОТ]" if user_data['is_bot'] else ""
            
            output += f"{identifier}{bot_mark} - {user_data['message_count']} сообщений\n"
        
        output += "\n"
        
        # === РАЗДЕЛ 2: Простой список ников (алфавитный порядок) ===
        output += "=" * 70 + "\n"
        output += f"## СПИСОК ВСЕХ НИКОВ (алфавитный порядок, всего: {len(users_dict)})\n"
        output += "=" * 70 + "\n\n"
        
        simple_list = []
        for user_id, user_data in users_dict.items():
            if user_data['username']:
                simple_list.append(f"@{user_data['username']}")
            else:
                first = user_data['first_name'] or ''
                last = user_data['last_name'] or ''
                full_name = f"{first} {last}".strip()
                simple_list.append(full_name if full_name else f"ID:{user_id}")
        
        for nickname in sorted(simple_list):
            output += f"{nickname}\n"
        
        # === РАЗДЕЛ 3: Статистика ===
        output += "\n" + "=" * 70 + "\n"
        output += "## СТАТИСТИКА\n"
        output += "=" * 70 + "\n\n"
        
        users_with_username = sum(1 for u in users_dict.values() if u['username'])
        users_without_username = len(users_dict) - users_with_username
        bots_count = sum(1 for u in users_dict.values() if u['is_bot'])
        total_messages = sum(u['message_count'] for u in users_dict.values())
        
        output += f"Всего уникальных пользователей: {len(users_dict)}\n"
        output += f"С username: {users_with_username}\n"
        output += f"Без username: {users_without_username}\n"
        output += f"Ботов: {bots_count}\n"
        output += f"Обработано сообщений: {processed}\n"
        output += f"Всего сообщений от пользователей: {total_messages}\n"
        output += f"Среднее сообщений на пользователя: {total_messages / len(users_dict):.1f}\n"
        
        # Топ-3 самых активных
        output += f"\nТоп-3 самых активных:\n"
        for i, (user_id, user_data) in enumerate(sorted_users[:3], 1):
            if user_data['username']:
                identifier = f"@{user_data['username']}"
            else:
                first = user_data['first_name'] or ''
                last = user_data['last_name'] or ''
                identifier = f"{first} {last}".strip() or f"ID:{user_id}"
            output += f"   {i}. {identifier} - {user_data['message_count']} сообщений\n"
        
        # Сохраняем в файл
        with open(OUTPUT_FILE, 'w', encoding='utf-8') as f:
            f.write(output)
        
        # Выводим итоги
        print("=" * 70)
        print("✅ ГОТОВО! ПОЛЬЗОВАТЕЛИ СПАРСЕНЫ!")
        print("=" * 70)
        print(f"📊 Статистика:")
        print(f"   - Обработано сообщений: {processed}")
        print(f"   - Уникальных пользователей: {len(users_dict)}")
        print(f"   - С username: {users_with_username}")
        print(f"   - Без username: {users_without_username}")
        print(f"   - Ботов найдено: {bots_count}")
        print(f"   - Файл результатов: {OUTPUT_FILE}")
        print("=" * 70)
        
        print(f"\n📋 Топ-3 самых активных:")
        for i, (user_id, user_data) in enumerate(sorted_users[:3], 1):
            if user_data['username']:
                identifier = f"@{user_data['username']}"
            else:
                first = user_data['first_name'] or ''
                last = user_data['last_name'] or ''
                identifier = f"{first} {last}".strip() or f"ID:{user_id}"
            print(f"   {i}. {identifier} - {user_data['message_count']} сообщений")
        
        print("\n✅ Файл готов к использованию!")


if __name__ == '__main__':
    # Проверяем конфигурацию
    if API_ID == 'YOUR_API_ID' or API_HASH == 'YOUR_API_HASH':
        print("=" * 70)
        print("❌ ОШИБКА: Не настроена конфигурация!")
        print("=" * 70)
        print("\n📋 Необходимо:")
        print("   1. Перейти на https://my.telegram.org/apps")
        print("   2. Войти в свой аккаунт Telegram")
        print("   3. Создать приложение и получить API_ID и API_HASH")
        print("   4. Отредактировать этот файл и указать свои значения:\n")
        print(f"   nano {__file__}\n")
        print("   API_ID = '12345678'  # Ваш API ID")
        print("   API_HASH = 'abc123...'  # Ваш API HASH\n")
        print("=" * 70)
        exit(1)
    
    # Поддержка Python 3.6+
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

