from __future__ import annotations import html WELCOME_RICH_HTML = """

Привет! Я — бот для написания постов

Помогаю писать и редактировать посты для соцсетей. Расскажи, о чём нужен пост, а я верну три варианта: короткий, развёрнутый и с призывом к действию.

Примеры запросов

Также я умею запоминать твой стиль: пришли скриншоты своих постов. Хочешь идею — напиши «предложи тему».

Ниже — подробная инструкция по работе с ботом.

""" HELP_MENU_TITLE = "Помощь по боту" HELP_MENU_INTRO = "Выбери раздел — откроется только он." HELP_SECTIONS: dict[str, tuple[str, str]] = { "posts": ( "✍️ Написать пост", """
  1. Напиши сообщение или отправь голосовое с прямой просьбой, например: «Придумай пост для Telegram про запуск нового продукта».
  2. Можешь указать площадку, аудиторию, факты, длину, цель и другие требования. Можно надиктовать подробное ТЗ или просто тему.
  3. Я распознаю речь, проверю, просишь ли ты именно написать пост, и верну три варианта отдельными сообщениями.

В сообщениях с вариантами будет только текст поста: без нумерации и вступлений, с абзацами, переносами строк и уместными эмодзи.

""", ), "tone": ( "🎨 Tone of Voice", """

Пришли скриншот или галерею скриншотов своих опубликованных постов. Я распознаю текст постов и сохраню его как образцы, дополню предыдущие примеры и обновлю только правила Tone of Voice. Сами публикации не переписываю.

""", ), "edit": ( "✏️ Правка поста", """

Ответь реплаем на сообщение с вариантом и укажи, что изменить. Например: «Сделай короче и добавь призыв». Я учту оригинальный текст и верну три новых варианта отдельными сообщениями.

""", ), "idea": ( "💡 Идея для поста", """

Напиши «предложи идею для поста», «о чём написать?» или «накидай тему» — верну одну идею. Команда /idea работает так же.

Идеи сохраняются, чтобы не повторяться: каждая новая идея отличается от предыдущих.

""", ), "subscription": ( "💳 Подписка", """

У тебя есть пробный период — 3 дня бесплатно. Дальше — подписка на 30 дней за 100 звёзд.

Когда период закончится, генерация постов и идей станет недоступна — бот предложит оформить подписку. Команды /help, /balance, /subscribe, /start и /clear работают всегда.

""", ), "commands": ( "⌨️ Команды", """

Быстрые slash-команды только на английском: /help — эта справка; /start — краткое описание бота; /clear — полностью обнулить твои данные бота, кроме технических API-логов; /idea — предложить одну идею для нового поста; /balance — статус подписки; /subscribe — оплатить подписку на 30 дней.

Можно попросить идею обычными словами: «предложи идею для поста», «о чём написать?», «накидай тему».

""", ), } HELP_SECTION_ORDER: tuple[str, ...] = tuple(HELP_SECTIONS) HELP_BACK = "⬅️ В меню" HELP_PREV = "⬅️ Предыдущий" HELP_NEXT = "➡️ Следующий" def _section_nav(section: str) -> str: buttons = [f'{HELP_BACK}'] index = HELP_SECTION_ORDER.index(section) if index > 0: previous = HELP_SECTION_ORDER[index - 1] buttons.append( f'{HELP_PREV}' ) if index + 1 < len(HELP_SECTION_ORDER): following = HELP_SECTION_ORDER[index + 1] buttons.append( f'{HELP_NEXT}' ) return '' + "".join(buttons) + "" def help_menu_html() -> str: buttons = [ f'' f"{HELP_SECTIONS[section][0]}" for section in HELP_SECTION_ORDER ] pairs = "".join( '' + "".join(buttons[i : i + 2]) + "" for i in range(0, len(buttons), 2) ) return ( f"

{HELP_MENU_TITLE}

" f"

{HELP_MENU_INTRO}

" f"

Я помогаю писать и редактировать посты для соцсетей. " f"Генерирую посты только по явной просьбе.

" f"{pairs}" ) def help_section_html(section: str) -> str: title, body = HELP_SECTIONS[section] return f"

{title}

{body}{_section_nav(section)}" def help_view(section: str | None = None) -> str: if section and section in HELP_SECTIONS: return help_section_html(section) return help_menu_html() def help_plain_view(section: str | None = None) -> str: if section and section in HELP_SECTIONS: title, body = HELP_SECTIONS[section] return f"{HELP_MENU_TITLE} — {title}\n\n{rich_to_plain(body)}" lines = [HELP_MENU_TITLE, HELP_MENU_INTRO] lines += [f"• {HELP_SECTIONS[name][0]}" for name in HELP_SECTION_ORDER] return "\n".join(lines) def rich_to_plain(rich_html: str) -> str: import re text = re.sub(r"]*)?>", "• ", rich_html, flags=re.IGNORECASE) text = re.sub(r"]*)?/?>", "\n", text, flags=re.IGNORECASE) text = re.sub(r"<[^>]+>", "", text) text = html.unescape(text) return "\n".join(line.strip() for line in text.splitlines() if line.strip())