From 5b294415d06125ac12e3c9fd0e4157eeaae6aa7f Mon Sep 17 00:00:00 2001 From: q Date: Tue, 10 Mar 2026 13:08:04 +0300 Subject: [PATCH] Add polychaetsi tracker and improve Docker setup --- .dockerignore | 1 + Dockerfile | 17 ++-- README.md | 30 ++++++- config.py | 7 ++ docker-compose.yaml | 11 ++- main.py | 186 +++++++++++++++++++++++++++++++++++++++++++- maket/cvetok.jpg | Bin 0 -> 43823 bytes requirements.txt | 2 + 8 files changed, 241 insertions(+), 13 deletions(-) create mode 100644 maket/cvetok.jpg diff --git a/.dockerignore b/.dockerignore index c024517..07421c8 100644 --- a/.dockerignore +++ b/.dockerignore @@ -5,3 +5,4 @@ __pycache__ .idea .vscode .DS_Store +db diff --git a/Dockerfile b/Dockerfile index d84e227..2b3c823 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,15 @@ FROM python:3.11-slim -ENV PYTHONUNBUFFERED=1 +ENV PYTHONDONTWRITEBYTECODE=1 \ + PYTHONUNBUFFERED=1 \ + PIP_NO_CACHE_DIR=1 WORKDIR /app + COPY requirements.txt ./ -RUN pip install --no-cache-dir -r requirements.txt -COPY main.py config.py impact.ttf zparser.py ./ -COPY maket ./maket -COPY AI ./AI -COPY games ./games +RUN python -m pip install --upgrade pip \ + && python -m pip install -r requirements.txt + +COPY . . + +RUN mkdir -p /db + CMD ["python", "main.py"] diff --git a/README.md b/README.md index 4528060..32e9f72 100644 --- a/README.md +++ b/README.md @@ -13,11 +13,28 @@ ## Запуск ```bash -docker-compose up --build +docker compose up --build -d ``` -Переменные окружения: задайте `BOT_TOKEN` в `.env` (уже добавлен шаблон); -`LLAMA_API_URL` — адрес llama.cpp сервера (для `/talk`) +Логи: + +```bash +docker compose logs -f bot +``` + +Остановка: + +```bash +docker compose down +``` + +Переменные окружения: задайте `BOT_TOKEN` в `.env`. +Для ИИ-фич нужен `LLAMA_API_URL`. + +Контейнер хранит состояние в `./db`: +- `penis_stats.sqlite3` +- `chat_history.sqlite3` +- `polychaetsi_stats.json` ## Команды @@ -29,6 +46,7 @@ docker-compose up --build - `/talk <сообщение>` — побазарить с ИИ (контекст 100 сообщений). - `/penis` — миниигра, 1 раз в 24 часа. - `/top_penis` — топ по длине. +- `/polychaetsi` — топ по слову «получается». - `/penis_casino <ставка>` — казино на размер (макс 1 см, казино всегда в выигрыше). - `/gadanie <тема>` — ИИ-гадание на фене + авто-мем. - `/ebalnik` — вкл/выкл авто-ответы бота в чате. @@ -45,6 +63,12 @@ docker-compose up --build - llama.cpp для ИИ-фич. - Dockerfile + docker-compose для развёртывания. +## Docker Notes + +- Образ ставит `tzdata`, поэтому `ZoneInfo("Europe/Moscow")` нормально работает в контейнере. +- В образ копируется весь проект, а runtime-данные исключены через `.dockerignore`. +- Если меняешь код или картинки, достаточно пересобрать: `docker compose up --build -d`. + ## Кратко о логике - `/maket` подбирает размер текста, чтобы уместить его в область макета. diff --git a/config.py b/config.py index 5e191aa..9c7aaae 100644 --- a/config.py +++ b/config.py @@ -18,6 +18,12 @@ 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 @@ -112,6 +118,7 @@ def get_hint_text(templates_str: str) -> str: "• /penis_casino [ставка] — казино на размер.\n" "• /gadanie [тема] — гадание на фене с мемом.\n" "• /ebalnik — включить/выключить автоответы в чате.\n" + "• /polychaetsi — топ по слову «получается».\n" "• /prices /fetch — цены и остатки Магнита.\n" "Подсказка: в группах пиши /команда@username_бота." ) diff --git a/docker-compose.yaml b/docker-compose.yaml index 19f22e3..7432aa9 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,10 +1,15 @@ -version: "3.9" - services: bot: - build: . + build: + context: . volumes: - ./db:/db env_file: - .env + environment: + TZ: Europe/Moscow + PENIS_DB_PATH: /db/penis_stats.sqlite3 + CHAT_HISTORY_DB_PATH: /db/chat_history.sqlite3 + POLYCHAETSI_STATS_PATH: /db/polychaetsi_stats.json + init: true restart: unless-stopped diff --git a/main.py b/main.py index 737ed36..7a623d7 100644 --- a/main.py +++ b/main.py @@ -1,5 +1,5 @@ # Системные импорты -import asyncio, logging, os, re, random, sqlite3 +import asyncio, json, logging, os, re, random, sqlite3, threading from datetime import datetime, time, timedelta from io import BytesIO from pathlib import Path @@ -26,6 +26,8 @@ import config logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) +_polychaetsi_lock = threading.Lock() +_polychaetsi_word_re = re.compile(r"[а-яё]+", re.IGNORECASE) # --- Инициализация и вспомогательные функции --- @@ -46,6 +48,13 @@ def init_penis_db() -> None: conn.execute("CREATE INDEX IF NOT EXISTS idx_penis_stats_length ON penis_stats(length DESC)") conn.commit() +def init_polychaetsi_storage() -> None: + """Инициализация json-хранилища статистики слова 'получается'.""" + path = config.POLYCHAETSI_STATS_PATH + path.parent.mkdir(parents=True, exist_ok=True) + if not path.exists(): + path.write_text('{"users": {}}', encoding="utf-8") + def templates_list_text() -> str: """Список макетов для подсказки.""" parts = [] @@ -572,6 +581,161 @@ def build_penis_top(limit: int = config.PENIS_TOP_LIMIT) -> str: lines.append(f"{prefix} {name} — {length:.1f} см") return "\n".join(lines) +def _load_polychaetsi_stats() -> dict: + path = config.POLYCHAETSI_STATS_PATH + if not path.exists(): + return {"users": {}} + + try: + with path.open("r", encoding="utf-8") as fh: + data = json.load(fh) + except (OSError, json.JSONDecodeError): + logger.exception("Failed to load polychaetsi stats") + return {"users": {}} + + if not isinstance(data, dict): + return {"users": {}} + + users = data.get("users") + if not isinstance(users, dict): + data["users"] = {} + return data + +def _save_polychaetsi_stats(data: dict) -> None: + path = config.POLYCHAETSI_STATS_PATH + path.parent.mkdir(parents=True, exist_ok=True) + tmp_path = path.with_name(f"{path.name}.tmp") + with tmp_path.open("w", encoding="utf-8") as fh: + json.dump(data, fh, ensure_ascii=False, indent=2) + tmp_path.replace(path) + +def _damerau_levenshtein_distance(source: str, target: str, max_distance: int = 2) -> int: + if source == target: + return 0 + if abs(len(source) - len(target)) > max_distance: + return max_distance + 1 + + previous_previous: list[int] | None = None + previous = list(range(len(target) + 1)) + + for i, source_char in enumerate(source, start=1): + current = [i] + [0] * len(target) + row_min = current[0] + + for j, target_char in enumerate(target, start=1): + cost = 0 if source_char == target_char else 1 + current[j] = min( + previous[j] + 1, + current[j - 1] + 1, + previous[j - 1] + cost, + ) + if ( + previous_previous is not None + and i > 1 + and j > 1 + and source_char == target[j - 2] + and source[i - 2] == target_char + ): + current[j] = min(current[j], previous_previous[j - 2] + 1) + + row_min = min(row_min, current[j]) + + if row_min > max_distance: + return max_distance + 1 + + previous_previous, previous = previous, current + + return previous[-1] + +def _normalize_polychaetsi_word(word: str) -> str: + normalized = word.lower().replace("ё", "е") + # Подтягиваем самые частые ошибки в возвратном окончании. + return re.sub(r"(ть?ся|ть?са|цца|ца)$", "тся", normalized) + +def is_polychaetsi_variant(word: str) -> bool: + normalized = _normalize_polychaetsi_word(word) + target = config.POLYCHAETSI_TARGET + + if normalized == target: + return True + if not normalized or normalized[0] != "п": + return False + if len(normalized) < len(target) - 1 or len(normalized) > len(target) + 1: + return False + if "ч" not in normalized or "а" not in normalized or "е" not in normalized: + return False + if not normalized.endswith(("я", "а")): + return False + + return _damerau_levenshtein_distance(normalized, target, max_distance=2) <= 2 + +def count_polychaetsi_mentions(text: str) -> int: + return sum(1 for word in _polychaetsi_word_re.findall(text) if is_polychaetsi_variant(word)) + +def register_polychaetsi_hits(user: types.User, hits: int) -> int: + display_name = format_penis_user_name(user) + with _polychaetsi_lock: + data = _load_polychaetsi_stats() + users = data.setdefault("users", {}) + + user_key = str(user.id) + entry = users.get(user_key) + if not isinstance(entry, dict): + entry = {"display_name": display_name, "count": 0} + + stored_count = entry.get("count", 0) + try: + count = int(stored_count) + except (TypeError, ValueError): + count = 0 + + count += hits + entry["display_name"] = display_name + entry["count"] = count + users[user_key] = entry + _save_polychaetsi_stats(data) + return count + +def build_polychaetsi_top(limit: int = config.POLYCHAETSI_TOP_LIMIT) -> str: + with _polychaetsi_lock: + data = _load_polychaetsi_stats() + + users = data.get("users", {}) + if not isinstance(users, dict): + return "ТОП получается:\nпока пусто." + + entries: list[tuple[int, str, int]] = [] + for user_key, raw_entry in users.items(): + if not isinstance(raw_entry, dict): + continue + + try: + count = int(raw_entry.get("count", 0)) + except (TypeError, ValueError): + continue + + if count <= 0: + continue + + try: + numeric_user_id = int(user_key) + except (TypeError, ValueError): + numeric_user_id = 0 + + name = str(raw_entry.get("display_name") or f"user_{user_key}").strip() or f"user_{user_key}" + entries.append((count, name, numeric_user_id)) + + if not entries: + return "ТОП получается:\nпока пусто." + + entries.sort(key=lambda item: (-item[0], item[1].lower(), item[2])) + medals = {1: "🥇", 2: "🥈", 3: "🥉"} + lines = ["ТОП получается:"] + for index, (count, name, _) in enumerate(entries[:limit], start=1): + prefix = medals.get(index, f"{index}.") + lines.append(f"{prefix} {name} — {count}") + return "\n".join(lines) + # --- Хендлеры aiogram --- async def handle_help(message: Message): @@ -599,6 +763,9 @@ async def handle_penis_cmd(message: Message): async def handle_top_penis_cmd(message: Message): await message.answer(build_penis_top()) +async def handle_polychaetsi_cmd(message: Message): + await message.answer(build_polychaetsi_top()) + async def handle_size_cmd(message: Message): size = round(random.uniform(0.1, 35.0), 1) if size < 5: @@ -765,6 +932,20 @@ async def handle_keywords(message: Message): ) return + polychaetsi_hits = count_polychaetsi_mentions(text_lower) + if polychaetsi_hits > 0 and message.from_user: + total_hits = await asyncio.to_thread(register_polychaetsi_hits, message.from_user, polychaetsi_hits) + photo_path = config.POLYCHAETSI_IMAGE_PATH + if photo_path.exists(): + await message.answer_photo( + photo=FSInputFile(photo_path), + caption=f"x{total_hits}", + ) + else: + logger.warning("cvetok.jpg not found, fallback to text response") + await message.answer(f"x{total_hits}") + return + # Записываем каждое обычное сообщение в историю чата await asyncio.to_thread(push_message, chat_id, "user", user_name, message.text) @@ -835,6 +1016,7 @@ def main(): if not token: raise RuntimeError("BOT_TOKEN не задан!") init_penis_db() + init_polychaetsi_storage() bot = Bot(token=token, default=DefaultBotProperties(parse_mode=ParseMode.HTML)) dp = Dispatcher() @@ -846,6 +1028,7 @@ def main(): dp.message.register(handle_size_cmd, Command("size")) dp.message.register(handle_penis_cmd, Command("penis")) dp.message.register(handle_top_penis_cmd, Command("top_penis")) + dp.message.register(handle_polychaetsi_cmd, Command("polychaetsi")) dp.message.register(handle_prices_cmd, Command("prices")) dp.message.register(handle_fetch_cmd, Command("fetch")) dp.message.register(handle_zvetok_cmd, Command("zvetok")) @@ -868,6 +1051,7 @@ def main(): BotCommand(command="size", description="хуй"), BotCommand(command="penis", description="миниигра 1 раз в 24ч"), BotCommand(command="top_penis", description="топ по длине"), + BotCommand(command="polychaetsi", description="топ по получается"), BotCommand(command="prices", description="цены и остатки Магнита"), BotCommand(command="fetch", description="alias для /prices"), BotCommand(command="zvetok", description="Цветянский бля"), diff --git a/maket/cvetok.jpg b/maket/cvetok.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dc4e6a6a7ebfa13deeff9ec3d53effe1c364c149 GIT binary patch literal 43823 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.4.1 pillow>=10.3.0 requests>=2.31.0 +aiohttp>=3.9.5 +tzdata>=2024.1 beautifulsoup4 lxml pysqlite3-binary>=0.5.3