import { UserGroupJoinings, UserGroups, Users } from "../models/index.js"; import { In } from "typeorm"; const GROUP_MENTION = /(^|[^\w@])@@([a-zA-Z0-9_]{1,64})\b/g; const WRAPPED_ASSET = /[:;][^:;\s]{1,100}[:;]/g; export function extractGroupMentionNames(texts) { const names = new Set(); for (const text of texts){ if (!text) continue; const sanitized = text.replace(WRAPPED_ASSET, (match)=>" ".repeat(match.length)); for (const match of sanitized.matchAll(GROUP_MENTION)){ names.add(match[2].toLowerCase()); } } return [ ...names ]; } export async function extractGroupMentionedUsers(texts) { const names = extractGroupMentionNames(texts); if (names.length === 0) return []; const groups = await UserGroups.find({ where: names.map((username)=>({ username })) }); const mentionedUserIds = new Set(); for (const group of groups){ mentionedUserIds.add(group.userId); const joinings = await UserGroupJoinings.findBy({ userGroupId: group.id }); for (const joining of joinings){ mentionedUserIds.add(joining.userId); } } if (mentionedUserIds.size === 0) return []; return await Users.findBy({ id: In([ ...mentionedUserIds ]) }); }