# -*- coding: utf-8 -*-
"""
Константы и текстовые сообщения для Telegram бота
"""
# Предопределенные ответы
PREDEFINED_RESPONSES = {
'привет': 'Привет! Как дела?',
'как дела': 'Отлично! А у тебя?',
'что делаешь': 'Отвечаю на сообщения в чате 😊',
'спасибо': 'Пожалуйста! Рад помочь!',
'пока': 'До свидания! Заходи еще!',
}
# Текст справки
HELP_TEXT = """
🤖 Команды бота:
Основные:
/start - Начать работу с ботом
/help - Показать это сообщение
/info - Информация о вас
Рейтинг:
/rank - Ваш текущий рейтинг
/ranks_info - Информация о системе рангов
/leaderboard - Топ-10 участников
Информация:
/weather [город] - Погода в городе
/news - Последние новости
/translate [текст] [язык] - Перевод текста
Прочее:
Введите "реквизиты" - Получить реквизиты для оплаты
Игры:
/play_game - Запустить мини-игру
Посты по расписанию (только для админов):
/schedule_post [время] [текст] - Запланировать пост
/list_posts - Показать запланированные посты
/delete_post [ID] - Удалить пост по расписанию
/publish_now [ID] - Опубликовать пост немедленно
Модерация (только для админов):
/warn [пользователь] [причина] - Выдать предупреждение
/mute [пользователь] [время] - Заглушить пользователя
/unmute [пользователь] - Снять заглушку
/ban [пользователь] [причина] - Забанить пользователя
/unban [пользователь] - Разбанить пользователя
/kick [пользователь] [причина] - Кикнуть пользователя
/promote [пользователь] - Повысить до модератора
/demote [пользователь] - Понизить с модератора
/import_csv [файл] - Импорт пользователей из CSV файла
"""
# Текст реквизитов
BANK_DETAILS_TEXT = "Денежные средства можно перечислить по номерам: \r\n💳 89066935474 Елена, \r\n💳89207144698 Людмила\r\nБольшая просьба не писать сообщения при переводе, карту могут заблокировать!!!"
# Сообщения планировщика постов
SCHEDULER_MESSAGES = {
'no_permission': '❌ У вас нет прав для планирования постов.',
'invalid_format': '❌ Ошибка формата времени: {error}',
'time_in_past': '❌ Время публикации должно быть в будущем!',
'post_scheduled': '✅ Пост запланирован!\n\n📅 Время публикации: {time}\n📝 Текст: {text}\n🆔 ID поста: {post_id}',
'save_error': '❌ Ошибка при сохранении поста в базу данных.',
'no_posts': '📭 Нет запланированных постов.',
'usage_schedule': 'Использование: /schedule_post [время] [текст поста]\n\nФормат времени:\n• Абсолютное: 2024-01-15 14:30:00\n• Относительное: +30m (через 30 минут), +2h (через 2 часа), +1d (через день)\n\nПример: /schedule_post +2h Привет всем!',
'usage_delete': 'Использование: /delete_post [ID поста]',
'usage_publish': 'Использование: /publish_now [ID поста]',
'invalid_id': '❌ ID поста должен быть числом.',
'post_deleted': '✅ Пост {post_id} удален.',
'post_not_found': '❌ Пост {post_id} не найден или у вас нет прав для его удаления.',
'post_published': '✅ Пост {post_id} опубликован немедленно!',
'publish_error': '❌ Ошибка при публикации поста: {error}',
'no_permission_view': '❌ У вас нет прав для просмотра постов.',
'no_permission_delete': '❌ У вас нет прав для удаления постов.',
'no_permission_publish': '❌ У вас нет прав для публикации постов.',
}
# Сообщения ранговой системы
RANK_MESSAGES = {
'rank_info': """
🏆 Военная система рангов
Как работает система:
• Каждый участник начинает с звания "Рядовой"
• Звание повышается автоматически при достижении определенного количества очков
• Очки начисляются за активность в чате и победы в играх
Иерархия званий:
🪖 Рядовой (0 очков)
🪖 Ефрейтор (100 очков)
🪖 Младший сержант (235 очков)
🪖 Сержант (505 очков)
🪖 Старший сержант (810 очков)
🪖 Старшина (1,250 очков)
🪖 Прапорщик (1,725 очков)
🪖 Старший прапорщик (2,335 очков)
🪖 Младший лейтенант (2,980 очков)
🪖 Лейтенант (3,760 очков)
🪖 Старший лейтенант (4,575 очков)
🪖 Капитан (5,525 очков)
🪖 Майор (6,510 очков)
🪖 Подполковник (7,630 очков)
🪖 Полковник (8,785 очков)
🪖 Генерал майор (16,075 очков)
🪖 Генерал лейтенант (32,150 очков)
🪖 Генерал полковник (64,300 очков)
🪖 Генерал армии (128,600 очков)
🪖 Маршал (256,000 очков)
Как получить очки:
• +1 очко за каждое сообщение в чате
• +5 очков за победу в мини-игре
• +15 очков за победу в крестиках-ноликах
• Бонусные очки за активность (случайно 1-5 очков)
Команды для работы с рангом:
/rank - Показать ваш текущий ранг и очки
/leaderboard - Топ-10 участников по очкам
/info - Детальная информация о вашем профиле
Служите чату верой и правдой, чтобы достичь высших воинских званий! 🎖️
""",
'rank_title': '🏆 Ваш рейтинг:\n\nОчки: {score}\nПредупреждений: {warnings}\nРоль: {role}',
'rank_not_found': 'Информация о вас не найдена.',
'leaderboard_title': '🏆 Топ-10 участников:\n\n',
'leaderboard_empty': 'Рейтинг пока пуст.',
'leaderboard_entry': '{position}. {name} - {score} очков\n',
'promotion_message': '🌟 За активное участие в группе {name} получил(-а) новое звание {new_rank}!',
}
# Сообщения модерации
MODERATION_MESSAGES = {
'no_permission': '❌ У вас нет прав для выполнения этой команды.',
'user_banned': '🚫 Пользователь {user_id} забанен.\nПричина: {reason}',
'user_unbanned': '✅ Пользователь {user_id} разбанен.',
'user_muted': '🔇 Пользователь {user_id} заглушен на {time} секунд.',
'user_unmuted': '🔊 Заглушка с пользователя {user_id} снята.',
'user_kicked': '👢 Пользователь {user_id} кикнут.\nПричина: {reason}',
'user_promoted': '⬆️ Пользователь {user_id} повышен до модератора.',
'user_demoted': '⬇️ Пользователь {user_id} понижен с модератора.',
'warning_issued': '⚠️ Предупреждение выдано пользователю {user_id} по причине: {reason}',
'ban_usage': 'Использование: /ban [пользователь] [причина]',
'unban_usage': 'Использование: /unban [пользователь]',
'mute_usage': 'Использование: /mute [пользователь] [время_в_секундах]',
'kick_usage': 'Использование: /kick [пользователь] [причина]',
'promote_usage': 'Использование: /promote [пользователь]',
'demote_usage': 'Использование: /demote [пользователь]',
'warn_usage': 'Использование: /warn [пользователь] [причина]',
'mute_invalid_time': '❌ Время должно быть числом в секундах.',
'ban_error': '❌ Ошибка при бане пользователя: {error}',
'unban_error': '❌ Ошибка при разбане пользователя: {error}',
'mute_error': '❌ Ошибка при mute пользователя: {error}',
'unmute_error': '❌ Ошибка при unmute пользователя: {error}',
'kick_error': '❌ Ошибка при кике пользователя: {error}',
'promote_error': '❌ Ошибка при повышении пользователя: {error}',
'demote_error': '❌ Ошибка при понижении пользователя: {error}',
}
# Сообщения игр
GAME_MESSAGES = {
'select_game': '🎮 Выберите игру:',
'rps_game': '🤖 Камень, ножницы, бумага!\n\nВыберите ваш ход:',
'tic_tac_toe_game': '❌⭕ Крестики-нолики!\n\nВы ходите первым. Выберите клетку:',
'quiz_game': '🧠 Викторина:\n\n{question}',
'rps_win': '🎉 Вы выиграли!\n\nВаш выбор: {user_choice}\nМой выбор: {bot_choice}',
'rps_lose': '😞 Вы проиграли!\n\nВаш выбор: {user_choice}\nМой выбор: {bot_choice}',
'rps_draw': '🤝 Ничья!\n\nВаш выбор: {user_choice}\nМой выбор: {bot_choice}',
'tic_tac_toe_win': '🎉 Вы выиграли! 🏆',
'tic_tac_toe_lose': '😞 Вы проиграли. Бот победил!',
'tic_tac_toe_draw': '🤝 Ничья!',
'quiz_correct': '🎉 Правильно! Вы заработали 5 очков!\n\nВопрос: {question}\nОтвет: {answer}',
'quiz_wrong': '❌ Неправильно!\n\nВопрос: {question}\nПравильный ответ: {correct_answer}',
'quiz_not_found': 'Вопрос викторины не найден.',
'invalid_move': 'Неверный ход!',
'game_over': 'Неверный формат хода!',
'battleship_start': '🚢 Морской бой!\n\nБот разместил корабли. Ваша очередь стрелять!\n\nПоле 5x5 для удобства.\nИспользуйте кнопки ниже для стрельбы.',
'battleship_hit': '💥 Попадание!',
'battleship_miss': '💧 Промах!',
'battleship_sunk': '💥 Корабль потоплен!',
'battleship_win': '🎉 Поздравляем! Вы победили в Морском бое! +15 очков',
'battleship_lose': '😞 Вы проиграли! Все корабли потоплены.',
'battleship_already_shot': 'Вы уже стреляли в эту клетку!',
'battleship_invalid_coord': 'Неверные координаты!',
}
# Сообщения погоды
WEATHER_MESSAGES = {
'no_api_key': 'API ключ для погоды не настроен.',
'weather_info': '🌤️ Погода в {city}:\n\nТемпература: {temp}°C\nОщущается как: {feels_like}°C\nВлажность: {humidity}%\nОписание: {description}',
'city_not_found': 'Город не найден.',
'weather_error': 'Ошибка при получении погоды: {error}',
}
# Сообщения новостей
NEWS_MESSAGES = {
'no_api_key': 'API ключ для новостей не настроен.',
'news_title': '📰 Последние новости:\n\n',
'news_not_found': 'Новости не найдены.',
'news_error': 'Ошибка при получении новостей: {error}',
}
# Сообщения перевода
TRANSLATE_MESSAGES = {
'usage': 'Использование: /translate [текст] [язык] (например: /translate hello en)',
'result': 'Перевод "{text}" на {lang}: [здесь будет перевод]',
'error': 'Ошибка при переводе: {error}',
}
# Сообщения импорта CSV
IMPORT_MESSAGES = {
'no_permission': '❌ У вас нет прав для выполнения этой команды.',
'usage': 'Использование: /import_csv [путь_к_файлу]\n\nПо умолчанию: /import_csv chat_-1001519866478_users_full_20251014.csv',
'start_import': '🔄 Начинаю импорт пользователей из файла: {file}',
'success': '✅ Импорт пользователей успешно завершен!',
'error': '❌ Произошла ошибка при импорте пользователей.',
'file_error': '❌ Ошибка при импорте: {error}',
}
# Сообщения пользователя
USER_MESSAGES = {
'welcome': '''Привет, {name}! 👋
Я ваш помощник в чате. Вот что я умею:
• Отвечать на сообщения
• Вести рейтинг участников
• Предоставлять погоду и новости
• Играть в мини-игры
• Помогать с модерацией
Используйте /help для подробной информации.''',
'help_welcome': '''Привет, {name}! 👋
Я ваш помощник в чате. Вот что я умею:
• Отвечать на сообщения
• Вести рейтинг участников
• Предоставлять погоду и новости
• Играть в мини-игры
• Помогать с модерацией
Используйте /help для подробной информации.''',
'unknown_message': '''🤖 Извините, я не понял ваше сообщение. Вот что я умею:
• Отвечать на простые вопросы
• Вести рейтинг участников
• Предоставлять погоду и новости
• Играть в мини-игры
• Помогать с модерацией
Используйте /help для подробной информации.''',
'bonus_points': '🎁 Бонус! Вам начислено {points} очков!',
'welcome_new_user': '''🎉 Добро пожаловать в чат, {name}!
Мы рады видеть вас здесь! Используйте /help чтобы узнать о возможностях бота.''',
'info_not_found': 'Информация не найдена.',
}
# Сообщения инлайнового поиска
INLINE_MESSAGES = {
'weather_title': 'Погода в {city}',
'weather_text': '🌤️ Погода в {city}:\nТемпература: {temp}°C\nОщущается как: {feels_like}°C\nВлажность: {humidity}%\nОписание: {description}',
'weather_not_found': 'Город не найден',
'translate_title': 'Перевод на {lang}',
'translate_text': 'Перевод "{text}" на {lang}: [здесь будет перевод]',
}
# Технические сообщения
TECH_MESSAGES = {
'db_connected': 'Успешное подключение к SQLite базе данных',
'db_tables_created': 'Таблицы созданы успешно',
'db_connection_error': 'Ошибка при подключении к SQLite: {error}',
'db_tables_error': 'Ошибка при создании таблиц: {error}',
'user_added_error': 'Ошибка при добавлении пользователя: {error}',
'score_update_error': 'Ошибка при обновлении очков: {error}',
'reputation_update_error': 'Ошибка при обновлении репутации: {error}',
'rank_update_error': 'Ошибка при обновлении ранга: {error}',
'warning_add_error': 'Ошибка при добавлении предупреждения: {error}',
'user_info_error': 'Ошибка при получении информации о пользователе: {error}',
'top_users_error': 'Ошибка при получении топ пользователей: {error}',
'warnings_get_error': 'Ошибка при получении предупреждений: {error}',
'csv_import_success': 'Импорт завершен. Добавлено: {added}, Обновлено: {updated}',
'csv_import_error': 'Ошибка при импорте пользователей из CSV: {error}',
'csv_file_not_found': 'Файл {file} не найден',
'csv_row_error': 'Ошибка обработки строки: {row}. Ошибка: {error}',
'scheduler_started': 'Планировщик постов запущен',
'scheduler_stopped': 'Планировщик постов остановлен',
'scheduler_error': 'Ошибка в планировщике: {error}',
'post_published': 'Пост {post_id} опубликован в чат {chat_id}',
'post_publish_error': 'Ошибка при публикации поста {post_id}: {error}',
'posts_check_error': 'Ошибка при проверке постов: {error}',
'callback_error': 'Ошибка при обработке инлайнового запроса: {error}',
'db_closed': 'Соединение с SQLite закрыто',
}
# Игровые элементы
GAME_CHOICES = {
'rock': '🪨 Камень',
'paper': '📄 Бумага',
'scissors': '✂️ Ножницы',
}
# Клавиатуры для игр
GAME_KEYBOARDS = {
'main_menu': [
['📋 Помощь', '🎮 Мини игры']
],
'games_menu': [
['Камень-ножницы-бумага', 'Крестики-нолики'],
['Викторина'],
['⬅️ Назад']
],
'rps_game': [
['🪨 Камень', '📄 Бумага'],
['✂️ Ножницы']
],
'help_menu': [
['🚀 Старт', '🔄 Начать заново']
],
}
# Викторина
QUIZ_QUESTIONS = [
{"question": "Столица Франции?", "answers": ["Париж", "Лондон", "Берлин"], "correct": 0},
{"question": "2 + 2 = ?", "answers": ["3", "4", "5"], "correct": 1},
{"question": "Цвет неба?", "answers": ["Зеленый", "Синий", "Красный"], "correct": 1},
{"question": "Сколько планет в Солнечной системе?", "answers": ["8", "9", "10"], "correct": 0},
{"question": "Какой язык программирования мы используем?", "answers": ["JavaScript", "Python", "Java"], "correct": 1}
]
# Константы для рангов
RANK_THRESHOLDS = [
(0, "Рядовой"),
(100, "Ефрейтор"),
(235, "Младший сержант"),
(505, "Сержант"),
(810, "Старший сержант"),
(1250, "Старшина"),
(1725, "Прапорщик"),
(2335, "Старший прапорщик"),
(2980, "Младший лейтенант"),
(3760, "Лейтенант"),
(4575, "Старший лейтенант"),
(5525, "Капитан"),
(6510, "Майор"),
(7630, "Подполковник"),
(8785, "Полковник"),
(16075, "Генерал майор"),
(32150, "Генерал лейтенант"),
(64300, "Генерал полковник"),
(128600, "Генерал армии"),
(256000, "Маршал")
]
# Константы для очков
SCORE_VALUES = {
'message': 1,
'game_win': 5,
'tic_tac_toe_win': 15,
'bonus_min': 1,
'bonus_max': 5,
'reputation_per_message': 1,
}
# Константы планировщика
SCHEDULER_CONFIG = {
'check_interval': 30, # секунд
'time_format': '%Y-%m-%d %H:%M:%S',
}
# Статусы постов
POST_STATUSES = {
'scheduled': 'scheduled',
'published': 'published',
}
# Роли пользователей
USER_ROLES = {
'user': 'user',
'moderator': 'moderator',
'admin': 'admin',
}
# Статусы пользователей Telegram
TELEGRAM_STATUSES = {
'member': 'member',
'administrator': 'administrator',
'creator': 'creator',
}