This commit is contained in:
@@ -1,6 +1,14 @@
|
||||
import type { ModerationGame } from '$lib/moderation.js';
|
||||
import {
|
||||
moderationCaseStatusLabels,
|
||||
type ModerationCaseStatus,
|
||||
type ModerationGame
|
||||
} from '$lib/moderation.js';
|
||||
import { serverTitle } from './server-labels.js';
|
||||
|
||||
export function moderationCaseHref(id: string): string {
|
||||
return `/moderation/cases/${encodeURIComponent(id)}`;
|
||||
}
|
||||
|
||||
export function moderationHref(context: {
|
||||
game?: string;
|
||||
guid?: string;
|
||||
@@ -35,6 +43,9 @@ export const moderationActionLabels: Record<string, string> = {
|
||||
'create-case': 'Case opened',
|
||||
'case-note': 'Case note added',
|
||||
'resolve-case': 'Case reviewed',
|
||||
'reopen-case': 'Case reopened',
|
||||
'update-case': 'Case updated',
|
||||
'attach-evidence': 'Case evidence attached',
|
||||
note: 'Private note',
|
||||
'restriction.created': 'Restriction created',
|
||||
'restriction.revoked': 'Restriction revoked',
|
||||
@@ -47,11 +58,63 @@ export const moderationActionLabels: Record<string, string> = {
|
||||
'case.note': 'Case note added',
|
||||
'case.resolved': 'Case resolved',
|
||||
'case.dismissed': 'Case dismissed',
|
||||
'case.in_review': 'Case under review',
|
||||
'case.escalated': 'Case escalated',
|
||||
'case.warning_issued': 'Warning issued',
|
||||
'case.restriction_applied': 'Restriction applied',
|
||||
'case.no_action': 'Closed without action',
|
||||
'case.duplicate': 'Closed as duplicate',
|
||||
'case.appeal_upheld': 'Appeal upheld',
|
||||
'case.appeal_denied': 'Appeal denied',
|
||||
'case.reopened': 'Case reopened',
|
||||
'case.updated': 'Case updated',
|
||||
'case.evidence_attached': 'Evidence attached',
|
||||
'case.restriction': 'Restriction linked to case',
|
||||
'player.note': 'Private player note',
|
||||
'runtime.configure': 'Integration configuration requested'
|
||||
};
|
||||
|
||||
export function moderationEventDetail(detail: string, action: string): string {
|
||||
if (action.startsWith('case.')) {
|
||||
try {
|
||||
const record: unknown = JSON.parse(detail);
|
||||
if (!record || typeof record !== 'object') return detail;
|
||||
const value = record as Record<string, unknown>;
|
||||
const display = (item: unknown, status = false): string =>
|
||||
item === null
|
||||
? 'Unassigned'
|
||||
: typeof item === 'string'
|
||||
? status && Object.hasOwn(moderationCaseStatusLabels, item)
|
||||
? moderationCaseStatusLabels[item as ModerationCaseStatus]
|
||||
: item
|
||||
: '';
|
||||
if (action === 'case.updated') {
|
||||
const changes = ['title', 'priority', 'assignee', 'status'].flatMap((key) => {
|
||||
const change = value[key];
|
||||
if (!change || typeof change !== 'object') return [];
|
||||
const { from, to } = change as { from?: unknown; to?: unknown };
|
||||
return [
|
||||
`${key === 'assignee' ? 'Assigned to' : key.charAt(0).toUpperCase() + key.slice(1)}: ${display(from, key === 'status')} → ${display(to, key === 'status')}`
|
||||
];
|
||||
});
|
||||
if (typeof value.reason === 'string') changes.push(value.reason);
|
||||
return changes.join('\n') || detail;
|
||||
}
|
||||
if (action === 'case.reopened' && typeof value.reason === 'string')
|
||||
return `Previous outcome: ${display(value.from, true)}\n${value.reason}`;
|
||||
if (
|
||||
action === 'case.evidence_attached' &&
|
||||
typeof value.count === 'number' &&
|
||||
typeof value.matchId === 'number'
|
||||
)
|
||||
return `${value.count} archived chat ${value.count === 1 ? 'entry' : 'entries'} attached from match #${value.matchId}.`;
|
||||
if (action === 'case.restriction' && typeof value.reason === 'string')
|
||||
return `${value.kind === 'ban' ? 'Ban' : 'Mute'} · ${display(value.scope)} scope\n${value.reason}`;
|
||||
} catch {
|
||||
// Older case events and decision reasons are plain staff-authored text.
|
||||
}
|
||||
return detail;
|
||||
}
|
||||
if (!['restriction.created', 'action.queued'].includes(action)) return detail;
|
||||
try {
|
||||
const value: unknown = JSON.parse(detail);
|
||||
|
||||
Reference in New Issue
Block a user