90bfdec58a
- added additional items to users and sandbox tables - added a random username generator
82 lines
3.1 KiB
TypeScript
82 lines
3.1 KiB
TypeScript
// Constants for username generation
|
|
const WORDS = {
|
|
adjectives: [
|
|
"azure", "crimson", "golden", "silver", "violet", "emerald", "cobalt", "amber", "coral", "jade",
|
|
"cyber", "digital", "quantum", "neural", "binary", "cosmic", "stellar", "atomic", "crypto", "nano",
|
|
"swift", "brave", "clever", "wise", "noble", "rapid", "bright", "sharp", "keen", "bold",
|
|
"dynamic", "epic", "mega", "ultra", "hyper", "super", "prime", "elite", "alpha", "omega",
|
|
"pixel", "vector", "sonic", "laser", "matrix", "nexus", "proxy", "cloud", "data", "tech",
|
|
],
|
|
nouns: [
|
|
"coder", "hacker", "dev", "ninja", "guru", "wizard", "admin", "mod", "chief", "boss",
|
|
"wolf", "eagle", "phoenix", "dragon", "tiger", "falcon", "shark", "lion", "hawk", "bear",
|
|
"byte", "bit", "node", "stack", "cache", "chip", "core", "net", "web", "app",
|
|
"star", "nova", "pulsar", "comet", "nebula", "quasar", "cosmos", "orbit", "astro", "solar",
|
|
"mind", "soul", "spark", "pulse", "force", "power", "wave", "storm", "flash", "surge",
|
|
],
|
|
prefixes: [
|
|
"the", "mr", "ms", "dr", "pro", "master", "lord", "captain", "chief", "agent",
|
|
],
|
|
} as const;
|
|
|
|
// Helper function to get random element from array
|
|
const getRandomElement = <T>(array: readonly T[]): T => {
|
|
return array[Math.floor(Math.random() * array.length)];
|
|
};
|
|
|
|
// Username pattern generators
|
|
const usernamePatterns = {
|
|
basic: (): string => {
|
|
const adjective = getRandomElement(WORDS.adjectives);
|
|
const noun = getRandomElement(WORDS.nouns);
|
|
const number = Math.floor(Math.random() * 10000);
|
|
return `${adjective}${noun}${number}`;
|
|
},
|
|
|
|
prefixed: (): string => {
|
|
const prefix = getRandomElement(WORDS.prefixes);
|
|
const noun = getRandomElement(WORDS.nouns);
|
|
const number = Math.floor(Math.random() * 100);
|
|
return `${prefix}${noun}${number}`;
|
|
},
|
|
|
|
doubleAdjective: (): string => {
|
|
const adj1 = getRandomElement(WORDS.adjectives);
|
|
const adj2 = getRandomElement(WORDS.adjectives);
|
|
const noun = getRandomElement(WORDS.nouns);
|
|
return `${adj1}${adj2}${noun}`;
|
|
},
|
|
|
|
doubleNoun: (): string => {
|
|
const noun1 = getRandomElement(WORDS.nouns);
|
|
const noun2 = getRandomElement(WORDS.nouns);
|
|
const number = Math.floor(Math.random() * 100);
|
|
return `${noun1}${number}${noun2}`;
|
|
},
|
|
};
|
|
|
|
export function generateUsername(): string {
|
|
const patterns = Object.values(usernamePatterns);
|
|
const selectedPattern = getRandomElement(patterns);
|
|
return selectedPattern();
|
|
}
|
|
|
|
export async function generateUniqueUsername(
|
|
checkExists: (username: string) => Promise<boolean>
|
|
): Promise<string> {
|
|
const MAX_ATTEMPTS = 10;
|
|
let attempts = 0;
|
|
let username = generateUsername();
|
|
|
|
while (await checkExists(username) && attempts < MAX_ATTEMPTS) {
|
|
username = generateUsername();
|
|
attempts++;
|
|
}
|
|
|
|
if (attempts >= MAX_ATTEMPTS) {
|
|
// Add a large random number to ensure uniqueness
|
|
username = generateUsername() + Math.floor(Math.random() * 1000000);
|
|
}
|
|
|
|
return username;
|
|
} |