import os from pathlib import Path from datetime import timedelta, time from zoneinfo import ZoneInfo # --- Базовые пути --- BASE_DIR = Path(__file__).parent FONT_PATH = BASE_DIR / "impact.ttf" DEFAULT_TZ = os.getenv("TZ", "Europe/Moscow") DATABASE_URL = os.getenv("DATABASE_URL", "postgresql://bot:botpass@postgres:5432/botdb") # --- Настройки /penis --- PENIS_START_LENGTH = 10.0 PENIS_MIN_DELTA = 0.1 PENIS_MAX_DELTA = 7.0 PENIS_COOLDOWN = timedelta(hours=24) PENIS_COOLDOWN_SECONDS = int(PENIS_COOLDOWN.total_seconds()) PENIS_TOP_LIMIT = 10 # --- Настройки "получается" --- POLYCHAETSI_STATS_PATH = Path(os.getenv("POLYCHAETSI_STATS_PATH", "/db/polychaetsi_stats.json")) POLYCHAETSI_TARGET = "получается" POLYCHAETSI_TOP_LIMIT = 10 POLYCHAETSI_IMAGE_PATH = BASE_DIR / "maket" / "cvetok.jpg" # --- Казино --- CASINO_MAX_BET = 1.0 # --- E621 API --- E621_LOGIN = os.getenv("E621_LOGIN", "") E621_API_KEY = os.getenv("E621_API_KEY", "") # --- Ставки на матчи --- ODDS_API_KEY = os.getenv("ODDS_API_KEY", "") ODDS_API_BASE = "https://api.the-odds-api.com/v4" BET_MAX_AMOUNT = 3.0 ODDS_SPORTS = { "dota2": "esports_dota2", } ODDS_CACHE_TTL = 86400 # 24 часа — экономим запросы (500/мес бесплатно) # --- Nude --- NUDE_HISTORY_PATH = Path(os.getenv("NUDE_HISTORY_PATH", "/db/nude_history.json")) NUDE_POSTS_PER_PAGE = int(os.getenv("NUDE_POSTS_PER_PAGE", "100")) NUDE_POSTS_POOL_TARGET = int(os.getenv("NUDE_POSTS_POOL_TARGET", "1200")) NUDE_MAX_POSTS_TO_SCAN = int(os.getenv("NUDE_MAX_POSTS_TO_SCAN", "2000")) NUDE_MIN_UNSEEN_POOL = int(os.getenv("NUDE_MIN_UNSEEN_POOL", "100")) NUDE_HISTORY_MAX_SIZE = int(os.getenv("NUDE_HISTORY_MAX_SIZE", "5000")) # --- Magnit API --- MAGNIT_API_BASE_URL = os.getenv("MAGNIT_API_BASE_URL", "https://mirror.porno4free.ru/magnit") MAGNIT_STORE_CODE = os.getenv("MAGNIT_STORE_CODE", "618224") MAGNIT_REQUEST_TIMEOUT = int(os.getenv("MAGNIT_REQUEST_TIMEOUT", "15")) # Можно указывать просто строку с названием или словарь с query/label/store_code. MAGNIT_PRODUCTS = [ "RedBull", ] # --- Конфигурация макетов --- TEMPLATES = { "1": { "path": BASE_DIR / "maket" / "1.png", "anchor": (104, 240), "padding": 20, "label": "Владимир Владимирович Путин самый лучший президент", }, "2": { "path": BASE_DIR / "maket" / "2.png", "anchor": (40, 40), "box_size": (582, 346), "label": "Макет 2", }, } # --- Расписание --- def make_time(h: int, m: int) -> time: return time(hour=h, minute=m) # Если у тебя наоборот, просто поменяй на False. UPPER_WEEK_IS_ODD = False PAIR_TIMES = { 1: (make_time(8, 0), make_time(9, 35)), 2: (make_time(9, 50), make_time(11, 25)), 3: (make_time(11, 55), make_time(13, 30)), 4: (make_time(13, 45), make_time(15, 20)), 5: (make_time(15, 50), make_time(17, 25)), } LESSON_SCHEDULE = { "upper": { 0: [ {"pair": 1, "title": "Нет пары"}, {"pair": 2, "title": "Экономика и право (практика), пр. Индустриев М.А. (до 6.11.25) / Васильева Е.В. (с 7.11.25), а. 504"}, {"pair": 3, "title": "Экономика и право (лекция), пр. Туманян Ю.Р. (до 6.11.25) / Васильева Е.В. (с 7.11.25), а. 510"}, {"pair": 4, "title": "Геоинформационные системы (лекция), пр. Ушканова Е.В., а. 403а (НИИМ и ПМ)"}, ], 1: [ {"pair": 1, "title": "Нет пары"}, {"pair": 2, "title": "Нет пары"}, {"pair": 3, "title": "Специальные разделы математики (практика), пр. Вакулов Б.Г., а. 504"}, {"pair": 4, "title": "1-я подгруппа: Геоинформационные системы (лаб), пр. Ушканова Е.В., а. 403а (НИИМ и ПМ)"}, ], 2: [ {"pair": 1, "title": "Нет пары"}, {"pair": 2, "title": "Технологии программирования (лекция), пр. Губский Д.С., а. 510"}, {"pair": 3, "title": "1-я подгруппа: Основы функционирования ВТ (лаб), пр. Дацюк О.В., а. 606. 2-я подгруппа: Геоинформационные системы (лаб), пр. Ушканова Е.В., а. 403а (НИИМ и ПМ)"}, {"pair": 4, "title": "1-я подгруппа: Технологии программирования (лаб), пр. Губский Д.С., а. 609. 2-я подгруппа: Технологии программирования (лаб), пр. Иванова И.Н., а. 609 а"}, {"pair": 5, "title": "2-я подгруппа: Основы функционирования вычислительной техники (лаб), пр. Дацюк О.В., а. 606"}, ], 3: [ {"pair": 1, "title": "Нет пары"}, {"pair": 2, "title": "Специальные разделы математики (прак), пр. Вакулов Б.Г., а. 502"}, {"pair": 3, "title": "Основы функционирования вычислительной техники (прак), пр. Дацюк О.В., а. 818"}, {"pair": 4, "title": "Специальные разделы математики (лекция), пр. Каплицкий В.М., а. 510"}, ], 4: [ {"pair": None, "title": "Иностранный язык"}, ], 5: [ {"pair": 1, "title": "Философия (лекция), пр. Новохатько А.Г., MS Teams"}, ], }, "lower": { 0: [ {"pair": 1, "title": "Нет пары"}, {"pair": 2, "title": "Экономика и право (практика), пр. Индустриев М.А. (до 6.11.25) / Васильева Е.В. (с 7.11.25), а. 504"}, {"pair": 3, "title": "Экономика и право (лекция), пр. Туманян Ю.Р. (до 6.11.25) / Васильева Е.В. (с 7.11.25), а. 510"}, {"pair": 4, "title": "Геоинформационные системы (лекция), пр. Ушканова Е.В., а. 403а (НИИМ и ПМ)"}, ], 1: [ {"pair": 1, "title": "Нет пары"}, {"pair": 2, "title": "Нет пары"}, {"pair": 3, "title": "Специальные разделы математики (практика), пр. Вакулов Б.Г., а. 504"}, {"pair": 4, "title": "1-я подгруппа: Геоинформационные системы (лаб), пр. Ушканова Е.В., а. 403а (НИИМ и ПМ)"}, ], 2: [ {"pair": 1, "title": "Нет пары"}, {"pair": 2, "title": "Технологии программирования (лекция), пр. Губский Д.С., а. 510"}, {"pair": 3, "title": "1-я подгруппа: Основы функционирования ВТ (лаб), пр. Дацюк О.В., а. 606. 2-я подгруппа: Геоинформационные системы (лаб), пр. Ушканова Е.В., а. 403а (НИИМ и ПМ)"}, {"pair": 4, "title": "1-я подгруппа: Технологии программирования (лаб), пр. Губский Д.С., а. 609. 2-я подгруппа: Технологии программирования (лаб), пр. Иванова И.Н., а. 609 а"}, {"pair": 5, "title": "2-я подгруппа: Основы функционирования вычислительной техники (лаб), пр. Дацюк О.В., а. 606"}, ], 3: [ {"pair": 1, "title": "Нет пары"}, {"pair": 2, "title": "Основы функционирования вычислительной техники (лекция), пр. Дацюк О.В., а. 514"}, {"pair": 3, "title": "Нет пары"}, {"pair": 4, "title": "Специальные разделы математики (лекция), пр. Каплицкий В.М., а. 510"}, ], 4: [ {"pair": None, "title": "Иностранный язык"}, ], # В PR отсутствовали пятница/суббота на нижней неделе — этих пар нет # только в исходном коммите; иняз и философия по субботам идут # независимо от чётности недели, так что дублируем из "upper". 5: [ {"pair": 1, "title": "Философия (лекция), пр. Новохатько А.Г., MS Teams"}, ], }, } SCHEDULE = { 0: [ # Понедельник (make_time(9, 50), make_time(10, 35), 5), (make_time(10, 40), make_time(11, 25), 30), (make_time(11, 55), make_time(12, 40), 5), (make_time(12, 45), make_time(13, 30), 15), (make_time(13, 45), make_time(14, 30), 5), (make_time(14, 35), make_time(15, 20), None), ], 1: [ # Вторник (make_time(11, 55), make_time(12, 40), 5), (make_time(12, 45), make_time(13, 30), 15), (make_time(13, 45), make_time(14, 30), 5), (make_time(14, 35), make_time(15, 20), None), ], 2: [ # Среда (make_time(9, 50), make_time(10, 35), 5), (make_time(10, 40), make_time(11, 25), 30), (make_time(11, 55), make_time(12, 40), 5), (make_time(12, 45), make_time(13, 30), 15), (make_time(13, 45), make_time(14, 30), 5), (make_time(14, 35), make_time(15, 20), 30), (make_time(15, 50), make_time(16, 35), 5), (make_time(16, 40), make_time(17, 25), None), ], 3: [ # Четверг (make_time(9, 50), make_time(10, 35), 5), (make_time(10, 40), make_time(11, 25), 30), (make_time(11, 55), make_time(12, 40), 5), (make_time(12, 45), make_time(13, 30), 15), (make_time(13, 45), make_time(14, 30), 5), (make_time(14, 35), make_time(15, 20), None), ], 4: [], # Пятница 5: [ # Суббота (make_time(8, 0), make_time(8, 45), 5), (make_time(8, 50), make_time(9, 35), None), ], } # --- Остальное --- KEYWORDS = {'крип', 'радиохэд', 'creep', 'radiohead'} # --- Авто-ответы ИИ --- AUTOREPLY_CHANCE = 0.10 AUTOREPLY_COOLDOWN = 120 AUTOREPLY_TRIGGERS = {'бот', 'фраер', 'кент', 'братуха', 'пацаны', 'чё как', 'базар', 'ебать', 'пизда', 'хуй', 'бля', 'сука', 'говно', 'пидор', 'пиздабол', 'пиздатый', 'пиздатая', 'пиздатое', 'пиздатые', 'пиздато', 'ваномас'} def get_hint_text(templates_str: str) -> str: return ( "Команды:\n" f"• /maket «id» «текст» — доступные: {templates_str}.\n" "• /gen_mem Up:верх Down:низ — отправь с фото.\n" "• /break — узнать время до перекура.\n" "• /schedule [пн|mon] — расписание; без аргумента еще текущая и следующая пара.\n" "• /penis — миниигра 1 раз в 24 часа.\n" "• /top_penis — топ по длине.\n" "• /talk [текст] — ИИ базарит на фене.\n" "• /penis_casino [ставка] — казино на размер.\n" "• /gadanie [тема] — гадание на фене с мемом.\n" "• /matches — матчи для ставок.\n" "• /bet [номер] [исход] [ставка] — поставить.\n" "• /mybets — мои активные ставки.\n" "• /bet_history — история ставок за месяц + статистика.\n" "• /sports_debug — диагностика API матчей.\n" "• /ebalnik — включить/выключить автоответы в чате.\n" "• /uwu [теги] — случайная картинка с e621.\n" "• /polychaetsi — топ по слову «получается».\n" "• /prices /fetch — цены и остатки Магнита.\n" "Подсказка: в группах пиши /команда@username_бота." )