1
0
Fork 0
forked from zovos/bot_tg
bot_tg/config.py
zovos 8a9ba990a9 fix: sync Saturday teacher name after merging PR #40 typo fixes
Our manually-added lower-week Saturday entry (missing from PR #39/#40
upstream) still had the old "Новосёлова" spelling; PR #40 fixed it to
"Новохатько" everywhere else but couldn't touch an entry that didn't
exist in its diff.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-03 05:37:56 +00:00

232 lines
13 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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_бота."
)