mirror of
https://github.com/FerraSoft/bottohelp.git
synced 2026-08-06 21:55:03 +00:00
200 lines
8.8 KiB
Python
200 lines
8.8 KiB
Python
"""
|
|
Сервис управления приветственными сообщениями.
|
|
Отвечает за генерацию приветствий в зависимости от роли пользователя.
|
|
"""
|
|
|
|
from typing import Dict, Optional
|
|
from core.permissions import UserRole
|
|
from core.exceptions import ValidationError
|
|
|
|
|
|
class WelcomeService:
|
|
"""
|
|
Сервис для генерации приветственных сообщений на основе роли пользователя.
|
|
|
|
Отвечает за:
|
|
- Генерацию приветствий для разных ролей
|
|
- Форматирование сообщений с персональными данными
|
|
- Валидацию входных данных
|
|
"""
|
|
|
|
def __init__(self):
|
|
"""Инициализация сервиса приветствий"""
|
|
self.welcome_messages = self._initialize_welcome_messages()
|
|
|
|
def _initialize_welcome_messages(self) -> Dict[str, str]:
|
|
"""
|
|
Инициализация словаря приветственных сообщений для разных ролей.
|
|
На основе требований из welcome_messages_proposals.md
|
|
"""
|
|
return {
|
|
UserRole.USER.value: """👋 Добро пожаловать в наш бот!
|
|
|
|
Здесь вы можете:
|
|
• 📊 Проверить свой ранг: /rank
|
|
• 🏆 Посмотреть таблицу лидеров: /leaderboard
|
|
• 🎯 Играть в игры: /play_game
|
|
• 🌦️ Узнать погоду: /weather
|
|
• 📰 Прочитать новости: /news
|
|
• 💸 Поддержать проект: /donate
|
|
|
|
Для справки используйте /help""",
|
|
|
|
UserRole.MODERATOR.value: """🛡️ Добро пожаловать, модератор!
|
|
|
|
Ваши права:
|
|
• ⚠️ Предупреждения: /warn
|
|
• 🔇 Заглушка: /mute /unmute
|
|
• 📊 Статистика модерации
|
|
|
|
Все базовые команды также доступны: /rank, /play_game, /weather и др.""",
|
|
|
|
UserRole.ADMIN.value: """👑 Добро пожаловать, администратор!
|
|
|
|
У вас полный доступ к управлению ботом:
|
|
• 👥 Модерация: /warn, /mute, /ban, /kick
|
|
• 📊 Статистика: /admin_stats, /export_stats
|
|
• 📝 Планирование: /schedule_post, /list_posts
|
|
• 🛠️ Система: /admin_errors, /report_error
|
|
|
|
Все пользовательские команды также доступны.
|
|
Используйте /help для полного списка.""",
|
|
|
|
UserRole.SUPER_ADMIN.value: """🔧 Супер-администратор активирован!
|
|
|
|
Ваши возможности:
|
|
• ⚠️ Модерация пользователей: /warn /mute /ban
|
|
• 📈 Просмотр статистики: /admin_stats
|
|
• 📅 Управление публикациями: /schedule_post
|
|
• 🔍 Работа с ошибками: /admin_errors
|
|
• 📤 Экспорт данных: /export_stats
|
|
|
|
Обычные команды: /rank /leaderboard /play_game и др."""
|
|
}
|
|
|
|
def get_welcome_message(self, user_role: UserRole, user_name: Optional[str] = None) -> str:
|
|
"""
|
|
Получение приветственного сообщения для указанной роли.
|
|
|
|
Args:
|
|
user_role: Роль пользователя
|
|
user_name: Имя пользователя (опционально)
|
|
|
|
Returns:
|
|
Отформатированное приветственное сообщение
|
|
|
|
Raises:
|
|
ValidationError: Если роль не поддерживается
|
|
"""
|
|
if not isinstance(user_role, UserRole):
|
|
raise ValidationError(f"Неверная роль пользователя: {user_role}")
|
|
|
|
# Получаем базовое сообщение для роли
|
|
base_message = self.welcome_messages.get(user_role.value)
|
|
|
|
if not base_message:
|
|
# Fallback на сообщение для обычного пользователя
|
|
base_message = self.welcome_messages[UserRole.USER.value]
|
|
|
|
# Форматируем с именем пользователя, если указано
|
|
if user_name:
|
|
# Добавляем персональное приветствие в начало
|
|
personal_greeting = f"👋 Привет, {user_name}!\n\n"
|
|
return personal_greeting + base_message
|
|
else:
|
|
# Безымянное приветствие
|
|
return "👋 Привет!\n\n" + base_message
|
|
|
|
def get_available_commands_for_role(self, user_role: UserRole) -> Dict[str, list]:
|
|
"""
|
|
Получение доступных команд для указанной роли.
|
|
|
|
Args:
|
|
user_role: Роль пользователя
|
|
|
|
Returns:
|
|
Словарь с доступными командами по категориям
|
|
"""
|
|
if not isinstance(user_role, UserRole):
|
|
raise ValidationError(f"Неверная роль пользователя: {user_role}")
|
|
|
|
# Базовые команды для всех пользователей
|
|
base_commands = {
|
|
'user_commands': [
|
|
'/start - Приветствие и начало работы',
|
|
'/help - Справка по командам',
|
|
'/rank - Просмотр личного ранга и прогресса',
|
|
'/leaderboard - Таблица лидеров по очкам',
|
|
'/info - Информация о боте',
|
|
'/weather - Погода',
|
|
'/news - Новости',
|
|
'/translate - Перевод текста',
|
|
'/donate - Поддержать проект'
|
|
],
|
|
'games': [
|
|
'/play_game - Выбор игры',
|
|
'/rock_paper_scissors - Камень-ножницы-бумага',
|
|
'/tic_tac_toe - Крестики-нолики',
|
|
'/quiz - Викторина',
|
|
'/battleship - Морской бой',
|
|
'/game_2048 - Игра 2048',
|
|
'/tetris - Тетрис',
|
|
'/snake - Змейка'
|
|
]
|
|
}
|
|
|
|
# Добавляем команды в зависимости от роли
|
|
if user_role in [UserRole.MODERATOR, UserRole.ADMIN, UserRole.SUPER_ADMIN]:
|
|
base_commands['moderation'] = [
|
|
'/warn - Выдать предупреждение',
|
|
'/mute - Заглушить пользователя',
|
|
'/unmute - Снять заглушку'
|
|
]
|
|
|
|
if user_role in [UserRole.ADMIN, UserRole.SUPER_ADMIN]:
|
|
base_commands['admin'] = [
|
|
'/ban - Заблокировать пользователя',
|
|
'/unban - Разблокировать пользователя',
|
|
'/kick - Выгнать из чата',
|
|
'/admin_stats - Статистика админа',
|
|
'/schedule_post - Запланировать публикацию',
|
|
'/list_posts - Список запланированных постов',
|
|
'/delete_post - Удалить пост',
|
|
'/publish_now - Опубликовать немедленно',
|
|
'/report_error - Сообщить об ошибке',
|
|
'/admin_errors - Управление ошибками',
|
|
'/export_stats - Экспорт статистики'
|
|
]
|
|
|
|
if user_role == UserRole.SUPER_ADMIN:
|
|
base_commands['super_admin'] = [
|
|
'/admin_system - Системные настройки',
|
|
'/admin_logs - Системные логи',
|
|
'/admin_restart - Управление перезапуском'
|
|
]
|
|
|
|
return base_commands
|
|
|
|
def validate_user_name(self, name: str) -> bool:
|
|
"""
|
|
Валидация имени пользователя.
|
|
|
|
Args:
|
|
name: Имя для проверки
|
|
|
|
Returns:
|
|
True если имя корректное
|
|
"""
|
|
if not name or not isinstance(name, str):
|
|
return False
|
|
|
|
# Проверяем длину
|
|
if len(name.strip()) < 1 or len(name) > 100:
|
|
return False
|
|
|
|
# Проверяем на запрещенные символы (простая проверка)
|
|
forbidden_chars = ['<', '>', '&', '\n', '\r']
|
|
if any(char in name for char in forbidden_chars):
|
|
return False
|
|
|
|
return True |