36 lines
1.1 KiB
TypeScript
36 lines
1.1 KiB
TypeScript
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<string>();
|
||
|
|
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;
|
||
|
|
}
|