CI / Build & Quality Checks (pull_request) Successful in 3m0s
CI / Trigger Desktop Build (pull_request) Skipped
CI / Docker image build & smoke test (pull_request) Skipped
CI / Secret scan (gitleaks) (pull_request) Successful in 15s
CI / Playwright smoke (e2e) (pull_request) Successful in 15m30s
dedupePolicyEntries keyed on the raw recommendation, so m.ban and org.matrix.mjolnir.ban for the same entity never matched and the rule showed twice (both labelled "Ban"). Key on the normalised value; move the pure helpers to policyEntries.ts with unit tests. Fixes #321 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
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;
|
|
}
|