Compare commits

...

2 commits

452
config.py
View file

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