domovoy_bot/utils/formatters.py
Admin ba4676b0af v1.0 MVP - Инициализация проекта 🏠
 Регистрация и верификация жильцов
 Рейтинг активности (уровни)
 Детект шпионов (Score 0-100)
 Анти-мат система (3 предупреждения → бан)
 Админ-панель с рассылкой
 Учёт квартир (несколько жильцов)
 Телефоны экстренных служб и мастеров
 Еженедельный экспорт JSON
 Прокси (socks5) для обхода РКН

Бекап: backups/versions/v1.0_mvp_2026-02-26/

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-02-27 10:54:16 +00:00

118 lines
3.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
Форматирование сообщений
"""
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> Проверить и запросить верификацию'''