mirror of
https://github.com/FerraSoft/bottohelp.git
synced 2026-08-06 21:55:03 +00:00
394 lines
21 KiB
Python
394 lines
21 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
Константы и текстовые сообщения для Telegram бота
|
|
"""
|
|
|
|
# Предопределенные ответы
|
|
PREDEFINED_RESPONSES = {
|
|
'привет': 'Привет! Как дела?',
|
|
'как дела': 'Отлично! А у тебя?',
|
|
'что делаешь': 'Отвечаю на сообщения в чате 😊',
|
|
'спасибо': 'Пожалуйста! Рад помочь!',
|
|
'пока': 'До свидания! Заходи еще!',
|
|
}
|
|
|
|
# Текст справки
|
|
HELP_TEXT = """
|
|
🤖 <b>Команды бота:</b>
|
|
|
|
<b>Основные:</b>
|
|
/start - Начать работу с ботом
|
|
/help - Показать это сообщение
|
|
/info - Информация о вас
|
|
|
|
<b>Рейтинг:</b>
|
|
/rank - Ваш текущий рейтинг
|
|
/ranks_info - Информация о системе рангов
|
|
/leaderboard - Топ-10 участников
|
|
|
|
<b>Информация:</b>
|
|
/weather [город] - Погода в городе
|
|
/news - Последние новости
|
|
/translate [текст] [язык] - Перевод текста
|
|
|
|
<b>Прочее:</b>
|
|
Введите "реквизиты" - Получить реквизиты для оплаты
|
|
|
|
<b>Игры:</b>
|
|
/play_game - Запустить мини-игру
|
|
|
|
<b>Посты по расписанию (только для админов):</b>
|
|
/schedule_post [время] [текст] - Запланировать пост
|
|
/list_posts - Показать запланированные посты
|
|
/delete_post [ID] - Удалить пост по расписанию
|
|
/publish_now [ID] - Опубликовать пост немедленно
|
|
|
|
<b>Модерация (только для админов):</b>
|
|
/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': """
|
|
🏆 <b>Военная система рангов</b>
|
|
|
|
<b>Как работает система:</b>
|
|
• Каждый участник начинает с звания "Рядовой"
|
|
• Звание повышается автоматически при достижении определенного количества очков
|
|
• Очки начисляются за активность в чате и победы в играх
|
|
|
|
<b>Иерархия званий:</b>
|
|
🪖 Рядовой (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 очков)
|
|
|
|
<b>Как получить очки:</b>
|
|
• +1 очко за каждое сообщение в чате
|
|
• +5 очков за победу в мини-игре
|
|
• +15 очков за победу в крестиках-ноликах
|
|
• Бонусные очки за активность (случайно 1-5 очков)
|
|
|
|
<b>Команды для работы с рангом:</b>
|
|
/rank - Показать ваш текущий ранг и очки
|
|
/leaderboard - Топ-10 участников по очкам
|
|
/info - Детальная информация о вашем профиле
|
|
|
|
Служите чату верой и правдой, чтобы достичь высших воинских званий! 🎖️
|
|
""",
|
|
'rank_title': '🏆 <b>Ваш рейтинг:</b>\n\nОчки: {score}\nПредупреждений: {warnings}\nРоль: {role}',
|
|
'rank_not_found': 'Информация о вас не найдена.',
|
|
'leaderboard_title': '🏆 <b>Топ-10 участников:</b>\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': '🚢 <b>Морской бой!</b>\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': '🌤️ <b>Погода в {city}:</b>\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': '📰 <b>Последние новости:</b>\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',
|
|
} |