✅ Регистрация и верификация жильцов ✅ Рейтинг активности (уровни) ✅ Детект шпионов (Score 0-100) ✅ Анти-мат система (3 предупреждения → бан) ✅ Админ-панель с рассылкой ✅ Учёт квартир (несколько жильцов) ✅ Телефоны экстренных служб и мастеров ✅ Еженедельный экспорт JSON ✅ Прокси (socks5) для обхода РКН Бекап: backups/versions/v1.0_mvp_2026-02-26/ Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
118 lines
3.6 KiB
Python
118 lines
3.6 KiB
Python
"""
|
||
Форматирование сообщений
|
||
"""
|
||
import json
|
||
from typing import List, Dict, Any
|
||
from database.models import User
|
||
|
||
|
||
def format_phone_list(services: List[Dict[str, Any]]) -> str:
|
||
"""Форматировать список телефонов"""
|
||
if not services:
|
||
return '📭 Список пуст'
|
||
|
||
lines = []
|
||
for svc in services:
|
||
emoji = get_service_emoji(svc.get('category', ''))
|
||
name = svc.get('name', 'Неизвестно')
|
||
phone = svc.get('phone', '')
|
||
desc = svc.get('description', '')
|
||
rating = svc.get('rating')
|
||
|
||
line = f'{emoji} <b>{name}</b>: <code>{phone}</code>'
|
||
if desc:
|
||
line += f'\n └─ {desc}'
|
||
if rating:
|
||
line += f' ⭐ {rating}'
|
||
|
||
lines.append(line)
|
||
|
||
return '\n\n'.join(lines)
|
||
|
||
|
||
def get_service_emoji(category: str) -> str:
|
||
"""Эмодзи для категории службы"""
|
||
emojis = {
|
||
'emergency': '🚨',
|
||
'utility': '🔧',
|
||
'police': '👮',
|
||
'masters': '👷',
|
||
'plumber': '🚿',
|
||
'electrician': '⚡',
|
||
}
|
||
return emojis.get(category, '📞')
|
||
|
||
|
||
def format_user_info(user: User) -> str:
|
||
"""Форматировать информацию о пользователе"""
|
||
status = '✅' if user.verified else '⏳'
|
||
spy_status = get_spy_status(user.spy_score)
|
||
|
||
text = f'''{status} <b>{user.full_name}</b>
|
||
├─ ID: <code>{user.user_id}</code>
|
||
├─ Ник: @{user.username or 'нет'}
|
||
├─ Квартира: {user.apartment or 'не указана'}
|
||
├─ Сообщений: {user.message_count}
|
||
├─ В чате с: {user.join_date.strftime('%d.%m.%Y')}
|
||
└─ Статус: {spy_status}'''
|
||
|
||
return text
|
||
|
||
|
||
def get_spy_status(score: int) -> str:
|
||
"""Статус детекта шпиона"""
|
||
if score <= 30:
|
||
return '🟢 В норме'
|
||
elif score <= 60:
|
||
return '🟡 Подозрительно'
|
||
else:
|
||
return '🔴 ШПИОН!'
|
||
|
||
|
||
def format_stats(stats: Dict[str, Any]) -> str:
|
||
"""Форматировать статистику чата"""
|
||
text = f'''📊 <b>Статистика чата</b>
|
||
|
||
👥 <b>Пользователи:</b>
|
||
├─ Всего: {stats.get('total_users', 0)}
|
||
├─ Верифицированы: {stats.get('verified_users', 0)}
|
||
└─ Непроверены: {stats.get('unverified_users', 0)}
|
||
|
||
📝 <b>Сообщения:</b>
|
||
├─ Всего: {stats.get('total_messages', 0)}
|
||
├─ За неделю: {stats.get('messages_week', 0)}
|
||
└─ За день: {stats.get('messages_day', 0)}
|
||
|
||
🕵️ <b>Безопасность:</b>
|
||
├─ Подозрительных: {stats.get('suspicious_count', 0)}
|
||
└─ Шпионов: {stats.get('spies_count', 0)}
|
||
|
||
📈 <b>Активность:</b>
|
||
└─ Топ за неделю: {stats.get('top_users', 'нет данных')}'''
|
||
|
||
return text
|
||
|
||
|
||
def format_spy_alert(user: User, flags: List[str]) -> str:
|
||
"""Форматировать предупреждение о шпионе"""
|
||
flag_emojis = {
|
||
'new_account': '🆕',
|
||
'no_avatar': '👤',
|
||
'generic_username': '🔤',
|
||
'unverified': '⏳',
|
||
'provocation': '💬',
|
||
'office_hours': '🕐',
|
||
'multicount': '🔄',
|
||
'complaints': '⚠️'
|
||
}
|
||
|
||
flags_text = '\n'.join([f'{flag_emojis.get(f, "•")} {f}' for f in flags])
|
||
|
||
return f'''🚨 <b>ТРЕВОГА: Возможный шпион!</b>
|
||
|
||
{format_user_info(user)}
|
||
|
||
📋 <b>Флаги:</b>
|
||
{flags_text}
|
||
|
||
💡 <b>Рекомендация:</b> Проверить и запросить верификацию'''
|