export type PolicyEntry = { entity: string; reason: string; recommendation: string; stateKey: string; }; /** * `m.ban` is the stable value; `org.matrix.mjolnir.ban` is the legacy * (pre-stabilization) recommendation still emitted by older bots. */ export const normalizeRecommendation = (rec: string): string => rec === 'org.matrix.mjolnir.ban' ? 'm.ban' : rec; export function recommendationLabel(rec: string): string { if (normalizeRecommendation(rec) === 'm.ban') return 'Ban'; return rec; } /** * Merge stable and legacy rule lists, one entry per entity + recommendation. * [Gitea #321] Keyed on the normalised recommendation: a bot publishing both * `m.ban` and its `org.matrix.mjolnir.ban` twin showed the rule twice. */ export function dedupePolicyEntries(entries: PolicyEntry[]): PolicyEntry[] { const seen = new Set(); const result: PolicyEntry[] = []; entries.forEach((entry) => { const key = `${entry.entity} ${normalizeRecommendation(entry.recommendation)}`; if (seen.has(key)) return; seen.add(key); result.push(entry); }); return result; }