68 lines
2.8 KiB
JavaScript
68 lines
2.8 KiB
JavaScript
|
|
import { getConnection, upsertConnection } from '../core/db.js';
|
||
|
|
import { logger } from '../core/logger.js';
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Резолвер владельца по business_connection_id.
|
||
|
|
*
|
||
|
|
* Зачем: у бизнес-сообщений НЕТ флага «исходящее». Единственный надёжный способ
|
||
|
|
* отличить сообщение владельца от сообщения собеседника — сравнить from.id с id
|
||
|
|
* владельца подключения. А уведомления об удалении надо слать в личку владельца
|
||
|
|
* (owner_chat_id). И то, и другое берём из подключения.
|
||
|
|
*
|
||
|
|
* Порядок поиска: память → БД → getBusinessConnection (и результат кэшируем).
|
||
|
|
* getBusinessConnection нужен после рестарта, если событие connection пришло до
|
||
|
|
* запуска и в памяти пусто, но в БД запись есть — тогда чаще хватит БД.
|
||
|
|
*/
|
||
|
|
const memo = new Map(); // connId -> { ownerId, ownerChatId, ownerName, ownerUsername, isEnabled }
|
||
|
|
|
||
|
|
/** Кладёт/обновляет подключение и в память, и в БД. Возвращает нормализованную запись. */
|
||
|
|
export function rememberConnection(conn) {
|
||
|
|
const record = {
|
||
|
|
connId: String(conn.id),
|
||
|
|
ownerId: conn.user?.id != null ? String(conn.user.id) : '',
|
||
|
|
ownerChatId: conn.user_chat_id != null ? String(conn.user_chat_id) : '',
|
||
|
|
ownerName: [conn.user?.first_name, conn.user?.last_name].filter(Boolean).join(' '),
|
||
|
|
ownerUsername: conn.user?.username ?? '',
|
||
|
|
isEnabled: Boolean(conn.is_enabled),
|
||
|
|
};
|
||
|
|
memo.set(record.connId, record);
|
||
|
|
upsertConnection(record);
|
||
|
|
return record;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Возвращает { ownerId, ownerChatId, ... } по connId или null.
|
||
|
|
* api — bot.api (для getBusinessConnection); можно не передавать, тогда только кэш/БД.
|
||
|
|
*/
|
||
|
|
export async function resolveOwner(connId, api) {
|
||
|
|
if (connId == null) return null;
|
||
|
|
const key = String(connId);
|
||
|
|
|
||
|
|
const cached = memo.get(key);
|
||
|
|
if (cached) return cached;
|
||
|
|
|
||
|
|
const row = getConnection(key);
|
||
|
|
if (row) {
|
||
|
|
const record = {
|
||
|
|
connId: key,
|
||
|
|
ownerId: row.owner_id ?? '',
|
||
|
|
ownerChatId: row.owner_chat_id ?? '',
|
||
|
|
ownerName: row.owner_name ?? '',
|
||
|
|
ownerUsername: row.owner_username ?? '',
|
||
|
|
isEnabled: Boolean(row.is_enabled),
|
||
|
|
};
|
||
|
|
memo.set(key, record);
|
||
|
|
return record;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (api?.getBusinessConnection) {
|
||
|
|
try {
|
||
|
|
const conn = await api.getBusinessConnection(key);
|
||
|
|
if (conn?.id) return rememberConnection(conn);
|
||
|
|
} catch (err) {
|
||
|
|
logger.warn(`connections: getBusinessConnection(${key}) не удался:`, err.message);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return null;
|
||
|
|
}
|