/
temast
/
AMIR
Обзор
Документация
Войти
/
temast
/
AMIR
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
PND
1 308 строк
68 KB
temast
create PND
19 ноя 2025, 10:30
19 ноя 2025, 10:30
8cbd119
Код
Авторство
О чём код?
import json import logging import os from datetime import time, datetime from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup from telegram.ext import Application, CommandHandler, CallbackQueryHandler, ContextTypes import pytz from pytz import timezone # === Настройки === DATA_FILE = "user_data.json" DEFAULT_TZ = "Europe/Moscow" def load_user_data(): if os.path.exists(DATA_FILE): try: with open(DATA_FILE, "r", encoding="utf-8") as f: return json.load(f) except Exception as e: logging.error(f"Ошибка загрузки данных: {e}") return {} def save_user_data(data): with open(DATA_FILE, "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, indent=2) user_data = load_user_data() # === 50 ВЫЗОВОВ === CHALLENGES_LIST = [ ("7 дней приседаний", "50 приседаний в день"), ("2 литра воды", "Пей воду — будь бодрым!"), ("Найди напарника", "Проведи тренировку с партнером"), ("Утренний Нурлат", "Сделай 5-минутную утреннюю зарядку 5 дней подряд"), ("Завтрак чемпиона", "Неделю ешь здоровый завтрак с утра"), ("7 дней растяжки", "Неделю выполняй 10-минутную растяжку"), ("Фото в форме", "Опубликуй фото в спортивной форме"), ("Осмотри Нурлат по-новому", "30 минут ходьбы в день целую неделю"), ("Напиши напарнику спасибо", "Поблагодари напарника сообщением после тренировки"), ("7 дней без пропусков", "Выполни любую тренировку 7 дней подряд"), ("Без сахара", "Откажись от сахара на 7 дней"), ("Ранняя пташка", "Вставай до 7 утра 5 дней подряд"), ("Без фастфуда", "Не ешь фастфуд неделю"), ("10 000 шагов", "Проходи 10 000 шагов ежедневно"), ("Медитация", "Медитируй 5 минут каждый день"), ("Без соцсетей", "1 час без соцсетей перед сном"), ("Пробежка в парке", "Беги 20 минут в парке «Победа»"), ("Силовая неделя", "Тренируй силу 4 раза за неделю"), ("Кардио-день", "30 минут кардио без перерыва"), ("Йога-утро", "Делай йогу каждое утро"), ("Питьевой режим", "Выпивай стакан воды сразу после пробуждения"), ("Без газировки", "Откажись от газированных напитков на неделю"), ("Сон 8 часов", "Спи не менее 8 часов 5 ночей подряд"), ("Фруктовый день", "Съешь 3 разных фрукта каждый день"), ("Овощной ужин", "Ужинай только овощами 3 дня"), ("Без хлеба", "Откажись от хлеба на 5 дней"), ("Тренировка на свежем воздухе", "Занимайся на улице 3 раза"), ("Мотивационная цитата", "Отправь другу цитату о силе воли"), ("День без жалоб", "Не жалуйся целый день"), ("Благодарность", "Запиши 3 вещи, за которые благодарен"), ("План на день", "Планируй свой день с вечера"), ("Без перекусов", "Не ешь между приёмами пищи 3 дня"), ("Зарядка для глаз", "Делай гимнастику для глаз каждый час"), ("Дыхание", "Практикуй глубокое дыхание 5 минут"), ("Холодный душ", "Прими контрастный душ утром"), ("Чтение", "Читай 10 страниц полезной книги"), ("Без алкоголя", "Откажись от алкоголя на неделю"), ("Спортивная форма", "Носи спортивную одежду весь день"), ("Тренировка в новом месте", "Попробуй тренироваться в новом парке или зале"), ("День силы", "Сделай 100 отжиманий за день (можно по частям)"), ("День ног", "Сделай 150 приседаний за день"), ("Пресс-день", "Выполни 200 скручиваний"), ("Без лифта", "Ходи только по лестнице неделю"), ("Уборка как тренировка", "Убирайся энергично 30 минут"), ("Танцы", "Танцуй 15 минут под любимую музыку"), ("Прыжки", "Сделай 3 подхода по 50 прыжков 'ножницы'"), ("Стойка у стены", "Стоя у стены — 5 минут без движения"), ("Баланс", "Стоя на одной ноге — 1 минута на каждую"), ("Поза лотоса", "Посиди в позе лотоса 10 минут"), ("Смех", "Смейся от души хотя бы раз в день!") ] # === ПОЛНЫЕ ТРЕНИРОВКИ НА ВСЮ НЕДЕЛЮ === WORKOUT_PROGRAMS = { "beginner": { "home": { "Пн": ( "🏠 *Новичок — Дома — Понедельник*\n\n" "✅ *Цель*: Активация мышц, привыкание к нагрузке\n\n" "1️⃣ *Разминка (5 мин)*\n" "• Вращения шеей, плечами, тазом — по 10 раз\n" "• Бег на месте — 1 мин\n" "• Наклоны в стороны — 10 раз\n\n" "2️⃣ *Приседания — 3×10*\n" "• Стопы на ширине плеч, спина прямая\n" "• Отдых: 45 сек\n\n" "3️⃣ *Отжимания с колен — 3×8*\n" "• Тело прямое от колен до головы\n" "• Отдых: 45 сек\n\n" "4️⃣ *Планка — 3×20 сек*\n" "• Локти под плечами, живот втянут\n\n" "💡 Нет инвентаря? Отлично! Всё упражнения без оборудования." ), "Вт": ( "🚶 *Новичок — Дома — Вторник*\n\n" "✅ *Активный отдых*\n\n" "• Прогулка на свежем воздухе — 30–45 минут\n" "• Лёгкая растяжка после прогулки — 10 минут\n\n" "💡 Ходи быстрым шагом, дыши глубоко!" ), "Ср": ( "🏠 *Новичок — Дома — Среда*\n\n" "1️⃣ *Разминка — 5 мин*\n" "2️⃣ *Мостик — 3×15 сек*\n" "• Лягте на спину, поднимите таз\n" "• Отдых: 30 сек\n\n" "3️⃣ *Выпады — 3×10 на ногу*\n" "• Шаг вперёд, опускайтесь до 90°\n" "• Отдых: 45 сек\n\n" "4️⃣ *Скручивания — 3×12*\n" "• Руки за голову, лопатки от пола\n" "• Отдых: 30 сек\n\n" "5️⃣ *Планка — 3×25 сек*" ), "Чт": ( "🛌 *Новичок — Дома — Четверг*\n\n" "✅ *Полный отдых*\n\n" "• Дайте телу восстановиться\n" "• Можно сделать лёгкую растяжку 10 минут\n\n" "💡 Восстановление — часть прогресса!" ), "Пт": ( "🏠 *Новичок — Дома — Пятница*\n\n" "1️⃣ *Разминка — 5 мин*\n" "2️⃣ *Отжимания — 3×6*\n" "• С колен или с пола — по силам\n" "• Отдых: 45 сек\n\n" "3️⃣ *Приседания — 3×12*\n" "• Медленно вниз, быстро вверх\n" "• Отдых: 45 сек\n\n" "4️⃣ *Планка — 3×30 сек*\n" "• Не поднимайте таз!\n\n" "5️⃣ *Растяжка — 5 мин*" ), "Сб": ( "🏃 *Новичок — Дома — Суббота*\n\n" "✅ *Кардио*\n\n" "• Ходьба или лёгкий бег — 20–30 минут\n" "• Темп: можете говорить, но не петь\n\n" "💡 Бегайте в парке «Победа» в Нурлате!" ), "Вс": ( "🧘 *Новичок — Дома — Воскресенье*\n\n" "✅ *Растяжка и восстановление*\n\n" "• Йога или стретчинг — 15–20 минут\n" "• Сосредоточьтесь на ногах и спине\n\n" "💡 Используйте YouTube: «йога для начинающих»" ) }, "gym": { "Пн": ( "🏋️ *Новичок — В зале — Понедельник*\n\n" "✅ *Цель*: Освоение базовых движений\n\n" "1️⃣ *Разминка (10 мин)*\n" "• Беговая дорожка — 5 мин (лёгкий темп)\n" "• Динамическая растяжка — 5 мин\n\n" "2️⃣ *Приседания со штангой — 3×8*\n" "• Начни с пустого грифа (20 кг)\n" "• Следи за техникой!\n" "• Отдых: 60 сек\n\n" "3️⃣ *Жим гантелей лёжа — 3×10*\n" "• Лёжа на скамье, локти под 75°\n" "• Отдых: 60 сек\n\n" "4️⃣ *Тяга вертикального блока — 3×12*\n" "• Спина прямая, тяни к груди\n\n" "💡 Попроси тренера проверить технику!" ), "Вт": ( "🚶 *Новичок — В зале — Вторник*\n\n" "✅ *Активный отдых*\n\n" "• Прогулка или лёгкая езда на велотренажёре — 20 мин\n" "• Растяжка — 10 мин\n\n" "💡 Не пропускайте день отдыха!" ), "Ср": ( "🏋️ *Новичок — В зале — Среда*\n\n" "1️⃣ *Разминка — 5 мин*\n" "2️⃣ *Разгибания ног — 3×12*\n" "• В тренажёре для квадрицепсов\n" "• Отдых: 45 сек\n\n" "3️⃣ *Сгибания рук — 3×10*\n" "• На блоке или с гантелями\n" "• Отдых: 45 сек\n\n" "4️⃣ *Планка — 3×30 сек*\n" "• В зале можно на коврике\n\n" "💡 Контролируйте движение — не рывками!" ), "Чт": ( "🛌 *Новичок — В зале — Четверг*\n\n" "✅ *Полный отдых*\n\n" "• Восстановление мышц\n" "• Можно принять контрастный душ\n\n" "💡 Сон — лучшее восстановление!" ), "Пт": ( "🏋️ *Новичок — В зале — Пятница*\n\n" "1️⃣ *Разминка — 5 мин*\n" "2️⃣ *Жим ногами — 3×10*\n" "• В тренажёре, стопы на ширине плеч\n" "• Отдых: 60 сек\n\n" "3️⃣ *Разведения гантелей — 3×12*\n" "• Лёжа на скамье, локти чуть согнуты\n" "• Отдых: 45 сек\n\n" "4️⃣ *Гиперэкстензия — 3×15*\n" "• Для спины, без веса\n\n" "💡 Не перегружайте поясницу!" ), "Сб": ( "❤️ *Новичок — В зале — Суббота*\n\n" "✅ *Кардио*\n\n" "• Эллипс или велотренажёр — 20 минут\n" "• Пульс 120–140 уд/мин\n\n" "💡 Кардио улучшает выносливость!" ), "Вс": ( "🧘 *Новичок — В зале — Воскресенье*\n\n" "✅ *Растяжка*\n\n" "• Используйте коврик в зале\n" "• Уделите внимание ногам и плечам — 15 мин\n\n" "💡 Гибкость снижает риск травм!" ) } }, "intermediate": { "home": { "Пн": ( "🏠 *Средний — Дома — Понедельник*\n\n" "• Бёрпи — 4×10\n" "• Приседания с прыжком — 4×12\n" "• Отжимания — 4×12\n" "• Подъёмы ног лёжа — 3×15\n" "• Планка с подъёмом рук — 3×20\n" "• Отдых между подходами: 45 сек\n\n" "💡 Используй рюкзак с книгами для утяжеления!" ), "Вт": ( "❤️ *Средний — Дома — Вторник*\n\n" "✅ *Кардио*\n\n" "• Бег на улице — 20–25 минут\n" "• Или скакалка — 5 подходов по 1 мин\n\n" "💡 Интервалы: 1 мин бег / 30 сек ходьба" ), "Ср": ( "🏠 *Средний — Дома — Среда*\n\n" "• Выпады с рюкзаком — 3×10/нога\n" "• Отжимания на кулаках — 4×10\n" "• Велосипед — 3×20\n" "• Мостик с подъёмом ноги — 3×12/нога\n" "• Планка — 3×45 сек\n\n" "💡 Контроль — важнее скорости!" ), "Чт": ( "🛌 *Средний — Дома — Четверг*\n\n" "✅ *Отдых или лёгкая йога*\n\n" "• 20 минут растяжки\n" "• Дыхательные упражнения\n\n" "💡 Восстановление = рост мышц!" ), "Пт": ( "🏠 *Средний — Дома — Пятница*\n\n" "• Плие-приседания — 4×15\n" "• Австралийские подтягивания (если есть турник) — 4×10\n" "• Русские скручивания — 3×20\n" "• Планка с касанием плеча — 3×10/сторона\n\n" "💡 Нет турника? Замени на отжимания!" ), "Сб": ( "⚡ *Средний — Дома — Суббота*\n\n" "✅ *HIIT-комплекс (4 круга)*\n\n" "1. Бёрпи — 10\n" "2. Приседания — 15\n" "3. Отжимания — 12\n" "4. Скручивания — 20\n" "5. Планка — 30 сек\n" "• Отдых между кругами: 2 мин\n\n" "💡 Делай без остановок внутри круга!" ), "Вс": ( "🧘 *Средний — Дома — Воскресенье*\n\n" "✅ *Глубокая растяжка*\n\n" "• Фокус на подколенниках, квадрицепсах, груди\n" "• Удерживай каждую позу 30–45 сек\n\n" "💡 Используй приложение «Stretching & Yoga»" ) }, "gym": { "Пн": ( "🏋️ *Средний — В зале — Понедельник*\n\n" "• Жим лёжа — 4×10\n" "• Тяга штанги в наклоне — 4×10\n" "• Отжимания на брусьях — 3×10\n" "• Подтягивания — 3×8\n" "• Скручивания на пресс — 3×15\n" "• Отдых: 60–90 сек между силовыми\n\n" "💡 Увеличивай вес каждую неделю на 2.5 кг." ), "Вт": ( "🦵 *Средний — В зале — Вторник*\n\n" "• Приседания со штангой — 4×12\n" "• Румынская тяга — 4×10\n" "• Болгарские выпады — 3×10/нога\n" "• Икры — 4×20\n" "• Гиперэкстензия — 3×15\n\n" "💡 Контролируй негативную фазу!" ), "Ср": ( "❤️ *Средний — В зале — Среда*\n\n" "✅ *Кардио + кор*\n\n" "• Беговая дорожка — 20 мин (интервалы)\n" "• Планка — 3×45 сек\n" "• Велосипед — 3×20\n" "• Русские скручивания — 3×15\n\n" "💡 Кардио после силы — для жиросжигания!" ), "Чт": ( "💪 *Средний — В зале — Четверг*\n\n" "• Тяга верхнего блока — 4×12\n" "• Гиперэкстензия — 4×15\n" "• Сгибания рук — 4×10\n" "• Разгибания на блоке — 4×12\n" "• Планка — 3×60 сек\n\n" "💡 Спина и бицепс — в один день!" ), "Пт": ( "🦵 *Средний — В зале — Пятница*\n\n" "• Жим ногами — 4×12\n" "• Выпады со штангой — 3×10/нога\n" "• Сгибания ног лёжа — 4×15\n" "• Икры сидя — 4×20\n" "• Вакуум — 3×30 сек\n\n" "💡 Ноги — самая большая мышечная группа!" ), "Сб": ( "⚡ *Средний — В зале — Суббота*\n\n" "✅ *Функциональный день*\n\n" "• Гиревой свинг — 4×15\n" "• Бёрпи с гантелью — 3×12\n" "• Прыжки на тумбу — 4×10\n" "• Скакалка — 5×30 сек\n\n" "💡 Развивай выносливость и взрывную силу!" ), "Вс": ( "🛌 *Средний — В зале — Воскресенье*\n\n" "✅ *Полный отдых*\n\n" "• Массаж или баня\n" "• Лёгкая прогулка\n\n" "💡 Неделя завершена — молодец!" ) } }, "advanced": { "home": { "Пн": ( "🏠 *Продвинутый — Дома — Понедельник*\n\n" "• Пистолетики (приседания на одной ноге) — 3×5/нога\n" "• Отжимания с хлопком — 4×8\n" "• Подтягивания — 4×10\n" "• Планка с подъёмом ног — 3×30 сек\n" "• Бёрпи с прыжком — 4×12\n\n" "💡 Нужен турник и коврик. Без инвентаря — фокус на весе тела." ), "Вт": ( "❤️ *Продвинутый — Дома — Вторник*\n\n" "✅ *Кардио с интервалами*\n\n" "• Бег: 1 мин спринт / 30 сек отдых — 10 кругов\n" "• Или скакалка: 30 сек макс / 30 сек отдых — 10 кругов\n\n" "💡 Развивай VO2 max!" ), "Ср": ( "🏠 *Продвинутый — Дома — Среда*\n\n" "• Выпады с прыжком — 4×10/нога\n" "• Отжимания на одной руке (в наклоне) — 3×5/рука\n" "• Велосипед — 4×25\n" "• Подъёмы ног в висе (если есть турник) — 4×12\n" "• Планка с касанием — 3×15/сторона\n\n" "💡 Контроль и медленная негатива!" ), "Чт": ( "🧘 *Продвинутый — Дома — Четверг*\n\n" "✅ *Активный отдых*\n\n" "• Йога продвинутого уровня — 30 мин\n" "• Дыхательные практики\n\n" "💡 Гибкость и дыхание — основа силы!" ), "Пт": ( "🏠 *Продвинутый — Дома — Пятница*\n\n" "• Плие-приседания с рюкзаком — 4×20\n" "• Подтягивания обратным хватом — 4×8\n" "• Русские скручивания с весом — 4×20\n" "• Мостик с подъёмом — 4×10\n" "• Планка на одной руке — 3×15/рука\n\n" "💡 Утяжеляй рюкзак постепенно!" ), "Сб": ( "🔄 *Продвинутый — Дома — Суббота*\n\n" "✅ *Фулбоди-комплекс (5 кругов)*\n\n" "1. Пистолетики — 5/нога\n" "2. Подтягивания — 8\n" "3. Отжимания с хлопком — 10\n" "4. Бёрпи — 15\n" "5. Планка — 60 сек\n" "• Отдых между кругами: 3 мин\n\n" "💡 Это вызов даже для профи!" ), "Вс": ( "🧘 *Продвинутый — Дома — Воскресенье*\n\n" "✅ *Глубокая растяжка + медитация*\n\n" "• Удерживай позы 60 сек\n" "• Медитация — 10–15 мин\n\n" "💡 Восстановление на высшем уровне!" ) }, "gym": { "Пн": ( "🏋️ *Продвинутый — В зале — Понедельник*\n\n" "• Жим лёжа — 5×5 (85% 1ПМ)\n" "• Жим под углом — 4×8\n" "• Отжимания на брусьях — 4×12\n" "• Разведения гантелей — 3×15\n" "• Французский жим — 4×10\n\n" "💡 Прогрессия: +2.5 кг каждую неделю в жиме." ), "Вт": ( "🦵 *Продвинутый — В зале — Вторник*\n\n" "• Подтягивания — 5×8\n" "• Тяга штанги в наклоне — 4×10\n" "• Гиперэкстензия с весом — 4×12\n" "• Молотки — 4×12\n" "• Концентрированные сгибания — 3×10\n\n" "💡 Спина — основа силы!" ), "Ср": ( "🦵 *Продвинутый — В зале — Среда*\n\n" "• Присед со штангой — 5×5\n" "• Румынская тяга — 4×8\n" "• Жим ногами — 4×12\n" "• Выпады со штангой — 3×10/нога\n" "• Икры — 5×20\n\n" "💡 Ноги — король тренировок!" ), "Чт": ( "❤️ *Продвинутый — В зале — Четверг*\n\n" "✅ *HIIT + кор*\n\n" "• Беговая дорожка: 30 сек спринт / 30 сек отдых — 10 кругов\n" "• Планка — 3×60 сек\n" "• Вакуум — 4×30 сек\n" "• Подъёмы ног в висе — 4×15\n\n" "💡 Жиросжигание на максимуме!" ), "Пт": ( "💪 *Продвинутый — В зале — Пятница*\n\n" "• Армейский жим — 5×6\n" "• Махи в стороны — 4×20\n" "• Обратные отжимания — 4×15\n" "• Разгибания на блоке — 4×12\n" "• Сгибания на прямой блок — 4×15\n\n" "💡 Плечи и руки — для эстетики!" ), "Сб": ( "🔄 *Продвинутый — В зале — Суббота*\n\n" "✅ *Фулбоди-комплекс (4 круга)*\n\n" "1. Жим лёжа — 8\n" "2. Подтягивания — 8\n" "3. Присед — 12\n" "4. Тяга штанги — 12\n" "5. Планка — 60 сек\n" "• Отдых между кругами: 4 мин\n\n" "💡 Заверши неделю мощно!" ), "Вс": ( "🧘 *Продвинутый — В зале — Воскресенье*\n\n" "✅ *Активный отдых*\n\n" "• Лёгкая растяжка в зале\n" "• Массаж или сауна\n\n" "💡 Восстановление — залог прогресса!" ) } } } # === ПОЛНОЕ МЕНЮ НА НЕДЕЛЮ === MENUS = { "low": { "Пн": ( "🍽️ *Понедельник (низкий бюджет)*\n\n" "🌅 *Завтрак (320 ккал)*\n" "• Овсянка на воде (40 г) — 150 ккал\n" "• Яблоко — 80 ккал\n" "• Чай без сахара\n\n" "🌇 *Обед (450 ккал)*\n" "• Гречка (50 г сухой) — 170 ккал\n" "• Тушеная капуста — 100 ккал\n" "• Яйцо — 80 ккал\n" "• Хлеб — 100 ккал\n\n" "🌃 *Ужин (200 ккал)*\n" "• Творог 5% (100 г) — 120 ккал\n" "• Кефир 1% (200 мл) — 80 ккал\n\n" "🍏 *Перекус*: Банан — 90 ккал" ), "Вт": ( "🍽️ *Вторник (низкий бюджет)*\n\n" "🌅 Завтрак: Манная каша на молоке (30 г) + чай — 280 ккал\n" "🌇 Обед: Рис (40 г) + куриные голени (120 г) + салат — 500 ккал\n" "🌃 Ужин: Омлет из 2 яиц + огурец — 220 ккал\n" "🍏 Перекус: Яблоко — 80 ккал" ), "Ср": ( "🍽️ *Среда (низкий бюджет)*\n\n" "🌅 Завтрак: Гречка с молоком — 300 ккал\n" "🌇 Обед: Суп из чечевицы + хлеб — 400 ккал\n" "🌃 Ужин: Тушеная капуста с морковью — 200 ккал\n" "🍏 Перекус: Кефир — 100 ккал" ), "Чт": ( "🍽️ *Четверг (низкий бюджет)*\n\n" "🌅 Завтрак: Овсянка + ложка мёда + яблоко — 320 ккал\n" "🌇 Обед: Макароны + фасоль в томате — 450 ккал\n" "🌃 Ужин: Яйцо варёное + салат из капусты — 200 ккал\n" "🍏 Перекус: Груша — 80 ккал" ), "Пт": ( "🍽️ *Пятница (низкий бюджет)*\n\n" "🌅 Завтрак: Рисовая каша на молоке — 300 ккал\n" "🌇 Обед: Суп-пюре из тыквы — 350 ккал\n" "🌃 Ужин: Творог + яблоко тёртое — 220 ккал\n" "🍏 Перекус: Йогурт без добавок — 120 ккал" ), "Сб": ( "🍽️ *Суббота (низкий бюджет)*\n\n" "🌅 Завтрак: Омлет + чай — 280 ккал\n" "🌇 Обед: Гречка + тушеная рыба (минтай) — 480 ккал\n" "🌃 Ужин: Кефир + хлеб с сыром — 250 ккал\n" "🍏 Перекус: Яблоко — 80 ккал" ), "Вс": ( "🍽️ *Воскресенье (низкий бюджет)*\n\n" "🌅 Завтрак: Овсянка + изюм — 320 ккал\n" "🌇 Обед: Суп из перловки с овощами — 400 ккал\n" "🌃 Ужин: Тушеные овощи + яйцо — 250 ккал\n" "🍏 Перекус: Банан — 90 ккал" ) }, "medium": { "Пн": ( "🥗 *Понедельник (средний бюджет)*\n\n" "🌅 Завтрак: Омлет с помидорами (2 яйца) + тост — 350 ккал\n" "🌇 Обед: Куриная грудка (150 г) + бурый рис (50 г) + брокколи — 480 ккал\n" "🌃 Ужин: Творог 5% (100 г) + ягоды — 180 ккал\n" "🍏 Перекус: Горсть орехов (30 г) — 180 ккал" ), "Вт": ( "🥗 *Вторник (средний бюджет)*\n\n" "🌅 Завтрак: Гречневая каша с молоком — 320 ккал\n" "🌇 Обед: Рыба на пару + картофель + салат — 500 ккал\n" "🌃 Ужин: Йогурт + банан — 220 ккал\n" "🍏 Перекус: Яблоко + арахисовая паста — 200 ккал" ), "Ср": ( "🥗 *Среда (средний бюджет)*\n\n" "🌅 Завтрак: Тосты с авокадо и яйцом — 380 ккал\n" "🌇 Обед: Чечевица + индейка + овощи — 520 ккал\n" "🌃 Ужин: Кефир + овсяное печенье — 250 ккал\n" "🍏 Перекус: Творожная запеканка — 200 ккал" ), "Чт": ( "🥗 *Четверг (средний бюджет)*\n\n" "🌅 Завтрак: Овсянка с ягодами и мёдом — 340 ккал\n" "🌇 Обед: Суп-харчо + хлеб — 450 ккал\n" "🌃 Ужин: Омлет с шампиньонами — 280 ккал\n" "🍏 Перекус: Груша — 80 ккал" ), "Пт": ( "🥗 *Пятница (средний бюджет)*\n\n" "🌅 Завтрак: Смузи (банан, шпинат, молоко) — 300 ккал\n" "🌇 Обед: Запечённая рыба + киноа + морковь — 500 ккал\n" "🌃 Ужин: Творог + киви — 200 ккал\n" "🍏 Перекус: Йогурт — 120 ккал" ), "Сб": ( "🥗 *Суббота (средний бюджет)*\n\n" "🌅 Завтрак: Яичница с овощами — 320 ккал\n" "🌇 Обед: Паста с курицей и томатным соусом — 550 ккал\n" "🌃 Ужин: Салат с тунцом и яйцом — 300 ккал\n" "🍏 Перекус: Орехи — 180 ккал" ), "Вс": ( "🥗 *Воскресенье (средний бюджет)*\n\n" "🌅 Завтрак: Блинчики из овсянки — 350 ккал\n" "🌇 Обед: Овощное рагу с фрикадельками — 500 ккал\n" "🌃 Ужин: Кефир + фрукты — 200 ккал\n" "🍏 Перекус: Запечённое яблоко — 120 ккал" ) }, "high": { "Пн": ( "🥑 *Понедельник (высокий бюджет)*\n\n" "🌅 Завтрак: Аворн-боул (овсянка, миндальное молоко, чиа, ягоды) — 420 ккал\n" "🌇 Обед: Стейк лосося (180 г) + киноа (60 г) + спаржа — 580 ккал\n" "🌃 Ужин: Творог 9% (100 г) + миндаль + мёд — 280 ккал\n" "🍏 Перекус: Свежевыжатый сок + орехи — 200 ккал" ), "Вт": ( "🥑 *Вторник (высокий бюджет)*\n\n" "🌅 Завтрак: Скрэмбл с авокадо и рукколой — 400 ккал\n" "🌇 Обед: Курица гриль + сладкий картофель + брокколи — 550 ккал\n" "🌃 Ужин: Йогурт греческий + гранола — 300 ккал\n" "🍏 Перекус: Протеиновый батончик — 220 ккал" ), "Ср": ( "🥑 *Среда (высокий бюджет)*\n\n" "🌅 Завтрак: Тост из спельты с лососем и сливочным сыром — 450 ккал\n" "🌇 Обед: Запечённая индейка + фарро + цукини — 580 ккал\n" "🌃 Ужин: Омлет с трюфельным маслом — 350 ккал\n" "🍏 Перекус: Финики + миндаль — 200 ккал" ), "Чт": ( "🥑 *Четверг (высокий бюджет)*\n\n" "🌅 Завтрак: Смузи-боул с гранолой — 400 ккал\n" "🌇 Обед: Морепродукты в белом вине + ризотто — 600 ккал\n" "🌃 Ужин: Кефир + ягоды асаи — 250 ккал\n" "🍏 Перекус: Кокосовые батончики — 180 ккал" ), "Пт": ( "🥑 *Пятница (высокий бюджет)*\n\n" "🌅 Завтрак: Французский тост с кленовым сиропом — 420 ккал\n" "🌇 Обед: Стейк рибай + картофельное пюре + грибы — 700 ккал\n" "🌃 Ужин: Салат с козьим сыром и грушей — 320 ккал\n" "🍏 Перекус: Шоколад с 85% какао — 150 ккал" ), "Сб": ( "🥑 *Суббота (высокий бюджет)*\n\n" "🌅 Завтрак: Белковый омлет с шпинатом — 380 ккал\n" "🌇 Обед: Лосось на гриле + киноа + авокадо — 600 ккал\n" "🌃 Ужин: Творожная запеканка с ягодами — 300 ккал\n" "🍏 Перекус: Коктейль из миндального молока — 200 ккал" ), "Вс": ( "🥑 *Воскресенье (высокий бюджет)*\n\n" "🌅 Завтрак: Блинчики из миндаля с ягодами — 400 ккал\n" "🌇 Обед: Утиная грудка + фруктовый соус + овощи — 650 ккал\n" "🌃 Ужин: Йогурт + мёд + грецкие орехи — 300 ккал\n" "🍏 Перекус: Свежие финики — 120 ккал" ) } } # === АНГЛИЙСКИЙ === ENGLISH_WORDS_400 = { "1. Фитнес и тренировки": [ "workout — тренировка", "exercise — упражнение", "train — тренироваться", "lift — поднимать (вес)", "run — бегать", "jump — прыгать", "stretch — растягиваться", "squat — приседать", "push-up — отжимание", "pull-up — подтягивание", "plank — планка", "cardio — кардио", "strength — сила", "endurance — выносливость", "flexibility — гибкость", "balance — баланс", "reps — повторения", "sets — подходы", "rest — отдых", "recover — восстанавливаться", "muscle — мышца", "core — мышцы кора", "abs — пресс", "legs — ноги", "arms — руки", "back — спина", "chest — грудь", "shoulders — плечи", "warm-up — разминка", "cool-down — заминка", "gym — спортзал", "weights — утяжелители", "dumbbell — гантель", "barbell — штанга", "treadmill — беговая дорожка", "mat — коврик", "resistance — сопротивление", "interval — интервал", "HIIT — ВИИТ", "yoga — йога" ], "2. Питание и еда": [ "food — еда", "meal — приём пищи", "breakfast — завтрак", "lunch — обед", "dinner — ужин", "snack — перекус", "water — вода", "protein — белок", "carbs — углеводы", "fat — жир", "fiber — клетчатка", "vitamins — витамины", "minerals — минералы", "calories — калории", "nutrition — питание", "healthy — здоровый", "unhealthy — нездоровый", "organic — органический", "fresh — свежий", "frozen — замороженный", "vegetables — овощи", "fruits — фрукты", "meat — мясо", "fish — рыба", "eggs — яйца", "dairy — молочные продукты", "grains — злаки", "nuts — орехи", "seeds — семена", "oil — масло", "sugar — сахар", "salt — соль", "spices — специи", "cook — готовить", "bake — запекать", "grill — жарить на гриле", "steam — готовить на пару", "boil — варить", "eat — есть", "drink — пить" ], "3. Здоровье и тело": [ "health — здоровье", "body — тело", "mind — разум", "sleep — сон", "energy — энергия", "tired — уставший", "strong — сильный", "weak — слабый", "fit — в форме", "overweight — избыточный вес", "skin — кожа", "hair — волосы", "heart — сердце", "lungs — лёгкие", "bones — кости", "joints — суставы", "pain — боль", "injury — травма", "recovery — восстановление", "hydration — гидратация", "posture — осанка", "breathing — дыхание", "stress — стресс", "relax — расслабляться", "meditate — медитировать", "immunity — иммунитет", "illness — болезнь", "doctor — врач", "medicine — лекарство", "supplements — добавки", "scale — весы", "waist — талия", "weight — вес", "height — рост", "BMI — ИМТ", "pulse — пульс", "temperature — температура", "sweat — пот", "shower — душ", "hygiene — гигиена" ], "4. Повседневные глаголы": [ "go — идти", "come — приходить", "do — делать", "make — делать / изготовлять", "take — брать", "get — получать", "give — давать", "put — класть", "keep — держать / сохранять", "let — позволять", "begin — начинать", "start — начинать", "finish — заканчивать", "stop — останавливать", "continue — продолжать", "try — пытаться", "help — помогать", "need — нуждаться", "want — хотеть", "like — нравиться", "love — любить", "hate — ненавидеть", "think — думать", "know — знать", "understand — понимать", "remember — помнить", "forget — забывать", "see — видеть", "hear — слышать", "feel — чувствовать", "say — говорить", "tell — рассказывать", "ask — спрашивать", "answer — отвечать", "call — звонить / звать", "write — писать", "read — читать", "learn — учить / узнавать", "study — учиться / изучать", "practice — практиковать" ], "5. Время и распорядок дня": [ "time — время", "day — день", "week — неделя", "month — месяц", "year — год", "morning — утро", "afternoon — день (после обеда)", "evening — вечер", "night — ночь", "today — сегодня", "tomorrow — завтра", "yesterday — вчера", "now — сейчас", "soon — скоро", "later — позже", "early — рано", "late — поздно", "schedule — расписание", "plan — план", "routine — распорядок", "habit — привычка", "goal — цель", "progress — прогресс", "deadline — крайний срок", "hour — час", "minute — минута", "second — секунда", "clock — часы", "calendar — календарь", "Monday — понедельник", "Tuesday — вторник", "Wednesday — среда", "Thursday — четверг", "Friday — пятница", "Saturday — суббота", "Sunday — воскресенье", "weekend — выходные", "weekday — будний день", "season — сезон", "weather — погода" ], "6. Эмоции и мотивация": [ "happy — счастливый", "sad — грустный", "angry — злой", "excited — взволнованный", "nervous — нервный", "calm — спокойный", "confident — уверенный", "motivated — мотивированный", "discouraged — обескураженный", "proud — гордый", "ashamed — стыдящийся", "guilty — виноватый", "hopeful — полный надежды", "grateful — благодарный", "bored — скучающий", "stressed — стрессующий", "relieved — облегчённый", "inspired — вдохновлённый", "determined — решительный", "lazy — ленивый", "discipline — дисциплина", "willpower — сила воли", "challenge — вызов", "success — успех", "failure — неудача", "effort — усилие", "result — результат", "reward — награда", "habit — привычка", "change — изменение", "mindset — установка", "attitude — отношение", "focus — фокус", "patience — терпение", "consistency — последовательность", "commitment — приверженность", "belief — вера", "dream — мечта", "purpose — цель", "meaning — смысл" ], "7. Дом и быт": [ "home — дом (место проживания)", "house — дом (здание)", "room — комната", "kitchen — кухня", "bedroom — спальня", "bathroom — ванная комната", "living room — гостиная", "window — окно", "door — дверь", "floor — пол", "table — стол", "chair — стул", "bed — кровать", "fridge — холодильник", "oven — духовка", "stove — плита", "sink — раковина", "mirror — зеркало", "light — свет", "clean — чистый / убирать", "dirty — грязный", "wash — мыть", "dry — сушить", "fold — складывать", "iron — гладить", "vacuum — пылесосить", "cook — готовить", "eat — есть", "sleep — спать", "shower — принимать душ", "toilet — туалет", "towel — полотенце", "soap — мыло", "toothbrush — зубная щётка", "clothes — одежда", "shoes — обувь", "laundry — стирка", "trash — мусор", "recycle — перерабатывать", "organize — организовывать" ], "8. Общение и социум": [ "talk — разговаривать", "speak — говорить", "listen — слушать", "communicate — общаться", "friend — друг", "family — семья", "partner — партнёр", "team — команда", "group — группа", "community — сообщество", "support — поддерживать", "encourage — поощрять", "criticize — критиковать", "agree — соглашаться", "disagree — не соглашаться", "apologize — извиняться", "thank — благодарить", "invite — приглашать", "meet — встречать", "greet — приветствовать", "introduce — представлять", "explain — объяснять", "describe — описывать", "suggest — предлагать", "recommend — рекомендовать", "promise — обещать", "trust — доверять", "respect — уважать", "kindness — доброта", "empathy — эмпатия", "conversation — беседа", "message — сообщение", "call — звонок", "text — текстовое сообщение", "email — электронная почта", "social — социальный", "network — сеть", "chat — чат", "discussion — обсуждение", "feedback — обратная связь" ], "9. Английский язык и обучение": [ "English — английский (язык)", "language — язык", "word — слово", "sentence — предложение", "grammar — грамматика", "vocabulary — словарный запас", "pronunciation — произношение", "accent — акцент", "fluency — беглость", "practice — практика", "lesson — урок", "teacher — учитель", "student — ученик / студент", "course — курс", "book — книга", "dictionary — словарь", "translate — переводить", "meaning — значение", "spell — писать по буквам", "write — писать", "read — читать", "listen — слушать", "speak — говорить", "understand — понимать", "mistake — ошибка", "correct — исправлять", "improve — улучшать", "learn — учить", "study — учиться", "remember — запоминать", "review — повторять", "test — тест", "exam — экзамен", "homework — домашнее задание", "note — заметка", "highlight — выделять", "repeat — повторять", "record — записывать", "shadow — повторять вслед", "imitate — подражать" ], "10. Спорт и активность": [ "sport — спорт", "football — футбол", "basketball — баскетбол", "tennis — теннис", "swimming — плавание", "cycling — велосипед", "running — бег", "walking — ходьба", "hiking — походы", "climbing — скалолазание", "skating — катание на коньках", "skiing — лыжи", "dancing — танцы", "martial arts — боевые искусства", "boxing — бокс", "wrestling — борьба", "gymnastics — гимнастика", "athletics — лёгкая атлетика", "competition — соревнование", "match — матч", "team — команда", "player — игрок", "coach — тренер", "referee — судья", "score — счёт", "win — побеждать", "lose — проигрывать", "draw — ничья", "champion — чемпион", "medal — медаль", "stadium — стадион", "field — поле", "court — площадка", "pool — бассейн", "track — беговая дорожка", "equipment — оборудование", "uniform — форма", "fan — фанат", "spectator — зритель", "active — активный" ] } ENGLISH_RULES = "📚 Present Simple: I train every day.\nPast Simple: I trained yesterday.\nFuture: I’m going to run." ENGLISH_TEST = "🧠 She ___ to the gym. A) go B) goes C) going" SPORT_COMPLEXES = ( "🏟️ Спорткомплексы Нурлата:\n" " Дворец спорта «Тулпар» - Солнечная ул.3\n" " Ледовый дворец спорта «Ледок» - Ул.Гиматдинова 97\n" "Спортивный комплекс «Буровик» - Ул.Мира 9\n" "Спорткомплекс имени М. Хузина - Ул.Советская 145Б\n" "Спорт клуб имени Мякишева - цокольный этаж образовательного центра имени Ахмадзаки хазрата Сафиуллина.\n" "Cпортивный комплекс «Батыр» - город Нурлат, улица Ленинградская, дом №1В\n" "Стадион им. Г. С. Хусаинова - Ул.Юности 1Б\n" ) # === Вспомогательные функции === def get_today_plan(user_id): user = user_data.get(str(user_id), {}) level = user.get("level", "beginner") place = user.get("place", "home") budget = user.get("budget", "low") tz_name = user.get("timezone", DEFAULT_TZ) try: tz = timezone(tz_name) except: tz = timezone(DEFAULT_TZ) now = datetime.now(tz) day_en = now.strftime("%a") en_to_ru = {"Mon": "Пн", "Tue": "Вт", "Wed": "Ср", "Thu": "Чт", "Fri": "Пт", "Sat": "Сб", "Sun": "Вс"} day = en_to_ru.get(day_en, "Пн") workout = WORKOUT_PROGRAMS.get(level, {}).get(place, {}).get(day, "Тренировка не найдена") menu = MENUS.get(budget, {}).get(day, "Меню не найдено") return f"📅 *Сегодня — {day}*\n\n💪 *Тренировка ({level}, {place}):*\n{workout}\n\n🥗 *Меню ({budget}):*\n{menu}" async def show_main_menu(update_or_query): keyboard = [ [InlineKeyboardButton("💪 Тренировки", callback_data='workouts')], [InlineKeyboardButton("🥗 Меню на неделю", callback_data='menu')], [InlineKeyboardButton("🇬🇧 Английский", callback_data='english')], [InlineKeyboardButton("🌍 Часовой пояс", callback_data='set_timezone')], [InlineKeyboardButton("🔔 Напоминания", callback_data='reminders')], [InlineKeyboardButton("🏟️ Спорткомплексы", callback_data='sports')], [InlineKeyboardButton("🤝 Напарник", callback_data='partner')], [InlineKeyboardButton("🔥 Вызовы", callback_data='challenges')], ] reply_markup = InlineKeyboardMarkup(keyboard) if hasattr(update_or_query, 'message') and update_or_query.message: await update_or_query.message.reply_text("Привет! Я бот «Начнём с понедельника». Выбери:", reply_markup=reply_markup) else: await update_or_query.edit_message_text("Привет! Я бот «Начнём с понедельника». Выбери:", reply_markup=reply_markup) # === Обработчики === async def start(update: Update, context: ContextTypes.DEFAULT_TYPE): await show_main_menu(update) async def button_handler(update: Update, context: ContextTypes.DEFAULT_TYPE): query = update.callback_query await query.answer() user_id = str(query.from_user.id) data = query.data back_button = [InlineKeyboardButton("← В главное меню", callback_data='back_to_main')] if data == 'back_to_main': await show_main_menu(query) return # === Тренировки === if data == 'workouts': kb = [ [InlineKeyboardButton("Новичок", callback_data='lvl_beginner')], [InlineKeyboardButton("Средний", callback_data='lvl_intermediate')], [InlineKeyboardButton("Продвинутый", callback_data='lvl_advanced')], back_button ] await query.edit_message_text("Выбери уровень подготовки:", reply_markup=InlineKeyboardMarkup(kb)) elif data.startswith('lvl_'): level = data[4:] user_data.setdefault(user_id, {})["level"] = level save_user_data(user_data) kb = [ [InlineKeyboardButton("🏠 Дома", callback_data=f'place_{level}_home')], [InlineKeyboardButton("🏋️ В зале", callback_data=f'place_{level}_gym')], back_button ] await query.edit_message_text("Где будешь тренироваться?", reply_markup=InlineKeyboardMarkup(kb)) elif data.startswith('place_'): _, level, place = data.split('_', 2) user_data[user_id]["place"] = place save_user_data(user_data) days = list(WORKOUT_PROGRAMS[level][place].keys()) kb = [[InlineKeyboardButton(day, callback_data=f'day_{level}_{place}_{day}')] for day in days] kb.append(back_button) await query.edit_message_text("Выбери день недели:", reply_markup=InlineKeyboardMarkup(kb)) elif data.startswith('day_'): _, level, place, day = data.split('_', 3) text = WORKOUT_PROGRAMS[level][place][day] await query.edit_message_text(text, parse_mode='Markdown', reply_markup=InlineKeyboardMarkup([back_button])) # === Меню === elif data == 'menu': kb = [ [InlineKeyboardButton("Низкий", callback_data='m_low')], [InlineKeyboardButton("Средний", callback_data='m_medium')], [InlineKeyboardButton("Высокий", callback_data='m_high')], back_button ] await query.edit_message_text("Выбери бюджет меню:", reply_markup=InlineKeyboardMarkup(kb)) elif data.startswith('m_'): budget = data[2:] user_data.setdefault(user_id, {})["budget"] = budget save_user_data(user_data) days = list(MENUS[budget].keys()) kb = [[InlineKeyboardButton(day, callback_data=f'md_{budget}_{day}')] for day in days] kb.append(back_button) await query.edit_message_text("Выбери день недели:", reply_markup=InlineKeyboardMarkup(kb)) elif data.startswith('md_'): _, budget, day = data.split('_', 2) text = MENUS[budget][day] await query.edit_message_text(text, parse_mode='Markdown', reply_markup=InlineKeyboardMarkup([back_button])) # === Английский === elif data == 'english': categories = list(ENGLISH_WORDS_400.keys()) kb = [[InlineKeyboardButton(cat, callback_data=f'words_{i}')] for i, cat in enumerate(categories)] kb.append(back_button) await query.edit_message_text("Выбери категорию слов:", reply_markup=InlineKeyboardMarkup(kb)) elif data.startswith('words_'): cat_index = int(data.split('_')[1]) category = list(ENGLISH_WORDS_400.keys())[cat_index] words = ", ".join(ENGLISH_WORDS_400[category]) await query.edit_message_text(f"🔤 *{category}*:\n\n{words}", parse_mode='Markdown', reply_markup=InlineKeyboardMarkup([back_button])) # === Вызовы === elif data == 'challenges': kb = [] for i, (title, desc) in enumerate(CHALLENGES_LIST): kb.append([InlineKeyboardButton(f"✅ {title}", callback_data=f'accept_challenge_{i}')]) kb.append(back_button) await query.edit_message_text("🔥 Выбери вызов на неделю:", reply_markup=InlineKeyboardMarkup(kb)) elif data.startswith('accept_challenge_'): idx = int(data.split('_')[2]) title, desc = CHALLENGES_LIST[idx] msg = f"🎉 *Вызов принят!*\n\n🏆 *{title}*\n💬 {desc}\n\n💪 Удачи! Отметься в https://t.me/PonedelnikNurlat" await query.edit_message_text(msg, parse_mode='Markdown', reply_markup=InlineKeyboardMarkup([back_button])) # === Прочее === elif data == 'set_timezone': common_tz = ["Europe/Moscow", "Asia/Yekaterinburg", "UTC"] kb = [[InlineKeyboardButton(tz, callback_data=f'tz_{tz}')] for tz in common_tz] kb.append(back_button) await query.edit_message_text("Выбери свой часовой пояс:", reply_markup=InlineKeyboardMarkup(kb)) elif data.startswith('tz_'): tz_name = data[3:] user_data.setdefault(user_id, {})["timezone"] = tz_name save_user_data(user_data) await query.edit_message_text(f"✅ Часовой пояс установлен: {tz_name}", reply_markup=InlineKeyboardMarkup([back_button])) elif data == 'reminders': user = user_data.get(user_id, {}) required = ["level", "place", "budget"] if not all(k in user for k in required): await query.edit_message_text("⚠️ Сначала выбери уровень, место тренировок и бюджет меню!", reply_markup=InlineKeyboardMarkup([back_button])) return tz_name = user.get("timezone", DEFAULT_TZ) try: tz = timezone(tz_name) except: tz = timezone(DEFAULT_TZ) current_jobs = context.job_queue.get_jobs_by_name(f"daily_{user_id}") for job in current_jobs: job.schedule_removal() context.job_queue.run_daily( send_daily_plan, time=time(hour=8, minute=0, second=0, tzinfo=tz), chat_id=int(user_id), user_id=int(user_id), name=f"daily_{user_id}" ) await query.edit_message_text(f"✅ Напоминания включены! Буду писать в 8:00 по времени: {tz_name}", reply_markup=InlineKeyboardMarkup([back_button])) elif data == 'sports': await query.edit_message_text(SPORT_COMPLEXES, reply_markup=InlineKeyboardMarkup([back_button])) elif data == 'partner': await query.edit_message_text("🤝 Чтобы найти напарника:\n1. Зайди в чат: t.me/PonedelnikNurlat Начнём с понедельника Нурлат\n2. Напиши: «Ищу партнёра для тренировок в Нурлате»", reply_markup=InlineKeyboardMarkup([back_button])) # === Напоминания и /daily === async def send_daily_plan(context: ContextTypes.DEFAULT_TYPE): job = context.job user_id = job.user_id try: text = get_today_plan(user_id) kb = [[InlineKeyboardButton("← В главное меню", callback_data='back_to_main')]] await context.bot.send_message(chat_id=user_id, text=text, parse_mode='Markdown', reply_markup=InlineKeyboardMarkup(kb)) except Exception as e: logging.error(f"Ошибка отправки напоминания {user_id}: {e}") async def daily(update: Update, context: ContextTypes.DEFAULT_TYPE): user_id = str(update.effective_user.id) if user_id not in user_data: await update.message.reply_text("Сначала настрой бота через /start") return text = get_today_plan(user_id) kb = [[InlineKeyboardButton("← В главное меню", callback_data='back_to_main')]] await update.message.reply_text(text, parse_mode='Markdown', reply_markup=InlineKeyboardMarkup(kb)) # === Запуск === def main(): TOKEN = "8371453673:AAFWAzO2bH97Wc0hbfvcAt7Liy31W0wBACI" app = Application.builder().token(TOKEN).build() app.add_handler(CommandHandler("start", start)) app.add_handler(CommandHandler("daily", daily)) app.add_handler(CallbackQueryHandler(button_handler)) print("✅ Бот «Начнём с понедельника» запущен!") app.run_polling() if __name__ == '__main__': main()