@aituber-onair/kizuna
Version:
A sophisticated bond system (絆 - Kizuna) for managing relationships between users and AI characters in AITuber OnAir.
142 lines • 3.73 kB
JavaScript
/**
* Utilities for user ID generation and parsing
*/
/**
* Generate user ID from platform and username
*
* @param platform Platform (ChatType)
* @param userName Username
* @param isOwner Whether owner
* @returns Generated user ID
*/
export function generateUserId(platform, userName, isOwner = false) {
// Fixed ID for owner
if (isOwner || platform === "chatForm") {
return "owner:default";
}
// Platform-specific prefix
const platformPrefix = getPlatformPrefix(platform);
// Sanitize username
const sanitizedName = sanitizeUserName(userName);
return `${platformPrefix}:${sanitizedName}`;
}
/**
* Parse user ID to get platform and username
*
* @param userId User ID
* @returns Parse result
*/
export function parseUserId(userId) {
const parts = userId.split(":");
if (parts.length < 2) {
throw new Error(`Invalid user ID format: ${userId}`);
}
const [platformStr, ...userNameParts] = parts;
const userName = userNameParts.join(":"); // Handle cases where ':' is included
// Convert platform to UserType
const platform = platformStrToUserType(platformStr || "unknown");
const isOwner = platform === "owner";
return {
platform,
userName,
isOwner,
};
}
/**
* Get platform prefix from ChatType
*/
function getPlatformPrefix(platform) {
switch (platform) {
case "chatForm":
return "owner";
case "youtube":
return "youtube";
case "twitch":
return "twitch";
case "websocket":
return "websocket";
case "vision":
return "vision";
case "textFile":
return "file";
case "configAdvice":
return "system";
default:
return "unknown";
}
}
/**
* Convert platform string to UserType
*/
function platformStrToUserType(platformStr) {
switch (platformStr) {
case "owner":
return "owner";
case "youtube":
return "youtube";
case "twitch":
return "twitch";
case "websocket":
case "vision":
case "file":
case "system":
case "unknown":
return "websocket"; // Treat as WebSocket type
default:
return "websocket";
}
}
/**
* Sanitize username
*/
function sanitizeUserName(userName) {
// Default name for empty strings
if (!userName || userName.trim() === "") {
return "anonymous";
}
// Replace special characters and limit length
return userName
.trim()
.replace(/[^\w\-_.]/g, "_") // Replace non-alphanumeric, hyphen, underscore, period
.substring(0, 50) // Maximum 50 characters
.toLowerCase(); // Convert to lowercase
}
/**
* Check user ID validity
*/
export function isValidUserId(userId) {
try {
parseUserId(userId);
return true;
}
catch {
return false;
}
}
/**
* Generate anonymous user ID
*/
export function generateAnonymousUserId(platform) {
const timestamp = Date.now();
const randomSuffix = Math.random().toString(36).substring(2, 8);
return generateUserId(platform, `anon_${timestamp}_${randomSuffix}`);
}
/**
* Get display username
*/
export function getDisplayName(userId) {
try {
const parsed = parseUserId(userId);
if (parsed.isOwner) {
return "Owner";
}
// Convert underscores to spaces
return parsed.userName
.replace(/_/g, " ")
.replace(/\b\w/g, (l) => l.toUpperCase()); // Capitalize first letters
}
catch {
return "Unknown User";
}
}
//# sourceMappingURL=userIdGenerator.js.map