Упрощение: общие хелперы, команды и упоминания по entities, фото только для моделей со зрением

- Одна formatUtc и один displayName(profile) вместо копий в разных слоях
- commandOf/mentionsUser/textWithoutMention работают по entities для текста и подписей;
  убраны askInCaption, regex-поиск упоминаний и отдельный composer.command("ask")
- Фото скачиваются только если модель их видит; пустой вопрос с картинкой формулирует промпт
- Поддержка фото задаётся явно для моделей по умолчанию, для своей AI_MODEL — через AI_IMAGE_INPUT
- Активность участников считается по сохранённой истории, а не отдельными счётчиками;
  один хендлер для message и edited_message, упоминания не пишутся дважды
- SQLite: synchronous = NORMAL для WAL
- Кнопки не-админов отклоняются через bot.drop(isAdmin)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
yunogasai
2026-09-24 20:10:56 +02:00
parent f8273e8a23
commit e812f1b1e2
21 changed files with 269 additions and 266 deletions

View File

@@ -1,14 +1,12 @@
import { formatUtc } from "../../libs/time.js";
import type { ChatMessage } from "../../types.js";
export const formatTime = (unixSeconds: number): string =>
new Date(unixSeconds * 1000).toISOString().slice(0, 16).replace("T", " ");
/** Сообщения чата в текстовом виде для контекста модели. */
export const formatChatMessages = (messages: ChatMessage[]): string =>
messages
.map((m) => {
const reply = m.replyToMessageId ? ` (ответ на #${m.replyToMessageId})` : "";
return `#${m.messageId} [${formatTime(m.date)} UTC] ${m.author}${reply}: ${m.text}`;
return `#${m.messageId} [${formatUtc(m.date)}] ${m.author}${reply}: ${m.text}`;
})
.join("\n");