refactor: remove unreachable legacy command handlers
This commit is contained in:
@@ -536,11 +536,3 @@ async def run_agent_prompt(
|
||||
update.effective_message,
|
||||
"⚠️ **Произошла внутренняя ошибка** при запросе к модели.",
|
||||
)
|
||||
|
||||
|
||||
async def run_ai_prompt(
|
||||
update: Update,
|
||||
context: ContextTypes.DEFAULT_TYPE,
|
||||
prompt: str,
|
||||
) -> None:
|
||||
await run_agent_prompt(update, context, prompt)
|
||||
|
||||
@@ -88,7 +88,6 @@ def create_application() -> Application:
|
||||
)
|
||||
|
||||
application.bot_data["ai_client"] = ai_client
|
||||
application.bot_data["assistant_mode"] = mode
|
||||
application.bot_data["timezone"] = get_local_timezone()
|
||||
application.bot_data["speech_recognizer"] = speech_recognizer
|
||||
application.bot_data["voice_max_duration"] = get_voice_max_duration_seconds()
|
||||
|
||||
@@ -3,7 +3,6 @@ import logging
|
||||
import os
|
||||
import tempfile
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
|
||||
from telegram import Update
|
||||
from telegram.constants import ChatAction
|
||||
@@ -12,7 +11,6 @@ from telegram.ext import ContextTypes
|
||||
|
||||
from .ai import AIClientError
|
||||
from .agent import run_agent_prompt
|
||||
from .reminders import parse_reminder
|
||||
from .telegram_utils import (
|
||||
build_inline_results,
|
||||
command_text,
|
||||
@@ -24,7 +22,6 @@ from .telegram_utils import (
|
||||
get_tz,
|
||||
get_voice_max_duration,
|
||||
markdown_code,
|
||||
parse_positive_int,
|
||||
reply_long,
|
||||
reply_markdown,
|
||||
require_user_id,
|
||||
@@ -36,16 +33,6 @@ from .time_utils import format_local_dt
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def format_numbered_rows(
|
||||
rows: list[dict[str, Any]],
|
||||
formatter,
|
||||
empty_text: str,
|
||||
) -> str:
|
||||
if not rows:
|
||||
return empty_text
|
||||
return "\n".join(formatter(row) for row in rows)
|
||||
|
||||
|
||||
async def start(update: Update, _context: ContextTypes.DEFAULT_TYPE) -> None:
|
||||
if update.message:
|
||||
await reply_markdown(
|
||||
@@ -285,324 +272,6 @@ async def model_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> N
|
||||
)
|
||||
|
||||
|
||||
async def remember_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
|
||||
if not update.message:
|
||||
return
|
||||
|
||||
user_id = require_user_id(update)
|
||||
text = command_text(context)
|
||||
if user_id is None:
|
||||
await reply_markdown(update.message, "⚠️ **Не могу определить пользователя.**")
|
||||
return
|
||||
if not text:
|
||||
await reply_markdown(
|
||||
update.message,
|
||||
"🧠 Напиши факт после команды: "
|
||||
"`/remember я предпочитаю короткие ответы`",
|
||||
)
|
||||
return
|
||||
|
||||
memory_id = get_storage(context).add_memory(user_id, text)
|
||||
await reply_markdown(
|
||||
update.message,
|
||||
f"✅ **Запомнил.** ID памяти: {markdown_code(memory_id)}",
|
||||
)
|
||||
|
||||
|
||||
async def memory_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
|
||||
if not update.message:
|
||||
return
|
||||
|
||||
user_id = require_user_id(update)
|
||||
if user_id is None:
|
||||
await reply_markdown(update.message, "⚠️ **Не могу определить пользователя.**")
|
||||
return
|
||||
|
||||
rows = get_storage(context).list_memories(user_id)
|
||||
text = "**🧠 Долговременная память**\n\n" + format_numbered_rows(
|
||||
rows,
|
||||
lambda row: (
|
||||
f"- {markdown_code('#' + str(row['id']))} "
|
||||
f"{escape_markdown_text(row['text'])}"
|
||||
),
|
||||
"*Пока пусто.*",
|
||||
)
|
||||
await reply_long(update.message, text)
|
||||
|
||||
|
||||
async def forget_memory_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
|
||||
if not update.message:
|
||||
return
|
||||
|
||||
user_id = require_user_id(update)
|
||||
memory_id = parse_positive_int(command_text(context))
|
||||
if user_id is None:
|
||||
await reply_markdown(update.message, "⚠️ **Не могу определить пользователя.**")
|
||||
return
|
||||
if memory_id is None:
|
||||
await reply_markdown(
|
||||
update.message,
|
||||
"🧠 Укажи ID: `/forget_memory 3`",
|
||||
)
|
||||
return
|
||||
|
||||
deleted = get_storage(context).delete_memory(user_id, memory_id)
|
||||
await reply_markdown(
|
||||
update.message,
|
||||
"✅ **Запись памяти удалена.**"
|
||||
if deleted
|
||||
else "🔎 **Не нашёл такую запись памяти.**",
|
||||
)
|
||||
|
||||
|
||||
async def note_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
|
||||
if not update.message:
|
||||
return
|
||||
|
||||
user_id = require_user_id(update)
|
||||
text = command_text(context)
|
||||
if user_id is None:
|
||||
await reply_markdown(update.message, "⚠️ **Не могу определить пользователя.**")
|
||||
return
|
||||
if not text:
|
||||
await reply_markdown(
|
||||
update.message,
|
||||
"📝 Напиши текст заметки: `/note идея для проекта`",
|
||||
)
|
||||
return
|
||||
|
||||
note_id = get_storage(context).add_note(user_id, text)
|
||||
await reply_markdown(
|
||||
update.message,
|
||||
f"✅ **Заметка сохранена.** ID: {markdown_code(note_id)}",
|
||||
)
|
||||
|
||||
|
||||
async def notes_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
|
||||
if not update.message:
|
||||
return
|
||||
|
||||
user_id = require_user_id(update)
|
||||
if user_id is None:
|
||||
await reply_markdown(update.message, "⚠️ **Не могу определить пользователя.**")
|
||||
return
|
||||
|
||||
rows = get_storage(context).list_notes(user_id)
|
||||
text = "**📝 Заметки**\n\n" + format_numbered_rows(
|
||||
rows,
|
||||
lambda row: (
|
||||
f"- {markdown_code('#' + str(row['id']))} "
|
||||
f"{escape_markdown_text(row['text'])}"
|
||||
),
|
||||
"*Пока пусто.*",
|
||||
)
|
||||
await reply_long(update.message, text)
|
||||
|
||||
|
||||
async def forget_note_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
|
||||
if not update.message:
|
||||
return
|
||||
|
||||
user_id = require_user_id(update)
|
||||
note_id = parse_positive_int(command_text(context))
|
||||
if user_id is None:
|
||||
await reply_markdown(update.message, "⚠️ **Не могу определить пользователя.**")
|
||||
return
|
||||
if note_id is None:
|
||||
await reply_markdown(update.message, "📝 Укажи ID: `/forget 3`")
|
||||
return
|
||||
|
||||
deleted = get_storage(context).delete_note(user_id, note_id)
|
||||
await reply_markdown(
|
||||
update.message,
|
||||
"✅ **Заметка удалена.**" if deleted else "🔎 **Не нашёл такую заметку.**",
|
||||
)
|
||||
|
||||
|
||||
async def remind_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
|
||||
if not update.message or not update.effective_chat:
|
||||
return
|
||||
|
||||
user_id = require_user_id(update)
|
||||
if user_id is None:
|
||||
await reply_markdown(update.message, "⚠️ **Не могу определить пользователя.**")
|
||||
return
|
||||
|
||||
parsed = parse_reminder(command_text(context), get_tz(context))
|
||||
if not parsed:
|
||||
await reply_markdown(
|
||||
update.message,
|
||||
"**⏰ Формат напоминания**\n\n"
|
||||
"- `/remind 30m позвонить`\n"
|
||||
"- `/remind через 2 часа проверить статус`\n"
|
||||
"- `/remind 18:30 отправить отчёт`\n"
|
||||
"- `/remind 2026-07-16 18:30 отправить отчёт`",
|
||||
)
|
||||
return
|
||||
|
||||
reminder_id = get_storage(context).add_reminder(
|
||||
user_id=user_id,
|
||||
chat_id=int(update.message.chat_id),
|
||||
text=parsed.text,
|
||||
remind_at_utc=parsed.remind_at_utc,
|
||||
)
|
||||
await reply_markdown(
|
||||
update.message,
|
||||
f"✅ **Напоминание {markdown_code(f'#{reminder_id}')} поставлено на** "
|
||||
f"{markdown_code(format_local_dt(parsed.remind_at_utc, get_tz(context)))}.",
|
||||
)
|
||||
|
||||
|
||||
async def reminders_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
|
||||
if not update.message:
|
||||
return
|
||||
|
||||
user_id = require_user_id(update)
|
||||
if user_id is None:
|
||||
await reply_markdown(update.message, "⚠️ **Не могу определить пользователя.**")
|
||||
return
|
||||
|
||||
tz = get_tz(context)
|
||||
rows = get_storage(context).list_reminders(user_id)
|
||||
text = "**⏰ Активные напоминания**\n\n" + format_numbered_rows(
|
||||
rows,
|
||||
lambda row: (
|
||||
f"- {markdown_code('#' + str(row['id']))} "
|
||||
f"{markdown_code(format_local_dt(row['remind_at'], tz))} — "
|
||||
f"{escape_markdown_text(row['text'])}"
|
||||
),
|
||||
"*Активных напоминаний нет.*",
|
||||
)
|
||||
await reply_long(update.message, text)
|
||||
|
||||
|
||||
async def cancel_reminder_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
|
||||
if not update.message:
|
||||
return
|
||||
|
||||
user_id = require_user_id(update)
|
||||
reminder_id = parse_positive_int(command_text(context))
|
||||
if user_id is None:
|
||||
await reply_markdown(update.message, "⚠️ **Не могу определить пользователя.**")
|
||||
return
|
||||
if reminder_id is None:
|
||||
await reply_markdown(
|
||||
update.message,
|
||||
"⏰ Укажи ID: `/cancelreminder 3`",
|
||||
)
|
||||
return
|
||||
|
||||
cancelled = get_storage(context).cancel_reminder(user_id, reminder_id)
|
||||
await reply_markdown(
|
||||
update.message,
|
||||
"✅ **Напоминание отменено.**"
|
||||
if cancelled
|
||||
else "🔎 **Не нашёл активное напоминание.**",
|
||||
)
|
||||
|
||||
|
||||
def split_tracking_text(raw: str) -> tuple[str, str]:
|
||||
if "|" not in raw:
|
||||
return raw.strip(), "open"
|
||||
title, status = raw.split("|", 1)
|
||||
return title.strip(), status.strip() or "open"
|
||||
|
||||
|
||||
async def track_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
|
||||
if not update.message:
|
||||
return
|
||||
|
||||
user_id = require_user_id(update)
|
||||
raw_text = command_text(context)
|
||||
if user_id is None:
|
||||
await reply_markdown(update.message, "⚠️ **Не могу определить пользователя.**")
|
||||
return
|
||||
if not raw_text:
|
||||
await reply_markdown(
|
||||
update.message,
|
||||
"📌 Формат: `/track паспорт | жду ответа`",
|
||||
)
|
||||
return
|
||||
|
||||
title, status = split_tracking_text(raw_text)
|
||||
if not title:
|
||||
await reply_markdown(
|
||||
update.message,
|
||||
"⚠️ **Название не должно быть пустым.**",
|
||||
)
|
||||
return
|
||||
|
||||
item_id = get_storage(context).add_tracked_item(user_id, title, status)
|
||||
await reply_markdown(
|
||||
update.message,
|
||||
f"✅ **Добавил отслеживание {markdown_code(f'#{item_id}')}**\n\n"
|
||||
f"**Название:** {escape_markdown_text(title)}\n"
|
||||
f"**Статус:** {escape_markdown_text(status)}",
|
||||
)
|
||||
|
||||
|
||||
async def status_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
|
||||
if not update.message:
|
||||
return
|
||||
|
||||
user_id = require_user_id(update)
|
||||
if user_id is None:
|
||||
await reply_markdown(update.message, "⚠️ **Не могу определить пользователя.**")
|
||||
return
|
||||
|
||||
raw_text = command_text(context)
|
||||
storage = get_storage(context)
|
||||
if not raw_text:
|
||||
rows = storage.list_tracked_items(user_id)
|
||||
text = "**📌 Отслеживаемые статусы**\n\n" + format_numbered_rows(
|
||||
rows,
|
||||
lambda row: (
|
||||
f"- {markdown_code('#' + str(row['id']))} "
|
||||
f"**{escape_markdown_text(row['title'])}:** "
|
||||
f"{escape_markdown_text(row['status'])}"
|
||||
),
|
||||
"*Нет отслеживаемых статусов.*",
|
||||
)
|
||||
await reply_long(update.message, text)
|
||||
return
|
||||
|
||||
parts = raw_text.split(maxsplit=1)
|
||||
item_id = parse_positive_int(parts[0])
|
||||
new_status = parts[1].strip() if len(parts) > 1 else ""
|
||||
if item_id is None or not new_status:
|
||||
await reply_markdown(
|
||||
update.message,
|
||||
"📌 Формат: `/status 3 новый статус`",
|
||||
)
|
||||
return
|
||||
|
||||
updated = storage.set_tracked_status(user_id, item_id, new_status)
|
||||
await reply_markdown(
|
||||
update.message,
|
||||
"✅ **Статус обновлён.**" if updated else "🔎 **Не нашёл такой объект.**",
|
||||
)
|
||||
|
||||
|
||||
async def untrack_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
|
||||
if not update.message:
|
||||
return
|
||||
|
||||
user_id = require_user_id(update)
|
||||
item_id = parse_positive_int(command_text(context))
|
||||
if user_id is None:
|
||||
await reply_markdown(update.message, "⚠️ **Не могу определить пользователя.**")
|
||||
return
|
||||
if item_id is None:
|
||||
await reply_markdown(update.message, "📌 Укажи ID: `/untrack 3`")
|
||||
return
|
||||
|
||||
deleted = get_storage(context).delete_tracked_item(user_id, item_id)
|
||||
await reply_markdown(
|
||||
update.message,
|
||||
"✅ **Объект удалён.**" if deleted else "🔎 **Не нашёл такой объект.**",
|
||||
)
|
||||
|
||||
|
||||
async def inline_query(update: Update, _context: ContextTypes.DEFAULT_TYPE) -> None:
|
||||
if not update.inline_query or not update.inline_query.query:
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user