export function buildGroupNicknameIdCandidates(values: Array): string[] { const set = new Set() for (const rawValue of values) { const raw = String(rawValue || '').trim() if (!raw) continue set.add(raw) } return Array.from(set) } export function normalizeGroupNicknameIdentity(value: string): string { return String(value || '').trim().toLowerCase() } export function normalizeGroupNickname(value: string): string { const trimmed = (value || '').trim() if (!trimmed) return '' const cleaned = trimmed.replace(/[\x00-\x1F\x7F]/g, '') if (!cleaned) return '' if (/^[,"'“”‘’,、]+$/.test(cleaned)) return '' return cleaned } export function resolveGroupNicknameByCandidates(groupNicknamesMap: Map, candidates: Array): string { const idCandidates = buildGroupNicknameIdCandidates(candidates) if (idCandidates.length === 0) return '' let resolved = '' for (const id of idCandidates) { const normalizedId = normalizeGroupNicknameIdentity(id) if (!normalizedId) continue const candidateNickname = normalizeGroupNickname(groupNicknamesMap.get(normalizedId) || '') if (!candidateNickname) continue if (!resolved) { resolved = candidateNickname continue } if (resolved !== candidateNickname) return '' } return resolved }