Route Telegram smart research commands (#16)
This commit is contained in:
parent
d4f2530284
commit
30544dce05
3 changed files with 38 additions and 0 deletions
|
|
@ -56,6 +56,7 @@ from http_chat_proxy import (
|
||||||
build_smart_research_proxy_payload,
|
build_smart_research_proxy_payload,
|
||||||
extract_smart_research_goal,
|
extract_smart_research_goal,
|
||||||
post_chat_proxy,
|
post_chat_proxy,
|
||||||
|
smart_research_command_names,
|
||||||
)
|
)
|
||||||
|
|
||||||
# ─── Config ─────────────────────────────────────────────────────────────
|
# ─── Config ─────────────────────────────────────────────────────────────
|
||||||
|
|
@ -982,6 +983,11 @@ async def handle_reply_to_bot(update: Update, context: ContextTypes.DEFAULT_TYPE
|
||||||
await handle_tagged(update, context)
|
await handle_tagged(update, context)
|
||||||
|
|
||||||
|
|
||||||
|
async def handle_smart_research_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||||||
|
"""Route configured slash commands into the smart-research proxy path."""
|
||||||
|
await handle_tagged(update, context)
|
||||||
|
|
||||||
|
|
||||||
async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||||||
"""Handle ALL incoming group messages — buffer for triage."""
|
"""Handle ALL incoming group messages — buffer for triage."""
|
||||||
if not update.message or not update.message.text:
|
if not update.message or not update.message.text:
|
||||||
|
|
@ -2236,6 +2242,8 @@ def main():
|
||||||
# Command handlers
|
# Command handlers
|
||||||
app.add_handler(CommandHandler("start", start_command))
|
app.add_handler(CommandHandler("start", start_command))
|
||||||
app.add_handler(CommandHandler("stats", stats_command))
|
app.add_handler(CommandHandler("stats", stats_command))
|
||||||
|
for command in smart_research_command_names(AGENT_SMART_RESEARCH_COMMAND_PREFIXES):
|
||||||
|
app.add_handler(CommandHandler(command, handle_smart_research_command))
|
||||||
|
|
||||||
# Tag handler — messages mentioning the bot
|
# Tag handler — messages mentioning the bot
|
||||||
# python-telegram-bot filters.Mention doesn't work for bot mentions in groups
|
# python-telegram-bot filters.Mention doesn't work for bot mentions in groups
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,22 @@ import re
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
DEFAULT_SMART_RESEARCH_COMMAND_PREFIXES = ("/smart_research", "/paid_research")
|
DEFAULT_SMART_RESEARCH_COMMAND_PREFIXES = ("/smart_research", "/paid_research")
|
||||||
|
_TELEGRAM_COMMAND_NAME_RE = re.compile(r"^[A-Za-z0-9_]+$")
|
||||||
|
|
||||||
|
|
||||||
|
def smart_research_command_names(
|
||||||
|
command_prefixes: tuple[str, ...] | list[str] = DEFAULT_SMART_RESEARCH_COMMAND_PREFIXES,
|
||||||
|
) -> list[str]:
|
||||||
|
"""Return Telegram command names registered for smart-research routing."""
|
||||||
|
command_names: set[str] = set()
|
||||||
|
for prefix in command_prefixes:
|
||||||
|
command = str(prefix).strip()
|
||||||
|
if not command.startswith("/"):
|
||||||
|
continue
|
||||||
|
command = command[1:].split("@", 1)[0].strip()
|
||||||
|
if command and _TELEGRAM_COMMAND_NAME_RE.match(command):
|
||||||
|
command_names.add(command)
|
||||||
|
return sorted(command_names)
|
||||||
|
|
||||||
|
|
||||||
def build_chat_proxy_payload(
|
def build_chat_proxy_payload(
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@ from http_chat_proxy import ( # noqa: E402
|
||||||
build_smart_research_proxy_payload,
|
build_smart_research_proxy_payload,
|
||||||
extract_chat_proxy_reply,
|
extract_chat_proxy_reply,
|
||||||
extract_smart_research_goal,
|
extract_smart_research_goal,
|
||||||
|
smart_research_command_names,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -118,6 +119,19 @@ def test_extract_smart_research_goal(message, expected):
|
||||||
assert extract_smart_research_goal(message) == expected
|
assert extract_smart_research_goal(message) == expected
|
||||||
|
|
||||||
|
|
||||||
|
def test_smart_research_command_names_are_safe_for_telegram_handlers():
|
||||||
|
assert smart_research_command_names(
|
||||||
|
[
|
||||||
|
"/smart_research",
|
||||||
|
"/paid_research",
|
||||||
|
"/paid_research@lipleowallet0622183538bot",
|
||||||
|
"not_a_command",
|
||||||
|
"/bad-name",
|
||||||
|
"/",
|
||||||
|
]
|
||||||
|
) == ["paid_research", "smart_research"]
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
("payload", "expected"),
|
("payload", "expected"),
|
||||||
[
|
[
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue