Переписать проект в личный MTProto-юзербот
Смена архитектуры с бизнес-бота на Bot API (команды со слешем) на личный юзербот на GramJS/MTProto с управлением через компаньон-бота. Возможности: - antidelete — кэш входящих в личке, восстановление удалённых «у всех» - onetime — перехват «просмотр один раз» фото/видео до истечения ссылки - локальное хранилище node:sqlite + шифрование AES-256-GCM, чистка по сроку - компаньон-бот (grammY): инлайн-панель, лента с пагинацией, выдача медиа, доступ только владельцу по OWNER_ID Устройство: - core/ — crypto, db, media, loader, registry, logger - userbot/ — MTProto-клиент из строки сессии, подписка на события - modules/ — фичи как модули с хуками setup/onMessage/onEdited/onDeleted - bot/ — компаньон-бот (единственный UI) - scripts/login.js — генерация строки сессии Удалён старый код Bot API (commands/, handlers/, middlewares/, dispatcher, store). Обновлены README и .env.example. Hcrgram/ (сторонний референс) добавлен в .gitignore. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
import { getCachedMessage } from '../core/db.js';
|
||||
import { logger } from '../core/logger.js';
|
||||
|
||||
/**
|
||||
* Ловит удаления. MTProto в событии удаления присылает ТОЛЬКО id сообщений —
|
||||
* без содержимого и (в личных чатах) без чата. Поэтому восстанавливаем из кэша,
|
||||
* который наполняет модуль [cache]. Нашли в кэше — значит это было входящее
|
||||
* в личке: сохраняем как перехват и уведомляем владельца.
|
||||
*/
|
||||
export default {
|
||||
name: 'antidelete',
|
||||
description: 'Сохраняет удалённые собеседником сообщения и медиа',
|
||||
|
||||
async onDeleted(event, ctx) {
|
||||
const ids = event.deletedIds ?? [];
|
||||
if (!ids.length) return;
|
||||
|
||||
for (const id of ids) {
|
||||
const cached = getCachedMessage(id);
|
||||
if (!cached) continue; // не наше/не кэшировали — пропускаем
|
||||
|
||||
await ctx.capture('deleted', {
|
||||
chatId: cached.chat_id,
|
||||
senderId: cached.sender_id,
|
||||
sender: cached.sender,
|
||||
text: cached.text,
|
||||
mediaKind: cached.media_kind,
|
||||
mediaPath: cached.media_path,
|
||||
});
|
||||
logger.info(`antidelete: восстановлено удалённое сообщение ${id} от ${cached.sender || '?'}`);
|
||||
}
|
||||
},
|
||||
};
|
||||
Reference in New Issue
Block a user