1
This commit is contained in:
70
src/services/customWorldRoleReferences.ts
Normal file
70
src/services/customWorldRoleReferences.ts
Normal file
@@ -0,0 +1,70 @@
|
||||
import type {
|
||||
CustomWorldRoleProfile,
|
||||
} from '../types';
|
||||
|
||||
type CustomWorldRoleReferenceProfile = {
|
||||
playableNpcs: CustomWorldRoleProfile[];
|
||||
storyNpcs: CustomWorldRoleProfile[];
|
||||
};
|
||||
|
||||
function normalizeRoleReference(value: string | null | undefined) {
|
||||
return (value ?? '')
|
||||
.trim()
|
||||
.replace(/^character-npc[-:]/i, '')
|
||||
.replace(/^(playable|story|role|npc)[-_:]/i, '')
|
||||
.replace(/\s+/g, '')
|
||||
.replace(/[((].*?[))]/g, '');
|
||||
}
|
||||
|
||||
function getRoleReferenceAliases(role: CustomWorldRoleProfile) {
|
||||
return [
|
||||
role.id,
|
||||
role.name,
|
||||
role.title,
|
||||
`${role.name}${role.title}`,
|
||||
`${role.title}${role.name}`,
|
||||
`${role.role}${role.name}`,
|
||||
`${role.name}${role.role}`,
|
||||
]
|
||||
.map(normalizeRoleReference)
|
||||
.filter(Boolean);
|
||||
}
|
||||
|
||||
export function findCustomWorldRoleByReference(
|
||||
profile: CustomWorldRoleReferenceProfile | null | undefined,
|
||||
reference: string | null | undefined,
|
||||
) {
|
||||
const normalizedReference = normalizeRoleReference(reference);
|
||||
if (!profile || !normalizedReference) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const roles = [...profile.storyNpcs, ...profile.playableNpcs];
|
||||
return (
|
||||
roles.find((role) =>
|
||||
getRoleReferenceAliases(role).includes(normalizedReference),
|
||||
) ?? null
|
||||
);
|
||||
}
|
||||
|
||||
export function resolveCustomWorldRoleIdReference(
|
||||
profile: CustomWorldRoleReferenceProfile | null | undefined,
|
||||
reference: string | null | undefined,
|
||||
) {
|
||||
const role = findCustomWorldRoleByReference(profile, reference);
|
||||
return role?.id ?? reference?.trim() ?? '';
|
||||
}
|
||||
|
||||
export function resolveCustomWorldRoleIdReferences(
|
||||
profile: CustomWorldRoleReferenceProfile | null | undefined,
|
||||
references: Array<string | null | undefined>,
|
||||
) {
|
||||
return [
|
||||
...new Set(
|
||||
references
|
||||
.map((reference) => resolveCustomWorldRoleIdReference(profile, reference))
|
||||
.map((reference) => reference.trim())
|
||||
.filter(Boolean),
|
||||
),
|
||||
];
|
||||
}
|
||||
Reference in New Issue
Block a user