@tixyel/streamelements 3.0.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../src/utils/EventProvider.ts","../src/utils/useStorage.ts","../src/client/index.ts","../src/types/alejo/pronouns.ts","../src/utils/Message.ts","../src/simulation/index.ts","../src/utils/Logger.ts","../src/actions/button.ts","../src/actions/command.ts","../src/client/listener.ts","../src/utils/useQueue.ts","../src/index.ts"],"sourcesContent":["/**\r\n * EventProvider class for managing event listeners and emitters.\r\n * This class allows you to register event listeners, emit events, and manage event subscriptions.\r\n * @example\r\n * ```typescript\r\n * interface TestEvents {\r\n * load: [{ type: 'load' }];\r\n * event: [{ type: 'event' }];\r\n * }\r\n *\r\n * class Test extends EventProvider<TestEvents> {}\r\n *\r\n * const test = new Test();\r\n * test.on('load', (data) => {})\r\n * test.once('event', (data) => {})\r\n * test.emit('load', { type: 'load' });\r\n * ```\r\n */\r\nexport class EventProvider<EventMap extends Record<string, any[]> = Record<string, any[]>> {\r\n /**\r\n * Stores registered event listeners.\r\n */\r\n private registeredEvents: { [K in keyof EventMap]?: Array<(this: this, ...args: EventMap[K]) => any> } = {};\r\n\r\n /**\r\n * Emits an event to all registered listeners.\r\n * Returns an array of return values from the listeners.\r\n * @param eventName The name of the event.\r\n * @param args Arguments to pass to the listeners.\r\n */\r\n emit<K extends keyof EventMap>(eventName: K, ...args: EventMap[K]): any[] {\r\n const listeners = this.registeredEvents[eventName] || [];\r\n\r\n return listeners.map((listener) => listener.apply(this, args));\r\n }\r\n\r\n /**\r\n * Registers an event listener.\r\n * @param eventName The name of the event.\r\n * @param callback The callback function.\r\n */\r\n on<K extends keyof EventMap>(eventName: K, callback: (this: this, ...args: EventMap[K]) => any): this {\r\n if (typeof callback !== 'function') {\r\n throw new TypeError('Callback must be a function');\r\n }\r\n\r\n if (!this.registeredEvents[eventName]) {\r\n this.registeredEvents[eventName] = [];\r\n }\r\n\r\n this.registeredEvents[eventName]!.push(callback);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes a specific event listener.\r\n * @param eventName The name of the event.\r\n * @param callback The callback function to remove.\r\n */\r\n off<K extends keyof EventMap>(eventName: K, callback?: (this: this, ...args: EventMap[K]) => any): this {\r\n const listeners = this.registeredEvents[eventName] || [];\r\n\r\n if (!callback) {\r\n this.registeredEvents[eventName] = [];\r\n\r\n return this;\r\n }\r\n\r\n this.registeredEvents[eventName] = listeners.filter((fn) => fn !== callback);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Registers a listener that is executed only once.\r\n * @param eventName The name of the event.\r\n * @param callback The callback function.\r\n */\r\n once<K extends keyof EventMap>(eventName: K, callback: (this: this, ...args: EventMap[K]) => any): this {\r\n const wrapper = (...args: EventMap[K]) => {\r\n this.off(eventName, wrapper);\r\n callback.apply(this, args);\r\n };\r\n\r\n this.on(eventName, wrapper);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes all listeners for a specific event.\r\n * @param eventName The name of the event.\r\n */\r\n removeAllListeners<K extends keyof EventMap>(eventName: K): this {\r\n this.registeredEvents[eventName] = [];\r\n\r\n return this;\r\n }\r\n}\r\n","import { EventProvider } from './EventProvider.js';\r\nimport { PathValue } from './index.js';\r\n\r\ntype UseStorageEvents<T> = {\r\n load: [T | null];\r\n save: [T];\r\n update: [T];\r\n};\r\n\r\ntype UseStorageOptions<T> = {\r\n id?: string;\r\n data: T;\r\n};\r\n\r\nexport var _storages: Array<useStorage<any>> = [];\r\n\r\nexport class useStorage<T extends object = Record<string, any>> extends EventProvider<UseStorageEvents<T>> {\r\n /**\r\n * The unique identifier for the storage instance.\r\n */\r\n public id: string = 'default';\r\n\r\n public loaded: boolean = false;\r\n\r\n public data!: T;\r\n\r\n constructor(options: UseStorageOptions<T>) {\r\n super();\r\n\r\n this.id = options.id || this.id;\r\n this.data = options.data ?? ({} as T);\r\n\r\n if (!SE_API || !SE_API.store) throw new Error('SE_API.store is not available');\r\n\r\n SE_API!.store\r\n .get<T>(this.id)\r\n .then((save) => {\r\n this.data = save ?? this.data;\r\n\r\n this.loaded = true;\r\n\r\n this.emit('load', this.data);\r\n\r\n if (JSON.stringify(this.data) !== JSON.stringify(save)) {\r\n this.emit('update', this.data);\r\n }\r\n })\r\n .catch(() => {\r\n this.loaded = true;\r\n this.emit('load', null);\r\n });\r\n\r\n _storages.push(this);\r\n }\r\n\r\n /**\r\n * Saves the current data to storage.\r\n * @param data Data to save (defaults to current)\r\n */\r\n save(data: T = this.data): void {\r\n if (this.loaded) {\r\n this.data = data;\r\n\r\n SE_API!.store.set<T>(this.id, this.data);\r\n\r\n this.emit('save', this.data);\r\n }\r\n }\r\n\r\n /**\r\n * Updates the storage data and emits an update event if the data has changed.\r\n * @param data Data to update (defaults to current)\r\n */\r\n update(data: T = this.data): void {\r\n if (this.loaded && JSON.stringify(this.data) !== JSON.stringify(data)) {\r\n this.data = { ...this.data, ...data };\r\n\r\n this.emit('update', this.data);\r\n }\r\n }\r\n\r\n /**\r\n * Adds a value to the storage at the specified path.\r\n * @param path Path to add the value to\r\n * @param value Value to add\r\n */\r\n add<P extends string>(path: P, value: PathValue<T, P>): void {\r\n if (!this.loaded) return;\r\n\r\n useStorage.setByPath(this.data, path, value);\r\n\r\n this.save(this.data);\r\n }\r\n\r\n /**\r\n * Sets a value in the storage at the specified path.\r\n * @param obj The object to set the value in\r\n * @param path The path to set the value at\r\n * @param value The value to set\r\n * @returns The updated object\r\n */\r\n static setByPath<P extends string, T extends object>(obj: T, path: P, value: PathValue<T, P>): void {\r\n const keys = path.split('.');\r\n let current: any = obj;\r\n\r\n for (let i = 0; i < keys.length - 1; i++) {\r\n if (typeof current[keys[i]] !== 'object' || current[keys[i]] == null) {\r\n current[keys[i]] = {};\r\n }\r\n\r\n current = current[keys[i]];\r\n }\r\n\r\n current[keys[keys.length - 1]] = value;\r\n\r\n return current;\r\n }\r\n\r\n override on<K extends keyof UseStorageEvents<T>>(eventName: K, callback: (...args: UseStorageEvents<T>[K]) => void): this {\r\n if (eventName === 'load' && this.loaded) {\r\n callback.apply(this, [this.data]);\r\n\r\n return this;\r\n }\r\n\r\n super.on(eventName, callback);\r\n\r\n return this;\r\n }\r\n}\r\n","import { onWidgetLoad } from '../types/streamelements/events/onWidgetLoad.js';\r\nimport { Alejo$Pronouns$name } from '../types/alejo/pronouns.js';\r\nimport { EventProvider } from '../utils/EventProvider.js';\r\nimport { useStorage } from '../utils/useStorage.js';\r\nimport { Session } from '../types/streamelements/session.js';\r\nimport { ClientEvents as events, Provider } from '../types/client.js';\r\nimport { Command } from '../actions/command.js';\r\nimport { Button } from '../actions/button.js';\r\n\r\ntype ClientEvents = {\r\n load: [this: Client, event: onWidgetLoad];\r\n action: [this: Client, action: Button | Command, type: 'created' | 'executed'];\r\n session: [this: Client, session: Session];\r\n event: [this: Client, event: events];\r\n};\r\n\r\ntype ClientOptions = {\r\n id?: string;\r\n};\r\n\r\ntype ClientStorageOptions<T> = {\r\n value: T;\r\n timestamp: number;\r\n expire: number;\r\n};\r\n\r\ntype ClientStorage = {\r\n user: Record<string, ClientStorageOptions<string>>;\r\n avatar: Record<string, ClientStorageOptions<string>>;\r\n pronoun: Record<string, ClientStorageOptions<Alejo$Pronouns$name>>;\r\n emote: Record<string, ClientStorageOptions<string>>;\r\n};\r\n\r\nexport class Client extends EventProvider<ClientEvents> {\r\n public id: string = 'default';\r\n\r\n public storage!: useStorage<ClientStorage>;\r\n\r\n public fields: onWidgetLoad['fieldData'] = {};\r\n\r\n public session!: Session;\r\n\r\n public loaded: boolean = false;\r\n\r\n constructor(options: ClientOptions) {\r\n super();\r\n\r\n this.id = options.id || this.id;\r\n\r\n this.storage = new useStorage({\r\n id: this.id,\r\n data: {\r\n user: {},\r\n avatar: {},\r\n pronoun: {},\r\n emote: {},\r\n },\r\n });\r\n\r\n window.client = this;\r\n }\r\n\r\n public actions: {\r\n commands: Command[];\r\n buttons: Button[];\r\n } = {\r\n commands: [],\r\n buttons: [],\r\n };\r\n\r\n public details!: {\r\n provider: Provider | 'local';\r\n user: onWidgetLoad['channel'];\r\n currency: onWidgetLoad['currency'];\r\n overlay: onWidgetLoad['overlay'];\r\n };\r\n\r\n public cache: { avatar: number; pronoun: number; emote: number } = {\r\n avatar: 30,\r\n pronoun: 30,\r\n emote: 30,\r\n };\r\n\r\n override on<K extends keyof ClientEvents>(eventName: K, callback: (...args: ClientEvents[K]) => void): this {\r\n if (eventName === 'load' && this.loaded) {\r\n callback.apply(this, [\r\n {\r\n channel: this.details.user,\r\n currency: this.details.currency,\r\n fieldData: this.fields,\r\n recents: [],\r\n session: {\r\n data: this.session,\r\n settings: {\r\n autoReset: false,\r\n calendar: false,\r\n resetOnStart: false,\r\n },\r\n },\r\n overlay: this.details.overlay,\r\n emulated: false,\r\n } as onWidgetLoad,\r\n ] as unknown as ClientEvents[K]);\r\n\r\n return this;\r\n }\r\n\r\n super.on(eventName, callback);\r\n\r\n return this;\r\n }\r\n}\r\n","export enum Alejo$Pronouns {\r\n hehim = 'He/Him',\r\n sheher = 'She/Her',\r\n theythem = 'They/Them',\r\n shethem = 'She/They',\r\n hethem = 'He/They',\r\n heshe = 'He/She',\r\n xexem = 'Xe/Xem',\r\n faefaer = 'Fae/Faer',\r\n vever = 'Ve/Ver',\r\n aeaer = 'Ae/Aer',\r\n ziehir = 'Zie/Hir',\r\n perper = 'Per/Per',\r\n eem = 'E/Em',\r\n itits = 'It/Its',\r\n}\r\n\r\nexport type Alejo$Pronouns$name =\r\n | 'hehim'\r\n | 'sheher'\r\n | 'theythem'\r\n | 'shethem'\r\n | 'hethem'\r\n | 'heshe'\r\n | 'xexem'\r\n | 'faefaer'\r\n | 'vever'\r\n | 'aeaer'\r\n | 'ziehir'\r\n | 'perper'\r\n | 'eem'\r\n | 'itits';\r\n\r\nexport type Alejo$Pronouns$display =\r\n | 'He/Him'\r\n | 'She/Her'\r\n | 'They/Them'\r\n | 'She/They'\r\n | 'He/They'\r\n | 'He/She'\r\n | 'Xe/Xem'\r\n | 'Fae/Faer'\r\n | 'Ve/Ver'\r\n | 'Ae/Aer'\r\n | 'Zie/Hir'\r\n | 'Per/Per'\r\n | 'E/Em'\r\n | 'It/Its';\r\n\r\nexport type Alejo$Pronouns$User = {\r\n id: string;\r\n login: string;\r\n pronouns: Alejo$Pronouns$name;\r\n};\r\n","import { Simulation } from '../simulation/index.js';\r\nimport { TwitchBadge, TwitchBadgesKeys } from '../types/badge.js';\r\nimport { Provider } from '../types/client.js';\r\nimport { BttvEmote, SeventvEmote, TwitchEmote } from '../types/emote.js';\r\n\r\ntype Emote = TwitchEmote | BttvEmote | SeventvEmote;\r\n\r\nexport function findEmotesInText(text: string, emotes: Emote[] = Simulation.data.emotes): Emote[] {\r\n const result: Emote[] = [];\r\n\r\n emotes.forEach((emote) => {\r\n const name = emote.name;\r\n\r\n let searchIndex = 0;\r\n let start = 0;\r\n\r\n while (searchIndex < text.length) {\r\n const index = text.indexOf(name, start);\r\n\r\n if (index === -1) break;\r\n\r\n const before = index > 0 ? text[index - 1] : ' ';\r\n const after = index + name.length < text.length ? text[index + name.length] : ' ';\r\n\r\n if (/\\s/.test(before) && /\\s/.test(after)) {\r\n result.push({ ...emote, start: index, end: index + name.length });\r\n }\r\n\r\n start = index + 1;\r\n }\r\n });\r\n\r\n return result.sort((a, b) => a.start - b.start);\r\n}\r\n\r\nexport function replaceEmotesWithHTML(text: string, emotes: Emote[]): string {\r\n if (!emotes.length) return text;\r\n\r\n let result = '';\r\n let index = 0;\r\n\r\n emotes.forEach((emote) => {\r\n result += text.substring(index, emote.start);\r\n\r\n const imgUrl = emote.urls['4'] || emote.urls['2'] || emote.urls['1'];\r\n\r\n result += `<img src=\"${imgUrl}\" alt=\"${emote.name}\" class=\"emote\" style=\"width: auto; height: 1em; vertical-align: middle;\" />`;\r\n\r\n index = emote.end;\r\n });\r\n\r\n result += text.substring(index);\r\n\r\n return result;\r\n}\r\n\r\ntype TwitchResult = {\r\n keys: TwitchBadgesKeys[];\r\n badges: TwitchBadge[];\r\n};\r\n\r\ntype YouTubeResult = {\r\n isVerified: boolean;\r\n isChatOwner: boolean;\r\n isChatSponsor: boolean;\r\n isChatModerator: boolean;\r\n};\r\n\r\nexport type BadgeOptions =\r\n | TwitchBadgesKeys[]\r\n | TwitchBadgesKeys\r\n | `${TwitchBadgesKeys}, ${TwitchBadgesKeys}`\r\n | `${TwitchBadgesKeys}, ${TwitchBadgesKeys}, ${TwitchBadgesKeys}`;\r\n\r\nexport async function generateBadges(badges: BadgeOptions, provider: 'youtube'): Promise<YouTubeResult>;\r\nexport async function generateBadges(badges: BadgeOptions, provider: 'twitch'): Promise<TwitchResult>;\r\nexport async function generateBadges(badges: BadgeOptions = [], provider: Provider = 'twitch'): Promise<TwitchResult | YouTubeResult> {\r\n if (!Array.isArray(badges) && typeof badges === 'string') {\r\n badges = badges.split(',').map((e) => e.trim()) as TwitchBadgesKeys[];\r\n }\r\n\r\n if (!badges || !badges.length) {\r\n var max = Simulation.rand.number(1, 3);\r\n\r\n for await (const _ of Array.from({ length: max }, () => '')) {\r\n var current = Simulation.rand.array(Object.keys(Simulation.data.badges))[0] as TwitchBadgesKeys;\r\n\r\n if (!badges.includes(current) && Array.isArray(badges)) {\r\n badges.push(current);\r\n } else {\r\n badges = [current];\r\n }\r\n }\r\n }\r\n\r\n var result;\r\n\r\n switch (provider) {\r\n case 'twitch': {\r\n result = {\r\n keys: Array.from(badges).filter((e) => e in Simulation.data.badges) as TwitchBadgesKeys[],\r\n badges: Array.from(badges)\r\n .slice(0, 3)\r\n .map((badge) => Simulation.data.badges[badge])\r\n .filter(Boolean) as TwitchBadge[],\r\n };\r\n\r\n break;\r\n }\r\n\r\n case 'youtube': {\r\n var details = {\r\n 'verified': { isVerified: false },\r\n 'broadcaster': { isChatOwner: false },\r\n 'host': { isChatOwner: false },\r\n 'sponsor': { isChatSponsor: false },\r\n 'subscriber': { isChatSponsor: false },\r\n 'moderator': { isChatModerator: false },\r\n };\r\n\r\n result = Object.entries(badges).reduce(\r\n (acc, [key]) => {\r\n if (key in details) {\r\n Object.assign(acc, details[key as keyof typeof details]);\r\n }\r\n\r\n return acc;\r\n },\r\n {\r\n isVerified: false,\r\n isChatOwner: false,\r\n isChatSponsor: false,\r\n isChatModerator: false,\r\n } as {\r\n isVerified: boolean;\r\n isChatOwner: boolean;\r\n isChatSponsor: boolean;\r\n isChatModerator: boolean;\r\n },\r\n );\r\n\r\n break;\r\n }\r\n }\r\n\r\n return result as TwitchResult | YouTubeResult;\r\n}\r\n","import { Tixyel } from '../index.js';\r\nimport { Alejo$Pronouns } from '../types/alejo/pronouns.js';\r\nimport type { TwitchBadge, TwitchBadgesKeys } from '../types/badge.js';\r\nimport type { Provider } from '../types/client.js';\r\nimport type { BttvEmote, SeventvEmote, TwitchEmote } from '../types/emote.js';\r\nimport type {\r\n FieldSettings,\r\n NormalizedFieldSettings,\r\n StreamElementsField,\r\n StreamElementsFieldTypes,\r\n StreamElementsFieldValue,\r\n} from '../types/streamelements/customfields.js';\r\nimport type { StreamElements$AlertService } from '../types/streamelements/events/integrated/alertService.js';\r\nimport type { StreamElements$BotCounter } from '../types/streamelements/events/integrated/botCounter.js';\r\nimport type { StreamElements$EventSkip } from '../types/streamelements/events/integrated/eventSkip.js';\r\nimport type { StreamElements } from '../types/streamelements/events/integrated/index.js';\r\nimport type { StreamElements$KVStore } from '../types/streamelements/events/integrated/kvstore.js';\r\nimport type { StreamElements$Tip } from '../types/streamelements/events/integrated/tip.js';\r\nimport type { onEventReceived } from '../types/streamelements/events/onEventReceived.js';\r\nimport type { onSessionUpdate } from '../types/streamelements/events/onSessionUpdate.js';\r\nimport type { onWidgetLoad } from '../types/streamelements/events/onWidgetLoad.js';\r\nimport type { Twitch$Cheer } from '../types/streamelements/events/twitch/cheer.js';\r\nimport type { Twitch$Follower } from '../types/streamelements/events/twitch/follower.js';\r\nimport type { Twitch } from '../types/streamelements/events/twitch/index.js';\r\nimport type { Twitch$DeleteMessage, Twitch$DeleteMessages } from '../types/streamelements/events/twitch/message.delete.js';\r\nimport type { Twitch$Message } from '../types/streamelements/events/twitch/message.js';\r\nimport type { Twitch$Raid } from '../types/streamelements/events/twitch/raid.js';\r\nimport type { Subscriber$community, Subscriber$gift, Subscriber$spam, Twitch$Subscriber } from '../types/streamelements/events/twitch/subscriber.js';\r\nimport type { Youtube } from '../types/streamelements/events/youtube/index.js';\r\nimport type { Youtube$Message } from '../types/streamelements/events/youtube/message.js';\r\nimport type { Sponsor$community, Sponsor$gift, Sponsor$spam, Youtube$Sponsor } from '../types/streamelements/events/youtube/sponsor.js';\r\nimport type { YouTube$Subscriber } from '../types/streamelements/events/youtube/subscriber.js';\r\nimport type { YouTube$Superchat } from '../types/streamelements/events/youtube/superchat.js';\r\nimport type { Session$AnyConfig, Session$AvailableCategory, Session$AvailableData } from '../types/streamelements/session.generate.js';\r\nimport type { Session } from '../types/streamelements/session.js';\r\nimport { BadgeOptions, findEmotesInText, generateBadges, replaceEmotesWithHTML } from '../utils/Message.js';\r\n\r\ntype Modifier = (value: string, param: string | null | undefined, values: { amount?: number; count?: number }) => string;\r\n\r\nexport class Simulation {\r\n static data = {\r\n names: ['Local', 'Tixyel', 'Urie_s2', 'itzzcatt', 'BeniArts', 'Cupidiko', 'shy_madeit'] as string[],\r\n messages: [\r\n 'Hello everyone!',\r\n 'PogChamp',\r\n 'This stream is amazing!',\r\n 'catJAM catJAM catJAM',\r\n 'LUL that was funny',\r\n 'GG!',\r\n 'First time here, loving it!',\r\n 'DinoDance',\r\n 'Can we get some hype in chat?',\r\n 'TransgenderPride PansexualPride NonbinaryPride',\r\n 'POGGERS',\r\n 'I just followed! PogChamp',\r\n 'Great gameplay btw',\r\n 'LUL LUL LUL',\r\n 'This is so wholesome AngelThump',\r\n 'catJAM vibing',\r\n 'haHAA',\r\n 'Wait what just happened? D:',\r\n 'GlitchCat GlitchCat',\r\n 'Best stream on Twitch right now!',\r\n 'DarkMode gang where you at?',\r\n 'PogChamp PogChamp PogChamp PogChamp',\r\n 'Anyone else eating? DoritosChip',\r\n 'I love this community!',\r\n 'TheIlluminati confirmed',\r\n 'bUrself be yourself!',\r\n 'CookieTime nom nom',\r\n 'imGlitch technical difficulties',\r\n 'This music is fire catJAM',\r\n 'bttvNice',\r\n 'LesbianPride GayPride BisexualPride',\r\n 'SSSsss Minecraft time',\r\n 'PopNemo',\r\n 'Going to bed, good night everyone!',\r\n 'Just got here, what did I miss?',\r\n ':tf: trollface',\r\n 'ariW wave',\r\n 'BroBalt nice one',\r\n 'AsexualPride IntersexPride GenderFluidPride',\r\n 'This chat is moving so fast!',\r\n 'CandianRage',\r\n 'PunchTrees PunchTrees',\r\n 'CiGrip',\r\n 'ConcernDoge hmm',\r\n 'CruW salute',\r\n 'cvHazmat stay safe',\r\n 'DuckerZ quack',\r\n 'BloodTrail hunting time',\r\n 'CatBag kitty!',\r\n 'c! poggers',\r\n ] as string[],\r\n tiers: ['1000', '2000', '3000', 'prime'] as string[],\r\n avatars: [\r\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/13e5fa74-defa-11e9-809c-784f43822e80-profile_image-300x300.png',\r\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/dbdc9198-def8-11e9-8681-784f43822e80-profile_image-300x300.png',\r\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/998f01ae-def8-11e9-b95c-784f43822e80-profile_image-300x300.png',\r\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/de130ab0-def7-11e9-b668-784f43822e80-profile_image-300x300.png',\r\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/ebe4cd89-b4f4-4cd9-adac-2f30151b4209-profile_image-300x300.png',\r\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/215b7342-def9-11e9-9a66-784f43822e80-profile_image-300x300.png',\r\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/ead5c8b2-a4c9-4724-b1dd-9f00b46cbd3d-profile_image-300x300.png',\r\n ] as string[],\r\n items: [] as any[],\r\n emotes: [\r\n {\r\n 'type': 'twitch',\r\n 'name': 'DinoDance',\r\n 'id': 'emotesv2_dcd06b30a5c24f6eb871e8f5edbd44f7',\r\n 'gif': true,\r\n 'animated': true,\r\n 'urls': {\r\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_dcd06b30a5c24f6eb871e8f5edbd44f7/animated/dark/1.0',\r\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_dcd06b30a5c24f6eb871e8f5edbd44f7/animated/dark/2.0',\r\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_dcd06b30a5c24f6eb871e8f5edbd44f7/animated/dark/3.0',\r\n },\r\n 'start': 46,\r\n 'end': 55,\r\n },\r\n {\r\n 'type': 'twitch',\r\n 'name': 'PopNemo',\r\n 'id': 'emotesv2_5d523adb8bbb4786821cd7091e47da21',\r\n 'gif': true,\r\n 'animated': true,\r\n 'urls': {\r\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_5d523adb8bbb4786821cd7091e47da21/animated/dark/1.0',\r\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_5d523adb8bbb4786821cd7091e47da21/animated/dark/2.0',\r\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_5d523adb8bbb4786821cd7091e47da21/animated/dark/3.0',\r\n },\r\n 'start': 56,\r\n 'end': 63,\r\n },\r\n {\r\n 'type': 'twitch',\r\n 'name': 'TransgenderPride',\r\n 'id': '307827377',\r\n 'gif': false,\r\n 'urls': {\r\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827377/default/dark/1.0',\r\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827377/default/dark/2.0',\r\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827377/default/dark/3.0',\r\n },\r\n 'start': 0,\r\n 'end': 15,\r\n },\r\n {\r\n 'type': 'twitch',\r\n 'name': 'PansexualPride',\r\n 'id': '307827370',\r\n 'gif': false,\r\n 'urls': {\r\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827370/default/dark/1.0',\r\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827370/default/dark/2.0',\r\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827370/default/dark/3.0',\r\n },\r\n 'start': 17,\r\n 'end': 30,\r\n },\r\n {\r\n 'type': 'twitch',\r\n 'name': 'NonbinaryPride',\r\n 'id': '307827356',\r\n 'gif': false,\r\n 'urls': {\r\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827356/default/dark/1.0',\r\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827356/default/dark/2.0',\r\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827356/default/dark/3.0',\r\n },\r\n 'start': 32,\r\n 'end': 45,\r\n },\r\n {\r\n 'type': 'twitch',\r\n 'name': 'LesbianPride',\r\n 'id': '307827340',\r\n 'gif': false,\r\n 'urls': {\r\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827340/default/dark/1.0',\r\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827340/default/dark/2.0',\r\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827340/default/dark/3.0',\r\n },\r\n 'start': 47,\r\n 'end': 58,\r\n },\r\n {\r\n 'type': 'twitch',\r\n 'name': 'IntersexPride',\r\n 'id': '307827332',\r\n 'gif': false,\r\n 'urls': {\r\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827332/default/dark/1.0',\r\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827332/default/dark/2.0',\r\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827332/default/dark/3.0',\r\n },\r\n 'start': 60,\r\n 'end': 72,\r\n },\r\n {\r\n 'type': 'twitch',\r\n 'name': 'GenderFluidPride',\r\n 'id': '307827326',\r\n 'gif': false,\r\n 'urls': {\r\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827326/default/dark/1.0',\r\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827326/default/dark/2.0',\r\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827326/default/dark/3.0',\r\n },\r\n 'start': 74,\r\n 'end': 89,\r\n },\r\n {\r\n 'type': 'twitch',\r\n 'name': 'GayPride',\r\n 'id': '307827321',\r\n 'gif': false,\r\n 'urls': {\r\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827321/default/dark/1.0',\r\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827321/default/dark/2.0',\r\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827321/default/dark/3.0',\r\n },\r\n 'start': 91,\r\n 'end': 98,\r\n },\r\n {\r\n 'type': 'twitch',\r\n 'name': 'BisexualPride',\r\n 'id': '307827313',\r\n 'gif': false,\r\n 'urls': {\r\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827313/default/dark/1.0',\r\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827313/default/dark/2.0',\r\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827313/default/dark/3.0',\r\n },\r\n 'start': 100,\r\n 'end': 112,\r\n },\r\n {\r\n 'type': 'twitch',\r\n 'name': 'AsexualPride',\r\n 'id': '307827267',\r\n 'gif': false,\r\n 'urls': {\r\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827267/default/dark/1.0',\r\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827267/default/dark/2.0',\r\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827267/default/dark/3.0',\r\n },\r\n 'start': 114,\r\n 'end': 125,\r\n },\r\n {\r\n 'type': 'twitch',\r\n 'name': 'PogChamp',\r\n 'id': '305954156',\r\n 'gif': false,\r\n 'urls': {\r\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/305954156/default/dark/1.0',\r\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/305954156/default/dark/2.0',\r\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/305954156/default/dark/3.0',\r\n },\r\n 'start': 127,\r\n 'end': 134,\r\n },\r\n {\r\n 'type': 'twitch',\r\n 'name': 'GlitchCat',\r\n 'id': '304486301',\r\n 'gif': false,\r\n 'urls': {\r\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/304486301/default/dark/1.0',\r\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/304486301/default/dark/2.0',\r\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/304486301/default/dark/3.0',\r\n },\r\n 'start': 136,\r\n 'end': 144,\r\n },\r\n {\r\n 'type': 'twitch',\r\n 'name': 'DarkMode',\r\n 'id': '461298',\r\n 'gif': false,\r\n 'urls': {\r\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/461298/default/dark/1.0',\r\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/461298/default/dark/2.0',\r\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/461298/default/dark/3.0',\r\n },\r\n 'start': 146,\r\n 'end': 153,\r\n },\r\n {\r\n 'type': 'twitch',\r\n 'name': 'LUL',\r\n 'id': '425618',\r\n 'gif': false,\r\n 'urls': {\r\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/425618/default/dark/1.0',\r\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/425618/default/dark/2.0',\r\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/425618/default/dark/3.0',\r\n },\r\n 'start': 155,\r\n 'end': 157,\r\n },\r\n {\r\n 'type': 'twitch',\r\n 'name': 'TheIlluminati',\r\n 'id': '145315',\r\n 'gif': false,\r\n 'urls': {\r\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/145315/default/dark/1.0',\r\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/145315/default/dark/2.0',\r\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/145315/default/dark/3.0',\r\n },\r\n 'start': 159,\r\n 'end': 171,\r\n },\r\n {\r\n 'type': 'twitch',\r\n 'name': 'imGlitch',\r\n 'id': '112290',\r\n 'gif': false,\r\n 'urls': {\r\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/112290/default/dark/1.0',\r\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/112290/default/dark/2.0',\r\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/112290/default/dark/3.0',\r\n },\r\n 'start': 173,\r\n 'end': 180,\r\n },\r\n {\r\n 'type': 'twitch',\r\n 'name': 'DoritosChip',\r\n 'id': '102242',\r\n 'gif': false,\r\n 'urls': {\r\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/102242/default/dark/1.0',\r\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/102242/default/dark/2.0',\r\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/102242/default/dark/3.0',\r\n },\r\n 'start': 182,\r\n 'end': 192,\r\n },\r\n {\r\n 'type': 'twitch',\r\n 'name': 'SSSsss',\r\n 'id': '46',\r\n 'gif': false,\r\n 'urls': {\r\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/46/default/dark/1.0',\r\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/46/default/dark/2.0',\r\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/46/default/dark/3.0',\r\n },\r\n 'start': 194,\r\n 'end': 199,\r\n },\r\n {\r\n 'type': 'twitch',\r\n 'name': 'PunchTrees',\r\n 'id': '47',\r\n 'gif': false,\r\n 'urls': {\r\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/47/default/dark/1.0',\r\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/47/default/dark/2.0',\r\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/47/default/dark/3.0',\r\n },\r\n 'start': 201,\r\n 'end': 210,\r\n },\r\n {\r\n 'type': 'twitch',\r\n 'name': 'BloodTrail',\r\n 'id': '69',\r\n 'gif': false,\r\n 'urls': {\r\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/69/default/dark/1.0',\r\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/69/default/dark/2.0',\r\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/69/default/dark/3.0',\r\n },\r\n 'start': 223,\r\n 'end': 232,\r\n },\r\n {\r\n 'type': '7tv',\r\n 'name': 'CookieTime',\r\n 'id': '635b0184ea9ce7391cbf77d6',\r\n 'gif': true,\r\n 'animated': true,\r\n 'urls': {\r\n '1': 'https://cdn.7tv.app/emote/635b0184ea9ce7391cbf77d6/1x.webp',\r\n '2': 'https://cdn.7tv.app/emote/635b0184ea9ce7391cbf77d6/2x.webp',\r\n '3': 'https://cdn.7tv.app/emote/635b0184ea9ce7391cbf77d6/3x.webp',\r\n '4': 'https://cdn.7tv.app/emote/635b0184ea9ce7391cbf77d6/4x.webp',\r\n },\r\n 'start': 0,\r\n 'end': 10,\r\n 'coords': {\r\n 'x': 0,\r\n 'y': 0,\r\n },\r\n },\r\n {\r\n 'type': 'bttv',\r\n 'name': 'catJAM',\r\n 'id': '5f1b0186cf6d2144653d2970',\r\n 'gif': true,\r\n 'animated': true,\r\n 'urls': {\r\n '1': 'https://cdn.betterttv.net/emote/5f1b0186cf6d2144653d2970/1x',\r\n '2': 'https://cdn.betterttv.net/emote/5f1b0186cf6d2144653d2970/2x',\r\n '4': 'https://cdn.betterttv.net/emote/5f1b0186cf6d2144653d2970/3x',\r\n },\r\n 'start': 0,\r\n 'end': 6,\r\n 'coords': {\r\n 'x': 0,\r\n 'y': 0,\r\n 'width': 112,\r\n 'height': 112,\r\n },\r\n },\r\n {\r\n 'type': 'bttv',\r\n 'name': ':tf:',\r\n 'id': '54fa8f1401e468494b85b537',\r\n 'gif': false,\r\n 'animated': false,\r\n 'urls': {\r\n '1': 'https://cdn.betterttv.net/emote/54fa8f1401e468494b85b537/1x',\r\n '2': 'https://cdn.betterttv.net/emote/54fa8f1401e468494b85b537/2x',\r\n '4': 'https://cdn.betterttv.net/emote/54fa8f1401e468494b85b537/3x',\r\n },\r\n 'start': 7,\r\n 'end': 11,\r\n 'coords': {\r\n 'x': 0,\r\n 'y': 0,\r\n 'width': 112,\r\n 'height': 112,\r\n },\r\n },\r\n {\r\n 'type': 'bttv',\r\n 'name': 'AngelThump',\r\n 'id': '566ca1a365dbbdab32ec055b',\r\n 'gif': false,\r\n 'animated': false,\r\n 'urls': {\r\n '1': 'https://cdn.betterttv.net/emote/566ca1a365dbbdab32ec055b/1x',\r\n '2': 'https://cdn.betterttv.net/emote/566ca1a365dbbdab32ec055b/2x',\r\n '4': 'https://cdn.betterttv.net/emote/566ca1a365dbbdab32ec055b/3x',\r\n },\r\n 'start': 12,\r\n 'end': 22,\r\n 'coords': {\r\n 'x': 0,\r\n 'y': 0,\r\n 'width': 334,\r\n 'height': 112,\r\n },\r\n },\r\n {\r\n 'type': 'bttv',\r\n 'name': 'ariW',\r\n 'id': '56fa09f18eff3b595e93ac26',\r\n 'gif': false,\r\n 'animated': false,\r\n 'urls': {\r\n '1': 'https://cdn.betterttv.net/emote/56fa09f18eff3b595e93ac26/1x',\r\n '2': 'https://cdn.betterttv.net/emote/56fa09f18eff3b595e93ac26/2x',\r\n '4': 'https://cdn.betterttv.net/emote/56fa09f18eff3b595e93ac26/3x',\r\n },\r\n 'start': 23,\r\n 'end': 27,\r\n 'coords': {\r\n 'x': 0,\r\n 'y': 0,\r\n 'width': 112,\r\n 'height': 112,\r\n },\r\n },\r\n {\r\n 'type': 'bttv',\r\n 'name': 'BroBalt',\r\n 'id': '54fbf00a01abde735115de5c',\r\n 'gif': false,\r\n 'animated': false,\r\n 'urls': {\r\n '1': 'https://cdn.betterttv.net/emote/54fbf00a01abde735115de5c/1x',\r\n '2': 'https://cdn.betterttv.net/emote/54fbf00a01abde735115de5c/2x',\r\n '4': 'https://cdn.betterttv.net/emote/54fbf00a01abde735115de5c/3x',\r\n },\r\n 'start': 28,\r\n 'end': 35,\r\n 'coords': {\r\n 'x': 0,\r\n 'y': 0,\r\n 'width': 184,\r\n 'height': 120,\r\n },\r\n },\r\n {\r\n 'type': 'bttv',\r\n 'name': 'bttvNice',\r\n 'id': '54fab7d2633595ca4c713abf',\r\n 'gif': false,\r\n 'animated': false,\r\n 'urls': {\r\n '1': 'https://cdn.betterttv.net/emote/54fab7d2633595ca4c713abf/1x',\r\n '2': 'https://cdn.betterttv.net/emote/54fab7d2633595ca4c713abf/2x',\r\n '4': 'https://cdn.betterttv.net/emote/54fab7d2633595ca4c713abf/3x',\r\n },\r\n 'start': 36,\r\n 'end': 44,\r\n 'coords': {\r\n 'x': 0,\r\n 'y': 0,\r\n 'width': 168,\r\n 'height': 112,\r\n },\r\n },\r\n {\r\n 'type': 'bttv',\r\n 'name': 'bUrself',\r\n 'id': '566c9f3b65dbbdab32ec052e',\r\n 'gif': false,\r\n 'animated': false,\r\n 'urls': {\r\n '1': 'https://cdn.betterttv.net/emote/566c9f3b65dbbdab32ec052e/1x',\r\n '2': 'https://cdn.betterttv.net/emote/566c9f3b65dbbdab32ec052e/2x',\r\n '4': 'https://cdn.betterttv.net/emote/566c9f3b65dbbdab32ec052e/3x',\r\n },\r\n 'start': 45,\r\n 'end': 52,\r\n 'coords': {\r\n 'x': 0,\r\n 'y': 0,\r\n 'width': 112,\r\n 'height': 112,\r\n },\r\n },\r\n {\r\n 'type': 'bttv',\r\n 'name': 'c!',\r\n 'id': '6468f7acaee1f7f47567708e',\r\n 'gif': false,\r\n 'animated': false,\r\n 'urls': {\r\n '1': 'https://cdn.betterttv.net/emote/6468f7acaee1f7f47567708e/1x',\r\n '2': 'https://cdn.betterttv.net/emote/6468f7acaee1f7f47567708e/2x',\r\n '4': 'https://cdn.betterttv.net/emote/6468f7acaee1f7f47567708e/3x',\r\n },\r\n 'start': 53,\r\n 'end': 55,\r\n 'coords': {\r\n 'x': 0,\r\n 'y': 0,\r\n 'width': 112,\r\n 'height': 112,\r\n },\r\n },\r\n {\r\n 'type': 'bttv',\r\n 'name': 'CandianRage',\r\n 'id': '54fbf09c01abde735115de61',\r\n 'gif': false,\r\n 'animated': false,\r\n 'urls': {\r\n '1': 'https://cdn.betterttv.net/emote/54fbf09c01abde735115de61/1x',\r\n '2': 'https://cdn.betterttv.net/emote/54fbf09c01abde735115de61/2x',\r\n '4': 'https://cdn.betterttv.net/emote/54fbf09c01abde735115de61/3x',\r\n },\r\n 'start': 56,\r\n 'end': 67,\r\n 'coords': {\r\n 'x': 0,\r\n 'y': 0,\r\n 'width': 112,\r\n 'height': 112,\r\n },\r\n },\r\n {\r\n 'type': 'bttv',\r\n 'name': 'CiGrip',\r\n 'id': '54fa8fce01e468494b85b53c',\r\n 'gif': false,\r\n 'animated': false,\r\n 'urls': {\r\n '1': 'https://cdn.betterttv.net/emote/54fa8fce01e468494b85b53c/1x',\r\n '2': 'https://cdn.betterttv.net/emote/54fa8fce01e468494b85b53c/2x',\r\n '4': 'https://cdn.betterttv.net/emote/54fa8fce01e468494b85b53c/3x',\r\n },\r\n 'start': 68,\r\n 'end': 74,\r\n 'coords': {\r\n 'x': 0,\r\n 'y': 0,\r\n 'width': 112,\r\n 'height': 112,\r\n },\r\n },\r\n {\r\n 'type': 'bttv',\r\n 'name': 'ConcernDoge',\r\n 'id': '566c9f6365dbbdab32ec0532',\r\n 'gif': false,\r\n 'animated': false,\r\n 'urls': {\r\n '1': 'https://cdn.betterttv.net/emote/566c9f6365dbbdab32ec0532/1x',\r\n '2': 'https://cdn.betterttv.net/emote/566c9f6365dbbdab32ec0532/2x',\r\n '4': 'https://cdn.betterttv.net/emote/566c9f6365dbbdab32ec0532/3x',\r\n },\r\n 'start': 75,\r\n 'end': 86,\r\n 'coords': {\r\n 'x': 0,\r\n 'y': 0,\r\n 'width': 101,\r\n 'height': 112,\r\n },\r\n },\r\n {\r\n 'type': 'bttv',\r\n 'name': 'CruW',\r\n 'id': '55471c2789d53f2d12781713',\r\n 'gif': false,\r\n 'animated': false,\r\n 'urls': {\r\n '1': 'https://cdn.betterttv.net/emote/55471c2789d53f2d12781713/1x',\r\n '2': 'https://cdn.betterttv.net/emote/55471c2789d53f2d12781713/2x',\r\n '4': 'https://cdn.betterttv.net/emote/55471c2789d53f2d12781713/3x',\r\n },\r\n 'start': 87,\r\n 'end': 91,\r\n 'coords': {\r\n 'x': 0,\r\n 'y': 0,\r\n 'width': 112,\r\n 'height': 112,\r\n },\r\n },\r\n {\r\n 'type': 'bttv',\r\n 'name': 'cvHazmat',\r\n 'id': '5e76d338d6581c3724c0f0b2',\r\n 'gif': false,\r\n 'animated': false,\r\n 'urls': {\r\n '1': 'https://cdn.betterttv.net/emote/5e76d338d6581c3724c0f0b2/1x',\r\n '2': 'https://cdn.betterttv.net/emote/5e76d338d6581c3724c0f0b2/2x',\r\n '4': 'https://cdn.betterttv.net/emote/5e76d338d6581c3724c0f0b2/3x',\r\n },\r\n 'start': 92,\r\n 'end': 100,\r\n 'coords': {\r\n 'x': 0,\r\n 'y': 0,\r\n 'width': 112,\r\n 'height': 112,\r\n },\r\n },\r\n {\r\n 'type': 'bttv',\r\n 'name': 'D:',\r\n 'id': '55028cd2135896936880fdd7',\r\n 'gif': false,\r\n 'animated': false,\r\n 'urls': {\r\n '1': 'https://cdn.betterttv.net/emote/55028cd2135896936880fdd7/1x',\r\n '2': 'https://cdn.betterttv.net/emote/55028cd2135896936880fdd7/2x',\r\n '4': 'https://cdn.betterttv.net/emote/55028cd2135896936880fdd7/3x',\r\n },\r\n 'start': 101,\r\n 'end': 103,\r\n 'coords': {\r\n 'x': 0,\r\n 'y': 0,\r\n 'width': 112,\r\n 'height': 112,\r\n },\r\n },\r\n {\r\n 'type': 'bttv',\r\n 'name': 'haHAA',\r\n 'id': '555981336ba1901877765555',\r\n 'gif': false,\r\n 'animated': false,\r\n 'urls': {\r\n '1': 'https://cdn.betterttv.net/emote/555981336ba1901877765555/1x',\r\n '2': 'https://cdn.betterttv.net/emote/555981336ba1901877765555/2x',\r\n '4': 'https://cdn.betterttv.net/emote/555981336ba1901877765555/3x',\r\n },\r\n 'start': 104,\r\n 'end': 109,\r\n 'coords': {\r\n 'x': 0,\r\n 'y': 0,\r\n 'width': 112,\r\n 'height': 112,\r\n },\r\n },\r\n {\r\n 'type': 'bttv',\r\n 'name': 'LuL',\r\n 'id': '567b00c61ddbe1786688a633',\r\n 'gif': false,\r\n 'animated': false,\r\n 'urls': {\r\n '1': 'https://cdn.betterttv.net/emote/567b00c61ddbe1786688a633/1x',\r\n '2': 'https://cdn.betterttv.net/emote/567b00c61ddbe1786688a633/2x',\r\n '4': 'https://cdn.betterttv.net/emote/567b00c61ddbe1786688a633/3x',\r\n },\r\n 'start': 110,\r\n 'end': 113,\r\n 'coords': {\r\n 'x': 0,\r\n 'y': 0,\r\n 'width': 112,\r\n 'height': 112,\r\n },\r\n },\r\n {\r\n 'type': 'bttv',\r\n 'name': 'DuckerZ',\r\n 'id': '573d38b50ffbf6cc5cc38dc9',\r\n 'gif': false,\r\n 'animated': false,\r\n 'urls': {\r\n '1': 'https://cdn.betterttv.net/emote/573d38b50ffbf6cc5cc38dc9/1x',\r\n '2': 'https://cdn.betterttv.net/emote/573d38b50ffbf6cc5cc38dc9/2x',\r\n '4': 'https://cdn.betterttv.net/emote/573d38b50ffbf6cc5cc38dc9/3x',\r\n },\r\n 'start': 114,\r\n 'end': 121,\r\n 'coords': {\r\n 'x': 0,\r\n 'y': 0,\r\n 'width': 149,\r\n 'height': 112,\r\n },\r\n },\r\n {\r\n 'type': 'ffz',\r\n 'name': 'CatBag',\r\n 'id': '25927',\r\n 'gif': false,\r\n 'animated': false,\r\n 'urls': {\r\n '1': 'https://cdn.frankerfacez.com/emote/25927/1',\r\n '2': 'https://cdn.frankerfacez.com/emote/25927/2',\r\n '4': 'https://cdn.frankerfacez.com/emote/25927/4',\r\n },\r\n 'start': 122,\r\n 'end': 128,\r\n 'coords': {\r\n 'x': 0,\r\n 'y': 0,\r\n 'width': 143,\r\n 'height': 128,\r\n },\r\n },\r\n ] as Array<TwitchEmote | BttvEmote | SeventvEmote>,\r\n badges: {\r\n '100 bits': {\r\n type: '100 bits',\r\n version: '1',\r\n url: 'https://static-cdn.jtvnw.net/badges/v1/09d93036-e7ce-431c-9a9e-7044297133f2/3',\r\n description: '100 bits badge',\r\n },\r\n 'no audio': {\r\n type: 'no audio',\r\n version: '1',\r\n url: 'https://static-cdn.jtvnw.net/badges/v1/aef2cd08-f29b-45a1-8c12-d44d7fd5e6f0/3',\r\n description: 'Individuals with unreliable or no sound can select this badge',\r\n },\r\n 'no video': {\r\n type: 'no video',\r\n version: '1',\r\n url: 'https://static-cdn.jtvnw.net/badges/v1/199a0dba-58f3-494e-a7fc-1fa0a1001fb8/3',\r\n description: 'Individuals with unreliable or no video can select this badge',\r\n },\r\n 'bot': {\r\n type: 'bot',\r\n version: '1',\r\n url: 'https://static-cdn.jtvnw.net/badges/v1/df9095f6-a8a0-4cc2-bb33-d908c0adffb8/3',\r\n description: 'Twitch bot',\r\n },\r\n 'twitch staff': {\r\n type: 'twitch staff',\r\n version: '1',\r\n url: 'https://static-cdn.jtvnw.net/badges/v1/d97c37bd-a6f5-4c38-8f57-4e4bef88af34/3',\r\n description: 'Twitch Staff',\r\n },\r\n 'admins': {\r\n type: 'admins',\r\n version: '1',\r\n url: 'https://static-cdn.jtvnw.net/badges/v1/9ef7e029-4cdf-4d4d-a0d5-e2b3fb2583fe/3',\r\n description: 'Admins',\r\n },\r\n 'artist': {\r\n type: 'artist',\r\n version: '1',\r\n url: 'https://static-cdn.jtvnw.net/badges/v1/4300a897-03dc-4e83-8c0e-c332fee7057f/3',\r\n description: 'Artist',\r\n },\r\n 'game developer': {\r\n type: 'game developer',\r\n version: '1',\r\n url: 'https://static-cdn.jtvnw.net/badges/v1/85856a4a-eb7d-4e26-a43e-d204a977ade4/3',\r\n description: 'Game Developer',\r\n },\r\n 'prime': {\r\n type: 'prime',\r\n version: '1',\r\n url: 'https://static-cdn.jtvnw.net/badges/v1/a1dd5073-19c3-4911-8cb4-c464a7bc1510/3',\r\n description: 'Prime',\r\n },\r\n 'turbo': {\r\n type: 'turbo',\r\n version: '1',\r\n url: 'https://static-cdn.jtvnw.net/badges/v1/bd444ec6-8f34-4bf9-91f4-af1e3428d80f/3',\r\n description: 'Turbo',\r\n },\r\n 'subscriber': {\r\n type: 'subscriber',\r\n version: '1',\r\n url: 'https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/3',\r\n description: 'Subscriber',\r\n },\r\n 'broadcaster': {\r\n type: 'broadcaster',\r\n version: '1',\r\n url: 'https://static-cdn.jtvnw.net/badges/v1/5527c58c-fb7d-422d-b71b-f309dcb85cc1/3',\r\n description: 'Broadcaster',\r\n },\r\n 'verified': {\r\n type: 'verified',\r\n version: '1',\r\n url: 'https://static-cdn.jtvnw.net/badges/v1/d12a2e27-16f6-41d0-ab77-b780518f00a3/3',\r\n description: 'Verified',\r\n },\r\n 'moderator': {\r\n type: 'moderator',\r\n version: '1',\r\n url: 'https://static-cdn.jtvnw.net/badges/v1/3267646d-33f0-4b17-b3df-f923a41db1d0/3',\r\n description: 'Moderator',\r\n },\r\n 'vip': {\r\n type: 'vip',\r\n version: '1',\r\n url: 'https://static-cdn.jtvnw.net/badges/v1/b817aba4-fad8-49e2-b88a-7cc744dfa6ec/3',\r\n description: 'VIP',\r\n },\r\n } as Record<TwitchBadgesKeys, TwitchBadge>,\r\n pronouns: Alejo$Pronouns,\r\n tts: [\r\n 'Filiz',\r\n 'Astrid',\r\n 'Tatyana',\r\n 'Maxim',\r\n 'Carmen',\r\n 'Ines',\r\n 'Cristiano',\r\n 'Vitoria',\r\n 'Ricardo',\r\n 'Maja',\r\n 'Jan',\r\n 'Jacek',\r\n 'Ewa',\r\n 'Ruben',\r\n 'Lotte',\r\n 'Liv',\r\n 'Seoyeon',\r\n 'Takumi',\r\n 'Mizuki',\r\n 'Giorgio',\r\n 'Carla',\r\n 'Bianca',\r\n 'Karl',\r\n 'Dora',\r\n 'Mathieu',\r\n 'Celine',\r\n 'Chantal',\r\n 'Penelope',\r\n 'Miguel',\r\n 'Mia',\r\n 'Enrique',\r\n 'Conchita',\r\n 'Geraint',\r\n 'Salli',\r\n 'Matthew',\r\n 'Kimberly',\r\n 'Kendra',\r\n 'Justin',\r\n 'Joey',\r\n 'Joanna',\r\n 'Ivy',\r\n 'Raveena',\r\n 'Aditi',\r\n 'Emma',\r\n 'Brian',\r\n 'Amy',\r\n 'Russell',\r\n 'Nicole',\r\n 'Vicki',\r\n 'Marlene',\r\n 'Hans',\r\n 'Naja',\r\n 'Mads',\r\n 'Gwyneth',\r\n 'Zhiyu',\r\n 'Tracy',\r\n 'Danny',\r\n 'Huihui',\r\n 'Yaoyao',\r\n 'Kangkang',\r\n 'HanHan',\r\n 'Zhiwei',\r\n 'Asaf',\r\n 'An',\r\n 'Stefanos',\r\n 'Filip',\r\n 'Ivan',\r\n 'Heidi',\r\n 'Herena',\r\n 'Kalpana',\r\n 'Hemant',\r\n 'Matej',\r\n 'Andika',\r\n 'Rizwan',\r\n 'Lado',\r\n 'Valluvar',\r\n 'Linda',\r\n 'Heather',\r\n 'Sean',\r\n 'Michael',\r\n 'Karsten',\r\n 'Guillaume',\r\n 'Pattara',\r\n 'Jakub',\r\n 'Szabolcs',\r\n 'Hoda',\r\n 'Naayf',\r\n ] as string[],\r\n };\r\n\r\n static color = {\r\n opacity(opacity: number = 100, color: string) {\r\n color = color.length > 7 ? color.substring(0, 6) : color;\r\n opacity = opacity > 1 ? opacity / 100 : opacity;\r\n\r\n let result = Math.round(Math.min(Math.max(opacity, 0), 1) * 255)\r\n .toString(16)\r\n .toLowerCase();\r\n\r\n result = result.padStart(2, '0');\r\n\r\n return color + result;\r\n },\r\n\r\n getOpacity(hex: string) {\r\n if (!hex.startsWith('#') || hex.length <= 7) return { opacity: 100, hex };\r\n\r\n var ohex = hex.slice(-2);\r\n var decimal = parseInt(ohex, 16) / 255;\r\n var percentage = Math.round(decimal * 100);\r\n var color = hex.length > 7 ? hex.slice(0, 7) : hex;\r\n\r\n return { opacity: percentage, color: color };\r\n },\r\n\r\n validate(str: string): 'hex' | 'rgb' | 'rgba' | 'hsl' | 'hsla' | 'css-color-name' | false {\r\n if (typeof str !== 'string' || !str.length) return false;\r\n\r\n const s = str.trim();\r\n\r\n // HEX (#FFF, #FFFFFF, #FFFFFFFF)\r\n if (/^#([A-Fa-f0-9]{3}){1,2}$/.test(s) || /^#([A-Fa-f0-9]{4}|[A-Fa-f0-9]{8})$/.test(s)) {\r\n return 'hex';\r\n }\r\n\r\n // rgb(255, 255, 255)\r\n if (/^rgb\\(\\s*(?:\\d{1,3}\\s*,\\s*){2}\\d{1,3}\\s*\\)$/.test(s)) {\r\n return 'rgb';\r\n }\r\n\r\n // rgba(255, 255, 255, 0.5)\r\n if (/^rgba\\(\\s*(?:\\d{1,3}\\s*,\\s*){3}(?:0|1|0?\\.\\d+)\\s*\\)$/.test(s)) {\r\n return 'rgba';\r\n }\r\n\r\n // hsl(360, 100%, 100%)\r\n if (/^hsl\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}%\\s*,\\s*\\d{1,3}%\\s*\\)$/.test(s)) {\r\n return 'hsl';\r\n }\r\n\r\n // hsla(360, 100%, 100%, 0.5)\r\n if (/^hsla\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}%\\s*,\\s*\\d{1,3}%\\s*,\\s*(?:0|1|0?\\.\\d+)\\s*\\)$/.test(s)) {\r\n return 'hsla';\r\n }\r\n\r\n if (\r\n [\r\n 'aliceblue',\r\n 'antiquewhite',\r\n 'aqua',\r\n 'aquamarine',\r\n 'azure',\r\n 'beige',\r\n 'bisque',\r\n 'black',\r\n 'blanchedalmond',\r\n 'blue',\r\n 'blueviolet',\r\n 'brown',\r\n 'burlywood',\r\n 'cadetblue',\r\n 'chartreuse',\r\n 'chocolate',\r\n 'coral',\r\n 'cornflowerblue',\r\n 'cornsilk',\r\n 'crimson',\r\n 'cyan',\r\n 'darkblue',\r\n 'darkcyan',\r\n 'darkgoldenrod',\r\n 'darkgray',\r\n 'darkgreen',\r\n 'darkgrey',\r\n 'darkkhaki',\r\n 'darkmagenta',\r\n 'darkolivegreen',\r\n 'darkorange',\r\n 'darkorchid',\r\n 'darkred',\r\n 'darksalmon',\r\n 'darkseagreen',\r\n 'darkslateblue',\r\n 'darkslategray',\r\n 'darkslategrey',\r\n 'darkturquoise',\r\n 'darkviolet',\r\n 'deeppink',\r\n 'deepskyblue',\r\n 'dimgray',\r\n 'dimgrey',\r\n 'dodgerblue',\r\n 'firebrick',\r\n 'floralwhite',\r\n 'forestgreen',\r\n 'fuchsia',\r\n 'gainsboro',\r\n 'ghostwhite',\r\n 'gold',\r\n 'goldenrod',\r\n 'gray',\r\n 'green',\r\n 'greenyellow',\r\n 'grey',\r\n 'honeydew',\r\n 'hotpink',\r\n 'indianred',\r\n 'indigo',\r\n 'ivory',\r\n 'khaki',\r\n 'lavender',\r\n 'lavenderblush',\r\n 'lawngreen',\r\n 'lemonchiffon',\r\n 'lightblue',\r\n 'lightcoral',\r\n 'lightcyan',\r\n 'lightgoldenrodyellow',\r\n 'lightgray',\r\n 'lightgreen',\r\n 'lightgrey',\r\n 'lightpink',\r\n 'lightsalmon',\r\n 'lightseagreen',\r\n 'lightskyblue',\r\n 'lightslategray',\r\n 'lightslategrey',\r\n 'lightsteelblue',\r\n 'lightyellow',\r\n 'lime',\r\n 'limegreen',\r\n 'linen',\r\n 'magenta',\r\n 'maroon',\r\n 'mediumaquamarine',\r\n 'mediumblue',\r\n 'mediumorchid',\r\n 'mediumpurple',\r\n 'mediumseagreen',\r\n 'mediumslateblue',\r\n 'mediumspringgreen',\r\n 'mediumturquoise',\r\n 'mediumvioletred',\r\n 'midnightblue',\r\n 'mintcream',\r\n 'mistyrose',\r\n 'moccasin',\r\n 'navajowhite',\r\n 'navy',\r\n 'oldlace',\r\n 'olive',\r\n 'olivedrab',\r\n 'orange',\r\n 'orangered',\r\n 'orchid',\r\n 'palegoldenrod',\r\n 'palegreen',\r\n 'paleturquoise',\r\n 'palevioletred',\r\n 'papayawhip',\r\n 'peachpuff',\r\n 'peru',\r\n 'pink',\r\n 'plum',\r\n 'powderblue',\r\n 'purple',\r\n 'rebeccapurple',\r\n 'red',\r\n 'rosybrown',\r\n 'royalblue',\r\n 'saddlebrown',\r\n 'salmon',\r\n 'sandybrown',\r\n 'seagreen',\r\n 'seashell',\r\n 'sienna',\r\n 'silver',\r\n 'skyblue',\r\n 'slateblue',\r\n 'slategray',\r\n 'slategrey',\r\n 'snow',\r\n 'springgreen',\r\n 'steelblue',\r\n 'tan',\r\n 'teal',\r\n 'thistle',\r\n 'tomato',\r\n 'turquoise',\r\n 'violet',\r\n 'wheat',\r\n 'white',\r\n 'whitesmoke',\r\n 'yellow',\r\n 'yellowgreen',\r\n 'transparent',\r\n ].includes(s.toLowerCase())\r\n ) {\r\n return 'css-color-name';\r\n }\r\n\r\n return false;\r\n },\r\n };\r\n\r\n static rand = {\r\n color(type: 'hex' | 'hexa' | 'rgb' | 'rgba' | 'hsl' | 'hsla' | 'css-color-name' = 'hex'): string {\r\n switch (type) {\r\n default:\r\n case 'hex': {\r\n return `#${Math.floor(Math.random() * 0xffffff)\r\n .toString(16)\r\n .padStart(6, '0')}`;\r\n }\r\n case 'hexa': {\r\n const hex = `#${Math.floor(Math.random() * 0xffffff)\r\n .toString(16)\r\n .padStart(6, '0')}`;\r\n\r\n const alpha = Math.floor(Math.random() * 256)\r\n .toString(16)\r\n .padStart(2, '0');\r\n\r\n return hex + alpha;\r\n }\r\n case 'rgb': {\r\n const r = Math.floor(Math.random() * 256);\r\n const g = Math.floor(Math.random() * 256);\r\n const b = Math.floor(Math.random() * 256);\r\n\r\n return `rgb(${r}, ${g}, ${b})`;\r\n }\r\n case 'rgba': {\r\n const r = Math.floor(Math.random() * 256);\r\n const g = Math.floor(Math.random() * 256);\r\n const b = Math.floor(Math.random() * 256);\r\n const a = Math.random().toFixed(2);\r\n\r\n return `rgba(${r}, ${g}, ${b}, ${a})`;\r\n }\r\n case 'hsl': {\r\n const h = Math.floor(Math.random() * 361);\r\n const s = Math.floor(Math.random() * 101);\r\n const l = Math.floor(Math.random() * 101);\r\n\r\n return `hsl(${h}, ${s}%, ${l}%)`;\r\n }\r\n case 'hsla': {\r\n const h = Math.floor(Math.random() * 361);\r\n const s = Math.floor(Math.random() * 101);\r\n const l = Math.floor(Math.random() * 101);\r\n const a = Math.random().toFixed(2);\r\n\r\n return `hsla(${h}, ${s}%, ${l}%, ${a})`;\r\n }\r\n case 'css-color-name': {\r\n var names = [\r\n 'aliceblue',\r\n 'antiquewhite',\r\n 'aqua',\r\n 'aquamarine',\r\n 'azure',\r\n 'beige',\r\n 'bisque',\r\n 'black',\r\n 'blanchedalmond',\r\n 'blue',\r\n 'blueviolet',\r\n 'brown',\r\n 'burlywood',\r\n 'cadetblue',\r\n 'chartreuse',\r\n 'chocolate',\r\n 'coral',\r\n 'cornflowerblue',\r\n 'cornsilk',\r\n 'crimson',\r\n 'cyan',\r\n 'darkblue',\r\n 'darkcyan',\r\n 'darkgoldenrod',\r\n 'darkgray',\r\n 'darkgreen',\r\n 'darkgrey',\r\n 'darkkhaki',\r\n 'darkmagenta',\r\n 'darkolivegreen',\r\n 'darkorange',\r\n 'darkorchid',\r\n 'darkred',\r\n 'darksalmon',\r\n 'darkseagreen',\r\n 'darkslateblue',\r\n 'darkslategray',\r\n 'darkslategrey',\r\n 'darkturquoise',\r\n 'darkviolet',\r\n 'deeppink',\r\n 'deepskyblue',\r\n 'dimgray',\r\n 'dimgrey',\r\n 'dodgerblue',\r\n 'firebrick',\r\n 'floralwhite',\r\n 'forestgreen',\r\n 'fuchsia',\r\n 'gainsboro',\r\n 'ghostwhite',\r\n 'gold',\r\n 'goldenrod',\r\n 'gray',\r\n 'green',\r\n 'greenyellow',\r\n 'grey',\r\n 'honeydew',\r\n 'hotpink',\r\n 'indianred',\r\n 'indigo',\r\n 'ivory',\r\n 'khaki',\r\n 'lavender',\r\n 'lavenderblush',\r\n 'lawngreen',\r\n 'lemonchiffon',\r\n 'lightblue',\r\n 'lightcoral',\r\n 'lightcyan',\r\n 'lightgoldenrodyellow',\r\n 'lightgray',\r\n 'lightgreen',\r\n 'lightgrey',\r\n 'lightpink',\r\n 'lightsalmon',\r\n 'lightseagreen',\r\n 'lightskyblue',\r\n 'lightslategray',\r\n 'lightslategrey',\r\n 'lightsteelblue',\r\n 'lightyellow',\r\n 'lime',\r\n 'limegreen',\r\n 'linen',\r\n 'magenta',\r\n 'maroon',\r\n 'mediumaquamarine',\r\n 'mediumblue',\r\n 'mediumorchid',\r\n 'mediumpurple',\r\n 'mediumseagreen',\r\n 'mediumslateblue',\r\n 'mediumspringgreen',\r\n 'mediumturquoise',\r\n 'mediumvioletred',\r\n 'midnightblue',\r\n 'mintcream',\r\n 'mistyrose',\r\n 'moccasin',\r\n 'navajowhite',\r\n 'navy',\r\n 'oldlace',\r\n 'olive',\r\n 'olivedrab',\r\n 'orange',\r\n 'orangered',\r\n 'orchid',\r\n 'palegoldenrod',\r\n 'palegreen',\r\n 'paleturquoise',\r\n 'palevioletred',\r\n 'papayawhip',\r\n 'peachpuff',\r\n 'peru',\r\n 'pink',\r\n 'plum',\r\n 'powderblue',\r\n 'purple',\r\n 'rebeccapurple',\r\n 'red',\r\n 'rosybrown',\r\n 'royalblue',\r\n 'saddlebrown',\r\n 'salmon',\r\n 'sandybrown',\r\n 'seagreen',\r\n 'seashell',\r\n 'sienna',\r\n 'silver',\r\n 'skyblue',\r\n 'slateblue',\r\n 'slategray',\r\n 'slategrey',\r\n 'snow',\r\n 'springgreen',\r\n 'steelblue',\r\n 'tan',\r\n 'teal',\r\n 'thistle',\r\n 'tomato',\r\n 'turquoise',\r\n 'violet',\r\n 'wheat',\r\n 'white',\r\n 'whitesmoke',\r\n 'yellow',\r\n 'yellowgreen',\r\n 'transparent',\r\n ];\r\n\r\n return this.array(names)[0];\r\n }\r\n }\r\n },\r\n\r\n number(min: number, max: number, float: number = 0): number {\r\n if (min > max) [min, max] = [max, min];\r\n\r\n const rand = Math.random() * (max - min) + min;\r\n return float ? Number(rand.toFixed(float)) : Math.round(rand);\r\n },\r\n\r\n boolean(threshold: number = 0.5): boolean {\r\n return Math.random() > threshold;\r\n },\r\n\r\n string(length: number, chars: string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'): string {\r\n let result = '';\r\n\r\n for (let i = 0; i < length; i++) {\r\n result += chars.charAt(Math.floor(Math.random() * chars.length));\r\n }\r\n\r\n return result;\r\n },\r\n\r\n array<T>(arr: T[]): [T, number] {\r\n const index = this.number(0, arr.length - 1);\r\n\r\n return [arr[index], index];\r\n },\r\n\r\n date(rangeDays: number = 365): string {\r\n const now = Date.now();\r\n const past = now - this.number(0, rangeDays * 24 * 60 * 60 * 1000);\r\n\r\n return new Date(past).toISOString();\r\n },\r\n\r\n uuid(): string {\r\n return window.crypto && typeof crypto?.randomUUID === 'function'\r\n ? crypto.randomUUID()\r\n : '10000000-1000-4000-8000-100000000000'.replace(/[018]/g, (c) =>\r\n (+c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (+c / 4)))).toString(16),\r\n );\r\n },\r\n };\r\n\r\n static string = {\r\n /**\r\n * Replaces occurrences in a string based on a pattern with the result of an asynchronous callback function.\r\n * @param string - The input string to perform replacements on.\r\n * @param pattern - The pattern to match in the string (can be a string or a regular expression).\r\n * @param callback - An asynchronous callback function that takes the matched substring and any captured groups as arguments and returns the replacement string.\r\n * @returns A promise that resolves to the modified string with replacements applied.\r\n * @example\r\n * ```javascript\r\n * const result = await Simulation.string.replace(\"Hello World\", /World/, async (match) => {\r\n * return await fetchSomeData(match); // Assume this function fetches data asynchronously\r\n * });\r\n * console.log(result); // Output will depend on the fetched data\r\n * ```\r\n */\r\n async replace(string: string, pattern: string, callback: (match: string, ...groups: string[]) => Promise<string> | string): Promise<string> {\r\n const promises: Array<Promise<string>> = [];\r\n\r\n string.replace(pattern, (match: string, ...groups: string[]) => {\r\n const promise = typeof callback === 'function' ? callback(match, ...groups) : match;\r\n\r\n promises.push(Promise.resolve(promise));\r\n\r\n return match;\r\n });\r\n\r\n const replacements = await Promise.all(promises);\r\n\r\n return string.replace(pattern, () => replacements.shift() ?? '');\r\n },\r\n\r\n /**\r\n * Capitalizes the first letter of a given string.\r\n * @param string - The input string to be capitalized.\r\n * @returns The capitalized string.\r\n * @example\r\n * ```javascript\r\n * const result = Simulation.string.capitalize(\"hello world\");\r\n * console.log(result); // Output: \"Hello world\"\r\n * ```\r\n */\r\n capitalize(string: string): string {\r\n return string.charAt(0).toUpperCase() + string.slice(1);\r\n },\r\n\r\n /**\r\n * Composes a template string by replacing placeholders with corresponding values and applying optional modifiers.\r\n * @param template - The template string containing placeholders in the format {key} and optional modifiers in the format [MODIFIER:param=value].\r\n * @param values - An object containing key-value pairs to replace the placeholders in the template.\r\n * @param options - Optional settings for the composition process.\r\n * @returns The composed string with placeholders replaced and modifiers applied.\r\n * @example\r\n * ```javascript\r\n * const template = \"Hello, {username}! You have {amount} [UPPERCASE=messages] and your name is [CAPITALIZE=name].\";\r\n * const values = { username: \"john_doe\", amount: 5, name: \"john\" };\r\n * const result = Simulation.string.compose(template, values);\r\n * console.log(result); // Output: \"Hello, john_doe! You have 5 MESSAGES and your name is John.\"\r\n * ```\r\n */\r\n compose(\r\n template: string,\r\n values: Record<string, any>,\r\n options: { method?: 'loop' | 'index'; modifiers?: Record<string, Modifier> } = { method: 'index', modifiers: {} },\r\n ): string {\r\n const { mergeSpanStyles } = Simulation.element;\r\n\r\n const flatten: Record<string, string> = Object.entries(Simulation.object.flatten(values)).reduce(\r\n (acc, [k, v]) => {\r\n acc[k] = String(v);\r\n\r\n if (['username', 'name', 'nick', 'nickname', 'sender'].some((e) => k === e)) {\r\n const username = acc?.username || acc?.name || acc?.nick || acc?.nickname || acc?.sender;\r\n\r\n acc['username'] = acc.username || username;\r\n acc['usernameAt'] = `@${acc.username}`;\r\n acc['name'] = acc.name || username;\r\n acc['nick'] = acc.nick || username;\r\n acc['nickname'] = acc.nickname || username;\r\n acc['sender'] = acc.sender || username;\r\n acc['senderAt'] = `@${acc.sender}`;\r\n }\r\n\r\n if (['amount', 'count'].some((e) => k === e)) {\r\n acc['amount'] = String(amount);\r\n acc['count'] = String(acc?.count || amount);\r\n }\r\n\r\n acc['currency'] = acc.currency || window.client?.details.currency.symbol || '$';\r\n acc['currencyCode'] = acc.currencyCode || window.client?.details.currency.code || 'USD';\r\n\r\n acc['skip'] = '<br/>';\r\n acc['newline'] = '<br/>';\r\n\r\n return acc;\r\n },\r\n {} as Record<string, string>,\r\n );\r\n\r\n const REGEX = {\r\n PLACEHOLDERS: /{([^}]+)}/g,\r\n MODIFIERS: /\\[(\\w+)(:[^=]+)?=([^\\]]+)\\]/g,\r\n };\r\n\r\n var amount = parseFloat(flatten?.amount ?? flatten?.count ?? 0);\r\n\r\n const MODIFIERS: Record<string, Modifier> = {\r\n BT1: (value) => (amount > 1 ? value : ''),\r\n BT0: (value) => (amount > 0 ? value : ''),\r\n ST1: (value) => (amount < 1 ? value : ''),\r\n ST0: (value) => (amount < 0 ? value : ''),\r\n UPC: (value) => value.toUpperCase(),\r\n LOW: (value) => value.toLowerCase(),\r\n REV: (value) => value.split('').reverse().join(''),\r\n CAP: (value) => value.charAt(0).toUpperCase() + value.slice(1).toLowerCase(),\r\n FALLBACK: (value, param) => (value.length ? value : (param ?? value)),\r\n COLOR: (value, param) => mergeSpanStyles(param && !!Simulation.color.validate(param) ? `color: ${param}` : '', value),\r\n WEIGHT: (value, param) => mergeSpanStyles(param && !isNaN(parseInt(param)) ? `font-weight: ${param}` : '', value),\r\n BOLD: (value) => mergeSpanStyles('font-weight: bold', value),\r\n LIGHT: (value) => mergeSpanStyles('font-weight: lighter', value),\r\n STRONG: (value) => mergeSpanStyles('font-weight: bolder', value),\r\n ITALIC: (value) => mergeSpanStyles('font-style: italic', value),\r\n UNDERLINE: (value) => mergeSpanStyles('text-decoration: underline', value),\r\n STRIKETHROUGH: (value) => mergeSpanStyles('text-decoration: line-through', value),\r\n SUB: (value) => mergeSpanStyles('vertical-align: sub', value),\r\n SUP: (value) => mergeSpanStyles('vertical-align: super', value),\r\n LARGER: (value) => mergeSpanStyles('font-size: larger', value),\r\n SMALL: (value) => mergeSpanStyles('font-size: smaller', value),\r\n SHADOW: (value, param) => mergeSpanStyles(`text-shadow: ${param}`, value),\r\n SIZE: (value, param) => mergeSpanStyles(param ? `font-size: ${param}` : '', value),\r\n ...(options.modifiers ?? {}),\r\n };\r\n\r\n const ALIASES = {\r\n UPC: ['UPPERCASE', 'UPPER', 'UPP'],\r\n LOW: ['LOWERCASE', 'LOWER', 'LWC'],\r\n REV: ['REVERSE', 'RVS'],\r\n CAP: ['CAPITALIZE', 'CAPITAL'],\r\n BT1: ['BIGGER_THAN_1', 'GREATER_THAN_1', 'GT1'],\r\n BT0: ['BIGGER_THAN_0', 'GREATER_THAN_0', 'GT0'],\r\n ST1: ['SMALLER_THAN_1', 'LESS_THAN_1', 'LT1'],\r\n ST0: ['SMALLER_THAN_0', 'LESS_THAN_0', 'LT0'],\r\n COLOR: ['COLOUR', 'CLR', 'HIGHLIGHT'],\r\n BOLD: ['BOLDEN', 'B'],\r\n STRONG: ['STRONGEN', 'STRONG'],\r\n ITALIC: ['ITALICIZE', 'ITALIC', 'I'],\r\n UNDERLINE: ['U', 'INS', 'INSET', 'I'],\r\n STRIKETHROUGH: ['STRIKE', 'S', 'DELETE', 'D'],\r\n SUB: ['SUBSCRIPT', 'SUBS'],\r\n SUP: ['SUPERSCRIPT', 'SUPS'],\r\n LARGER: ['LARGER', 'LG'],\r\n SMALL: ['SMALLER', 'SM'],\r\n SHADOW: ['SHADOW', 'SHD'],\r\n FALLBACK: ['FALLBACK', 'FB'],\r\n };\r\n\r\n function applyModifier(value: string, name: string, param: string | null | undefined): string {\r\n const canonical = Object.entries(ALIASES).find(([key, aliases]) => {\r\n if (aliases.some((alias) => alias.toUpperCase() === name.toUpperCase())) return true;\r\n else if (key.toUpperCase() === name.toUpperCase()) return true;\r\n else return false;\r\n });\r\n const use = canonical ? canonical[0] : name.toUpperCase();\r\n\r\n if (MODIFIERS[use]) return MODIFIERS[use](value, typeof param === 'string' ? param.trim() : null, flatten);\r\n else return value;\r\n }\r\n\r\n function replaceAll(string: string): string {\r\n let str = string;\r\n let match;\r\n\r\n while ((match = REGEX.MODIFIERS.exec(str)) !== null) {\r\n const [fullMatch, modifier, param, value] = match;\r\n\r\n const newValue = applyModifier(replaceAll(value), modifier, param);\r\n\r\n str = str.replace(fullMatch, newValue ?? '');\r\n\r\n REGEX.MODIFIERS.lastIndex = 0;\r\n }\r\n\r\n return str;\r\n }\r\n\r\n function parseModifiers(str: string): string {\r\n let i = 0;\r\n const len = str.length;\r\n\r\n function parseText(stopChar?: string): string {\r\n let out = '';\r\n while (i < len) {\r\n if (str[i] === '\\\\') {\r\n if (i + 1 < len) {\r\n out += str[i + 1];\r\n i += 2;\r\n } else {\r\n i++;\r\n }\r\n } else if (str[i] === '[' && (!stopChar || stopChar !== '[')) {\r\n out += parseModifier();\r\n } else if (stopChar && str[i] === stopChar) {\r\n i++;\r\n break;\r\n } else {\r\n out += str[i++];\r\n }\r\n }\r\n return out;\r\n }\r\n\r\n function parseModifier(): string {\r\n i++;\r\n let name = '';\r\n while (i < len && /[A-Za-z0-9]/.test(str[i])) name += str[i++];\r\n let param: string | null = null;\r\n if (str[i] === ':') {\r\n i++;\r\n const paramStart = i;\r\n while (i < len && str[i] !== '=') i++;\r\n param = str.slice(paramStart, i);\r\n }\r\n if (str[i] === '=') i++;\r\n const value = parseText(']');\r\n return applyModifier(value, name, param);\r\n }\r\n\r\n return parseText();\r\n }\r\n\r\n let result = template.replace(REGEX.PLACEHOLDERS, (_, key: string) =>\r\n typeof flatten[key] === 'string' || typeof flatten[key] === 'number' ? String(flatten[key]) : (key ?? key),\r\n );\r\n\r\n result = options.method === 'loop' ? replaceAll(result) : parseModifiers(result);\r\n\r\n return result;\r\n },\r\n };\r\n\r\n static element = {\r\n /**\r\n * Merges outer span styles with inner span styles in the provided HTML string.\r\n * @param outerStyle - The style string to be applied to the outer span.\r\n * @param innerHTML - The inner HTML string which may contain a span with its own styles.\r\n * @returns A new HTML string with merged styles applied to a single span.\r\n * @example\r\n * ```javascript\r\n * const result = Simulation.element.mergeSpanStyles(\"color: red; font-weight: bold;\", '<span style=\"font-size: 14px;\">Hello World</span>');\r\n * console.log(result); // Output: '<span style=\"font-size: 14px; color: red; font-weight: bold;\">Hello World</span>'\r\n * ```\r\n */\r\n mergeSpanStyles(outerStyle: string, innerHTML: string): string {\r\n const match = innerHTML.match(/^<span style=\"([^\"]*)\">(.*)<\\/span>$/s);\r\n\r\n if (match) {\r\n const innerStyle = match[1];\r\n const content = match[2];\r\n\r\n const mergedStyle = [innerStyle, outerStyle]\r\n .filter(Boolean)\r\n .join('; ')\r\n .replace(/\\s*;\\s*/g, '; ')\r\n .trim();\r\n\r\n return `<span style=\"${mergedStyle}\">${content}</span>`;\r\n } else {\r\n return `<span style=\"${outerStyle}\">${innerHTML}</span>`;\r\n }\r\n },\r\n };\r\n\r\n static object = {\r\n /**\r\n * Flattens a nested object into a single-level object with dot-separated keys.\r\n * @param obj - The nested object to be flattened.\r\n * @param prefix - The prefix to be added to each key (used for recursion).\r\n * @returns A flattened object with dot-separated keys.\r\n * @example\r\n * ```javascript\r\n * const nestedObj = { a: { b: 1, c: { d: 2 } }, e: [3, 4] };\r\n * const flatObj = Simulation.object.flatten(nestedObj);\r\n * console.log(flatObj);\r\n * // Output: { 'a.b': '1', 'a.c.d': '2', 'e:0': '3', 'e:1': '4' }\r\n * ```\r\n */\r\n flatten(obj: Record<string, any>, prefix: string = ''): Record<string, string> {\r\n const result = {} as Record<string, string>;\r\n\r\n for (const key in obj) {\r\n if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;\r\n\r\n const value = obj[key];\r\n const path = prefix ? `${prefix}.${key}` : key;\r\n\r\n // Handle null and undefined\r\n if (value === null || value === undefined) {\r\n result[path] = String(value);\r\n\r\n continue;\r\n }\r\n\r\n // Handle Date objects\r\n if (value instanceof Date) {\r\n result[path] = value.toISOString();\r\n\r\n continue;\r\n }\r\n\r\n // Handle Map objects\r\n if (value instanceof Map) {\r\n value.forEach((v, k) => {\r\n result[`${path}.${k}`] = JSON.stringify(v);\r\n });\r\n\r\n continue;\r\n }\r\n\r\n // Handle Array objects\r\n if (Array.isArray(value)) {\r\n value.forEach((v, i) => {\r\n const itemPath = `${path}:${i}`;\r\n\r\n if (typeof v === 'object') {\r\n Object.assign(result, this.flatten(v, itemPath));\r\n } else {\r\n result[itemPath] = String(v);\r\n }\r\n });\r\n\r\n continue;\r\n }\r\n\r\n // Handle nested objects\r\n if (typeof value === 'object') {\r\n Object.assign(result, this.flatten(value, path));\r\n\r\n continue;\r\n }\r\n\r\n // Handle primitive values (string, number, boolean, etc.)\r\n result[path] = String(value);\r\n }\r\n\r\n return result;\r\n },\r\n };\r\n\r\n static generate = {\r\n session: {\r\n types: {\r\n name: { type: 'string', options: Simulation.data.names.filter((e) => e.length) },\r\n tier: { type: 'string', options: Simulation.data.tiers.filter((e) => e.length) },\r\n message: { type: 'string', options: Simulation.data.messages.filter((e) => e.length) },\r\n item: { type: 'array', options: Simulation.data.items },\r\n avatar: { type: 'string', options: Simulation.data.avatars.filter((e) => e.length) },\r\n } as Record<string, Session$AnyConfig>,\r\n\r\n available(): Session$AvailableData {\r\n const types = this.types;\r\n\r\n return {\r\n follower: {\r\n latest: { name: types.name },\r\n session: { count: { type: 'int', min: 50, max: 200 } },\r\n week: { count: { type: 'int', min: 200, max: 1000 } },\r\n month: { count: { type: 'int', min: 1000, max: 3000 } },\r\n goal: { amount: { type: 'int', min: 3000, max: 7000 } },\r\n total: { count: { type: 'int', min: 7000, max: 10000 } },\r\n recent: {\r\n type: 'recent',\r\n amount: 25,\r\n value: { name: types.name, createdAt: { type: 'date', range: 400 } },\r\n },\r\n },\r\n subscriber: {\r\n latest: {\r\n name: types.name,\r\n amount: { type: 'int', min: 10, max: 30 },\r\n tier: types.tier,\r\n message: types.message,\r\n },\r\n 'new-latest': {\r\n name: types.name,\r\n amount: { type: 'int', min: 10, max: 30 },\r\n message: types.message,\r\n },\r\n 'resub-latest': {\r\n name: types.name,\r\n amount: { type: 'int', min: 10, max: 30 },\r\n message: types.message,\r\n },\r\n 'gifted-latest': {\r\n name: types.name,\r\n amount: { type: 'int', min: 10, max: 30 },\r\n message: types.message,\r\n tier: types.tier,\r\n sender: types.name,\r\n },\r\n session: { count: { type: 'int', min: 10, max: 40 } },\r\n 'new-session': { count: { type: 'int', min: 10, max: 40 } },\r\n 'resub-session': { count: { type: 'int', min: 10, max: 40 } },\r\n 'gifted-session': { count: { type: 'int', min: 10, max: 40 } },\r\n week: { count: { type: 'int', min: 40, max: 100 } },\r\n month: { count: { type: 'int', min: 100, max: 200 } },\r\n goal: { amount: { type: 'int', min: 200, max: 300 } },\r\n total: { count: { type: 'int', min: 300, max: 400 } },\r\n points: { amount: { type: 'int', min: 100, max: 400 } },\r\n 'alltime-gifter': { name: types.name, amount: { type: 'int', min: 300, max: 400 } },\r\n recent: {\r\n type: 'recent',\r\n amount: 25,\r\n value: {\r\n name: types.name,\r\n amount: { type: 'int', min: 10, max: 30 },\r\n tier: types.tier,\r\n createdAt: { type: 'date', range: 400 },\r\n },\r\n },\r\n },\r\n host: {\r\n latest: { name: types.name, amount: { type: 'int', min: 1, max: 10 } },\r\n recent: {\r\n type: 'recent',\r\n amount: 25,\r\n value: {\r\n name: types.name,\r\n amount: { type: 'int', min: 1, max: 10 },\r\n createdAt: { type: 'date', range: 400 },\r\n },\r\n },\r\n },\r\n raid: {\r\n latest: { name: types.name, amount: { type: 'int', min: 0, max: 100 } },\r\n recent: {\r\n type: 'recent',\r\n amount: 25,\r\n value: {\r\n name: types.name,\r\n amount: { type: 'int', min: 0, max: 100 },\r\n createdAt: { type: 'date', range: 400 },\r\n },\r\n },\r\n },\r\n charityCampaignDonation: {\r\n latest: { name: types.name, amount: { type: 'int', min: 50, max: 150 } },\r\n 'session-top-donation': { name: types.name, amount: { type: 'int', min: 50, max: 200 } },\r\n 'weekly-top-donation': { name: types.name, amount: { type: 'int', min: 200, max: 500 } },\r\n 'monthly-top-donation': { name: types.name, amount: { type: 'int', min: 500, max: 800 } },\r\n 'alltime-top-donation': { name: types.name, amount: { type: 'int', min: 800, max: 1000 } },\r\n 'session-top-donator': { name: types.name, amount: { type: 'int', min: 50, max: 200 } },\r\n 'weekly-top-donator': { name: types.name, amount: { type: 'int', min: 200, max: 500 } },\r\n 'monthly-top-donator': { name: types.name, amount: { type: 'int', min: 500, max: 800 } },\r\n 'alltime-top-donator': { name: types.name, amount: { type: 'int', min: 800, max: 1000 } },\r\n recent: {\r\n type: 'recent',\r\n amount: 25,\r\n value: {\r\n name: types.name,\r\n amount: { type: 'int', min: 50, max: 150 },\r\n createdAt: { type: 'date', range: 400 },\r\n },\r\n },\r\n },\r\n cheer: {\r\n latest: { name: types.name, amount: { type: 'int', min: 200, max: 800 }, message: types.message },\r\n 'session-top-donation': { name: types.name, amount: { type: 'int', min: 200, max: 1000 } },\r\n 'weekly-top-donation': { name: types.name, amount: { type: 'int', min: 1000, max: 5000 } },\r\n 'monthly-top-donation': { name: types.name, amount: { type: 'int', min: 5000, max: 12000 } },\r\n 'alltime-top-donation': { name: types.name, amount: { type: 'int', min: 12000, max: 20000 } },\r\n 'session-top-donator': { name: types.name, amount: { type: 'int', min: 200, max: 1000 } },\r\n 'weekly-top-donator': { name: types.name, amount: { type: 'int', min: 1000, max: 5000 } },\r\n 'monthly-top-donator': { name: types.name, amount: { type: 'int', min: 5000, max: 12000 } },\r\n 'alltime-top-donator': { name: types.name, amount: { type: 'int', min: 12000, max: 20000 } },\r\n session: { amount: { type: 'int', min: 200, max: 1000 } },\r\n week: { amount: { type: 'int', min: 1000, max: 5000 } },\r\n month: { amount: { type: 'int', min: 5000, max: 12000 } },\r\n goal: { amount: { type: 'int', min: 12000, max: 18000 } },\r\n total: { amount: { type: 'int', min: 18000, max: 20000 } },\r\n count: { count: { type: 'int', min: 200, max: 1000 } },\r\n recent: {\r\n type: 'recent',\r\n amount: 25,\r\n value: {\r\n name: types.name,\r\n amount: { type: 'int', min: 200, max: 800 },\r\n createdAt: { type: 'date', range: 400 },\r\n },\r\n },\r\n },\r\n cheerPurchase: {\r\n latest: { name: types.name, amount: { type: 'int', min: 200, max: 400 } },\r\n 'session-top-donation': { name: types.name, amount: { type: 'int', min: 200, max: 400 } },\r\n 'weekly-top-donation': { name: types.name, amount: { type: 'int', min: 400, max: 800 } },\r\n 'monthly-top-donation': { name: types.name, amount: { type: 'int', min: 800, max: 1500 } },\r\n 'alltime-top-donation': { name: types.name, amount: { type: 'int', min: 1500, max: 2000 } },\r\n 'session-top-donator': { name: types.name, amount: { type: 'int', min: 200, max: 400 } },\r\n 'weekly-top-donator': { name: types.name, amount: { type: 'int', min: 400, max: 800 } },\r\n 'monthly-top-donator': { name: types.name, amount: { type: 'int', min: 800, max: 1500 } },\r\n 'alltime-top-donator': { name: types.name, amount: { type: 'int', min: 1500, max: 2000 } },\r\n recent: {\r\n type: 'recent',\r\n amount: 25,\r\n value: {\r\n name: types.name,\r\n amount: { type: 'int', min: 200, max: 400 },\r\n createdAt: { type: 'date', range: 400 },\r\n },\r\n },\r\n },\r\n superchat: {\r\n latest: { name: types.name, amount: { type: 'int', min: 100, max: 400 } },\r\n 'session-top-donation': { name: types.name, amount: { type: 'int', min: 100, max: 500 } },\r\n 'weekly-top-donation': { name: types.name, amount: { type: 'int', min: 500, max: 1000 } },\r\n 'monthly-top-donation': { name: types.name, amount: { type: 'int', min: 1000, max: 2000 } },\r\n 'alltime-top-donation': { name: types.name, amount: { type: 'int', min: 2000, max: 2500 } },\r\n 'session-top-donator': { name: types.name, amount: { type: 'int', min: 100, max: 500 } },\r\n 'weekly-top-donator': { name: types.name, amount: { type: 'int', min: 500, max: 1000 } },\r\n 'monthly-top-donator': { name: types.name, amount: { type: 'int', min: 1000, max: 2000 } },\r\n 'alltime-top-donator': { name: types.name, amount: { type: 'int', min: 2000, max: 2500 } },\r\n session: { amount: { type: 'int', min: 100, max: 500 } },\r\n week: { amount: { type: 'int', min: 500, max: 1000 } },\r\n month: { amount: { type: 'int', min: 1000, max: 2000 } },\r\n goal: { amount: { type: 'int', min: 2000, max: 2300 } },\r\n total: { amount: { type: 'int', min: 2300, max: 2500 } },\r\n count: { count: { type: 'int', min: 100, max: 500 } },\r\n recent: {\r\n type: 'recent',\r\n amount: 25,\r\n value: {\r\n name: types.name,\r\n amount: { type: 'int', min: 100, max: 400 },\r\n createdAt: { type: 'date', range: 400 },\r\n },\r\n },\r\n },\r\n hypetrain: {\r\n latest: {\r\n name: types.name,\r\n amount: { type: 'int', min: 0, max: 100 },\r\n active: { type: 'int', min: 0, max: 1 },\r\n level: { type: 'int', min: 5, max: 10 },\r\n levelChanged: { type: 'int', min: 0, max: 5 },\r\n _type: { type: 'array', options: ['follower', 'subscriber', 'cheer', 'donation'] },\r\n },\r\n 'level-goal': { amount: { type: 'int', min: 0, max: 100 } },\r\n 'level-progress': { amount: { type: 'int', min: 0, max: 100 }, percent: { type: 'int', min: 0, max: 100 } },\r\n total: { amount: { type: 'int', min: 0, max: 100 } },\r\n 'latest-top-contributors': { type: 'recent', amount: 25, value: { name: types.name } },\r\n },\r\n 'channel-points': {\r\n latest: {\r\n name: types.name,\r\n amount: { type: 'int', min: 0, max: 100 },\r\n message: types.message,\r\n redemption: { type: 'array', options: ['Reward 1', 'Reward 2', 'Reward 3'] },\r\n },\r\n },\r\n tip: {\r\n latest: { name: types.name, amount: { type: 'int', min: 100, max: 400 } },\r\n 'session-top-donation': { name: types.name, amount: { type: 'int', min: 100, max: 500 } },\r\n 'weekly-top-donation': { name: types.name, amount: { type: 'int', min: 500, max: 1000 } },\r\n 'monthly-top-donation': { name: types.name, amount: { type: 'int', min: 1000, max: 2000 } },\r\n 'alltime-top-donation': { name: types.name, amount: { type: 'int', min: 2000, max: 2500 } },\r\n 'session-top-donator': { name: types.name, amount: { type: 'int', min: 100, max: 500 } },\r\n 'weekly-top-donator': { name: types.name, amount: { type: 'int', min: 500, max: 1000 } },\r\n 'monthly-top-donator': { name: types.name, amount: { type: 'int', min: 1000, max: 2000 } },\r\n 'alltime-top-donator': { name: types.name, amount: { type: 'int', min: 2000, max: 2500 } },\r\n session: { amount: { type: 'int', min: 100, max: 500 } },\r\n week: { amount: { type: 'int', min: 500, max: 1000 } },\r\n month: { amount: { type: 'int', min: 1000, max: 2000 } },\r\n goal: { amount: { type: 'int', min: 2000, max: 2300 } },\r\n total: { amount: { type: 'int', min: 2300, max: 2500 } },\r\n count: { count: { type: 'int', min: 100, max: 500 } },\r\n recent: {\r\n type: 'recent',\r\n amount: 25,\r\n value: {\r\n name: types.name,\r\n amount: { type: 'int', min: 100, max: 400 },\r\n createdAt: { type: 'date', range: 400 },\r\n },\r\n },\r\n },\r\n merch: {\r\n latest: { name: types.name, amount: { type: 'int', min: 0, max: 100 }, items: types.item },\r\n 'goal-orders': { amount: { type: 'int', min: 0, max: 100 } },\r\n 'goal-items': { amount: { type: 'int', min: 0, max: 100 } },\r\n 'goal-total': { amount: { type: 'int', min: 0, max: 100 } },\r\n recent: { type: 'recent', amount: 25, value: { name: types.name } },\r\n },\r\n purchase: {\r\n latest: {\r\n name: types.name,\r\n amount: { type: 'int', min: 0, max: 100 },\r\n items: types.item,\r\n avatar: types.avatar,\r\n message: types.message,\r\n },\r\n },\r\n };\r\n },\r\n\r\n async get(): Promise<Session> {\r\n const available = this.available();\r\n\r\n const generate = (available: Session$AvailableData | Session$AvailableCategory | Session$AnyConfig): any => {\r\n const generateRecentData = (config: Session$AnyConfig): Array<any> => {\r\n if (!config || !('amount' in config)) return [];\r\n\r\n const items: Array<{ createdAt: string }> = [];\r\n\r\n for (let i = 0; i < config.amount; i++) {\r\n items.push(generate(config.value));\r\n }\r\n\r\n return items.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\r\n };\r\n\r\n const generateObjectData = (config: Record<string, any>): Record<string, any> => {\r\n const result: Record<string, any> = {};\r\n\r\n for (const key in config) {\r\n const processedKey = key.replace('_type', 'type');\r\n\r\n result[processedKey] = generate(config[key]);\r\n }\r\n\r\n return result;\r\n };\r\n\r\n const processTypedConfig = (config: Session$AnyConfig): any => {\r\n if (!config) return config;\r\n\r\n switch (config.type) {\r\n case 'int':\r\n return Simulation.rand.number(config.min, config.max);\r\n case 'string':\r\n return Simulation.rand.array(config.options)[0];\r\n case 'date':\r\n return Simulation.rand.date(config.range);\r\n case 'array':\r\n return Simulation.rand.array(config.options)[0];\r\n case 'recent':\r\n return generateRecentData(config);\r\n default:\r\n return config;\r\n }\r\n };\r\n\r\n // Main generation logic\r\n\r\n // Handle primitive values (non-objects)\r\n if (typeof available !== 'object' || available === null) {\r\n return available;\r\n }\r\n\r\n // Handle typed configurations (objects with a 'type' property)\r\n if ('type' in available && typeof available.type === 'string') {\r\n return processTypedConfig(available);\r\n }\r\n\r\n // Handle generic objects - recursively process each property\r\n return generateObjectData(available);\r\n };\r\n\r\n var session: Session = Object.entries(generate(available)).reduce(\r\n (acc, [key, value]) => {\r\n Object.entries(value as any).forEach(\r\n ([subKey, subValue]) =>\r\n //\r\n (acc[`${key}-${subKey}`] = subValue),\r\n );\r\n\r\n return acc;\r\n },\r\n {} as Record<string, any>,\r\n ) as Session;\r\n\r\n return session;\r\n },\r\n },\r\n event: {\r\n /**\r\n * Simulates the onWidgetLoad event for a widget.\r\n * @param fields - The field values to be included in the event.\r\n * @param session - The session data to be included in the event.\r\n * @param currency - The currency to be used (default is 'USD').\r\n * @returns A Promise that resolves to the simulated onWidgetLoad event data.\r\n */\r\n async onWidgetLoad(fields: Record<string, StreamElementsFieldValue>, session: Session, currency: 'BRL' | 'USD' | 'EUR' = 'USD'): Promise<onWidgetLoad> {\r\n const currencies = {\r\n BRL: { code: 'BRL', name: 'Brazilian Real', symbol: 'R$' },\r\n USD: { code: 'USD', name: 'US Dollar', symbol: '$' },\r\n EUR: { code: 'EUR', name: 'Euro', symbol: '€' },\r\n };\r\n\r\n return {\r\n channel: {\r\n username: 'local',\r\n apiToken: '',\r\n id: '',\r\n providerId: '',\r\n avatar: '',\r\n },\r\n currency: currencies[currency] ?? currencies.USD,\r\n fieldData: fields,\r\n recents: [],\r\n session: {\r\n data: session,\r\n settings: {\r\n autoReset: false,\r\n calendar: false,\r\n resetOnStart: false,\r\n },\r\n },\r\n overlay: {\r\n isEditorMode: true,\r\n muted: false,\r\n },\r\n emulated: true,\r\n };\r\n },\r\n /**\r\n * Simulates the onSessionUpdate event for a widget.\r\n * @param session - The session data to be included in the event.\r\n * @returns A Promise that resolves to the simulated onSessionUpdate event data.\r\n */\r\n async onSessionUpdate(session?: Session): Promise<onSessionUpdate> {\r\n session ??= await Simulation.generate.session.get();\r\n\r\n return { session };\r\n },\r\n /**\r\n * Simulates the onEventReceived event for a widget.\r\n * @param provider - The provider of the event (default is 'random').\r\n * @param type - The type of event to simulate (default is 'random').\r\n * @param options - Additional options to customize the event data.\r\n * @returns A Promise that resolves to the simulated onEventReceived event data, or null if the event type is not supported.\r\n * @example\r\n * ```javascript\r\n * // Simulate a random event\r\n * const randomEvent = await Simulation.generate.event.onEventReceived();\r\n *\r\n * // Simulate a Twitch message event with custom options\r\n * const twitchMessageEvent = await Simulation.generate.event.onEventReceived('twitch', 'message', { name: 'Streamer', message: 'Hello World!' });\r\n * ```\r\n */\r\n async onEventReceived(\r\n provider: Provider | 'random' = 'random',\r\n type: onEventReceived['listener'] | 'random' | 'tip' | 'cheer' | 'follower' | 'raid' | 'subscriber' = 'random',\r\n options: Record<string, string | number | boolean> = {},\r\n ): Promise<onEventReceived | null> {\r\n const available: Record<Provider, string[]> = {\r\n twitch: ['message', 'follower-latest', 'cheer-latest', 'raid-latest', 'subscriber-latest'],\r\n streamelements: ['tip-latest'],\r\n youtube: ['message', 'superchat-latest', 'subscriber-latest', 'sponsor-latest'],\r\n kick: [],\r\n facebook: [],\r\n };\r\n\r\n switch (provider) {\r\n default:\r\n case 'random': {\r\n var randomProvider = Simulation.rand.array(Object.keys(available).filter((e) => available[e as Provider].length))[0] as Provider;\r\n var randomEvent = Simulation.rand.array(available[randomProvider])[0] as onEventReceived['listener'];\r\n\r\n return this.onEventReceived(randomProvider, randomEvent);\r\n }\r\n\r\n case 'twitch': {\r\n switch (type as Twitch['listener'] | 'random' | 'cheer' | 'follower' | 'raid' | 'subscriber') {\r\n default:\r\n case 'random': {\r\n var randomEvent = Simulation.rand.array(available[provider])[0] as onEventReceived['listener'];\r\n\r\n return this.onEventReceived(provider, randomEvent);\r\n }\r\n case 'message': {\r\n var name = (options?.name as string) ?? Simulation.rand.array(Simulation.data.names.filter((e) => e.length))[0];\r\n var message = (options?.message as string) ?? Simulation.rand.array(Simulation.data.messages.filter((e) => e.length))[0];\r\n\r\n var badges = await generateBadges((options?.badges as BadgeOptions) ?? [], provider);\r\n\r\n var emotes = findEmotesInText(message);\r\n var renderedText = replaceEmotesWithHTML(message, emotes);\r\n\r\n var color = (options?.color as string) ?? Simulation.rand.color('hex');\r\n var userId = (options?.userId as string) ?? Simulation.rand.number(10000000, 99999999).toString();\r\n var time = Date.now();\r\n\r\n const event: Twitch$Message = {\r\n listener: 'message',\r\n event: {\r\n service: provider,\r\n data: {\r\n time: time,\r\n tags: {\r\n 'badge-info': `${badges.keys.map((key) => `${key}/${Simulation.rand.number(1, 5)}`).join(',')}`,\r\n 'badges': badges.keys.join('/1,'),\r\n\r\n 'mod': badges.keys.includes('moderator') ? '1' : '0',\r\n 'subscriber': badges.keys.includes('subscriber') ? '1' : '0',\r\n 'turbo': badges.keys.includes('turbo') ? '1' : '0',\r\n\r\n 'tmi-sent-ts': time.toString(),\r\n\r\n 'user-id': userId,\r\n 'user-type': '',\r\n\r\n 'color': color,\r\n 'display-name': name,\r\n 'emotes': '',\r\n\r\n 'client-nonce': Simulation.rand.string(16),\r\n 'flags': '',\r\n 'id': Simulation.rand.uuid(),\r\n 'first-msg': '0',\r\n 'returning-chatter': '0',\r\n },\r\n nick: name.toLowerCase(),\r\n displayName: name,\r\n displayColor: color,\r\n channel: 'local',\r\n text: message,\r\n isAction: false,\r\n userId: userId,\r\n msgId: Simulation.rand.uuid(),\r\n badges: badges.badges,\r\n emotes: emotes,\r\n },\r\n renderedText: renderedText,\r\n },\r\n };\r\n\r\n return event;\r\n }\r\n case 'cheer':\r\n case 'cheer-latest': {\r\n var amount = (options?.amount as number) ?? Simulation.rand.number(100, 10000);\r\n var avatar = (options?.avatar as string) ?? Simulation.rand.array(Simulation.data.avatars)[0];\r\n var name = (options?.name as string) ?? Simulation.rand.array(Simulation.data.names.filter((e) => e.length))[0];\r\n var message = (options?.message as string) ?? Simulation.rand.array(Simulation.data.messages.filter((e) => e.length))[0];\r\n\r\n const event: Twitch$Cheer = {\r\n listener: 'cheer-latest',\r\n event: {\r\n amount,\r\n avatar,\r\n name: name.toLowerCase(),\r\n displayName: name,\r\n message: message,\r\n providerId: '',\r\n _id: Simulation.rand.uuid(),\r\n sessionTop: false,\r\n type: 'cheer',\r\n originalEventName: 'cheer-latest',\r\n },\r\n };\r\n\r\n return event;\r\n }\r\n case 'follower':\r\n case 'follower-latest': {\r\n var avatar = (options?.avatar as string) ?? Simulation.rand.array(Simulation.data.avatars)[0];\r\n var name = (options?.name as string) ?? Simulation.rand.array(Simulation.data.names.filter((e) => e.length))[0];\r\n\r\n const event: Twitch$Follower = {\r\n listener: 'follower-latest',\r\n event: {\r\n avatar,\r\n name: name.toLowerCase(),\r\n displayName: name,\r\n providerId: '',\r\n _id: Simulation.rand.uuid(),\r\n sessionTop: false,\r\n type: 'follower',\r\n originalEventName: 'follower-latest',\r\n },\r\n };\r\n\r\n return event;\r\n }\r\n case 'raid':\r\n case 'raid-latest': {\r\n var amount = (options?.amount as number) ?? Simulation.rand.number(1, 100);\r\n var avatar = (options?.avatar as string) ?? Simulation.rand.array(Simulation.data.avatars)[0];\r\n var name = (options?.name as string) ?? Simulation.rand.array(Simulation.data.names.filter((e) => e.length))[0];\r\n\r\n const event: Twitch$Raid = {\r\n listener: 'raid-latest',\r\n event: {\r\n amount,\r\n avatar,\r\n name: name.toLowerCase(),\r\n displayName: name,\r\n providerId: '',\r\n _id: Simulation.rand.uuid(),\r\n sessionTop: false,\r\n type: 'raid',\r\n originalEventName: 'raid-latest',\r\n },\r\n };\r\n\r\n return event;\r\n }\r\n case 'subscriber':\r\n case 'subscriber-latest': {\r\n var tier = (options?.tier as string) ?? Simulation.rand.array(['1000', '2000', '3000'])[0];\r\n var amount = (options?.amount as number) ?? Simulation.rand.number(1, 24);\r\n var avatar = (options?.avatar as string) ?? Simulation.rand.array(Simulation.data.avatars)[0];\r\n var name = (options?.name as string) ?? Simulation.rand.array(Simulation.data.names.filter((e) => e.length))[0];\r\n var sender = (options?.sender as string) ?? Simulation.rand.array(Simulation.data.names.filter((e) => e.length && e !== name))[0];\r\n var message = (options?.message as string) ?? Simulation.rand.array(Simulation.data.messages.filter((e) => e.length))[0];\r\n\r\n var addons = {\r\n default: {\r\n avatar,\r\n tier,\r\n playedAsCommunityGift: false,\r\n },\r\n gift: {\r\n sender,\r\n gifted: true,\r\n } as Subscriber$gift,\r\n community: {\r\n message,\r\n sender,\r\n bulkGifted: true,\r\n } as Subscriber$community,\r\n spam: {\r\n sender,\r\n gifted: true,\r\n isCommunityGift: true,\r\n } as Subscriber$spam,\r\n };\r\n\r\n var subTypes = ['default', 'gift', 'community', 'spam'];\r\n var subType = (options?.subType as string) ?? Simulation.rand.array(subTypes)[0];\r\n\r\n subType = subTypes.includes(subType) ? subType : 'default';\r\n\r\n const event: Twitch$Subscriber = {\r\n listener: 'subscriber-latest',\r\n event: {\r\n amount,\r\n name: name.toLowerCase(),\r\n displayName: name,\r\n providerId: '',\r\n\r\n ...addons.default,\r\n ...addons[subType as keyof typeof addons],\r\n\r\n _id: Simulation.rand.uuid(),\r\n sessionTop: false,\r\n type: 'subscriber',\r\n originalEventName: 'subscriber-latest',\r\n },\r\n };\r\n\r\n return event;\r\n }\r\n case 'delete-message': {\r\n const event: Twitch$DeleteMessage = {\r\n listener: 'delete-message',\r\n event: {\r\n msgId: (options?.id as string) ?? Simulation.rand.uuid(),\r\n },\r\n };\r\n\r\n return event;\r\n }\r\n case 'delete-messages': {\r\n const event: Twitch$DeleteMessages = {\r\n listener: 'delete-messages',\r\n event: {\r\n userId: (options?.id as string) ?? Simulation.rand.number(10000000, 99999999).toString(),\r\n },\r\n };\r\n\r\n return event;\r\n }\r\n }\r\n }\r\n\r\n case 'streamelements': {\r\n switch (type as StreamElements['listener'] | 'random' | 'tip' | 'mute' | 'unmute' | 'skip') {\r\n default:\r\n case 'random': {\r\n var randomEvent = Simulation.rand.array(available[provider])[0] as onEventReceived['listener'];\r\n\r\n return this.onEventReceived(provider, randomEvent);\r\n }\r\n case 'tip':\r\n case 'tip-latest': {\r\n var amount = (options?.amount as number) ?? Simulation.rand.number(100, 4000);\r\n var avatar = (options?.avatar as string) ?? Simulation.rand.array(Simulation.data.avatars)[0];\r\n var name = (options?.name as string) ?? Simulation.rand.array(Simulation.data.names.filter((e) => e.length))[0];\r\n\r\n const event: StreamElements$Tip = {\r\n listener: 'tip-latest',\r\n event: {\r\n amount,\r\n avatar,\r\n name: name.toLowerCase(),\r\n displayName: name,\r\n providerId: '',\r\n _id: Simulation.rand.uuid(),\r\n sessionTop: false,\r\n type: 'tip',\r\n originalEventName: 'tip-latest',\r\n },\r\n };\r\n\r\n return event;\r\n }\r\n case 'kvstore:update': {\r\n const event: StreamElements$KVStore = {\r\n listener: 'kvstore:update',\r\n event: {\r\n data: {\r\n key: `customWidget.${(options?.key as string) ?? 'sampleKey'}`,\r\n value: (options?.value as string) ?? 'sampleValue',\r\n },\r\n },\r\n };\r\n\r\n return event;\r\n }\r\n case 'bot:counter': {\r\n const event: StreamElements$BotCounter = {\r\n listener: 'bot:counter',\r\n event: {\r\n counter: (options?.counter as string) ?? 'sampleCounter',\r\n value: (options?.value as number) ?? Simulation.rand.number(0, 100),\r\n },\r\n };\r\n\r\n return event;\r\n }\r\n case 'mute':\r\n case 'unmute':\r\n case 'alertService:toggleSound': {\r\n var muted = (options?.muted as boolean) ?? !client.details.overlay.muted;\r\n\r\n const event: StreamElements$AlertService = {\r\n listener: 'alertService:toggleSound',\r\n event: { muted },\r\n };\r\n\r\n return event;\r\n }\r\n case 'skip':\r\n case 'event:skip': {\r\n const event: StreamElements$EventSkip = {\r\n listener: 'event:skip',\r\n event: {},\r\n };\r\n\r\n return event;\r\n }\r\n }\r\n }\r\n\r\n case 'youtube': {\r\n switch (type as Youtube['listener'] | 'random' | 'message' | 'superchat' | 'subscriber' | 'sponsor') {\r\n default:\r\n case 'random': {\r\n var randomEvent = Simulation.rand.array(available[provider])[0] as onEventReceived['listener'];\r\n\r\n return this.onEventReceived(provider, randomEvent);\r\n }\r\n case 'message': {\r\n var name = (options?.name as string) ?? Simulation.rand.array(Simulation.data.names.filter((e) => e.length))[0];\r\n var message = (options?.message as string) ?? Simulation.rand.array(Simulation.data.messages.filter((e) => e.length))[0];\r\n\r\n const badges = await generateBadges((options?.badges as BadgeOptions) ?? [], provider);\r\n\r\n var emotes = findEmotesInText(message);\r\n var renderedText = replaceEmotesWithHTML(message, emotes);\r\n\r\n var color = (options?.color as string) ?? Simulation.rand.color('hex');\r\n var userId = (options?.userId as string) ?? Simulation.rand.number(10000000, 99999999).toString();\r\n var time = Date.now();\r\n\r\n var avatar = (options?.avatar as string) ?? Simulation.rand.array(Simulation.data.avatars)[0];\r\n\r\n const event: Youtube$Message = {\r\n listener: 'message',\r\n event: {\r\n service: 'youtube',\r\n data: {\r\n kind: '',\r\n etag: '',\r\n id: '',\r\n snippet: {\r\n type: '',\r\n liveChatId: '',\r\n authorChannelId: 'local',\r\n publishedAt: new Date().toISOString(),\r\n hasDisplayContent: true,\r\n displayMessage: message,\r\n textMessageDetails: {\r\n messageText: message,\r\n },\r\n },\r\n authorDetails: {\r\n channelId: 'local',\r\n channelUrl: '',\r\n displayName: name,\r\n profileImageUrl: avatar,\r\n ...badges,\r\n },\r\n msgId: Simulation.rand.uuid(),\r\n userId: Simulation.rand.uuid(),\r\n nick: name.toLowerCase(),\r\n badges: [],\r\n displayName: name,\r\n isAction: false,\r\n time: Date.now(),\r\n tags: [],\r\n displayColor: Simulation.rand.color('hex'),\r\n channel: 'local',\r\n text: message,\r\n avatar: avatar,\r\n emotes: [],\r\n },\r\n renderedText: message,\r\n },\r\n };\r\n\r\n return event;\r\n }\r\n case 'subscriber':\r\n case 'subscriber-latest': {\r\n var avatar = (options?.avatar as string) ?? Simulation.rand.array(Simulation.data.avatars)[0];\r\n var name = (options?.name as string) ?? Simulation.rand.array(Simulation.data.names.filter((e) => e.length))[0];\r\n\r\n const event: YouTube$Subscriber = {\r\n listener: 'subscriber-latest',\r\n event: {\r\n avatar,\r\n displayName: name,\r\n name: name.toLowerCase(),\r\n providerId: '',\r\n _id: Simulation.rand.uuid(),\r\n sessionTop: false,\r\n type: 'subscriber',\r\n originalEventName: 'subscriber-latest',\r\n },\r\n };\r\n\r\n return event;\r\n }\r\n case 'superchat':\r\n case 'superchat-latest': {\r\n var amount = (options?.amount as number) ?? Simulation.rand.number(100, 4000);\r\n var avatar = (options?.avatar as string) ?? Simulation.rand.array(Simulation.data.avatars)[0];\r\n var name = (options?.name as string) ?? Simulation.rand.array(Simulation.data.names.filter((e) => e.length))[0];\r\n\r\n const event: YouTube$Superchat = {\r\n listener: 'superchat-latest',\r\n event: {\r\n amount,\r\n avatar,\r\n name: name.toLowerCase(),\r\n displayName: name,\r\n providerId: '',\r\n _id: Simulation.rand.uuid(),\r\n sessionTop: false,\r\n type: 'superchat',\r\n originalEventName: 'superchat-latest',\r\n },\r\n };\r\n\r\n return event;\r\n }\r\n case 'sponsor':\r\n case 'sponsor-latest': {\r\n var tier = (options?.tier as string) ?? Simulation.rand.array(['1000', '2000', '3000'])[0];\r\n var amount = (options?.amount as number) ?? Simulation.rand.number(1, 24);\r\n var avatar = (options?.avatar as string) ?? Simulation.rand.array(Simulation.data.avatars)[0];\r\n var name = (options?.name as string) ?? Simulation.rand.array(Simulation.data.names.filter((e) => e.length))[0];\r\n var sender = (options?.sender as string) ?? Simulation.rand.array(Simulation.data.names.filter((e) => e.length && e !== name))[0];\r\n var message = (options?.message as string) ?? Simulation.rand.array(Simulation.data.messages.filter((e) => e.length))[0];\r\n\r\n var addons = {\r\n default: {\r\n avatar,\r\n tier,\r\n playedAsCommunityGift: false,\r\n },\r\n gift: {\r\n sender,\r\n gifted: true,\r\n } as Sponsor$gift,\r\n community: {\r\n message,\r\n sender,\r\n bulkGifted: true,\r\n } as Sponsor$community,\r\n spam: {\r\n sender,\r\n gifted: true,\r\n isCommunityGift: true,\r\n } as Sponsor$spam,\r\n };\r\n\r\n var subTypes = ['default', 'gift', 'community', 'spam'];\r\n var subType = (options?.subType as string) ?? Simulation.rand.array(subTypes)[0];\r\n\r\n subType = subTypes.includes(subType) ? subType : 'default';\r\n\r\n const event: Youtube$Sponsor = {\r\n listener: 'sponsor-latest',\r\n event: {\r\n amount,\r\n name: name.toLowerCase(),\r\n displayName: name,\r\n providerId: '',\r\n\r\n ...addons.default,\r\n ...addons[subType as keyof typeof addons],\r\n\r\n _id: Simulation.rand.uuid(),\r\n sessionTop: false,\r\n type: 'sponsor',\r\n originalEventName: 'sponsor-latest',\r\n },\r\n };\r\n\r\n return event;\r\n }\r\n }\r\n }\r\n }\r\n },\r\n },\r\n };\r\n\r\n static fields(settings: FieldSettings): Record<string, StreamElementsField> {\r\n const defaultOptions: NormalizedFieldSettings = {\r\n from: 'main',\r\n endsWith: [],\r\n ignore: [],\r\n replace: {},\r\n subgroup: false,\r\n template: '• {key}',\r\n subgroupTemplate: '★ {key}',\r\n settings: {\r\n types: [\r\n [['size', 'width', 'number', 'gap', 'duration'], 'number'],\r\n [['options', 'dropdown', 'weight'], 'dropdown'],\r\n [['range', 'radius'], 'slider'],\r\n [['color', 'background'], 'colorpicker'],\r\n [['font-family', 'font', 'family'], 'googleFont'],\r\n ],\r\n addons: [\r\n [['slider', 'radius'], { step: 1, min: 0, max: 'inherit' }],\r\n [['options', 'dropdown'], { options: {} }],\r\n [\r\n ['weight'],\r\n {\r\n options: {\r\n '100': 'Thin',\r\n '200': 'Extra Light',\r\n '300': 'Light',\r\n '400': 'Regular',\r\n '500': 'Medium',\r\n '600': 'Semi Bold',\r\n '700': 'Bold',\r\n '800': 'Extra Bold',\r\n '900': 'Black',\r\n },\r\n },\r\n ],\r\n ],\r\n transforms: [\r\n [['size', 'width', 'number', 'gap', 'duration'], (value) => parseFloat(String(value))],\r\n [['font-family', 'font', 'family'], (value) => value],\r\n [['range', 'radius'], (value) => parseFloat(String(value))],\r\n [['options', 'dropdown'], (value) => value],\r\n [['weight'], (value) => value],\r\n [['color', 'background'], (value) => value],\r\n ],\r\n labels: [\r\n [['font-size'], ' • In pixels'],\r\n [['font-radius'], ' • In pixels'],\r\n ],\r\n },\r\n };\r\n\r\n function normalizeFieldSettings(settings: FieldSettings): NormalizedFieldSettings {\r\n return {\r\n ...defaultOptions,\r\n ...settings,\r\n endsWith: Array.isArray(settings.endsWith) ? settings.endsWith : defaultOptions.endsWith,\r\n ignore: Array.isArray(settings.ignore) ? settings.ignore : defaultOptions.ignore,\r\n replace: { ...defaultOptions.replace, ...(settings.replace ?? {}) },\r\n settings: {\r\n types: Array.isArray(settings.settings?.types) ? settings.settings.types : defaultOptions.settings.types,\r\n addons: Array.isArray(settings.settings?.addons) ? settings.settings.addons : defaultOptions.settings.addons,\r\n transforms: Array.isArray(settings.settings?.transforms) ? settings.settings.transforms : defaultOptions.settings.transforms,\r\n labels: Array.isArray(settings.settings?.labels) ? settings.settings.labels : defaultOptions.settings.labels,\r\n },\r\n subgroup: settings.subgroup ?? defaultOptions.subgroup,\r\n template: settings.template ?? defaultOptions.template,\r\n subgroupTemplate: settings.subgroupTemplate ?? defaultOptions.subgroupTemplate,\r\n from: settings.from ?? defaultOptions.from,\r\n };\r\n }\r\n\r\n const options = normalizeFieldSettings(settings);\r\n\r\n const extractCssVariables = (): Record<string, string> => {\r\n return Array.from(document.styleSheets)\r\n .filter(({ href }) => !href || href.startsWith(window.location.origin))\r\n .reduce(\r\n (acc, { cssRules }) => {\r\n if (!cssRules) return acc;\r\n Array.from(cssRules).forEach((rule) => {\r\n if (rule instanceof CSSStyleRule && rule.selectorText === options.from && Array.from(rule.style).some((prop) => prop.startsWith('--'))) {\r\n Array.from(rule.style)\r\n .filter((prop) => prop.startsWith('--'))\r\n .forEach((prop) => {\r\n acc[prop] = rule.style.getPropertyValue(prop).trim();\r\n });\r\n }\r\n });\r\n return acc;\r\n },\r\n {} as Record<string, string>,\r\n );\r\n };\r\n\r\n const allVariables = extractCssVariables();\r\n\r\n const filteredVariables = Object.entries(allVariables)\r\n .filter(([name]) => options.endsWith.some((suffix) => name.toLowerCase().endsWith(suffix.toLowerCase()) && !name.includes('-options-')))\r\n .filter(([name]) => !options.ignore.some((ignoreName) => name.toLowerCase() === ignoreName.toLowerCase()))\r\n .reduce(\r\n (acc, [name, value]) => {\r\n acc[name.replace('--', '')] = String(options.replace?.[name] ?? value);\r\n return acc;\r\n },\r\n {} as Record<string, string | number>,\r\n );\r\n\r\n let usedSubgroups: string[] = [];\r\n\r\n const fields = Object.entries(filteredVariables).reduce(\r\n (fields, [name, value]) => {\r\n let type = options.settings.types.find(([names]) => names.some((n) => name.toLowerCase().includes(n)))?.[1] || 'text';\r\n\r\n let transform = options.settings.transforms.find(([names]) => names.some((n) => name.toLowerCase().includes(n)))?.[1] || ((v: any) => v);\r\n\r\n let labelAddon = options.settings.labels.find(([names]) => names.some((n) => name.toLowerCase().includes(n)))?.[1] || '';\r\n\r\n let fieldAddons: Record<string, any> = {\r\n type: 'text',\r\n label: labelAddon,\r\n ...(options.settings.addons.find(([names]) => names.some((n) => name.toLowerCase().includes(n)))?.[1] || {}),\r\n };\r\n\r\n (['min', 'max', 'step', 'label', 'type'] as const).forEach((addonKey) => {\r\n const addonValue = allVariables[`--${name}-${addonKey}`];\r\n if (addonValue && addonValue.length) {\r\n fieldAddons[addonKey] = isNaN(parseFloat(addonValue)) ? String(addonValue).replace(/^['\"]|['\"]$/g, '') : String(parseFloat(addonValue));\r\n }\r\n });\r\n\r\n let subgroupKey = name\r\n .replace(/-(size|color|weight|width|height|gap|duration|radius|amount)$/g, '')\r\n .replace(/-([a-z])/g, (_, c) => c.toUpperCase())\r\n .replace(/[A-Z]/g, ' $&')\r\n .toLowerCase()\r\n .trim();\r\n\r\n let matchingSubgroupVars = Object.keys(filteredVariables).filter((key) =>\r\n key.startsWith(subgroupKey.replace(/[A-Z]/g, '-$&').replaceAll(' ', '-').toLowerCase().slice(1)),\r\n );\r\n\r\n if (\r\n options.subgroup &&\r\n !fields[`${subgroupKey.replace(/[A-Z]/g, '-$&').replaceAll(' ', '-').toLowerCase().slice(1)}-subgroup`] &&\r\n matchingSubgroupVars.length > 1 &&\r\n !usedSubgroups.includes(name)\r\n ) {\r\n usedSubgroups.push(...matchingSubgroupVars);\r\n\r\n fields[`${subgroupKey.replace(/[A-Z]/g, '-$&').replaceAll(' ', '-').toLowerCase().slice(1)}-subgroup`] = {\r\n type: 'hidden',\r\n label: options.subgroupTemplate.replaceAll('{key}', Simulation.string.capitalize(subgroupKey)),\r\n };\r\n }\r\n\r\n let label = Simulation.string.capitalize(\r\n name\r\n .replace(/-([a-z])/g, (_, c) => c.toUpperCase())\r\n .replace(/[A-Z]/g, ' $&')\r\n .toLowerCase(),\r\n );\r\n\r\n value = transform(value) ?? value;\r\n\r\n const getCustomOptions = () => {\r\n const values = Object.entries(allVariables)\r\n .filter(([key]) => key.startsWith(`--${name}-options-`))\r\n .reduce(\r\n (acc, [key, value]) => {\r\n const optionLabel = key.replace(`--${name}-options-`, '');\r\n if (optionLabel)\r\n acc[String(value)] = Simulation.string.capitalize(\r\n optionLabel\r\n .replace(/-([a-z])/g, (_, c) => c.toUpperCase())\r\n .replace(/[A-Z]/g, ' $&')\r\n .toLowerCase(),\r\n );\r\n return acc;\r\n },\r\n {} as Record<string, string>,\r\n );\r\n return Object.keys(values).length ? values : null;\r\n };\r\n\r\n const customOptions = getCustomOptions();\r\n\r\n if (customOptions) {\r\n type = 'dropdown';\r\n fieldAddons.options = customOptions;\r\n value = String(value);\r\n }\r\n\r\n Object.entries(fieldAddons).forEach(([key, val]) => {\r\n if ([false, 'inherit', 'auto', null].includes(val)) fieldAddons[key] = value;\r\n });\r\n\r\n fields[name] = {\r\n type: (fieldAddons.type as StreamElementsFieldTypes) || type,\r\n label: options.template.toString().replaceAll('{key}', Simulation.string.capitalize(label) + fieldAddons.label),\r\n value,\r\n min: fieldAddons.min,\r\n max: fieldAddons.max,\r\n step: fieldAddons.step,\r\n options: fieldAddons.options,\r\n };\r\n\r\n return fields;\r\n },\r\n {} as Record<string, StreamElementsField>,\r\n );\r\n\r\n const errors = Object.entries(fields).reduce(\r\n (acc, [name, field]) => {\r\n const hasInvalidLabel = field?.label?.includes('undefined');\r\n const isInvalidValue = !['hidden', 'button'].includes(field.type) && field.value === undefined;\r\n if (hasInvalidLabel || isInvalidValue) acc[name] = field;\r\n return acc;\r\n },\r\n {} as Record<string, StreamElementsField>,\r\n );\r\n\r\n if (Object.keys(errors).length) {\r\n Tixyel.logger.error('Simulation.fields: Detected errors in generated fields:', errors);\r\n\r\n throw new Error('Error while processing fields');\r\n }\r\n\r\n return fields;\r\n }\r\n\r\n static async start() {\r\n const localFiles = {\r\n fields: ['fields.json', 'cf.json', 'field.json', 'customfields.json'].find((file) => {\r\n try {\r\n new URL('./' + file, window.location.href);\r\n return true;\r\n } catch (error) {\r\n return false;\r\n }\r\n }),\r\n data: ['data.json', 'fielddata.json', 'fd.json', 'DATA.json'].find((file) => {\r\n try {\r\n new URL('./' + file, window.location.href);\r\n return true;\r\n } catch (error) {\r\n return false;\r\n }\r\n }),\r\n };\r\n\r\n const data: Record<string, string | number | boolean> = await fetch('./' + (localFiles.data ?? 'data.json'), {\r\n cache: 'no-store',\r\n })\r\n .then((res) => res.json())\r\n .catch(() => ({}));\r\n\r\n await fetch('./' + (localFiles.fields ?? 'fields.json'), {\r\n cache: 'no-store',\r\n })\r\n .then((res) => res.json())\r\n .then(async (customfields: Record<string, StreamElementsField>) => {\r\n const fields = Object.entries(customfields)\r\n .filter(([_, { value }]) => value != undefined)\r\n .reduce(\r\n (acc, [key, { value }]) => {\r\n if (data && data[key] !== undefined) value = data[key];\r\n\r\n acc[key] = value;\r\n\r\n return acc;\r\n },\r\n {\r\n ...data,\r\n } as Record<string, StreamElementsFieldValue>,\r\n );\r\n\r\n const load = await Simulation.generate.event.onWidgetLoad(fields, await Simulation.generate.session.get());\r\n\r\n window.dispatchEvent(new CustomEvent('onWidgetLoad', { detail: load }));\r\n });\r\n }\r\n}\r\n","type LoggerThemeName = 'error' | 'success' | 'alert' | 'warn' | 'status' | 'received' | 'simple' | 'info';\r\n\r\ninterface LoggerTheme {\r\n name: LoggerThemeName;\r\n color?: string;\r\n background?: string;\r\n bold?: boolean;\r\n italic?: boolean;\r\n underline?: boolean;\r\n fontSize?: number;\r\n template?: {\r\n before?: string;\r\n after?: string;\r\n };\r\n}\r\n\r\ntype LoggerLogFunction = (...args: any[]) => void;\r\n\r\ntype LoggerMethods = Record<LoggerThemeName, LoggerLogFunction>;\r\n\r\nexport class Logger implements LoggerMethods {\r\n private readonly themes: LoggerTheme[] = [\r\n {\r\n name: 'error',\r\n color: '#721c24',\r\n background: '#f8d7da',\r\n bold: true,\r\n italic: false,\r\n fontSize: 18,\r\n template: { before: ' ✖ ', after: ' ' },\r\n },\r\n {\r\n name: 'success',\r\n color: '#155724',\r\n background: '#d4edda',\r\n bold: true,\r\n italic: false,\r\n fontSize: 18,\r\n template: { before: ' ✔ ', after: ' ' },\r\n },\r\n {\r\n name: 'alert',\r\n color: '#856404',\r\n background: '#fff3cd',\r\n bold: true,\r\n italic: false,\r\n fontSize: 20,\r\n template: { before: ' ⚠ ', after: ' ' },\r\n },\r\n {\r\n name: 'warn',\r\n color: '#856404',\r\n background: '#fff3cd',\r\n bold: true,\r\n italic: false,\r\n fontSize: 20,\r\n template: { before: ' ⚠ ', after: ' ' },\r\n },\r\n {\r\n name: 'status',\r\n color: '#0c5460',\r\n background: '#d1ecf1',\r\n bold: true,\r\n italic: false,\r\n fontSize: 12,\r\n template: { before: ' · ', after: '' },\r\n },\r\n {\r\n name: 'received',\r\n color: '#E6BBFF',\r\n background: 'transparent',\r\n bold: false,\r\n italic: false,\r\n fontSize: 14,\r\n template: { before: ' ⬇ ', after: '' },\r\n },\r\n {\r\n name: 'simple',\r\n color: '#f5c6cb',\r\n background: 'transparent',\r\n bold: false,\r\n italic: false,\r\n fontSize: 14,\r\n template: { before: '', after: '' },\r\n },\r\n {\r\n name: 'info',\r\n color: '#f6c6cb',\r\n background: 'transparent',\r\n bold: false,\r\n italic: false,\r\n fontSize: 14,\r\n template: { before: ' ℹ ', after: '' },\r\n },\r\n ];\r\n\r\n error: LoggerLogFunction = () => {};\r\n success: LoggerLogFunction = () => {};\r\n alert: LoggerLogFunction = () => {};\r\n warn: LoggerLogFunction = () => {};\r\n status: LoggerLogFunction = () => {};\r\n received: LoggerLogFunction = () => {};\r\n simple: LoggerLogFunction = () => {};\r\n info: LoggerLogFunction = () => {};\r\n\r\n constructor() {\r\n this.themes.forEach((theme) => {\r\n const styles: string[] = [];\r\n\r\n if (theme.background && theme.background !== 'transparent') styles.push(`background-color: ${theme.background}`);\r\n if (theme.color) styles.push(`color: ${theme.color}`);\r\n if (theme.bold) styles.push('font-weight: bold');\r\n if (theme.italic) styles.push('font-style: italic');\r\n if (theme.underline) styles.push('text-decoration: underline');\r\n if (theme.fontSize) styles.push(`font-size: ${theme.fontSize}px`);\r\n\r\n const signal = '%c';\r\n\r\n const logFn: LoggerLogFunction = (...args: any[]) => {\r\n const textContent = Array.from(args).filter((arg) => typeof arg === 'string' || typeof arg === 'number');\r\n const objectContent = Array.from(args).filter((arg) => typeof arg !== 'string' && typeof arg !== 'number');\r\n const css = textContent.length > 0 ? styles.join('; ') : null;\r\n\r\n const log: any[] = [\r\n textContent.length > 0 ? signal + (theme.template?.before ?? '') + textContent.join(' ') + (theme.template?.after ?? '') : null,\r\n css,\r\n ...objectContent,\r\n ].filter(Boolean);\r\n\r\n return console.log(...log);\r\n };\r\n\r\n this[theme.name] = logFn;\r\n });\r\n }\r\n}\r\n","import { Client } from '../client/index.js';\r\nimport { Tixyel } from '../index.js';\r\n\r\ninterface ButtonOptions {\r\n field: string | ((field: string, value: string | boolean | number) => boolean);\r\n template?: string;\r\n run: (field: string, value: string | boolean | number) => void;\r\n}\r\n\r\nexport class Button {\r\n field: ButtonOptions['field'] = 'button';\r\n\r\n template: string = 'button';\r\n\r\n run!: ButtonOptions['run'];\r\n\r\n constructor(options: ButtonOptions) {\r\n if (!(window.client instanceof Client)) return;\r\n\r\n this.field = options.field ?? this.field;\r\n this.template = options.template ?? this.template;\r\n\r\n this.run = options.run;\r\n\r\n // Register the button in the client actions\r\n window.client.actions.buttons.push(this);\r\n\r\n window.client.emit('action', this, 'created');\r\n }\r\n\r\n parse(field: string, value: string | boolean | number): Button {\r\n var f = field.replace(typeof this.field === 'string' ? this.field : (this.template.replace(/\\{[^}]*\\}/g, '') ?? ''), '').trim();\r\n\r\n try {\r\n this.run.apply(window.client, [f.length ? f : (field ?? field), value]);\r\n } catch (error) {\r\n throw new Error(`Error running button \"${this.field}\": ${error instanceof Error ? error.message : error}`);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n static execute(field: string, value: string | boolean | number): boolean {\r\n try {\r\n if (!(window.client instanceof Client)) return false;\r\n\r\n if (window.client.actions.buttons.length) {\r\n const button = window.client.actions.buttons.find((b) =>\r\n typeof b.field === 'string' ? b.field === field : typeof b.field === 'function' ? b.field(field, value) : false,\r\n );\r\n\r\n if (button && button instanceof Button) {\r\n try {\r\n button.parse(field, value);\r\n window.client.emit('action', button, 'executed');\r\n\r\n Tixyel.logger.received(`Button executed: ${field} with value: ${value}`);\r\n } catch (error) {\r\n Tixyel.logger.error(`Error executing button \"${field}\": ${error instanceof Error ? error.message : error}`);\r\n }\r\n\r\n return true;\r\n }\r\n }\r\n } catch (error) {\r\n return false;\r\n } finally {\r\n return false;\r\n }\r\n }\r\n}\r\n","import { Client } from '../client/index.js';\r\nimport { Tixyel } from '../index.js';\r\nimport { Twitch$Message } from '../types/streamelements/events/twitch/message.js';\r\nimport { Youtube$Message } from '../types/streamelements/events/youtube/message.js';\r\n\r\ninterface CommandOptions {\r\n prefix?: string;\r\n name: string;\r\n description?: string;\r\n arguments?: boolean;\r\n run: () => void;\r\n test?: string;\r\n aliases?: string[];\r\n permissions?: string[];\r\n admins?: string[];\r\n}\r\n\r\ntype CommandEvent = { provider: 'twitch'; data: Twitch$Message } | { provider: 'youtube'; data: Youtube$Message } | { provider: 'kick'; data: any };\r\n\r\nexport class Command {\r\n prefix: string = '!';\r\n\r\n name!: string;\r\n description!: string;\r\n\r\n arguments: boolean = false;\r\n\r\n test: string = `${this.prefix}${this.name} arg1 arg2`;\r\n\r\n aliases: string[] = [];\r\n permissions?: string[] | boolean = undefined;\r\n admins: string[] = [];\r\n\r\n constructor(options: CommandOptions) {\r\n if (!(window.client instanceof Client)) return;\r\n\r\n this.prefix = options.prefix ?? this.prefix;\r\n this.name = options.name;\r\n this.description = options.description ?? this.description;\r\n this.arguments = options.arguments ?? this.arguments;\r\n\r\n this.run = options.run;\r\n\r\n this.test = options.test ?? this.test;\r\n this.aliases = options.aliases ?? this.aliases;\r\n this.permissions = options.permissions ?? this.permissions;\r\n this.admins = options.admins ?? this.admins;\r\n\r\n // Register the command in the client actions\r\n window.client.actions.commands.push(this);\r\n\r\n window.client.emit('action', this, 'created');\r\n }\r\n\r\n run(this: Client, args: string[], event: CommandEvent): void {}\r\n\r\n verify(nickname: string, roles: string[], args: string[]): boolean {\r\n if (this.arguments === true && (!args || !args.length)) {\r\n return false;\r\n }\r\n\r\n if (this.admins.some((a) => nickname.toLocaleLowerCase() === a.toLocaleLowerCase())) {\r\n return true;\r\n }\r\n\r\n if (this.permissions === true || typeof this.permissions === 'undefined' || (Array.isArray(this.permissions) && !this.permissions.length)) {\r\n return false;\r\n }\r\n\r\n if (Array.isArray(this.permissions) && this.permissions.some((p) => roles.map((r) => r.toLowerCase()).includes(p.toLowerCase()))) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n parse(text: string, event: CommandEvent): boolean {\r\n if (!(window.client instanceof Client)) return false;\r\n\r\n const args = text\r\n .replace(this.prefix, '')\r\n .split(' ')\r\n .slice(1)\r\n .map((a) => a.trim());\r\n\r\n var nickname: string = '';\r\n var roles: string[] = [];\r\n\r\n const rAliases = { bits: 'cheer', premium: 'prime' };\r\n\r\n switch (event.provider) {\r\n case 'twitch': {\r\n const data = event.data;\r\n\r\n nickname = data.event.data.nick || data.event.data.displayName;\r\n\r\n if (data.event.data.tags?.badges) {\r\n const tags = data.event.data.tags.badges.toString().replace(/\\/\\d+/g, '').split(',');\r\n\r\n roles = tags.map((t) => (t in rAliases ? rAliases[t as keyof typeof rAliases] : t));\r\n }\r\n\r\n break;\r\n }\r\n case 'youtube': {\r\n const data = event.data;\r\n\r\n const rMap = {\r\n isVerified: 'verified',\r\n isChatOwner: 'owner',\r\n isChatSponsor: 'sponsor',\r\n isChatModerator: 'moderator',\r\n };\r\n\r\n nickname = data.event.data.nick || data.event.data.displayName;\r\n\r\n roles = Object.entries(data.event.data.authorDetails)\r\n .filter(([k, v]) => k.startsWith('is') && v)\r\n .map(([k]) => rMap[k as keyof typeof rMap])\r\n .filter(Boolean);\r\n\r\n break;\r\n }\r\n case 'kick': {\r\n return false;\r\n\r\n break;\r\n }\r\n }\r\n\r\n const verify = this.verify(nickname, roles, args);\r\n\r\n if (verify === true) {\r\n this.run.apply(window.client, [args, event]);\r\n }\r\n\r\n return verify;\r\n }\r\n\r\n static execute(received: CommandEvent): boolean {\r\n if (!(window.client instanceof Client)) return false;\r\n\r\n const data = received.data;\r\n\r\n try {\r\n if (window.client.actions.commands.length && window.client.actions.commands.some((c) => data.event.data.text.startsWith(c.prefix))) {\r\n const command = window.client.actions.commands.find((c) => data.event.data.text.replace(c.prefix, '').split(' ')[0] === c.name);\r\n\r\n if (command && command instanceof Command) {\r\n command.parse(data.event.data.text, received);\r\n\r\n window.client.emit('action', command, 'executed');\r\n\r\n Tixyel.logger.received(`Command executed: ${data.event.data.text} by ${data.event.data.nick || data.event.data.displayName}`, data);\r\n\r\n return true;\r\n }\r\n }\r\n } catch (error) {\r\n return false;\r\n } finally {\r\n return false;\r\n }\r\n }\r\n}\r\n","import { Button } from '../actions/button.js';\r\nimport { Command } from '../actions/command.js';\r\nimport { Simulation } from '../simulation/index.js';\r\nimport { ClientEvents, Provider } from '../types/client.js';\r\nimport { _storages } from '../utils/useStorage.js';\r\nimport { Client } from './index.js';\r\n\r\nwindow.addEventListener('load', () => {\r\n if (window.client instanceof Client) {\r\n Simulation.start();\r\n }\r\n});\r\n\r\nwindow.addEventListener('onWidgetLoad', async (data) => {\r\n const { detail } = data;\r\n\r\n if (window.client instanceof Client) {\r\n const client = window.client;\r\n\r\n client.fields = detail.fieldData;\r\n client.session = detail.session.data;\r\n\r\n client.details = {\r\n ...client.details,\r\n user: detail.channel,\r\n currency: detail.currency,\r\n overlay: detail.overlay,\r\n };\r\n\r\n if (detail.channel.id && !detail.emulated) {\r\n await fetch(`https://api.streamelements.com/kappa/v2/channels/${detail.channel.id}/`)\r\n .then((res) => res.json())\r\n .then((profile) => {\r\n if (profile.provider) {\r\n client.details.provider = profile.provider;\r\n\r\n return profile.provider;\r\n } else {\r\n client.details.provider = 'local';\r\n }\r\n })\r\n .catch(() => {\r\n client.details.provider = 'local';\r\n });\r\n } else {\r\n client.details.provider = 'local';\r\n }\r\n\r\n client.emit('load', detail);\r\n\r\n client.loaded = true;\r\n\r\n client.storage.on('load', () => {\r\n client.storage.add(`avatar.${detail.channel.providerId.toLowerCase()}`, {\r\n value: detail.channel.avatar,\r\n timestamp: Date.now(),\r\n expire: Date.now() + client.cache.avatar * 60 * 60 * 1000,\r\n });\r\n });\r\n }\r\n});\r\n\r\nwindow.addEventListener('onSessionUpdate', (data) => {\r\n const { detail } = data;\r\n\r\n if (window.client instanceof Client) {\r\n const client = window.client;\r\n\r\n client.session = detail.session;\r\n\r\n client.emit('session', detail.session);\r\n }\r\n});\r\n\r\nwindow.addEventListener('onEventReceived', ({ detail }) => {\r\n if (window.client instanceof Client) {\r\n var provider: Provider =\r\n // @ts-ignore\r\n detail.event?.provider || detail.event?.service || detail.event?.data?.provider || window.client.details.provider;\r\n\r\n const actAsStreamElements = ['kvstore:update', 'bot:counter', 'alertService:toggleSound', 'event:skip', 'tip-latest', 'event:test'];\r\n\r\n if (actAsStreamElements.some((l) => l === detail.listener)) provider = 'streamelements';\r\n\r\n const received = { provider: provider, data: detail } as ClientEvents;\r\n\r\n switch (received.provider) {\r\n case 'streamelements': {\r\n const data = received.data;\r\n\r\n switch (data.listener) {\r\n case 'tip-latest': {\r\n const event = data.event;\r\n break;\r\n }\r\n case 'event:skip': {\r\n const event = data.event;\r\n break;\r\n }\r\n case 'event:test': {\r\n switch (data.event.listener) {\r\n case 'widget-button': {\r\n const event = data.event;\r\n\r\n Button.execute(event.field, event.value);\r\n\r\n break;\r\n }\r\n case 'subscriber-latest': {\r\n const event = data.event;\r\n break;\r\n }\r\n\r\n // ... alot more\r\n }\r\n\r\n break;\r\n }\r\n case 'kvstore:update': {\r\n const event = data.event;\r\n\r\n if (_storages.length) {\r\n var storage = _storages.find((s) => s.id === event.data.key.replace('customWidget.', ''));\r\n\r\n if (storage) {\r\n storage.update(event.data.value);\r\n }\r\n }\r\n\r\n break;\r\n }\r\n case 'bot:counter': {\r\n const event = data.event;\r\n break;\r\n }\r\n case 'alertService:toggleSound': {\r\n const event = data.event;\r\n\r\n client.details.overlay.muted = Boolean(event.muted);\r\n\r\n break;\r\n }\r\n }\r\n\r\n break;\r\n }\r\n case 'twitch': {\r\n const data = received.data;\r\n\r\n switch (data.listener) {\r\n case 'delete-message': {\r\n const event = data.event;\r\n break;\r\n }\r\n case 'delete-messages': {\r\n const event = data.event;\r\n break;\r\n }\r\n case 'message': {\r\n const event = data.event;\r\n break;\r\n }\r\n case 'follower-latest': {\r\n const event = data.event;\r\n break;\r\n }\r\n case 'cheer-latest': {\r\n const event = data.event;\r\n break;\r\n }\r\n case 'subscriber-latest': {\r\n if (!data.event.gifted && !data.event.bulkGifted && !data.event.isCommunityGift) {\r\n // normal\r\n const event = data.event;\r\n } else if (data.event.gifted && !data.event.bulkGifted && !data.event.isCommunityGift) {\r\n // gift\r\n const event = data.event;\r\n } else if (data.event.gifted && !data.event.bulkGifted && data.event.isCommunityGift) {\r\n // community gift spam\r\n const event = data.event;\r\n } else if (!data.event.gifted && data.event.bulkGifted && !data.event.isCommunityGift) {\r\n // community gift\r\n const event = data.event;\r\n }\r\n\r\n break;\r\n }\r\n case 'raid-latest': {\r\n const event = data.event;\r\n break;\r\n }\r\n }\r\n\r\n break;\r\n }\r\n case 'youtube': {\r\n const data = received.data;\r\n\r\n switch (data.listener) {\r\n case 'message': {\r\n const event = data.event;\r\n\r\n Command.execute({ provider: 'youtube', data: data });\r\n\r\n break;\r\n }\r\n case 'subscriber-latest': {\r\n const event = data.event;\r\n\r\n break;\r\n }\r\n case 'sponsor-latest': {\r\n const event = data.event;\r\n\r\n if (!data.event.gifted && !data.event.bulkGifted && !data.event.isCommunityGift) {\r\n // normal\r\n const event = data.event;\r\n } else if (data.event.gifted && !data.event.bulkGifted && !data.event.isCommunityGift) {\r\n // gift\r\n const event = data.event;\r\n } else if (data.event.gifted && !data.event.bulkGifted && data.event.isCommunityGift) {\r\n // community gift spam\r\n const event = data.event;\r\n } else if (!data.event.gifted && data.event.bulkGifted && !data.event.isCommunityGift) {\r\n // community gift\r\n const event = data.event;\r\n }\r\n\r\n break;\r\n }\r\n case 'superchat-latest': {\r\n const event = data.event;\r\n\r\n break;\r\n }\r\n }\r\n\r\n break;\r\n }\r\n case 'kick': {\r\n const data = received.data;\r\n\r\n break;\r\n }\r\n case 'facebook': {\r\n const data = received.data;\r\n\r\n break;\r\n }\r\n }\r\n\r\n window.client.emit('event', received);\r\n }\r\n});\r\n","import { Client } from '../client/index.js';\r\nimport { Tixyel } from '../index.js';\r\nimport { EventProvider } from './EventProvider.js';\r\n\r\ntype QueueEvents<T> = {\r\n load: [];\r\n cancel: [];\r\n update: [queue: QueueItem<T>[], priorityQueue: QueueItem<T>[], history: QueueItem<T>[], timeouts: Array<ReturnType<typeof setTimeout>>];\r\n process: [item: QueueItem<T>, queue: useQueue<T>];\r\n};\r\n\r\ntype QueueProps = {\r\n isoDate: string;\r\n isLoop: boolean;\r\n isPriority: boolean;\r\n isImmediate: boolean;\r\n};\r\n\r\ntype QueueItem<T> = { value: T } & QueueProps;\r\n\r\ntype QueueProcessor<T> = (item: T, queue: useQueue<T>) => Promise<any>;\r\n\r\ninterface QueueOptions<T> {\r\n duration: number | boolean | undefined;\r\n processor: QueueProcessor<T>;\r\n}\r\n\r\nexport class useQueue<T> extends EventProvider<QueueEvents<T>> {\r\n queue: QueueItem<T>[] = [];\r\n priorityQueue: QueueItem<T>[] = [];\r\n history: QueueItem<T>[] = [];\r\n\r\n timeouts: Array<ReturnType<typeof setTimeout>> = [];\r\n\r\n running: boolean = false;\r\n duration: number | boolean | undefined = undefined;\r\n\r\n loaded: boolean = false;\r\n\r\n processor!: QueueProcessor<T>;\r\n\r\n constructor(options: QueueOptions<T>) {\r\n if (!(window.client instanceof Client)) return;\r\n\r\n super();\r\n\r\n this.duration = options.duration;\r\n this.processor = options.processor;\r\n\r\n window.client.on('load', () => {\r\n this.emit('load');\r\n\r\n this.loaded = true;\r\n });\r\n }\r\n\r\n enqueue(value: T, options: Partial<QueueProps> = {}): this {\r\n const item: QueueItem<T> = {\r\n isoDate: new Date().toISOString(),\r\n isLoop: options?.isLoop ?? false,\r\n isPriority: options?.isPriority ?? false,\r\n isImmediate: options?.isImmediate ?? false,\r\n value,\r\n };\r\n\r\n const hasItems = this.hasItems();\r\n\r\n if (item.isPriority && item.isImmediate) {\r\n this.cancel();\r\n this.priorityQueue.unshift(item);\r\n } else {\r\n const targetQueue = item.isPriority ? this.priorityQueue : this.queue;\r\n\r\n targetQueue.push(item);\r\n }\r\n\r\n // Always process immediately if it's not running\r\n if (this.running === false && hasItems === false) {\r\n this.run();\r\n }\r\n\r\n this.emit('update', this.queue, this.priorityQueue, this.history, this.timeouts);\r\n\r\n return this;\r\n }\r\n\r\n private async run() {\r\n if (!this.hasItems()) {\r\n this.running = false;\r\n return;\r\n }\r\n\r\n this.running = true;\r\n\r\n await this.next();\r\n\r\n if (typeof this.duration === 'number' && this.duration > 0) {\r\n this.timeouts.push(setTimeout(() => this.run(), this.duration));\r\n } else if (this.duration === 0 || this.duration === false) this.run();\r\n }\r\n\r\n private async next() {\r\n const nextItem = this.priorityQueue.length > 0 ? this.priorityQueue.shift() : this.queue.shift();\r\n\r\n if (!nextItem) {\r\n this.running = false;\r\n\r\n return;\r\n }\r\n\r\n try {\r\n await this.processor.apply(this, [nextItem.value, this]);\r\n\r\n this.emit('process', nextItem, this);\r\n } catch (error) {\r\n Tixyel.logger.error(`Error during item processing: ${error instanceof Error ? error.message : String(error)}`);\r\n }\r\n\r\n this.history.push(nextItem);\r\n\r\n const targetQueue = nextItem.isPriority ? this.priorityQueue : this.queue;\r\n\r\n if (nextItem.isLoop) targetQueue.push(nextItem);\r\n }\r\n\r\n public resume() {\r\n this.cancel();\r\n\r\n if (this.hasItems()) this.run();\r\n\r\n return this;\r\n }\r\n\r\n public update(save: Partial<useQueue<T>>): this {\r\n this.queue = save.queue ?? this.queue;\r\n this.priorityQueue = save.priorityQueue ?? this.priorityQueue;\r\n this.history = save.history ?? this.history;\r\n\r\n if (this.hasItems() && this.running === false) {\r\n window.client?.on('load', () => this.run());\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public cancel() {\r\n this.timeouts.forEach((timeout) => clearTimeout(timeout));\r\n this.timeouts = [];\r\n this.running = false;\r\n\r\n this.emit('cancel');\r\n }\r\n\r\n public hasItems(): boolean {\r\n return this.queue.length > 0 || this.priorityQueue.length > 0;\r\n }\r\n}\r\n","import { Client } from './client/index.js';\r\nimport { Simulation } from './simulation/index.js';\r\nimport { onEventReceivedEvent } from './types/streamelements/events/onEventReceived.js';\r\nimport { onSessionUpdateEvent } from './types/streamelements/events/onSessionUpdate.js';\r\nimport { onWidgetLoadEvent } from './types/streamelements/events/onWidgetLoad.js';\r\nimport { Logger } from './utils/Logger.js';\r\nimport './client/listener.js';\r\nimport { Button } from './actions/button.js';\r\nimport { Command } from './actions/command.js';\r\nimport { findEmotesInText, replaceEmotesWithHTML } from './utils/Message.js';\r\nimport { EventProvider } from './utils/EventProvider.js';\r\nimport { useStorage } from './utils/useStorage.js';\r\nimport { useQueue } from './utils/useQueue.js';\r\n\r\nexport * from './types/index.js';\r\n\r\nexport const Tixyel = {\r\n Client,\r\n Simulation,\r\n logger: new Logger(),\r\n utils: {\r\n findEmotesInText,\r\n replaceEmotesWithHTML,\r\n },\r\n modules: {\r\n Button,\r\n Command,\r\n EventProvider,\r\n useStorage,\r\n useQueue,\r\n },\r\n} as const;\r\n\r\ntype _Tixyel_ = {\r\n Client: typeof Client;\r\n Simulation: typeof Simulation;\r\n logger: Logger;\r\n utils: {\r\n findEmotesInText: typeof findEmotesInText;\r\n replaceEmotesWithHTML: typeof replaceEmotesWithHTML;\r\n };\r\n modules: {\r\n Button: typeof Button;\r\n Command: typeof Command;\r\n EventProvider: typeof EventProvider;\r\n useStorage: typeof useStorage;\r\n useQueue: typeof useQueue;\r\n };\r\n};\r\n\r\ndeclare global {\r\n interface Window {\r\n Tixyel: _Tixyel_;\r\n client: Client;\r\n }\r\n\r\n interface WindowEventMap {\r\n onWidgetLoad: onWidgetLoadEvent;\r\n onSessionUpdate: onSessionUpdateEvent;\r\n onEventReceived: onEventReceivedEvent;\r\n }\r\n\r\n var Tixyel: _Tixyel_;\r\n var client: Client;\r\n}\r\n\r\nif (typeof window !== 'undefined') {\r\n window.Tixyel = Tixyel;\r\n}\r\n"],"names":["EventProvider","eventName","args","listener","callback","listeners","fn","wrapper","_storages","useStorage","options","save","data","path","value","obj","keys","current","i","Client","Alejo$Pronouns","findEmotesInText","text","emotes","Simulation","result","emote","name","searchIndex","start","index","before","after","a","b","replaceEmotesWithHTML","imgUrl","generateBadges","badges","provider","e","max","_","badge","details","acc","key","_Simulation","settings","defaultOptions","normalizeFieldSettings","allVariables","href","cssRules","rule","prop","filteredVariables","suffix","ignoreName","usedSubgroups","fields","type","names","n","transform","fieldAddons","addonKey","addonValue","subgroupKey","c","matchingSubgroupVars","label","customOptions","values","optionLabel","val","errors","field","hasInvalidLabel","isInvalidValue","Tixyel","localFiles","file","res","customfields","load","opacity","color","hex","ohex","decimal","percentage","str","s","alpha","r","g","h","l","min","float","rand","threshold","length","chars","arr","rangeDays","past","string","pattern","promises","match","groups","promise","replacements","template","mergeSpanStyles","flatten","k","v","username","amount","REGEX","MODIFIERS","param","ALIASES","applyModifier","canonical","aliases","alias","use","replaceAll","fullMatch","modifier","newValue","parseModifiers","len","parseText","stopChar","out","parseModifier","paramStart","outerStyle","innerHTML","innerStyle","content","prefix","itemPath","types","available","generate","generateRecentData","config","items","generateObjectData","processedKey","processTypedConfig","session","subKey","subValue","currency","currencies","randomProvider","randomEvent","message","renderedText","userId","time","avatar","tier","sender","addons","subTypes","subType","muted","Logger","theme","styles","signal","logFn","textContent","arg","objectContent","css","log","Button","f","error","button","Command","event","nickname","roles","p","rAliases","t","rMap","verify","received","command","detail","client","profile","storage","useQueue","item","hasItems","nextItem","targetQueue","timeout"],"mappings":"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L,8EAA8E,KAAKA,CAAC,EAC/E,OAIP,CACE,YACA,eACA,OACA,aACA,QACA,QACA,SACA,QACA,iBACA,OACA,aACA,QACA,YACA,YACA,aACA,YACA,QACA,iBACA,WACA,UACA,OACA,WACA,WACA,gBACA,WACA,YACA,WACA,YACA,cACA,iBACA,aACA,aACA,UACA,aACA,eACA,gBACA,gBACA,gBACA,gBACA,aACA,WACA,cACA,UACA,UACA,aACA,YACA,cACA,cACA,UACA,YACA,aACA,OACA,YACA,OACA,QACA,cACA,OACA,WACA,UACA,YACA,SACA,QACA,QACA,WACA,gBACA,YACA,eACA,YACA,aACA,YACA,uBACA,YACA,aACA,YACA,YACA,cACA,gBACA,eACA,iBACA,iBACA,iBACA,cACA,OACA,YACA,QACA,UACA,SACA,mBACA,aACA,eACA,eACA,iBACA,kBACA,oBACA,kBACA,kBACA,eACA,YACA,YACA,WACA,cACA,OACA,UACA,QACA,YACA,SACA,YACA,SACA,gBACA,YACA,gBACA,gBACA,aACA,YACA,OACA,OACA,OACA,aACA,SACA,gBACA,MACA,YACA,YACA,cACA,SACA,aACA,WACA,WACA,SACA,SACA,UACA,YACA,YACA,YACA,OACA,cACA,YACA,MACA,OACA,UACA,SACA,YACA,SACA,QACA,QACA,aACA,SACA,cACA,aAAA,EACA,SAASA,EAAE,YAAA,CAAa,EAEnB,iBAGF,EACT,CAAA,EAGF9C,EAAO,KAAO,CACZ,MAAMc,EAA4E,MAAe,CAC/F,OAAQA,EAAA,CACN,QACA,IAAK,MACH,MAAO,IAAI,KAAK,MAAM,KAAK,SAAW,QAAQ,EAC3C,SAAS,EAAE,EACX,SAAS,EAAG,GAAG,CAAC,GAErB,IAAK,OAAQ,CACX,MAAM2B,EAAM,IAAI,KAAK,MAAM,KAAK,OAAA,EAAW,QAAQ,EAChD,SAAS,EAAE,EACX,SAAS,EAAG,GAAG,CAAC,GAEbM,EAAQ,KAAK,MAAM,KAAK,OAAA,EAAW,GAAG,EACzC,SAAS,EAAE,EACX,SAAS,EAAG,GAAG,EAElB,OAA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"}
1
+ {"version":3,"file":"index.umd.js","sources":["../src/utils/EventProvider.ts","../src/utils/useStorage.ts","../src/client/index.ts","../src/types/alejo/pronouns.ts","../src/utils/Message.ts","../src/simulation/index.ts","../src/utils/Logger.ts","../src/actions/button.ts","../src/actions/command.ts","../src/client/listener.ts","../src/utils/useQueue.ts","../src/index.ts"],"sourcesContent":["/**\n * EventProvider class for managing event listeners and emitters.\n * This class allows you to register event listeners, emit events, and manage event subscriptions.\n * @example\n * ```typescript\n * interface TestEvents {\n * load: [{ type: 'load' }];\n * event: [{ type: 'event' }];\n * }\n *\n * class Test extends EventProvider<TestEvents> {}\n *\n * const test = new Test();\n * test.on('load', (data) => {})\n * test.once('event', (data) => {})\n * test.emit('load', { type: 'load' });\n * ```\n */\nexport class EventProvider<EventMap extends Record<string, any[]> = Record<string, any[]>> {\n /**\n * Stores registered event listeners.\n */\n private registeredEvents: { [K in keyof EventMap]?: Array<(this: this, ...args: EventMap[K]) => any> } = {};\n\n /**\n * Emits an event to all registered listeners.\n * Returns an array of return values from the listeners.\n * @param eventName The name of the event.\n * @param args Arguments to pass to the listeners.\n */\n emit<K extends keyof EventMap>(eventName: K, ...args: EventMap[K]): any[] {\n const listeners = this.registeredEvents[eventName] || [];\n\n return listeners.map((listener) => listener.apply(this, args));\n }\n\n /**\n * Registers an event listener.\n * @param eventName The name of the event.\n * @param callback The callback function.\n */\n on<K extends keyof EventMap>(eventName: K, callback: (this: this, ...args: EventMap[K]) => any): this {\n if (typeof callback !== 'function') {\n throw new TypeError('Callback must be a function');\n }\n\n if (!this.registeredEvents[eventName]) {\n this.registeredEvents[eventName] = [];\n }\n\n this.registeredEvents[eventName]!.push(callback);\n\n return this;\n }\n\n /**\n * Removes a specific event listener.\n * @param eventName The name of the event.\n * @param callback The callback function to remove.\n */\n off<K extends keyof EventMap>(eventName: K, callback?: (this: this, ...args: EventMap[K]) => any): this {\n const listeners = this.registeredEvents[eventName] || [];\n\n if (!callback) {\n this.registeredEvents[eventName] = [];\n\n return this;\n }\n\n this.registeredEvents[eventName] = listeners.filter((fn) => fn !== callback);\n\n return this;\n }\n\n /**\n * Registers a listener that is executed only once.\n * @param eventName The name of the event.\n * @param callback The callback function.\n */\n once<K extends keyof EventMap>(eventName: K, callback: (this: this, ...args: EventMap[K]) => any): this {\n const wrapper = (...args: EventMap[K]) => {\n this.off(eventName, wrapper);\n callback.apply(this, args);\n };\n\n this.on(eventName, wrapper);\n\n return this;\n }\n\n /**\n * Removes all listeners for a specific event.\n * @param eventName The name of the event.\n */\n removeAllListeners<K extends keyof EventMap>(eventName: K): this {\n this.registeredEvents[eventName] = [];\n\n return this;\n }\n}\n","import { EventProvider } from './EventProvider.js';\nimport { PathValue } from './index.js';\n\ntype UseStorageEvents<T> = {\n load: [T | null];\n save: [T];\n update: [T];\n};\n\ntype UseStorageOptions<T> = {\n id?: string;\n data: T;\n};\n\nexport var _storages: Array<useStorage<any>> = [];\n\nexport class useStorage<T extends object = Record<string, any>> extends EventProvider<UseStorageEvents<T>> {\n /**\n * The unique identifier for the storage instance.\n */\n public id: string = 'default';\n\n public loaded: boolean = false;\n\n public data!: T;\n\n constructor(options: UseStorageOptions<T>) {\n super();\n\n this.id = options.id || this.id;\n this.data = options.data ?? ({} as T);\n\n if (!SE_API || !SE_API.store) throw new Error('SE_API.store is not available');\n\n SE_API!.store\n .get<T>(this.id)\n .then((save) => {\n this.data = save ?? this.data;\n\n this.loaded = true;\n\n this.emit('load', this.data);\n\n if (JSON.stringify(this.data) !== JSON.stringify(save)) {\n this.emit('update', this.data);\n }\n })\n .catch(() => {\n this.loaded = true;\n this.emit('load', null);\n });\n\n _storages.push(this);\n }\n\n /**\n * Saves the current data to storage.\n * @param data Data to save (defaults to current)\n */\n save(data: T = this.data): void {\n if (this.loaded) {\n this.data = data;\n\n SE_API!.store.set<T>(this.id, this.data);\n\n this.emit('save', this.data);\n }\n }\n\n /**\n * Updates the storage data and emits an update event if the data has changed.\n * @param data Data to update (defaults to current)\n */\n update(data: T = this.data): void {\n if (this.loaded && JSON.stringify(this.data) !== JSON.stringify(data)) {\n this.data = { ...this.data, ...data };\n\n this.emit('update', this.data);\n }\n }\n\n /**\n * Adds a value to the storage at the specified path.\n * @param path Path to add the value to\n * @param value Value to add\n */\n add<P extends string>(path: P, value: PathValue<T, P>): void {\n if (!this.loaded) return;\n\n useStorage.setByPath(this.data, path, value);\n\n this.save(this.data);\n }\n\n /**\n * Sets a value in the storage at the specified path.\n * @param obj The object to set the value in\n * @param path The path to set the value at\n * @param value The value to set\n * @returns The updated object\n */\n static setByPath<P extends string, T extends object>(obj: T, path: P, value: PathValue<T, P>): void {\n const keys = path.split('.');\n let current: any = obj;\n\n for (let i = 0; i < keys.length - 1; i++) {\n if (typeof current[keys[i]] !== 'object' || current[keys[i]] == null) {\n current[keys[i]] = {};\n }\n\n current = current[keys[i]];\n }\n\n current[keys[keys.length - 1]] = value;\n\n return current;\n }\n\n override on<K extends keyof UseStorageEvents<T>>(eventName: K, callback: (...args: UseStorageEvents<T>[K]) => void): this {\n if (eventName === 'load' && this.loaded) {\n callback.apply(this, [this.data]);\n\n return this;\n }\n\n super.on(eventName, callback);\n\n return this;\n }\n}\n","import { onWidgetLoad } from '../types/streamelements/events/onWidgetLoad.js';\nimport { Alejo$Pronouns$name } from '../types/alejo/pronouns.js';\nimport { EventProvider } from '../utils/EventProvider.js';\nimport { useStorage } from '../utils/useStorage.js';\nimport { Session } from '../types/streamelements/session.js';\nimport { ClientEvents as events, Provider } from '../types/client.js';\nimport { Command } from '../actions/command.js';\nimport { Button } from '../actions/button.js';\n\ntype ClientEvents = {\n load: [this: Client, event: onWidgetLoad];\n action: [this: Client, action: Button | Command, type: 'created' | 'executed'];\n session: [this: Client, session: Session];\n event: [this: Client, event: events];\n};\n\ntype ClientOptions = {\n id?: string;\n};\n\ntype ClientStorageOptions<T> = {\n value: T;\n timestamp: number;\n expire: number;\n};\n\ntype ClientStorage = {\n user: Record<string, ClientStorageOptions<string>>;\n avatar: Record<string, ClientStorageOptions<string>>;\n pronoun: Record<string, ClientStorageOptions<Alejo$Pronouns$name>>;\n emote: Record<string, ClientStorageOptions<string>>;\n};\n\nexport class Client extends EventProvider<ClientEvents> {\n public id: string = 'default';\n\n public storage!: useStorage<ClientStorage>;\n\n public fields: onWidgetLoad['fieldData'] = {};\n\n public session!: Session;\n\n public loaded: boolean = false;\n\n constructor(options: ClientOptions) {\n super();\n\n this.id = options.id || this.id;\n\n this.storage = new useStorage({\n id: this.id,\n data: {\n user: {},\n avatar: {},\n pronoun: {},\n emote: {},\n },\n });\n\n window.client = this;\n }\n\n public actions: {\n commands: Command[];\n buttons: Button[];\n } = {\n commands: [],\n buttons: [],\n };\n\n public details!: {\n provider: Provider | 'local';\n user: onWidgetLoad['channel'];\n currency: onWidgetLoad['currency'];\n overlay: onWidgetLoad['overlay'];\n };\n\n public cache: { avatar: number; pronoun: number; emote: number } = {\n avatar: 30,\n pronoun: 30,\n emote: 30,\n };\n\n override on<K extends keyof ClientEvents>(eventName: K, callback: (...args: ClientEvents[K]) => void): this {\n if (eventName === 'load' && this.loaded) {\n callback.apply(this, [\n {\n channel: this.details.user,\n currency: this.details.currency,\n fieldData: this.fields,\n recents: [],\n session: {\n data: this.session,\n settings: {\n autoReset: false,\n calendar: false,\n resetOnStart: false,\n },\n },\n overlay: this.details.overlay,\n emulated: false,\n } as onWidgetLoad,\n ] as unknown as ClientEvents[K]);\n\n return this;\n }\n\n super.on(eventName, callback);\n\n return this;\n }\n}\n","export enum Alejo$Pronouns {\n hehim = 'He/Him',\n sheher = 'She/Her',\n theythem = 'They/Them',\n shethem = 'She/They',\n hethem = 'He/They',\n heshe = 'He/She',\n xexem = 'Xe/Xem',\n faefaer = 'Fae/Faer',\n vever = 'Ve/Ver',\n aeaer = 'Ae/Aer',\n ziehir = 'Zie/Hir',\n perper = 'Per/Per',\n eem = 'E/Em',\n itits = 'It/Its',\n}\n\nexport type Alejo$Pronouns$name =\n | 'hehim'\n | 'sheher'\n | 'theythem'\n | 'shethem'\n | 'hethem'\n | 'heshe'\n | 'xexem'\n | 'faefaer'\n | 'vever'\n | 'aeaer'\n | 'ziehir'\n | 'perper'\n | 'eem'\n | 'itits';\n\nexport type Alejo$Pronouns$display =\n | 'He/Him'\n | 'She/Her'\n | 'They/Them'\n | 'She/They'\n | 'He/They'\n | 'He/She'\n | 'Xe/Xem'\n | 'Fae/Faer'\n | 'Ve/Ver'\n | 'Ae/Aer'\n | 'Zie/Hir'\n | 'Per/Per'\n | 'E/Em'\n | 'It/Its';\n\nexport type Alejo$Pronouns$User = {\n id: string;\n login: string;\n pronouns: Alejo$Pronouns$name;\n};\n","import { Simulation } from '../simulation/index.js';\nimport { TwitchBadge, TwitchBadgesKeys } from '../types/badge.js';\nimport { Provider } from '../types/client.js';\nimport { BttvEmote, SeventvEmote, TwitchEmote } from '../types/emote.js';\n\ntype Emote = TwitchEmote | BttvEmote | SeventvEmote;\n\nexport function findEmotesInText(text: string, emotes: Emote[] = Simulation.data.emotes): Emote[] {\n const result: Emote[] = [];\n\n emotes.forEach((emote) => {\n const name = emote.name;\n\n let searchIndex = 0;\n let start = 0;\n\n while (searchIndex < text.length) {\n const index = text.indexOf(name, start);\n\n if (index === -1) break;\n\n const before = index > 0 ? text[index - 1] : ' ';\n const after = index + name.length < text.length ? text[index + name.length] : ' ';\n\n if (/\\s/.test(before) && /\\s/.test(after)) {\n result.push({ ...emote, start: index, end: index + name.length });\n }\n\n start = index + 1;\n }\n });\n\n return result.sort((a, b) => a.start - b.start);\n}\n\nexport function replaceEmotesWithHTML(text: string, emotes: Emote[]): string {\n if (!emotes.length) return text;\n\n let result = '';\n let index = 0;\n\n emotes.forEach((emote) => {\n result += text.substring(index, emote.start);\n\n const imgUrl = emote.urls['4'] || emote.urls['2'] || emote.urls['1'];\n\n result += `<img src=\"${imgUrl}\" alt=\"${emote.name}\" class=\"emote\" style=\"width: auto; height: 1em; vertical-align: middle;\" />`;\n\n index = emote.end;\n });\n\n result += text.substring(index);\n\n return result;\n}\n\ntype TwitchResult = {\n keys: TwitchBadgesKeys[];\n badges: TwitchBadge[];\n};\n\ntype YouTubeResult = {\n isVerified: boolean;\n isChatOwner: boolean;\n isChatSponsor: boolean;\n isChatModerator: boolean;\n};\n\nexport type BadgeOptions =\n | TwitchBadgesKeys[]\n | TwitchBadgesKeys\n | `${TwitchBadgesKeys}, ${TwitchBadgesKeys}`\n | `${TwitchBadgesKeys}, ${TwitchBadgesKeys}, ${TwitchBadgesKeys}`;\n\nexport async function generateBadges(badges: BadgeOptions, provider: 'youtube'): Promise<YouTubeResult>;\nexport async function generateBadges(badges: BadgeOptions, provider: 'twitch'): Promise<TwitchResult>;\nexport async function generateBadges(badges: BadgeOptions = [], provider: Provider = 'twitch'): Promise<TwitchResult | YouTubeResult> {\n if (!Array.isArray(badges) && typeof badges === 'string') {\n badges = badges.split(',').map((e) => e.trim()) as TwitchBadgesKeys[];\n }\n\n if (!badges || !badges.length) {\n var max = Simulation.rand.number(1, 3);\n\n for await (const _ of Array.from({ length: max }, () => '')) {\n var current = Simulation.rand.array(Object.keys(Simulation.data.badges))[0] as TwitchBadgesKeys;\n\n if (!badges.includes(current) && Array.isArray(badges)) {\n badges.push(current);\n } else {\n badges = [current];\n }\n }\n }\n\n var result;\n\n switch (provider) {\n case 'twitch': {\n result = {\n keys: Array.from(badges).filter((e) => e in Simulation.data.badges) as TwitchBadgesKeys[],\n badges: Array.from(badges)\n .slice(0, 3)\n .map((badge) => Simulation.data.badges[badge])\n .filter(Boolean) as TwitchBadge[],\n };\n\n break;\n }\n\n case 'youtube': {\n var details = {\n 'verified': { isVerified: false },\n 'broadcaster': { isChatOwner: false },\n 'host': { isChatOwner: false },\n 'sponsor': { isChatSponsor: false },\n 'subscriber': { isChatSponsor: false },\n 'moderator': { isChatModerator: false },\n };\n\n result = Object.entries(badges).reduce(\n (acc, [key]) => {\n if (key in details) {\n Object.assign(acc, details[key as keyof typeof details]);\n }\n\n return acc;\n },\n {\n isVerified: false,\n isChatOwner: false,\n isChatSponsor: false,\n isChatModerator: false,\n } as {\n isVerified: boolean;\n isChatOwner: boolean;\n isChatSponsor: boolean;\n isChatModerator: boolean;\n },\n );\n\n break;\n }\n }\n\n return result as TwitchResult | YouTubeResult;\n}\n","import { Tixyel } from '../index.js';\nimport { Alejo$Pronouns } from '../types/alejo/pronouns.js';\nimport type { TwitchBadge, TwitchBadgesKeys } from '../types/badge.js';\nimport type { Provider } from '../types/client.js';\nimport type { BttvEmote, SeventvEmote, TwitchEmote } from '../types/emote.js';\nimport type {\n FieldSettings,\n NormalizedFieldSettings,\n StreamElementsField,\n StreamElementsFieldTypes,\n StreamElementsFieldValue,\n} from '../types/streamelements/customfields.js';\nimport type { StreamElements$AlertService } from '../types/streamelements/events/integrated/alertService.js';\nimport type { StreamElements$BotCounter } from '../types/streamelements/events/integrated/botCounter.js';\nimport type { StreamElements$EventSkip } from '../types/streamelements/events/integrated/eventSkip.js';\nimport type { StreamElements } from '../types/streamelements/events/integrated/index.js';\nimport type { StreamElements$KVStore } from '../types/streamelements/events/integrated/kvstore.js';\nimport type { StreamElements$Tip } from '../types/streamelements/events/integrated/tip.js';\nimport type { onEventReceived } from '../types/streamelements/events/onEventReceived.js';\nimport type { onSessionUpdate } from '../types/streamelements/events/onSessionUpdate.js';\nimport type { onWidgetLoad } from '../types/streamelements/events/onWidgetLoad.js';\nimport type { Twitch$Cheer } from '../types/streamelements/events/twitch/cheer.js';\nimport type { Twitch$Follower } from '../types/streamelements/events/twitch/follower.js';\nimport type { Twitch } from '../types/streamelements/events/twitch/index.js';\nimport type { Twitch$DeleteMessage, Twitch$DeleteMessages } from '../types/streamelements/events/twitch/message.delete.js';\nimport type { Twitch$Message } from '../types/streamelements/events/twitch/message.js';\nimport type { Twitch$Raid } from '../types/streamelements/events/twitch/raid.js';\nimport type { Subscriber$community, Subscriber$gift, Subscriber$spam, Twitch$Subscriber } from '../types/streamelements/events/twitch/subscriber.js';\nimport type { Youtube } from '../types/streamelements/events/youtube/index.js';\nimport type { Youtube$Message } from '../types/streamelements/events/youtube/message.js';\nimport type { Sponsor$community, Sponsor$gift, Sponsor$spam, Youtube$Sponsor } from '../types/streamelements/events/youtube/sponsor.js';\nimport type { YouTube$Subscriber } from '../types/streamelements/events/youtube/subscriber.js';\nimport type { YouTube$Superchat } from '../types/streamelements/events/youtube/superchat.js';\nimport type { Session$AnyConfig, Session$AvailableCategory, Session$AvailableData } from '../types/streamelements/session.generate.js';\nimport type { Session } from '../types/streamelements/session.js';\nimport { BadgeOptions, findEmotesInText, generateBadges, replaceEmotesWithHTML } from '../utils/Message.js';\n\ntype Modifier = (value: string, param: string | null | undefined, values: { amount?: number; count?: number }) => string;\n\nexport class Simulation {\n static data = {\n names: ['Local', 'Tixyel', 'Urie_s2', 'itzzcatt', 'BeniArts', 'Cupidiko', 'shy_madeit'] as string[],\n messages: [\n 'Hello everyone!',\n 'PogChamp',\n 'This stream is amazing!',\n 'catJAM catJAM catJAM',\n 'LUL that was funny',\n 'GG!',\n 'First time here, loving it!',\n 'DinoDance',\n 'Can we get some hype in chat?',\n 'TransgenderPride PansexualPride NonbinaryPride',\n 'POGGERS',\n 'I just followed! PogChamp',\n 'Great gameplay btw',\n 'LUL LUL LUL',\n 'This is so wholesome AngelThump',\n 'catJAM vibing',\n 'haHAA',\n 'Wait what just happened? D:',\n 'GlitchCat GlitchCat',\n 'Best stream on Twitch right now!',\n 'DarkMode gang where you at?',\n 'PogChamp PogChamp PogChamp PogChamp',\n 'Anyone else eating? DoritosChip',\n 'I love this community!',\n 'TheIlluminati confirmed',\n 'bUrself be yourself!',\n 'CookieTime nom nom',\n 'imGlitch technical difficulties',\n 'This music is fire catJAM',\n 'bttvNice',\n 'LesbianPride GayPride BisexualPride',\n 'SSSsss Minecraft time',\n 'PopNemo',\n 'Going to bed, good night everyone!',\n 'Just got here, what did I miss?',\n ':tf: trollface',\n 'ariW wave',\n 'BroBalt nice one',\n 'AsexualPride IntersexPride GenderFluidPride',\n 'This chat is moving so fast!',\n 'CandianRage',\n 'PunchTrees PunchTrees',\n 'CiGrip',\n 'ConcernDoge hmm',\n 'CruW salute',\n 'cvHazmat stay safe',\n 'DuckerZ quack',\n 'BloodTrail hunting time',\n 'CatBag kitty!',\n 'c! poggers',\n ] as string[],\n tiers: ['1000', '2000', '3000', 'prime'] as string[],\n avatars: [\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/13e5fa74-defa-11e9-809c-784f43822e80-profile_image-300x300.png',\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/dbdc9198-def8-11e9-8681-784f43822e80-profile_image-300x300.png',\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/998f01ae-def8-11e9-b95c-784f43822e80-profile_image-300x300.png',\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/de130ab0-def7-11e9-b668-784f43822e80-profile_image-300x300.png',\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/ebe4cd89-b4f4-4cd9-adac-2f30151b4209-profile_image-300x300.png',\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/215b7342-def9-11e9-9a66-784f43822e80-profile_image-300x300.png',\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/ead5c8b2-a4c9-4724-b1dd-9f00b46cbd3d-profile_image-300x300.png',\n ] as string[],\n items: [] as any[],\n emotes: [\n {\n 'type': 'twitch',\n 'name': 'DinoDance',\n 'id': 'emotesv2_dcd06b30a5c24f6eb871e8f5edbd44f7',\n 'gif': true,\n 'animated': true,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_dcd06b30a5c24f6eb871e8f5edbd44f7/animated/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_dcd06b30a5c24f6eb871e8f5edbd44f7/animated/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_dcd06b30a5c24f6eb871e8f5edbd44f7/animated/dark/3.0',\n },\n 'start': 46,\n 'end': 55,\n },\n {\n 'type': 'twitch',\n 'name': 'PopNemo',\n 'id': 'emotesv2_5d523adb8bbb4786821cd7091e47da21',\n 'gif': true,\n 'animated': true,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_5d523adb8bbb4786821cd7091e47da21/animated/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_5d523adb8bbb4786821cd7091e47da21/animated/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_5d523adb8bbb4786821cd7091e47da21/animated/dark/3.0',\n },\n 'start': 56,\n 'end': 63,\n },\n {\n 'type': 'twitch',\n 'name': 'TransgenderPride',\n 'id': '307827377',\n 'gif': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827377/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827377/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827377/default/dark/3.0',\n },\n 'start': 0,\n 'end': 15,\n },\n {\n 'type': 'twitch',\n 'name': 'PansexualPride',\n 'id': '307827370',\n 'gif': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827370/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827370/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827370/default/dark/3.0',\n },\n 'start': 17,\n 'end': 30,\n },\n {\n 'type': 'twitch',\n 'name': 'NonbinaryPride',\n 'id': '307827356',\n 'gif': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827356/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827356/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827356/default/dark/3.0',\n },\n 'start': 32,\n 'end': 45,\n },\n {\n 'type': 'twitch',\n 'name': 'LesbianPride',\n 'id': '307827340',\n 'gif': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827340/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827340/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827340/default/dark/3.0',\n },\n 'start': 47,\n 'end': 58,\n },\n {\n 'type': 'twitch',\n 'name': 'IntersexPride',\n 'id': '307827332',\n 'gif': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827332/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827332/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827332/default/dark/3.0',\n },\n 'start': 60,\n 'end': 72,\n },\n {\n 'type': 'twitch',\n 'name': 'GenderFluidPride',\n 'id': '307827326',\n 'gif': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827326/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827326/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827326/default/dark/3.0',\n },\n 'start': 74,\n 'end': 89,\n },\n {\n 'type': 'twitch',\n 'name': 'GayPride',\n 'id': '307827321',\n 'gif': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827321/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827321/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827321/default/dark/3.0',\n },\n 'start': 91,\n 'end': 98,\n },\n {\n 'type': 'twitch',\n 'name': 'BisexualPride',\n 'id': '307827313',\n 'gif': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827313/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827313/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827313/default/dark/3.0',\n },\n 'start': 100,\n 'end': 112,\n },\n {\n 'type': 'twitch',\n 'name': 'AsexualPride',\n 'id': '307827267',\n 'gif': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827267/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827267/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827267/default/dark/3.0',\n },\n 'start': 114,\n 'end': 125,\n },\n {\n 'type': 'twitch',\n 'name': 'PogChamp',\n 'id': '305954156',\n 'gif': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/305954156/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/305954156/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/305954156/default/dark/3.0',\n },\n 'start': 127,\n 'end': 134,\n },\n {\n 'type': 'twitch',\n 'name': 'GlitchCat',\n 'id': '304486301',\n 'gif': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/304486301/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/304486301/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/304486301/default/dark/3.0',\n },\n 'start': 136,\n 'end': 144,\n },\n {\n 'type': 'twitch',\n 'name': 'DarkMode',\n 'id': '461298',\n 'gif': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/461298/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/461298/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/461298/default/dark/3.0',\n },\n 'start': 146,\n 'end': 153,\n },\n {\n 'type': 'twitch',\n 'name': 'LUL',\n 'id': '425618',\n 'gif': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/425618/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/425618/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/425618/default/dark/3.0',\n },\n 'start': 155,\n 'end': 157,\n },\n {\n 'type': 'twitch',\n 'name': 'TheIlluminati',\n 'id': '145315',\n 'gif': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/145315/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/145315/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/145315/default/dark/3.0',\n },\n 'start': 159,\n 'end': 171,\n },\n {\n 'type': 'twitch',\n 'name': 'imGlitch',\n 'id': '112290',\n 'gif': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/112290/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/112290/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/112290/default/dark/3.0',\n },\n 'start': 173,\n 'end': 180,\n },\n {\n 'type': 'twitch',\n 'name': 'DoritosChip',\n 'id': '102242',\n 'gif': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/102242/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/102242/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/102242/default/dark/3.0',\n },\n 'start': 182,\n 'end': 192,\n },\n {\n 'type': 'twitch',\n 'name': 'SSSsss',\n 'id': '46',\n 'gif': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/46/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/46/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/46/default/dark/3.0',\n },\n 'start': 194,\n 'end': 199,\n },\n {\n 'type': 'twitch',\n 'name': 'PunchTrees',\n 'id': '47',\n 'gif': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/47/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/47/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/47/default/dark/3.0',\n },\n 'start': 201,\n 'end': 210,\n },\n {\n 'type': 'twitch',\n 'name': 'BloodTrail',\n 'id': '69',\n 'gif': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/69/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/69/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/69/default/dark/3.0',\n },\n 'start': 223,\n 'end': 232,\n },\n {\n 'type': '7tv',\n 'name': 'CookieTime',\n 'id': '635b0184ea9ce7391cbf77d6',\n 'gif': true,\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/635b0184ea9ce7391cbf77d6/1x.webp',\n '2': 'https://cdn.7tv.app/emote/635b0184ea9ce7391cbf77d6/2x.webp',\n '3': 'https://cdn.7tv.app/emote/635b0184ea9ce7391cbf77d6/3x.webp',\n '4': 'https://cdn.7tv.app/emote/635b0184ea9ce7391cbf77d6/4x.webp',\n },\n 'start': 0,\n 'end': 10,\n 'coords': {\n 'x': 0,\n 'y': 0,\n },\n },\n {\n 'type': 'bttv',\n 'name': 'catJAM',\n 'id': '5f1b0186cf6d2144653d2970',\n 'gif': true,\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/5f1b0186cf6d2144653d2970/1x',\n '2': 'https://cdn.betterttv.net/emote/5f1b0186cf6d2144653d2970/2x',\n '4': 'https://cdn.betterttv.net/emote/5f1b0186cf6d2144653d2970/3x',\n },\n 'start': 0,\n 'end': 6,\n 'coords': {\n 'x': 0,\n 'y': 0,\n 'width': 112,\n 'height': 112,\n },\n },\n {\n 'type': 'bttv',\n 'name': ':tf:',\n 'id': '54fa8f1401e468494b85b537',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fa8f1401e468494b85b537/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa8f1401e468494b85b537/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa8f1401e468494b85b537/3x',\n },\n 'start': 7,\n 'end': 11,\n 'coords': {\n 'x': 0,\n 'y': 0,\n 'width': 112,\n 'height': 112,\n },\n },\n {\n 'type': 'bttv',\n 'name': 'AngelThump',\n 'id': '566ca1a365dbbdab32ec055b',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566ca1a365dbbdab32ec055b/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca1a365dbbdab32ec055b/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca1a365dbbdab32ec055b/3x',\n },\n 'start': 12,\n 'end': 22,\n 'coords': {\n 'x': 0,\n 'y': 0,\n 'width': 334,\n 'height': 112,\n },\n },\n {\n 'type': 'bttv',\n 'name': 'ariW',\n 'id': '56fa09f18eff3b595e93ac26',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/56fa09f18eff3b595e93ac26/1x',\n '2': 'https://cdn.betterttv.net/emote/56fa09f18eff3b595e93ac26/2x',\n '4': 'https://cdn.betterttv.net/emote/56fa09f18eff3b595e93ac26/3x',\n },\n 'start': 23,\n 'end': 27,\n 'coords': {\n 'x': 0,\n 'y': 0,\n 'width': 112,\n 'height': 112,\n },\n },\n {\n 'type': 'bttv',\n 'name': 'BroBalt',\n 'id': '54fbf00a01abde735115de5c',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fbf00a01abde735115de5c/1x',\n '2': 'https://cdn.betterttv.net/emote/54fbf00a01abde735115de5c/2x',\n '4': 'https://cdn.betterttv.net/emote/54fbf00a01abde735115de5c/3x',\n },\n 'start': 28,\n 'end': 35,\n 'coords': {\n 'x': 0,\n 'y': 0,\n 'width': 184,\n 'height': 120,\n },\n },\n {\n 'type': 'bttv',\n 'name': 'bttvNice',\n 'id': '54fab7d2633595ca4c713abf',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fab7d2633595ca4c713abf/1x',\n '2': 'https://cdn.betterttv.net/emote/54fab7d2633595ca4c713abf/2x',\n '4': 'https://cdn.betterttv.net/emote/54fab7d2633595ca4c713abf/3x',\n },\n 'start': 36,\n 'end': 44,\n 'coords': {\n 'x': 0,\n 'y': 0,\n 'width': 168,\n 'height': 112,\n },\n },\n {\n 'type': 'bttv',\n 'name': 'bUrself',\n 'id': '566c9f3b65dbbdab32ec052e',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566c9f3b65dbbdab32ec052e/1x',\n '2': 'https://cdn.betterttv.net/emote/566c9f3b65dbbdab32ec052e/2x',\n '4': 'https://cdn.betterttv.net/emote/566c9f3b65dbbdab32ec052e/3x',\n },\n 'start': 45,\n 'end': 52,\n 'coords': {\n 'x': 0,\n 'y': 0,\n 'width': 112,\n 'height': 112,\n },\n },\n {\n 'type': 'bttv',\n 'name': 'c!',\n 'id': '6468f7acaee1f7f47567708e',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/6468f7acaee1f7f47567708e/1x',\n '2': 'https://cdn.betterttv.net/emote/6468f7acaee1f7f47567708e/2x',\n '4': 'https://cdn.betterttv.net/emote/6468f7acaee1f7f47567708e/3x',\n },\n 'start': 53,\n 'end': 55,\n 'coords': {\n 'x': 0,\n 'y': 0,\n 'width': 112,\n 'height': 112,\n },\n },\n {\n 'type': 'bttv',\n 'name': 'CandianRage',\n 'id': '54fbf09c01abde735115de61',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fbf09c01abde735115de61/1x',\n '2': 'https://cdn.betterttv.net/emote/54fbf09c01abde735115de61/2x',\n '4': 'https://cdn.betterttv.net/emote/54fbf09c01abde735115de61/3x',\n },\n 'start': 56,\n 'end': 67,\n 'coords': {\n 'x': 0,\n 'y': 0,\n 'width': 112,\n 'height': 112,\n },\n },\n {\n 'type': 'bttv',\n 'name': 'CiGrip',\n 'id': '54fa8fce01e468494b85b53c',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fa8fce01e468494b85b53c/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa8fce01e468494b85b53c/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa8fce01e468494b85b53c/3x',\n },\n 'start': 68,\n 'end': 74,\n 'coords': {\n 'x': 0,\n 'y': 0,\n 'width': 112,\n 'height': 112,\n },\n },\n {\n 'type': 'bttv',\n 'name': 'ConcernDoge',\n 'id': '566c9f6365dbbdab32ec0532',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566c9f6365dbbdab32ec0532/1x',\n '2': 'https://cdn.betterttv.net/emote/566c9f6365dbbdab32ec0532/2x',\n '4': 'https://cdn.betterttv.net/emote/566c9f6365dbbdab32ec0532/3x',\n },\n 'start': 75,\n 'end': 86,\n 'coords': {\n 'x': 0,\n 'y': 0,\n 'width': 101,\n 'height': 112,\n },\n },\n {\n 'type': 'bttv',\n 'name': 'CruW',\n 'id': '55471c2789d53f2d12781713',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/55471c2789d53f2d12781713/1x',\n '2': 'https://cdn.betterttv.net/emote/55471c2789d53f2d12781713/2x',\n '4': 'https://cdn.betterttv.net/emote/55471c2789d53f2d12781713/3x',\n },\n 'start': 87,\n 'end': 91,\n 'coords': {\n 'x': 0,\n 'y': 0,\n 'width': 112,\n 'height': 112,\n },\n },\n {\n 'type': 'bttv',\n 'name': 'cvHazmat',\n 'id': '5e76d338d6581c3724c0f0b2',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/5e76d338d6581c3724c0f0b2/1x',\n '2': 'https://cdn.betterttv.net/emote/5e76d338d6581c3724c0f0b2/2x',\n '4': 'https://cdn.betterttv.net/emote/5e76d338d6581c3724c0f0b2/3x',\n },\n 'start': 92,\n 'end': 100,\n 'coords': {\n 'x': 0,\n 'y': 0,\n 'width': 112,\n 'height': 112,\n },\n },\n {\n 'type': 'bttv',\n 'name': 'D:',\n 'id': '55028cd2135896936880fdd7',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/55028cd2135896936880fdd7/1x',\n '2': 'https://cdn.betterttv.net/emote/55028cd2135896936880fdd7/2x',\n '4': 'https://cdn.betterttv.net/emote/55028cd2135896936880fdd7/3x',\n },\n 'start': 101,\n 'end': 103,\n 'coords': {\n 'x': 0,\n 'y': 0,\n 'width': 112,\n 'height': 112,\n },\n },\n {\n 'type': 'bttv',\n 'name': 'haHAA',\n 'id': '555981336ba1901877765555',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/555981336ba1901877765555/1x',\n '2': 'https://cdn.betterttv.net/emote/555981336ba1901877765555/2x',\n '4': 'https://cdn.betterttv.net/emote/555981336ba1901877765555/3x',\n },\n 'start': 104,\n 'end': 109,\n 'coords': {\n 'x': 0,\n 'y': 0,\n 'width': 112,\n 'height': 112,\n },\n },\n {\n 'type': 'bttv',\n 'name': 'LuL',\n 'id': '567b00c61ddbe1786688a633',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/567b00c61ddbe1786688a633/1x',\n '2': 'https://cdn.betterttv.net/emote/567b00c61ddbe1786688a633/2x',\n '4': 'https://cdn.betterttv.net/emote/567b00c61ddbe1786688a633/3x',\n },\n 'start': 110,\n 'end': 113,\n 'coords': {\n 'x': 0,\n 'y': 0,\n 'width': 112,\n 'height': 112,\n },\n },\n {\n 'type': 'bttv',\n 'name': 'DuckerZ',\n 'id': '573d38b50ffbf6cc5cc38dc9',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/573d38b50ffbf6cc5cc38dc9/1x',\n '2': 'https://cdn.betterttv.net/emote/573d38b50ffbf6cc5cc38dc9/2x',\n '4': 'https://cdn.betterttv.net/emote/573d38b50ffbf6cc5cc38dc9/3x',\n },\n 'start': 114,\n 'end': 121,\n 'coords': {\n 'x': 0,\n 'y': 0,\n 'width': 149,\n 'height': 112,\n },\n },\n {\n 'type': 'ffz',\n 'name': 'CatBag',\n 'id': '25927',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.frankerfacez.com/emote/25927/1',\n '2': 'https://cdn.frankerfacez.com/emote/25927/2',\n '4': 'https://cdn.frankerfacez.com/emote/25927/4',\n },\n 'start': 122,\n 'end': 128,\n 'coords': {\n 'x': 0,\n 'y': 0,\n 'width': 143,\n 'height': 128,\n },\n },\n ] as Array<TwitchEmote | BttvEmote | SeventvEmote>,\n badges: {\n '100 bits': {\n type: '100 bits',\n version: '1',\n url: 'https://static-cdn.jtvnw.net/badges/v1/09d93036-e7ce-431c-9a9e-7044297133f2/3',\n description: '100 bits badge',\n },\n 'no audio': {\n type: 'no audio',\n version: '1',\n url: 'https://static-cdn.jtvnw.net/badges/v1/aef2cd08-f29b-45a1-8c12-d44d7fd5e6f0/3',\n description: 'Individuals with unreliable or no sound can select this badge',\n },\n 'no video': {\n type: 'no video',\n version: '1',\n url: 'https://static-cdn.jtvnw.net/badges/v1/199a0dba-58f3-494e-a7fc-1fa0a1001fb8/3',\n description: 'Individuals with unreliable or no video can select this badge',\n },\n 'bot': {\n type: 'bot',\n version: '1',\n url: 'https://static-cdn.jtvnw.net/badges/v1/df9095f6-a8a0-4cc2-bb33-d908c0adffb8/3',\n description: 'Twitch bot',\n },\n 'twitch staff': {\n type: 'twitch staff',\n version: '1',\n url: 'https://static-cdn.jtvnw.net/badges/v1/d97c37bd-a6f5-4c38-8f57-4e4bef88af34/3',\n description: 'Twitch Staff',\n },\n 'admins': {\n type: 'admins',\n version: '1',\n url: 'https://static-cdn.jtvnw.net/badges/v1/9ef7e029-4cdf-4d4d-a0d5-e2b3fb2583fe/3',\n description: 'Admins',\n },\n 'artist': {\n type: 'artist',\n version: '1',\n url: 'https://static-cdn.jtvnw.net/badges/v1/4300a897-03dc-4e83-8c0e-c332fee7057f/3',\n description: 'Artist',\n },\n 'game developer': {\n type: 'game developer',\n version: '1',\n url: 'https://static-cdn.jtvnw.net/badges/v1/85856a4a-eb7d-4e26-a43e-d204a977ade4/3',\n description: 'Game Developer',\n },\n 'prime': {\n type: 'prime',\n version: '1',\n url: 'https://static-cdn.jtvnw.net/badges/v1/a1dd5073-19c3-4911-8cb4-c464a7bc1510/3',\n description: 'Prime',\n },\n 'turbo': {\n type: 'turbo',\n version: '1',\n url: 'https://static-cdn.jtvnw.net/badges/v1/bd444ec6-8f34-4bf9-91f4-af1e3428d80f/3',\n description: 'Turbo',\n },\n 'subscriber': {\n type: 'subscriber',\n version: '1',\n url: 'https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/3',\n description: 'Subscriber',\n },\n 'broadcaster': {\n type: 'broadcaster',\n version: '1',\n url: 'https://static-cdn.jtvnw.net/badges/v1/5527c58c-fb7d-422d-b71b-f309dcb85cc1/3',\n description: 'Broadcaster',\n },\n 'verified': {\n type: 'verified',\n version: '1',\n url: 'https://static-cdn.jtvnw.net/badges/v1/d12a2e27-16f6-41d0-ab77-b780518f00a3/3',\n description: 'Verified',\n },\n 'moderator': {\n type: 'moderator',\n version: '1',\n url: 'https://static-cdn.jtvnw.net/badges/v1/3267646d-33f0-4b17-b3df-f923a41db1d0/3',\n description: 'Moderator',\n },\n 'vip': {\n type: 'vip',\n version: '1',\n url: 'https://static-cdn.jtvnw.net/badges/v1/b817aba4-fad8-49e2-b88a-7cc744dfa6ec/3',\n description: 'VIP',\n },\n } as Record<TwitchBadgesKeys, TwitchBadge>,\n pronouns: Alejo$Pronouns,\n tts: [\n 'Filiz',\n 'Astrid',\n 'Tatyana',\n 'Maxim',\n 'Carmen',\n 'Ines',\n 'Cristiano',\n 'Vitoria',\n 'Ricardo',\n 'Maja',\n 'Jan',\n 'Jacek',\n 'Ewa',\n 'Ruben',\n 'Lotte',\n 'Liv',\n 'Seoyeon',\n 'Takumi',\n 'Mizuki',\n 'Giorgio',\n 'Carla',\n 'Bianca',\n 'Karl',\n 'Dora',\n 'Mathieu',\n 'Celine',\n 'Chantal',\n 'Penelope',\n 'Miguel',\n 'Mia',\n 'Enrique',\n 'Conchita',\n 'Geraint',\n 'Salli',\n 'Matthew',\n 'Kimberly',\n 'Kendra',\n 'Justin',\n 'Joey',\n 'Joanna',\n 'Ivy',\n 'Raveena',\n 'Aditi',\n 'Emma',\n 'Brian',\n 'Amy',\n 'Russell',\n 'Nicole',\n 'Vicki',\n 'Marlene',\n 'Hans',\n 'Naja',\n 'Mads',\n 'Gwyneth',\n 'Zhiyu',\n 'Tracy',\n 'Danny',\n 'Huihui',\n 'Yaoyao',\n 'Kangkang',\n 'HanHan',\n 'Zhiwei',\n 'Asaf',\n 'An',\n 'Stefanos',\n 'Filip',\n 'Ivan',\n 'Heidi',\n 'Herena',\n 'Kalpana',\n 'Hemant',\n 'Matej',\n 'Andika',\n 'Rizwan',\n 'Lado',\n 'Valluvar',\n 'Linda',\n 'Heather',\n 'Sean',\n 'Michael',\n 'Karsten',\n 'Guillaume',\n 'Pattara',\n 'Jakub',\n 'Szabolcs',\n 'Hoda',\n 'Naayf',\n ] as string[],\n };\n\n static color = {\n opacity(opacity: number = 100, color: string) {\n color = color.length > 7 ? color.substring(0, 6) : color;\n opacity = opacity > 1 ? opacity / 100 : opacity;\n\n let result = Math.round(Math.min(Math.max(opacity, 0), 1) * 255)\n .toString(16)\n .toLowerCase();\n\n result = result.padStart(2, '0');\n\n return color + result;\n },\n\n getOpacity(hex: string) {\n if (!hex.startsWith('#') || hex.length <= 7) return { opacity: 100, hex };\n\n var ohex = hex.slice(-2);\n var decimal = parseInt(ohex, 16) / 255;\n var percentage = Math.round(decimal * 100);\n var color = hex.length > 7 ? hex.slice(0, 7) : hex;\n\n return { opacity: percentage, color: color };\n },\n\n validate(str: string): 'hex' | 'rgb' | 'rgba' | 'hsl' | 'hsla' | 'css-color-name' | false {\n if (typeof str !== 'string' || !str.length) return false;\n\n const s = str.trim();\n\n // HEX (#FFF, #FFFFFF, #FFFFFFFF)\n if (/^#([A-Fa-f0-9]{3}){1,2}$/.test(s) || /^#([A-Fa-f0-9]{4}|[A-Fa-f0-9]{8})$/.test(s)) {\n return 'hex';\n }\n\n // rgb(255, 255, 255)\n if (/^rgb\\(\\s*(?:\\d{1,3}\\s*,\\s*){2}\\d{1,3}\\s*\\)$/.test(s)) {\n return 'rgb';\n }\n\n // rgba(255, 255, 255, 0.5)\n if (/^rgba\\(\\s*(?:\\d{1,3}\\s*,\\s*){3}(?:0|1|0?\\.\\d+)\\s*\\)$/.test(s)) {\n return 'rgba';\n }\n\n // hsl(360, 100%, 100%)\n if (/^hsl\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}%\\s*,\\s*\\d{1,3}%\\s*\\)$/.test(s)) {\n return 'hsl';\n }\n\n // hsla(360, 100%, 100%, 0.5)\n if (/^hsla\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}%\\s*,\\s*\\d{1,3}%\\s*,\\s*(?:0|1|0?\\.\\d+)\\s*\\)$/.test(s)) {\n return 'hsla';\n }\n\n if (\n [\n 'aliceblue',\n 'antiquewhite',\n 'aqua',\n 'aquamarine',\n 'azure',\n 'beige',\n 'bisque',\n 'black',\n 'blanchedalmond',\n 'blue',\n 'blueviolet',\n 'brown',\n 'burlywood',\n 'cadetblue',\n 'chartreuse',\n 'chocolate',\n 'coral',\n 'cornflowerblue',\n 'cornsilk',\n 'crimson',\n 'cyan',\n 'darkblue',\n 'darkcyan',\n 'darkgoldenrod',\n 'darkgray',\n 'darkgreen',\n 'darkgrey',\n 'darkkhaki',\n 'darkmagenta',\n 'darkolivegreen',\n 'darkorange',\n 'darkorchid',\n 'darkred',\n 'darksalmon',\n 'darkseagreen',\n 'darkslateblue',\n 'darkslategray',\n 'darkslategrey',\n 'darkturquoise',\n 'darkviolet',\n 'deeppink',\n 'deepskyblue',\n 'dimgray',\n 'dimgrey',\n 'dodgerblue',\n 'firebrick',\n 'floralwhite',\n 'forestgreen',\n 'fuchsia',\n 'gainsboro',\n 'ghostwhite',\n 'gold',\n 'goldenrod',\n 'gray',\n 'green',\n 'greenyellow',\n 'grey',\n 'honeydew',\n 'hotpink',\n 'indianred',\n 'indigo',\n 'ivory',\n 'khaki',\n 'lavender',\n 'lavenderblush',\n 'lawngreen',\n 'lemonchiffon',\n 'lightblue',\n 'lightcoral',\n 'lightcyan',\n 'lightgoldenrodyellow',\n 'lightgray',\n 'lightgreen',\n 'lightgrey',\n 'lightpink',\n 'lightsalmon',\n 'lightseagreen',\n 'lightskyblue',\n 'lightslategray',\n 'lightslategrey',\n 'lightsteelblue',\n 'lightyellow',\n 'lime',\n 'limegreen',\n 'linen',\n 'magenta',\n 'maroon',\n 'mediumaquamarine',\n 'mediumblue',\n 'mediumorchid',\n 'mediumpurple',\n 'mediumseagreen',\n 'mediumslateblue',\n 'mediumspringgreen',\n 'mediumturquoise',\n 'mediumvioletred',\n 'midnightblue',\n 'mintcream',\n 'mistyrose',\n 'moccasin',\n 'navajowhite',\n 'navy',\n 'oldlace',\n 'olive',\n 'olivedrab',\n 'orange',\n 'orangered',\n 'orchid',\n 'palegoldenrod',\n 'palegreen',\n 'paleturquoise',\n 'palevioletred',\n 'papayawhip',\n 'peachpuff',\n 'peru',\n 'pink',\n 'plum',\n 'powderblue',\n 'purple',\n 'rebeccapurple',\n 'red',\n 'rosybrown',\n 'royalblue',\n 'saddlebrown',\n 'salmon',\n 'sandybrown',\n 'seagreen',\n 'seashell',\n 'sienna',\n 'silver',\n 'skyblue',\n 'slateblue',\n 'slategray',\n 'slategrey',\n 'snow',\n 'springgreen',\n 'steelblue',\n 'tan',\n 'teal',\n 'thistle',\n 'tomato',\n 'turquoise',\n 'violet',\n 'wheat',\n 'white',\n 'whitesmoke',\n 'yellow',\n 'yellowgreen',\n 'transparent',\n ].includes(s.toLowerCase())\n ) {\n return 'css-color-name';\n }\n\n return false;\n },\n };\n\n static rand = {\n color(type: 'hex' | 'hexa' | 'rgb' | 'rgba' | 'hsl' | 'hsla' | 'css-color-name' = 'hex'): string {\n switch (type) {\n default:\n case 'hex': {\n return `#${Math.floor(Math.random() * 0xffffff)\n .toString(16)\n .padStart(6, '0')}`;\n }\n case 'hexa': {\n const hex = `#${Math.floor(Math.random() * 0xffffff)\n .toString(16)\n .padStart(6, '0')}`;\n\n const alpha = Math.floor(Math.random() * 256)\n .toString(16)\n .padStart(2, '0');\n\n return hex + alpha;\n }\n case 'rgb': {\n const r = Math.floor(Math.random() * 256);\n const g = Math.floor(Math.random() * 256);\n const b = Math.floor(Math.random() * 256);\n\n return `rgb(${r}, ${g}, ${b})`;\n }\n case 'rgba': {\n const r = Math.floor(Math.random() * 256);\n const g = Math.floor(Math.random() * 256);\n const b = Math.floor(Math.random() * 256);\n const a = Math.random().toFixed(2);\n\n return `rgba(${r}, ${g}, ${b}, ${a})`;\n }\n case 'hsl': {\n const h = Math.floor(Math.random() * 361);\n const s = Math.floor(Math.random() * 101);\n const l = Math.floor(Math.random() * 101);\n\n return `hsl(${h}, ${s}%, ${l}%)`;\n }\n case 'hsla': {\n const h = Math.floor(Math.random() * 361);\n const s = Math.floor(Math.random() * 101);\n const l = Math.floor(Math.random() * 101);\n const a = Math.random().toFixed(2);\n\n return `hsla(${h}, ${s}%, ${l}%, ${a})`;\n }\n case 'css-color-name': {\n var names = [\n 'aliceblue',\n 'antiquewhite',\n 'aqua',\n 'aquamarine',\n 'azure',\n 'beige',\n 'bisque',\n 'black',\n 'blanchedalmond',\n 'blue',\n 'blueviolet',\n 'brown',\n 'burlywood',\n 'cadetblue',\n 'chartreuse',\n 'chocolate',\n 'coral',\n 'cornflowerblue',\n 'cornsilk',\n 'crimson',\n 'cyan',\n 'darkblue',\n 'darkcyan',\n 'darkgoldenrod',\n 'darkgray',\n 'darkgreen',\n 'darkgrey',\n 'darkkhaki',\n 'darkmagenta',\n 'darkolivegreen',\n 'darkorange',\n 'darkorchid',\n 'darkred',\n 'darksalmon',\n 'darkseagreen',\n 'darkslateblue',\n 'darkslategray',\n 'darkslategrey',\n 'darkturquoise',\n 'darkviolet',\n 'deeppink',\n 'deepskyblue',\n 'dimgray',\n 'dimgrey',\n 'dodgerblue',\n 'firebrick',\n 'floralwhite',\n 'forestgreen',\n 'fuchsia',\n 'gainsboro',\n 'ghostwhite',\n 'gold',\n 'goldenrod',\n 'gray',\n 'green',\n 'greenyellow',\n 'grey',\n 'honeydew',\n 'hotpink',\n 'indianred',\n 'indigo',\n 'ivory',\n 'khaki',\n 'lavender',\n 'lavenderblush',\n 'lawngreen',\n 'lemonchiffon',\n 'lightblue',\n 'lightcoral',\n 'lightcyan',\n 'lightgoldenrodyellow',\n 'lightgray',\n 'lightgreen',\n 'lightgrey',\n 'lightpink',\n 'lightsalmon',\n 'lightseagreen',\n 'lightskyblue',\n 'lightslategray',\n 'lightslategrey',\n 'lightsteelblue',\n 'lightyellow',\n 'lime',\n 'limegreen',\n 'linen',\n 'magenta',\n 'maroon',\n 'mediumaquamarine',\n 'mediumblue',\n 'mediumorchid',\n 'mediumpurple',\n 'mediumseagreen',\n 'mediumslateblue',\n 'mediumspringgreen',\n 'mediumturquoise',\n 'mediumvioletred',\n 'midnightblue',\n 'mintcream',\n 'mistyrose',\n 'moccasin',\n 'navajowhite',\n 'navy',\n 'oldlace',\n 'olive',\n 'olivedrab',\n 'orange',\n 'orangered',\n 'orchid',\n 'palegoldenrod',\n 'palegreen',\n 'paleturquoise',\n 'palevioletred',\n 'papayawhip',\n 'peachpuff',\n 'peru',\n 'pink',\n 'plum',\n 'powderblue',\n 'purple',\n 'rebeccapurple',\n 'red',\n 'rosybrown',\n 'royalblue',\n 'saddlebrown',\n 'salmon',\n 'sandybrown',\n 'seagreen',\n 'seashell',\n 'sienna',\n 'silver',\n 'skyblue',\n 'slateblue',\n 'slategray',\n 'slategrey',\n 'snow',\n 'springgreen',\n 'steelblue',\n 'tan',\n 'teal',\n 'thistle',\n 'tomato',\n 'turquoise',\n 'violet',\n 'wheat',\n 'white',\n 'whitesmoke',\n 'yellow',\n 'yellowgreen',\n 'transparent',\n ];\n\n return this.array(names)[0];\n }\n }\n },\n\n number(min: number, max: number, float: number = 0): number {\n if (min > max) [min, max] = [max, min];\n\n const rand = Math.random() * (max - min) + min;\n return float ? Number(rand.toFixed(float)) : Math.round(rand);\n },\n\n boolean(threshold: number = 0.5): boolean {\n return Math.random() > threshold;\n },\n\n string(length: number, chars: string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'): string {\n let result = '';\n\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n\n return result;\n },\n\n array<T>(arr: T[]): [T, number] {\n const index = this.number(0, arr.length - 1);\n\n return [arr[index], index];\n },\n\n date(rangeDays: number = 365): string {\n const now = Date.now();\n const past = now - this.number(0, rangeDays * 24 * 60 * 60 * 1000);\n\n return new Date(past).toISOString();\n },\n\n uuid(): string {\n return window.crypto && typeof crypto?.randomUUID === 'function'\n ? crypto.randomUUID()\n : '10000000-1000-4000-8000-100000000000'.replace(/[018]/g, (c) =>\n (+c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (+c / 4)))).toString(16),\n );\n },\n };\n\n static string = {\n /**\n * Replaces occurrences in a string based on a pattern with the result of an asynchronous callback function.\n * @param string - The input string to perform replacements on.\n * @param pattern - The pattern to match in the string (can be a string or a regular expression).\n * @param callback - An asynchronous callback function that takes the matched substring and any captured groups as arguments and returns the replacement string.\n * @returns A promise that resolves to the modified string with replacements applied.\n * @example\n * ```javascript\n * const result = await Simulation.string.replace(\"Hello World\", /World/, async (match) => {\n * return await fetchSomeData(match); // Assume this function fetches data asynchronously\n * });\n * console.log(result); // Output will depend on the fetched data\n * ```\n */\n async replace(string: string, pattern: string, callback: (match: string, ...groups: string[]) => Promise<string> | string): Promise<string> {\n const promises: Array<Promise<string>> = [];\n\n string.replace(pattern, (match: string, ...groups: string[]) => {\n const promise = typeof callback === 'function' ? callback(match, ...groups) : match;\n\n promises.push(Promise.resolve(promise));\n\n return match;\n });\n\n const replacements = await Promise.all(promises);\n\n return string.replace(pattern, () => replacements.shift() ?? '');\n },\n\n /**\n * Capitalizes the first letter of a given string.\n * @param string - The input string to be capitalized.\n * @returns The capitalized string.\n * @example\n * ```javascript\n * const result = Simulation.string.capitalize(\"hello world\");\n * console.log(result); // Output: \"Hello world\"\n * ```\n */\n capitalize(string: string): string {\n return string.charAt(0).toUpperCase() + string.slice(1);\n },\n\n /**\n * Composes a template string by replacing placeholders with corresponding values and applying optional modifiers.\n * @param template - The template string containing placeholders in the format {key} and optional modifiers in the format [MODIFIER:param=value].\n * @param values - An object containing key-value pairs to replace the placeholders in the template.\n * @param options - Optional settings for the composition process.\n * @returns The composed string with placeholders replaced and modifiers applied.\n * @example\n * ```javascript\n * const template = \"Hello, {username}! You have {amount} [UPPERCASE=messages] and your name is [CAPITALIZE=name].\";\n * const values = { username: \"john_doe\", amount: 5, name: \"john\" };\n * const result = Simulation.string.compose(template, values);\n * console.log(result); // Output: \"Hello, john_doe! You have 5 MESSAGES and your name is John.\"\n * ```\n */\n compose(\n template: string,\n values: Record<string, any>,\n options: { method?: 'loop' | 'index'; modifiers?: Record<string, Modifier> } = { method: 'index', modifiers: {} },\n ): string {\n const { mergeSpanStyles } = Simulation.element;\n\n const flatten: Record<string, string> = Object.entries(Simulation.object.flatten(values)).reduce(\n (acc, [k, v]) => {\n acc[k] = String(v);\n\n if (['username', 'name', 'nick', 'nickname', 'sender'].some((e) => k === e)) {\n const username = acc?.username || acc?.name || acc?.nick || acc?.nickname || acc?.sender;\n\n acc['username'] = acc.username || username;\n acc['usernameAt'] = `@${acc.username}`;\n acc['name'] = acc.name || username;\n acc['nick'] = acc.nick || username;\n acc['nickname'] = acc.nickname || username;\n acc['sender'] = acc.sender || username;\n acc['senderAt'] = `@${acc.sender}`;\n }\n\n if (['amount', 'count'].some((e) => k === e)) {\n acc['amount'] = String(amount);\n acc['count'] = String(acc?.count || amount);\n }\n\n acc['currency'] = acc.currency || window.client?.details.currency.symbol || '$';\n acc['currencyCode'] = acc.currencyCode || window.client?.details.currency.code || 'USD';\n\n acc['skip'] = '<br/>';\n acc['newline'] = '<br/>';\n\n return acc;\n },\n {} as Record<string, string>,\n );\n\n const REGEX = {\n PLACEHOLDERS: /{([^}]+)}/g,\n MODIFIERS: /\\[(\\w+)(:[^=]+)?=([^\\]]+)\\]/g,\n };\n\n var amount = parseFloat(flatten?.amount ?? flatten?.count ?? 0);\n\n const MODIFIERS: Record<string, Modifier> = {\n BT1: (value) => (amount > 1 ? value : ''),\n BT0: (value) => (amount > 0 ? value : ''),\n ST1: (value) => (amount < 1 ? value : ''),\n ST0: (value) => (amount < 0 ? value : ''),\n UPC: (value) => value.toUpperCase(),\n LOW: (value) => value.toLowerCase(),\n REV: (value) => value.split('').reverse().join(''),\n CAP: (value) => value.charAt(0).toUpperCase() + value.slice(1).toLowerCase(),\n FALLBACK: (value, param) => (value.length ? value : (param ?? value)),\n COLOR: (value, param) => mergeSpanStyles(param && !!Simulation.color.validate(param) ? `color: ${param}` : '', value),\n WEIGHT: (value, param) => mergeSpanStyles(param && !isNaN(parseInt(param)) ? `font-weight: ${param}` : '', value),\n BOLD: (value) => mergeSpanStyles('font-weight: bold', value),\n LIGHT: (value) => mergeSpanStyles('font-weight: lighter', value),\n STRONG: (value) => mergeSpanStyles('font-weight: bolder', value),\n ITALIC: (value) => mergeSpanStyles('font-style: italic', value),\n UNDERLINE: (value) => mergeSpanStyles('text-decoration: underline', value),\n STRIKETHROUGH: (value) => mergeSpanStyles('text-decoration: line-through', value),\n SUB: (value) => mergeSpanStyles('vertical-align: sub', value),\n SUP: (value) => mergeSpanStyles('vertical-align: super', value),\n LARGER: (value) => mergeSpanStyles('font-size: larger', value),\n SMALL: (value) => mergeSpanStyles('font-size: smaller', value),\n SHADOW: (value, param) => mergeSpanStyles(`text-shadow: ${param}`, value),\n SIZE: (value, param) => mergeSpanStyles(param ? `font-size: ${param}` : '', value),\n ...(options.modifiers ?? {}),\n };\n\n const ALIASES = {\n UPC: ['UPPERCASE', 'UPPER', 'UPP'],\n LOW: ['LOWERCASE', 'LOWER', 'LWC'],\n REV: ['REVERSE', 'RVS'],\n CAP: ['CAPITALIZE', 'CAPITAL'],\n BT1: ['BIGGER_THAN_1', 'GREATER_THAN_1', 'GT1'],\n BT0: ['BIGGER_THAN_0', 'GREATER_THAN_0', 'GT0'],\n ST1: ['SMALLER_THAN_1', 'LESS_THAN_1', 'LT1'],\n ST0: ['SMALLER_THAN_0', 'LESS_THAN_0', 'LT0'],\n COLOR: ['COLOUR', 'CLR', 'HIGHLIGHT'],\n BOLD: ['BOLDEN', 'B'],\n STRONG: ['STRONGEN', 'STRONG'],\n ITALIC: ['ITALICIZE', 'ITALIC', 'I'],\n UNDERLINE: ['U', 'INS', 'INSET', 'I'],\n STRIKETHROUGH: ['STRIKE', 'S', 'DELETE', 'D'],\n SUB: ['SUBSCRIPT', 'SUBS'],\n SUP: ['SUPERSCRIPT', 'SUPS'],\n LARGER: ['LARGER', 'LG'],\n SMALL: ['SMALLER', 'SM'],\n SHADOW: ['SHADOW', 'SHD'],\n FALLBACK: ['FALLBACK', 'FB'],\n };\n\n function applyModifier(value: string, name: string, param: string | null | undefined): string {\n const canonical = Object.entries(ALIASES).find(([key, aliases]) => {\n if (aliases.some((alias) => alias.toUpperCase() === name.toUpperCase())) return true;\n else if (key.toUpperCase() === name.toUpperCase()) return true;\n else return false;\n });\n const use = canonical ? canonical[0] : name.toUpperCase();\n\n if (MODIFIERS[use]) return MODIFIERS[use](value, typeof param === 'string' ? param.trim() : null, flatten);\n else return value;\n }\n\n function replaceAll(string: string): string {\n let str = string;\n let match;\n\n while ((match = REGEX.MODIFIERS.exec(str)) !== null) {\n const [fullMatch, modifier, param, value] = match;\n\n const newValue = applyModifier(replaceAll(value), modifier, param);\n\n str = str.replace(fullMatch, newValue ?? '');\n\n REGEX.MODIFIERS.lastIndex = 0;\n }\n\n return str;\n }\n\n function parseModifiers(str: string): string {\n let i = 0;\n const len = str.length;\n\n function parseText(stopChar?: string): string {\n let out = '';\n while (i < len) {\n if (str[i] === '\\\\') {\n if (i + 1 < len) {\n out += str[i + 1];\n i += 2;\n } else {\n i++;\n }\n } else if (str[i] === '[' && (!stopChar || stopChar !== '[')) {\n out += parseModifier();\n } else if (stopChar && str[i] === stopChar) {\n i++;\n break;\n } else {\n out += str[i++];\n }\n }\n return out;\n }\n\n function parseModifier(): string {\n i++;\n let name = '';\n while (i < len && /[A-Za-z0-9]/.test(str[i])) name += str[i++];\n let param: string | null = null;\n if (str[i] === ':') {\n i++;\n const paramStart = i;\n while (i < len && str[i] !== '=') i++;\n param = str.slice(paramStart, i);\n }\n if (str[i] === '=') i++;\n const value = parseText(']');\n return applyModifier(value, name, param);\n }\n\n return parseText();\n }\n\n let result = template.replace(REGEX.PLACEHOLDERS, (_, key: string) =>\n typeof flatten[key] === 'string' || typeof flatten[key] === 'number' ? String(flatten[key]) : (key ?? key),\n );\n\n result = options.method === 'loop' ? replaceAll(result) : parseModifiers(result);\n\n return result;\n },\n };\n\n static element = {\n /**\n * Merges outer span styles with inner span styles in the provided HTML string.\n * @param outerStyle - The style string to be applied to the outer span.\n * @param innerHTML - The inner HTML string which may contain a span with its own styles.\n * @returns A new HTML string with merged styles applied to a single span.\n * @example\n * ```javascript\n * const result = Simulation.element.mergeSpanStyles(\"color: red; font-weight: bold;\", '<span style=\"font-size: 14px;\">Hello World</span>');\n * console.log(result); // Output: '<span style=\"font-size: 14px; color: red; font-weight: bold;\">Hello World</span>'\n * ```\n */\n mergeSpanStyles(outerStyle: string, innerHTML: string): string {\n const match = innerHTML.match(/^<span style=\"([^\"]*)\">(.*)<\\/span>$/s);\n\n if (match) {\n const innerStyle = match[1];\n const content = match[2];\n\n const mergedStyle = [innerStyle, outerStyle]\n .filter(Boolean)\n .join('; ')\n .replace(/\\s*;\\s*/g, '; ')\n .trim();\n\n return `<span style=\"${mergedStyle}\">${content}</span>`;\n } else {\n return `<span style=\"${outerStyle}\">${innerHTML}</span>`;\n }\n },\n };\n\n static object = {\n /**\n * Flattens a nested object into a single-level object with dot-separated keys.\n * @param obj - The nested object to be flattened.\n * @param prefix - The prefix to be added to each key (used for recursion).\n * @returns A flattened object with dot-separated keys.\n * @example\n * ```javascript\n * const nestedObj = { a: { b: 1, c: { d: 2 } }, e: [3, 4] };\n * const flatObj = Simulation.object.flatten(nestedObj);\n * console.log(flatObj);\n * // Output: { 'a.b': '1', 'a.c.d': '2', 'e:0': '3', 'e:1': '4' }\n * ```\n */\n flatten(obj: Record<string, any>, prefix: string = ''): Record<string, string> {\n const result = {} as Record<string, string>;\n\n for (const key in obj) {\n if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;\n\n const value = obj[key];\n const path = prefix ? `${prefix}.${key}` : key;\n\n // Handle null and undefined\n if (value === null || value === undefined) {\n result[path] = String(value);\n\n continue;\n }\n\n // Handle Date objects\n if (value instanceof Date) {\n result[path] = value.toISOString();\n\n continue;\n }\n\n // Handle Map objects\n if (value instanceof Map) {\n value.forEach((v, k) => {\n result[`${path}.${k}`] = JSON.stringify(v);\n });\n\n continue;\n }\n\n // Handle Array objects\n if (Array.isArray(value)) {\n value.forEach((v, i) => {\n const itemPath = `${path}:${i}`;\n\n if (typeof v === 'object') {\n Object.assign(result, this.flatten(v, itemPath));\n } else {\n result[itemPath] = String(v);\n }\n });\n\n continue;\n }\n\n // Handle nested objects\n if (typeof value === 'object') {\n Object.assign(result, this.flatten(value, path));\n\n continue;\n }\n\n // Handle primitive values (string, number, boolean, etc.)\n result[path] = String(value);\n }\n\n return result;\n },\n };\n\n static generate = {\n session: {\n types: {\n name: { type: 'string', options: Simulation.data.names.filter((e) => e.length) },\n tier: { type: 'string', options: Simulation.data.tiers.filter((e) => e.length) },\n message: { type: 'string', options: Simulation.data.messages.filter((e) => e.length) },\n item: { type: 'array', options: Simulation.data.items },\n avatar: { type: 'string', options: Simulation.data.avatars.filter((e) => e.length) },\n } as Record<string, Session$AnyConfig>,\n\n available(): Session$AvailableData {\n const types = this.types;\n\n return {\n follower: {\n latest: { name: types.name },\n session: { count: { type: 'int', min: 50, max: 200 } },\n week: { count: { type: 'int', min: 200, max: 1000 } },\n month: { count: { type: 'int', min: 1000, max: 3000 } },\n goal: { amount: { type: 'int', min: 3000, max: 7000 } },\n total: { count: { type: 'int', min: 7000, max: 10000 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: { name: types.name, createdAt: { type: 'date', range: 400 } },\n },\n },\n subscriber: {\n latest: {\n name: types.name,\n amount: { type: 'int', min: 10, max: 30 },\n tier: types.tier,\n message: types.message,\n },\n 'new-latest': {\n name: types.name,\n amount: { type: 'int', min: 10, max: 30 },\n message: types.message,\n },\n 'resub-latest': {\n name: types.name,\n amount: { type: 'int', min: 10, max: 30 },\n message: types.message,\n },\n 'gifted-latest': {\n name: types.name,\n amount: { type: 'int', min: 10, max: 30 },\n message: types.message,\n tier: types.tier,\n sender: types.name,\n },\n session: { count: { type: 'int', min: 10, max: 40 } },\n 'new-session': { count: { type: 'int', min: 10, max: 40 } },\n 'resub-session': { count: { type: 'int', min: 10, max: 40 } },\n 'gifted-session': { count: { type: 'int', min: 10, max: 40 } },\n week: { count: { type: 'int', min: 40, max: 100 } },\n month: { count: { type: 'int', min: 100, max: 200 } },\n goal: { amount: { type: 'int', min: 200, max: 300 } },\n total: { count: { type: 'int', min: 300, max: 400 } },\n points: { amount: { type: 'int', min: 100, max: 400 } },\n 'alltime-gifter': { name: types.name, amount: { type: 'int', min: 300, max: 400 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 10, max: 30 },\n tier: types.tier,\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n host: {\n latest: { name: types.name, amount: { type: 'int', min: 1, max: 10 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 1, max: 10 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n raid: {\n latest: { name: types.name, amount: { type: 'int', min: 0, max: 100 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 0, max: 100 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n charityCampaignDonation: {\n latest: { name: types.name, amount: { type: 'int', min: 50, max: 150 } },\n 'session-top-donation': { name: types.name, amount: { type: 'int', min: 50, max: 200 } },\n 'weekly-top-donation': { name: types.name, amount: { type: 'int', min: 200, max: 500 } },\n 'monthly-top-donation': { name: types.name, amount: { type: 'int', min: 500, max: 800 } },\n 'alltime-top-donation': { name: types.name, amount: { type: 'int', min: 800, max: 1000 } },\n 'session-top-donator': { name: types.name, amount: { type: 'int', min: 50, max: 200 } },\n 'weekly-top-donator': { name: types.name, amount: { type: 'int', min: 200, max: 500 } },\n 'monthly-top-donator': { name: types.name, amount: { type: 'int', min: 500, max: 800 } },\n 'alltime-top-donator': { name: types.name, amount: { type: 'int', min: 800, max: 1000 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 50, max: 150 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n cheer: {\n latest: { name: types.name, amount: { type: 'int', min: 200, max: 800 }, message: types.message },\n 'session-top-donation': { name: types.name, amount: { type: 'int', min: 200, max: 1000 } },\n 'weekly-top-donation': { name: types.name, amount: { type: 'int', min: 1000, max: 5000 } },\n 'monthly-top-donation': { name: types.name, amount: { type: 'int', min: 5000, max: 12000 } },\n 'alltime-top-donation': { name: types.name, amount: { type: 'int', min: 12000, max: 20000 } },\n 'session-top-donator': { name: types.name, amount: { type: 'int', min: 200, max: 1000 } },\n 'weekly-top-donator': { name: types.name, amount: { type: 'int', min: 1000, max: 5000 } },\n 'monthly-top-donator': { name: types.name, amount: { type: 'int', min: 5000, max: 12000 } },\n 'alltime-top-donator': { name: types.name, amount: { type: 'int', min: 12000, max: 20000 } },\n session: { amount: { type: 'int', min: 200, max: 1000 } },\n week: { amount: { type: 'int', min: 1000, max: 5000 } },\n month: { amount: { type: 'int', min: 5000, max: 12000 } },\n goal: { amount: { type: 'int', min: 12000, max: 18000 } },\n total: { amount: { type: 'int', min: 18000, max: 20000 } },\n count: { count: { type: 'int', min: 200, max: 1000 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 200, max: 800 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n cheerPurchase: {\n latest: { name: types.name, amount: { type: 'int', min: 200, max: 400 } },\n 'session-top-donation': { name: types.name, amount: { type: 'int', min: 200, max: 400 } },\n 'weekly-top-donation': { name: types.name, amount: { type: 'int', min: 400, max: 800 } },\n 'monthly-top-donation': { name: types.name, amount: { type: 'int', min: 800, max: 1500 } },\n 'alltime-top-donation': { name: types.name, amount: { type: 'int', min: 1500, max: 2000 } },\n 'session-top-donator': { name: types.name, amount: { type: 'int', min: 200, max: 400 } },\n 'weekly-top-donator': { name: types.name, amount: { type: 'int', min: 400, max: 800 } },\n 'monthly-top-donator': { name: types.name, amount: { type: 'int', min: 800, max: 1500 } },\n 'alltime-top-donator': { name: types.name, amount: { type: 'int', min: 1500, max: 2000 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 200, max: 400 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n superchat: {\n latest: { name: types.name, amount: { type: 'int', min: 100, max: 400 } },\n 'session-top-donation': { name: types.name, amount: { type: 'int', min: 100, max: 500 } },\n 'weekly-top-donation': { name: types.name, amount: { type: 'int', min: 500, max: 1000 } },\n 'monthly-top-donation': { name: types.name, amount: { type: 'int', min: 1000, max: 2000 } },\n 'alltime-top-donation': { name: types.name, amount: { type: 'int', min: 2000, max: 2500 } },\n 'session-top-donator': { name: types.name, amount: { type: 'int', min: 100, max: 500 } },\n 'weekly-top-donator': { name: types.name, amount: { type: 'int', min: 500, max: 1000 } },\n 'monthly-top-donator': { name: types.name, amount: { type: 'int', min: 1000, max: 2000 } },\n 'alltime-top-donator': { name: types.name, amount: { type: 'int', min: 2000, max: 2500 } },\n session: { amount: { type: 'int', min: 100, max: 500 } },\n week: { amount: { type: 'int', min: 500, max: 1000 } },\n month: { amount: { type: 'int', min: 1000, max: 2000 } },\n goal: { amount: { type: 'int', min: 2000, max: 2300 } },\n total: { amount: { type: 'int', min: 2300, max: 2500 } },\n count: { count: { type: 'int', min: 100, max: 500 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 100, max: 400 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n hypetrain: {\n latest: {\n name: types.name,\n amount: { type: 'int', min: 0, max: 100 },\n active: { type: 'int', min: 0, max: 1 },\n level: { type: 'int', min: 5, max: 10 },\n levelChanged: { type: 'int', min: 0, max: 5 },\n _type: { type: 'array', options: ['follower', 'subscriber', 'cheer', 'donation'] },\n },\n 'level-goal': { amount: { type: 'int', min: 0, max: 100 } },\n 'level-progress': { amount: { type: 'int', min: 0, max: 100 }, percent: { type: 'int', min: 0, max: 100 } },\n total: { amount: { type: 'int', min: 0, max: 100 } },\n 'latest-top-contributors': { type: 'recent', amount: 25, value: { name: types.name } },\n },\n 'channel-points': {\n latest: {\n name: types.name,\n amount: { type: 'int', min: 0, max: 100 },\n message: types.message,\n redemption: { type: 'array', options: ['Reward 1', 'Reward 2', 'Reward 3'] },\n },\n },\n tip: {\n latest: { name: types.name, amount: { type: 'int', min: 100, max: 400 } },\n 'session-top-donation': { name: types.name, amount: { type: 'int', min: 100, max: 500 } },\n 'weekly-top-donation': { name: types.name, amount: { type: 'int', min: 500, max: 1000 } },\n 'monthly-top-donation': { name: types.name, amount: { type: 'int', min: 1000, max: 2000 } },\n 'alltime-top-donation': { name: types.name, amount: { type: 'int', min: 2000, max: 2500 } },\n 'session-top-donator': { name: types.name, amount: { type: 'int', min: 100, max: 500 } },\n 'weekly-top-donator': { name: types.name, amount: { type: 'int', min: 500, max: 1000 } },\n 'monthly-top-donator': { name: types.name, amount: { type: 'int', min: 1000, max: 2000 } },\n 'alltime-top-donator': { name: types.name, amount: { type: 'int', min: 2000, max: 2500 } },\n session: { amount: { type: 'int', min: 100, max: 500 } },\n week: { amount: { type: 'int', min: 500, max: 1000 } },\n month: { amount: { type: 'int', min: 1000, max: 2000 } },\n goal: { amount: { type: 'int', min: 2000, max: 2300 } },\n total: { amount: { type: 'int', min: 2300, max: 2500 } },\n count: { count: { type: 'int', min: 100, max: 500 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 100, max: 400 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n merch: {\n latest: { name: types.name, amount: { type: 'int', min: 0, max: 100 }, items: types.item },\n 'goal-orders': { amount: { type: 'int', min: 0, max: 100 } },\n 'goal-items': { amount: { type: 'int', min: 0, max: 100 } },\n 'goal-total': { amount: { type: 'int', min: 0, max: 100 } },\n recent: { type: 'recent', amount: 25, value: { name: types.name } },\n },\n purchase: {\n latest: {\n name: types.name,\n amount: { type: 'int', min: 0, max: 100 },\n items: types.item,\n avatar: types.avatar,\n message: types.message,\n },\n },\n };\n },\n\n async get(): Promise<Session> {\n const available = this.available();\n\n const generate = (available: Session$AvailableData | Session$AvailableCategory | Session$AnyConfig): any => {\n const generateRecentData = (config: Session$AnyConfig): Array<any> => {\n if (!config || !('amount' in config)) return [];\n\n const items: Array<{ createdAt: string }> = [];\n\n for (let i = 0; i < config.amount; i++) {\n items.push(generate(config.value));\n }\n\n return items.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n };\n\n const generateObjectData = (config: Record<string, any>): Record<string, any> => {\n const result: Record<string, any> = {};\n\n for (const key in config) {\n const processedKey = key.replace('_type', 'type');\n\n result[processedKey] = generate(config[key]);\n }\n\n return result;\n };\n\n const processTypedConfig = (config: Session$AnyConfig): any => {\n if (!config) return config;\n\n switch (config.type) {\n case 'int':\n return Simulation.rand.number(config.min, config.max);\n case 'string':\n return Simulation.rand.array(config.options)[0];\n case 'date':\n return Simulation.rand.date(config.range);\n case 'array':\n return Simulation.rand.array(config.options)[0];\n case 'recent':\n return generateRecentData(config);\n default:\n return config;\n }\n };\n\n // Main generation logic\n\n // Handle primitive values (non-objects)\n if (typeof available !== 'object' || available === null) {\n return available;\n }\n\n // Handle typed configurations (objects with a 'type' property)\n if ('type' in available && typeof available.type === 'string') {\n return processTypedConfig(available);\n }\n\n // Handle generic objects - recursively process each property\n return generateObjectData(available);\n };\n\n var session: Session = Object.entries(generate(available)).reduce(\n (acc, [key, value]) => {\n Object.entries(value as any).forEach(\n ([subKey, subValue]) =>\n //\n (acc[`${key}-${subKey}`] = subValue),\n );\n\n return acc;\n },\n {} as Record<string, any>,\n ) as Session;\n\n return session;\n },\n },\n event: {\n /**\n * Simulates the onWidgetLoad event for a widget.\n * @param fields - The field values to be included in the event.\n * @param session - The session data to be included in the event.\n * @param currency - The currency to be used (default is 'USD').\n * @returns A Promise that resolves to the simulated onWidgetLoad event data.\n */\n async onWidgetLoad(fields: Record<string, StreamElementsFieldValue>, session: Session, currency: 'BRL' | 'USD' | 'EUR' = 'USD'): Promise<onWidgetLoad> {\n const currencies = {\n BRL: { code: 'BRL', name: 'Brazilian Real', symbol: 'R$' },\n USD: { code: 'USD', name: 'US Dollar', symbol: '$' },\n EUR: { code: 'EUR', name: 'Euro', symbol: '€' },\n };\n\n return {\n channel: {\n username: 'local',\n apiToken: '',\n id: '',\n providerId: '',\n avatar: '',\n },\n currency: currencies[currency] ?? currencies.USD,\n fieldData: fields,\n recents: [],\n session: {\n data: session,\n settings: {\n autoReset: false,\n calendar: false,\n resetOnStart: false,\n },\n },\n overlay: {\n isEditorMode: true,\n muted: false,\n },\n emulated: true,\n };\n },\n /**\n * Simulates the onSessionUpdate event for a widget.\n * @param session - The session data to be included in the event.\n * @returns A Promise that resolves to the simulated onSessionUpdate event data.\n */\n async onSessionUpdate(session?: Session): Promise<onSessionUpdate> {\n session ??= await Simulation.generate.session.get();\n\n return { session };\n },\n /**\n * Simulates the onEventReceived event for a widget.\n * @param provider - The provider of the event (default is 'random').\n * @param type - The type of event to simulate (default is 'random').\n * @param options - Additional options to customize the event data.\n * @returns A Promise that resolves to the simulated onEventReceived event data, or null if the event type is not supported.\n * @example\n * ```javascript\n * // Simulate a random event\n * const randomEvent = await Simulation.generate.event.onEventReceived();\n *\n * // Simulate a Twitch message event with custom options\n * const twitchMessageEvent = await Simulation.generate.event.onEventReceived('twitch', 'message', { name: 'Streamer', message: 'Hello World!' });\n * ```\n */\n async onEventReceived(\n provider: Provider | 'random' = 'random',\n type: onEventReceived['listener'] | 'random' | 'tip' | 'cheer' | 'follower' | 'raid' | 'subscriber' = 'random',\n options: Record<string, string | number | boolean> = {},\n ): Promise<onEventReceived | null> {\n const available: Record<Provider, string[]> = {\n twitch: ['message', 'follower-latest', 'cheer-latest', 'raid-latest', 'subscriber-latest'],\n streamelements: ['tip-latest'],\n youtube: ['message', 'superchat-latest', 'subscriber-latest', 'sponsor-latest'],\n kick: [],\n facebook: [],\n };\n\n switch (provider) {\n default:\n case 'random': {\n var randomProvider = Simulation.rand.array(Object.keys(available).filter((e) => available[e as Provider].length))[0] as Provider;\n var randomEvent = Simulation.rand.array(available[randomProvider])[0] as onEventReceived['listener'];\n\n return this.onEventReceived(randomProvider, randomEvent);\n }\n\n case 'twitch': {\n switch (type as Twitch['listener'] | 'random' | 'cheer' | 'follower' | 'raid' | 'subscriber') {\n default:\n case 'random': {\n var randomEvent = Simulation.rand.array(available[provider])[0] as onEventReceived['listener'];\n\n return this.onEventReceived(provider, randomEvent);\n }\n case 'message': {\n var name = (options?.name as string) ?? Simulation.rand.array(Simulation.data.names.filter((e) => e.length))[0];\n var message = (options?.message as string) ?? Simulation.rand.array(Simulation.data.messages.filter((e) => e.length))[0];\n\n var badges = await generateBadges((options?.badges as BadgeOptions) ?? [], provider);\n\n var emotes = findEmotesInText(message);\n var renderedText = replaceEmotesWithHTML(message, emotes);\n\n var color = (options?.color as string) ?? Simulation.rand.color('hex');\n var userId = (options?.userId as string) ?? Simulation.rand.number(10000000, 99999999).toString();\n var time = Date.now();\n\n const event: Twitch$Message = {\n listener: 'message',\n event: {\n service: provider,\n data: {\n time: time,\n tags: {\n 'badge-info': `${badges.keys.map((key) => `${key}/${Simulation.rand.number(1, 5)}`).join(',')}`,\n 'badges': badges.keys.join('/1,'),\n\n 'mod': badges.keys.includes('moderator') ? '1' : '0',\n 'subscriber': badges.keys.includes('subscriber') ? '1' : '0',\n 'turbo': badges.keys.includes('turbo') ? '1' : '0',\n\n 'tmi-sent-ts': time.toString(),\n\n 'user-id': userId,\n 'user-type': '',\n\n 'color': color,\n 'display-name': name,\n 'emotes': '',\n\n 'client-nonce': Simulation.rand.string(16),\n 'flags': '',\n 'id': Simulation.rand.uuid(),\n 'first-msg': '0',\n 'returning-chatter': '0',\n },\n nick: name.toLowerCase(),\n displayName: name,\n displayColor: color,\n channel: 'local',\n text: message,\n isAction: false,\n userId: userId,\n msgId: Simulation.rand.uuid(),\n badges: badges.badges,\n emotes: emotes,\n },\n renderedText: renderedText,\n },\n };\n\n return event;\n }\n case 'cheer':\n case 'cheer-latest': {\n var amount = (options?.amount as number) ?? Simulation.rand.number(100, 10000);\n var avatar = (options?.avatar as string) ?? Simulation.rand.array(Simulation.data.avatars)[0];\n var name = (options?.name as string) ?? Simulation.rand.array(Simulation.data.names.filter((e) => e.length))[0];\n var message = (options?.message as string) ?? Simulation.rand.array(Simulation.data.messages.filter((e) => e.length))[0];\n\n const event: Twitch$Cheer = {\n listener: 'cheer-latest',\n event: {\n amount,\n avatar,\n name: name.toLowerCase(),\n displayName: name,\n message: message,\n providerId: '',\n _id: Simulation.rand.uuid(),\n sessionTop: false,\n type: 'cheer',\n originalEventName: 'cheer-latest',\n },\n };\n\n return event;\n }\n case 'follower':\n case 'follower-latest': {\n var avatar = (options?.avatar as string) ?? Simulation.rand.array(Simulation.data.avatars)[0];\n var name = (options?.name as string) ?? Simulation.rand.array(Simulation.data.names.filter((e) => e.length))[0];\n\n const event: Twitch$Follower = {\n listener: 'follower-latest',\n event: {\n avatar,\n name: name.toLowerCase(),\n displayName: name,\n providerId: '',\n _id: Simulation.rand.uuid(),\n sessionTop: false,\n type: 'follower',\n originalEventName: 'follower-latest',\n },\n };\n\n return event;\n }\n case 'raid':\n case 'raid-latest': {\n var amount = (options?.amount as number) ?? Simulation.rand.number(1, 100);\n var avatar = (options?.avatar as string) ?? Simulation.rand.array(Simulation.data.avatars)[0];\n var name = (options?.name as string) ?? Simulation.rand.array(Simulation.data.names.filter((e) => e.length))[0];\n\n const event: Twitch$Raid = {\n listener: 'raid-latest',\n event: {\n amount,\n avatar,\n name: name.toLowerCase(),\n displayName: name,\n providerId: '',\n _id: Simulation.rand.uuid(),\n sessionTop: false,\n type: 'raid',\n originalEventName: 'raid-latest',\n },\n };\n\n return event;\n }\n case 'subscriber':\n case 'subscriber-latest': {\n var tier = (options?.tier as string) ?? Simulation.rand.array(['1000', '2000', '3000'])[0];\n var amount = (options?.amount as number) ?? Simulation.rand.number(1, 24);\n var avatar = (options?.avatar as string) ?? Simulation.rand.array(Simulation.data.avatars)[0];\n var name = (options?.name as string) ?? Simulation.rand.array(Simulation.data.names.filter((e) => e.length))[0];\n var sender = (options?.sender as string) ?? Simulation.rand.array(Simulation.data.names.filter((e) => e.length && e !== name))[0];\n var message = (options?.message as string) ?? Simulation.rand.array(Simulation.data.messages.filter((e) => e.length))[0];\n\n var addons = {\n default: {\n avatar,\n tier,\n playedAsCommunityGift: false,\n },\n gift: {\n sender,\n gifted: true,\n } as Subscriber$gift,\n community: {\n message,\n sender,\n bulkGifted: true,\n } as Subscriber$community,\n spam: {\n sender,\n gifted: true,\n isCommunityGift: true,\n } as Subscriber$spam,\n };\n\n var subTypes = ['default', 'gift', 'community', 'spam'];\n var subType = (options?.subType as string) ?? Simulation.rand.array(subTypes)[0];\n\n subType = subTypes.includes(subType) ? subType : 'default';\n\n const event: Twitch$Subscriber = {\n listener: 'subscriber-latest',\n event: {\n amount,\n name: name.toLowerCase(),\n displayName: name,\n providerId: '',\n\n ...addons.default,\n ...addons[subType as keyof typeof addons],\n\n _id: Simulation.rand.uuid(),\n sessionTop: false,\n type: 'subscriber',\n originalEventName: 'subscriber-latest',\n },\n };\n\n return event;\n }\n case 'delete-message': {\n const event: Twitch$DeleteMessage = {\n listener: 'delete-message',\n event: {\n msgId: (options?.id as string) ?? Simulation.rand.uuid(),\n },\n };\n\n return event;\n }\n case 'delete-messages': {\n const event: Twitch$DeleteMessages = {\n listener: 'delete-messages',\n event: {\n userId: (options?.id as string) ?? Simulation.rand.number(10000000, 99999999).toString(),\n },\n };\n\n return event;\n }\n }\n }\n\n case 'streamelements': {\n switch (type as StreamElements['listener'] | 'random' | 'tip' | 'mute' | 'unmute' | 'skip') {\n default:\n case 'random': {\n var randomEvent = Simulation.rand.array(available[provider])[0] as onEventReceived['listener'];\n\n return this.onEventReceived(provider, randomEvent);\n }\n case 'tip':\n case 'tip-latest': {\n var amount = (options?.amount as number) ?? Simulation.rand.number(100, 4000);\n var avatar = (options?.avatar as string) ?? Simulation.rand.array(Simulation.data.avatars)[0];\n var name = (options?.name as string) ?? Simulation.rand.array(Simulation.data.names.filter((e) => e.length))[0];\n\n const event: StreamElements$Tip = {\n listener: 'tip-latest',\n event: {\n amount,\n avatar,\n name: name.toLowerCase(),\n displayName: name,\n providerId: '',\n _id: Simulation.rand.uuid(),\n sessionTop: false,\n type: 'tip',\n originalEventName: 'tip-latest',\n },\n };\n\n return event;\n }\n case 'kvstore:update': {\n const event: StreamElements$KVStore = {\n listener: 'kvstore:update',\n event: {\n data: {\n key: `customWidget.${(options?.key as string) ?? 'sampleKey'}`,\n value: (options?.value as string) ?? 'sampleValue',\n },\n },\n };\n\n return event;\n }\n case 'bot:counter': {\n const event: StreamElements$BotCounter = {\n listener: 'bot:counter',\n event: {\n counter: (options?.counter as string) ?? 'sampleCounter',\n value: (options?.value as number) ?? Simulation.rand.number(0, 100),\n },\n };\n\n return event;\n }\n case 'mute':\n case 'unmute':\n case 'alertService:toggleSound': {\n var muted = (options?.muted as boolean) ?? !client.details.overlay.muted;\n\n const event: StreamElements$AlertService = {\n listener: 'alertService:toggleSound',\n event: { muted },\n };\n\n return event;\n }\n case 'skip':\n case 'event:skip': {\n const event: StreamElements$EventSkip = {\n listener: 'event:skip',\n event: {},\n };\n\n return event;\n }\n }\n }\n\n case 'youtube': {\n switch (type as Youtube['listener'] | 'random' | 'message' | 'superchat' | 'subscriber' | 'sponsor') {\n default:\n case 'random': {\n var randomEvent = Simulation.rand.array(available[provider])[0] as onEventReceived['listener'];\n\n return this.onEventReceived(provider, randomEvent);\n }\n case 'message': {\n var name = (options?.name as string) ?? Simulation.rand.array(Simulation.data.names.filter((e) => e.length))[0];\n var message = (options?.message as string) ?? Simulation.rand.array(Simulation.data.messages.filter((e) => e.length))[0];\n\n const badges = await generateBadges((options?.badges as BadgeOptions) ?? [], provider);\n\n var emotes = findEmotesInText(message);\n var renderedText = replaceEmotesWithHTML(message, emotes);\n\n var color = (options?.color as string) ?? Simulation.rand.color('hex');\n var userId = (options?.userId as string) ?? Simulation.rand.number(10000000, 99999999).toString();\n var time = Date.now();\n\n var avatar = (options?.avatar as string) ?? Simulation.rand.array(Simulation.data.avatars)[0];\n\n const event: Youtube$Message = {\n listener: 'message',\n event: {\n service: 'youtube',\n data: {\n kind: '',\n etag: '',\n id: '',\n snippet: {\n type: '',\n liveChatId: '',\n authorChannelId: 'local',\n publishedAt: new Date().toISOString(),\n hasDisplayContent: true,\n displayMessage: message,\n textMessageDetails: {\n messageText: message,\n },\n },\n authorDetails: {\n channelId: 'local',\n channelUrl: '',\n displayName: name,\n profileImageUrl: avatar,\n ...badges,\n },\n msgId: Simulation.rand.uuid(),\n userId: Simulation.rand.uuid(),\n nick: name.toLowerCase(),\n badges: [],\n displayName: name,\n isAction: false,\n time: Date.now(),\n tags: [],\n displayColor: Simulation.rand.color('hex'),\n channel: 'local',\n text: message,\n avatar: avatar,\n emotes: [],\n },\n renderedText: message,\n },\n };\n\n return event;\n }\n case 'subscriber':\n case 'subscriber-latest': {\n var avatar = (options?.avatar as string) ?? Simulation.rand.array(Simulation.data.avatars)[0];\n var name = (options?.name as string) ?? Simulation.rand.array(Simulation.data.names.filter((e) => e.length))[0];\n\n const event: YouTube$Subscriber = {\n listener: 'subscriber-latest',\n event: {\n avatar,\n displayName: name,\n name: name.toLowerCase(),\n providerId: '',\n _id: Simulation.rand.uuid(),\n sessionTop: false,\n type: 'subscriber',\n originalEventName: 'subscriber-latest',\n },\n };\n\n return event;\n }\n case 'superchat':\n case 'superchat-latest': {\n var amount = (options?.amount as number) ?? Simulation.rand.number(100, 4000);\n var avatar = (options?.avatar as string) ?? Simulation.rand.array(Simulation.data.avatars)[0];\n var name = (options?.name as string) ?? Simulation.rand.array(Simulation.data.names.filter((e) => e.length))[0];\n\n const event: YouTube$Superchat = {\n listener: 'superchat-latest',\n event: {\n amount,\n avatar,\n name: name.toLowerCase(),\n displayName: name,\n providerId: '',\n _id: Simulation.rand.uuid(),\n sessionTop: false,\n type: 'superchat',\n originalEventName: 'superchat-latest',\n },\n };\n\n return event;\n }\n case 'sponsor':\n case 'sponsor-latest': {\n var tier = (options?.tier as string) ?? Simulation.rand.array(['1000', '2000', '3000'])[0];\n var amount = (options?.amount as number) ?? Simulation.rand.number(1, 24);\n var avatar = (options?.avatar as string) ?? Simulation.rand.array(Simulation.data.avatars)[0];\n var name = (options?.name as string) ?? Simulation.rand.array(Simulation.data.names.filter((e) => e.length))[0];\n var sender = (options?.sender as string) ?? Simulation.rand.array(Simulation.data.names.filter((e) => e.length && e !== name))[0];\n var message = (options?.message as string) ?? Simulation.rand.array(Simulation.data.messages.filter((e) => e.length))[0];\n\n var addons = {\n default: {\n avatar,\n tier,\n playedAsCommunityGift: false,\n },\n gift: {\n sender,\n gifted: true,\n } as Sponsor$gift,\n community: {\n message,\n sender,\n bulkGifted: true,\n } as Sponsor$community,\n spam: {\n sender,\n gifted: true,\n isCommunityGift: true,\n } as Sponsor$spam,\n };\n\n var subTypes = ['default', 'gift', 'community', 'spam'];\n var subType = (options?.subType as string) ?? Simulation.rand.array(subTypes)[0];\n\n subType = subTypes.includes(subType) ? subType : 'default';\n\n const event: Youtube$Sponsor = {\n listener: 'sponsor-latest',\n event: {\n amount,\n name: name.toLowerCase(),\n displayName: name,\n providerId: '',\n\n ...addons.default,\n ...addons[subType as keyof typeof addons],\n\n _id: Simulation.rand.uuid(),\n sessionTop: false,\n type: 'sponsor',\n originalEventName: 'sponsor-latest',\n },\n };\n\n return event;\n }\n }\n }\n }\n },\n },\n };\n\n static fields(settings: FieldSettings): Record<string, StreamElementsField> {\n const defaultOptions: NormalizedFieldSettings = {\n from: 'main',\n endsWith: [],\n ignore: [],\n replace: {},\n subgroup: false,\n template: '• {key}',\n subgroupTemplate: '★ {key}',\n settings: {\n types: [\n [['size', 'width', 'number', 'gap', 'duration'], 'number'],\n [['options', 'dropdown', 'weight'], 'dropdown'],\n [['range', 'radius'], 'slider'],\n [['color', 'background'], 'colorpicker'],\n [['font-family', 'font', 'family'], 'googleFont'],\n ],\n addons: [\n [['slider', 'radius'], { step: 1, min: 0, max: 'inherit' }],\n [['options', 'dropdown'], { options: {} }],\n [\n ['weight'],\n {\n options: {\n '100': 'Thin',\n '200': 'Extra Light',\n '300': 'Light',\n '400': 'Regular',\n '500': 'Medium',\n '600': 'Semi Bold',\n '700': 'Bold',\n '800': 'Extra Bold',\n '900': 'Black',\n },\n },\n ],\n ],\n transforms: [\n [['size', 'width', 'number', 'gap', 'duration'], (value) => parseFloat(String(value))],\n [['font-family', 'font', 'family'], (value) => value],\n [['range', 'radius'], (value) => parseFloat(String(value))],\n [['options', 'dropdown'], (value) => value],\n [['weight'], (value) => value],\n [['color', 'background'], (value) => value],\n ],\n labels: [\n [['font-size'], ' • In pixels'],\n [['font-radius'], ' • In pixels'],\n ],\n },\n };\n\n function normalizeFieldSettings(settings: FieldSettings): NormalizedFieldSettings {\n return {\n ...defaultOptions,\n ...settings,\n endsWith: Array.isArray(settings.endsWith) ? settings.endsWith : defaultOptions.endsWith,\n ignore: Array.isArray(settings.ignore) ? settings.ignore : defaultOptions.ignore,\n replace: { ...defaultOptions.replace, ...(settings.replace ?? {}) },\n settings: {\n types: Array.isArray(settings.settings?.types) ? settings.settings.types : defaultOptions.settings.types,\n addons: Array.isArray(settings.settings?.addons) ? settings.settings.addons : defaultOptions.settings.addons,\n transforms: Array.isArray(settings.settings?.transforms) ? settings.settings.transforms : defaultOptions.settings.transforms,\n labels: Array.isArray(settings.settings?.labels) ? settings.settings.labels : defaultOptions.settings.labels,\n },\n subgroup: settings.subgroup ?? defaultOptions.subgroup,\n template: settings.template ?? defaultOptions.template,\n subgroupTemplate: settings.subgroupTemplate ?? defaultOptions.subgroupTemplate,\n from: settings.from ?? defaultOptions.from,\n };\n }\n\n const options = normalizeFieldSettings(settings);\n\n const extractCssVariables = (): Record<string, string> => {\n return Array.from(document.styleSheets)\n .filter(({ href }) => !href || href.startsWith(window.location.origin))\n .reduce(\n (acc, { cssRules }) => {\n if (!cssRules) return acc;\n Array.from(cssRules).forEach((rule) => {\n if (rule instanceof CSSStyleRule && rule.selectorText === options.from && Array.from(rule.style).some((prop) => prop.startsWith('--'))) {\n Array.from(rule.style)\n .filter((prop) => prop.startsWith('--'))\n .forEach((prop) => {\n acc[prop] = rule.style.getPropertyValue(prop).trim();\n });\n }\n });\n return acc;\n },\n {} as Record<string, string>,\n );\n };\n\n const allVariables = extractCssVariables();\n\n const filteredVariables = Object.entries(allVariables)\n .filter(([name]) => options.endsWith.some((suffix) => name.toLowerCase().endsWith(suffix.toLowerCase()) && !name.includes('-options-')))\n .filter(([name]) => !options.ignore.some((ignoreName) => name.toLowerCase() === ignoreName.toLowerCase()))\n .reduce(\n (acc, [name, value]) => {\n acc[name.replace('--', '')] = String(options.replace?.[name] ?? value);\n return acc;\n },\n {} as Record<string, string | number>,\n );\n\n let usedSubgroups: string[] = [];\n\n const fields = Object.entries(filteredVariables).reduce(\n (fields, [name, value]) => {\n let type = options.settings.types.find(([names]) => names.some((n) => name.toLowerCase().includes(n)))?.[1] || 'text';\n\n let transform = options.settings.transforms.find(([names]) => names.some((n) => name.toLowerCase().includes(n)))?.[1] || ((v: any) => v);\n\n let labelAddon = options.settings.labels.find(([names]) => names.some((n) => name.toLowerCase().includes(n)))?.[1] || '';\n\n let fieldAddons: Record<string, any> = {\n type: 'text',\n label: labelAddon,\n ...(options.settings.addons.find(([names]) => names.some((n) => name.toLowerCase().includes(n)))?.[1] || {}),\n };\n\n (['min', 'max', 'step', 'label', 'type'] as const).forEach((addonKey) => {\n const addonValue = allVariables[`--${name}-${addonKey}`];\n if (addonValue && addonValue.length) {\n fieldAddons[addonKey] = isNaN(parseFloat(addonValue)) ? String(addonValue).replace(/^['\"]|['\"]$/g, '') : String(parseFloat(addonValue));\n }\n });\n\n let subgroupKey = name\n .replace(/-(size|color|weight|width|height|gap|duration|radius|amount)$/g, '')\n .replace(/-([a-z])/g, (_, c) => c.toUpperCase())\n .replace(/[A-Z]/g, ' $&')\n .toLowerCase()\n .trim();\n\n let matchingSubgroupVars = Object.keys(filteredVariables).filter((key) =>\n key.startsWith(subgroupKey.replace(/[A-Z]/g, '-$&').replaceAll(' ', '-').toLowerCase().slice(1)),\n );\n\n if (\n options.subgroup &&\n !fields[`${subgroupKey.replace(/[A-Z]/g, '-$&').replaceAll(' ', '-').toLowerCase().slice(1)}-subgroup`] &&\n matchingSubgroupVars.length > 1 &&\n !usedSubgroups.includes(name)\n ) {\n usedSubgroups.push(...matchingSubgroupVars);\n\n fields[`${subgroupKey.replace(/[A-Z]/g, '-$&').replaceAll(' ', '-').toLowerCase().slice(1)}-subgroup`] = {\n type: 'hidden',\n label: options.subgroupTemplate.replaceAll('{key}', Simulation.string.capitalize(subgroupKey)),\n };\n }\n\n let label = Simulation.string.capitalize(\n name\n .replace(/-([a-z])/g, (_, c) => c.toUpperCase())\n .replace(/[A-Z]/g, ' $&')\n .toLowerCase(),\n );\n\n value = transform(value) ?? value;\n\n const getCustomOptions = () => {\n const values = Object.entries(allVariables)\n .filter(([key]) => key.startsWith(`--${name}-options-`))\n .reduce(\n (acc, [key, value]) => {\n const optionLabel = key.replace(`--${name}-options-`, '');\n if (optionLabel)\n acc[String(value)] = Simulation.string.capitalize(\n optionLabel\n .replace(/-([a-z])/g, (_, c) => c.toUpperCase())\n .replace(/[A-Z]/g, ' $&')\n .toLowerCase(),\n );\n return acc;\n },\n {} as Record<string, string>,\n );\n return Object.keys(values).length ? values : null;\n };\n\n const customOptions = getCustomOptions();\n\n if (customOptions) {\n type = 'dropdown';\n fieldAddons.options = customOptions;\n value = String(value);\n }\n\n Object.entries(fieldAddons).forEach(([key, val]) => {\n if ([false, 'inherit', 'auto', null].includes(val)) fieldAddons[key] = value;\n });\n\n fields[name] = {\n type: (fieldAddons.type as StreamElementsFieldTypes) || type,\n label: options.template.toString().replaceAll('{key}', Simulation.string.capitalize(label) + fieldAddons.label),\n value,\n min: fieldAddons.min,\n max: fieldAddons.max,\n step: fieldAddons.step,\n options: fieldAddons.options,\n };\n\n return fields;\n },\n {} as Record<string, StreamElementsField>,\n );\n\n const errors = Object.entries(fields).reduce(\n (acc, [name, field]) => {\n const hasInvalidLabel = field?.label?.includes('undefined');\n const isInvalidValue = !['hidden', 'button'].includes(field.type) && field.value === undefined;\n if (hasInvalidLabel || isInvalidValue) acc[name] = field;\n return acc;\n },\n {} as Record<string, StreamElementsField>,\n );\n\n if (Object.keys(errors).length) {\n Tixyel.logger.error('Simulation.fields: Detected errors in generated fields:', errors);\n\n throw new Error('Error while processing fields');\n }\n\n return fields;\n }\n\n static async start() {\n const localFiles = {\n fields: ['fields.json', 'cf.json', 'field.json', 'customfields.json'].find((file) => {\n try {\n new URL('./' + file, window.location.href);\n return true;\n } catch (error) {\n return false;\n }\n }),\n data: ['data.json', 'fielddata.json', 'fd.json', 'DATA.json'].find((file) => {\n try {\n new URL('./' + file, window.location.href);\n return true;\n } catch (error) {\n return false;\n }\n }),\n };\n\n const data: Record<string, string | number | boolean> = await fetch('./' + (localFiles.data ?? 'data.json'), {\n cache: 'no-store',\n })\n .then((res) => res.json())\n .catch(() => ({}));\n\n await fetch('./' + (localFiles.fields ?? 'fields.json'), {\n cache: 'no-store',\n })\n .then((res) => res.json())\n .then(async (customfields: Record<string, StreamElementsField>) => {\n const fields = Object.entries(customfields)\n .filter(([_, { value }]) => value != undefined)\n .reduce(\n (acc, [key, { value }]) => {\n if (data && data[key] !== undefined) value = data[key];\n\n acc[key] = value;\n\n return acc;\n },\n {\n ...data,\n } as Record<string, StreamElementsFieldValue>,\n );\n\n const load = await Simulation.generate.event.onWidgetLoad(fields, await Simulation.generate.session.get());\n\n window.dispatchEvent(new CustomEvent('onWidgetLoad', { detail: load }));\n });\n }\n}\n","type LoggerThemeName = 'error' | 'success' | 'alert' | 'warn' | 'status' | 'received' | 'simple' | 'info';\n\ninterface LoggerTheme {\n name: LoggerThemeName;\n color?: string;\n background?: string;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n fontSize?: number;\n template?: {\n before?: string;\n after?: string;\n };\n}\n\ntype LoggerLogFunction = (...args: any[]) => void;\n\ntype LoggerMethods = Record<LoggerThemeName, LoggerLogFunction>;\n\nexport class Logger implements LoggerMethods {\n private readonly themes: LoggerTheme[] = [\n {\n name: 'error',\n color: '#721c24',\n background: '#f8d7da',\n bold: true,\n italic: false,\n fontSize: 18,\n template: { before: ' ✖ ', after: ' ' },\n },\n {\n name: 'success',\n color: '#155724',\n background: '#d4edda',\n bold: true,\n italic: false,\n fontSize: 18,\n template: { before: ' ✔ ', after: ' ' },\n },\n {\n name: 'alert',\n color: '#856404',\n background: '#fff3cd',\n bold: true,\n italic: false,\n fontSize: 20,\n template: { before: ' ⚠ ', after: ' ' },\n },\n {\n name: 'warn',\n color: '#856404',\n background: '#fff3cd',\n bold: true,\n italic: false,\n fontSize: 20,\n template: { before: ' ⚠ ', after: ' ' },\n },\n {\n name: 'status',\n color: '#0c5460',\n background: '#d1ecf1',\n bold: true,\n italic: false,\n fontSize: 12,\n template: { before: ' · ', after: '' },\n },\n {\n name: 'received',\n color: '#E6BBFF',\n background: 'transparent',\n bold: false,\n italic: false,\n fontSize: 14,\n template: { before: ' ⬇ ', after: '' },\n },\n {\n name: 'simple',\n color: '#f5c6cb',\n background: 'transparent',\n bold: false,\n italic: false,\n fontSize: 14,\n template: { before: '', after: '' },\n },\n {\n name: 'info',\n color: '#f6c6cb',\n background: 'transparent',\n bold: false,\n italic: false,\n fontSize: 14,\n template: { before: ' ℹ ', after: '' },\n },\n ];\n\n error: LoggerLogFunction = () => {};\n success: LoggerLogFunction = () => {};\n alert: LoggerLogFunction = () => {};\n warn: LoggerLogFunction = () => {};\n status: LoggerLogFunction = () => {};\n received: LoggerLogFunction = () => {};\n simple: LoggerLogFunction = () => {};\n info: LoggerLogFunction = () => {};\n\n constructor() {\n this.themes.forEach((theme) => {\n const styles: string[] = [];\n\n if (theme.background && theme.background !== 'transparent') styles.push(`background-color: ${theme.background}`);\n if (theme.color) styles.push(`color: ${theme.color}`);\n if (theme.bold) styles.push('font-weight: bold');\n if (theme.italic) styles.push('font-style: italic');\n if (theme.underline) styles.push('text-decoration: underline');\n if (theme.fontSize) styles.push(`font-size: ${theme.fontSize}px`);\n\n const signal = '%c';\n\n const logFn: LoggerLogFunction = (...args: any[]) => {\n const textContent = Array.from(args).filter((arg) => typeof arg === 'string' || typeof arg === 'number');\n const objectContent = Array.from(args).filter((arg) => typeof arg !== 'string' && typeof arg !== 'number');\n const css = textContent.length > 0 ? styles.join('; ') : null;\n\n const log: any[] = [\n textContent.length > 0 ? signal + (theme.template?.before ?? '') + textContent.join(' ') + (theme.template?.after ?? '') : null,\n css,\n ...objectContent,\n ].filter(Boolean);\n\n return console.log(...log);\n };\n\n this[theme.name] = logFn;\n });\n }\n}\n","import { Client } from '../client/index.js';\nimport { Tixyel } from '../index.js';\n\ninterface ButtonOptions {\n field: string | ((field: string, value: string | boolean | number) => boolean);\n template?: string;\n run: (field: string, value: string | boolean | number) => void;\n}\n\nexport class Button {\n field: ButtonOptions['field'] = 'button';\n\n template: string = 'button';\n\n run!: ButtonOptions['run'];\n\n constructor(options: ButtonOptions) {\n if (!(window.client instanceof Client)) return;\n\n this.field = options.field ?? this.field;\n this.template = options.template ?? this.template;\n\n this.run = options.run;\n\n // Register the button in the client actions\n window.client.actions.buttons.push(this);\n\n window.client.emit('action', this, 'created');\n }\n\n parse(field: string, value: string | boolean | number): Button {\n var f = field.replace(typeof this.field === 'string' ? this.field : (this.template.replace(/\\{[^}]*\\}/g, '') ?? ''), '').trim();\n\n try {\n this.run.apply(window.client, [f.length ? f : (field ?? field), value]);\n } catch (error) {\n throw new Error(`Error running button \"${this.field}\": ${error instanceof Error ? error.message : error}`);\n }\n\n return this;\n }\n\n static execute(field: string, value: string | boolean | number): boolean {\n try {\n if (!(window.client instanceof Client)) return false;\n\n if (window.client.actions.buttons.length) {\n const button = window.client.actions.buttons.find((b) =>\n typeof b.field === 'string' ? b.field === field : typeof b.field === 'function' ? b.field(field, value) : false,\n );\n\n if (button && button instanceof Button) {\n try {\n button.parse(field, value);\n window.client.emit('action', button, 'executed');\n\n Tixyel.logger.received(`Button executed: ${field} with value: ${value}`);\n } catch (error) {\n Tixyel.logger.error(`Error executing button \"${field}\": ${error instanceof Error ? error.message : error}`);\n }\n\n return true;\n }\n }\n } catch (error) {\n return false;\n } finally {\n return false;\n }\n }\n}\n","import { Client } from '../client/index.js';\nimport { Tixyel } from '../index.js';\nimport { Twitch$Message } from '../types/streamelements/events/twitch/message.js';\nimport { Youtube$Message } from '../types/streamelements/events/youtube/message.js';\n\ninterface CommandOptions {\n prefix?: string;\n name: string;\n description?: string;\n arguments?: boolean;\n run: () => void;\n test?: string;\n aliases?: string[];\n permissions?: string[];\n admins?: string[];\n}\n\ntype CommandEvent = { provider: 'twitch'; data: Twitch$Message } | { provider: 'youtube'; data: Youtube$Message } | { provider: 'kick'; data: any };\n\nexport class Command {\n prefix: string = '!';\n\n name!: string;\n description!: string;\n\n arguments: boolean = false;\n\n test: string = `${this.prefix}${this.name} arg1 arg2`;\n\n aliases: string[] = [];\n permissions?: string[] | boolean = undefined;\n admins: string[] = [];\n\n constructor(options: CommandOptions) {\n if (!(window.client instanceof Client)) return;\n\n this.prefix = options.prefix ?? this.prefix;\n this.name = options.name;\n this.description = options.description ?? this.description;\n this.arguments = options.arguments ?? this.arguments;\n\n this.run = options.run;\n\n this.test = options.test ?? this.test;\n this.aliases = options.aliases ?? this.aliases;\n this.permissions = options.permissions ?? this.permissions;\n this.admins = options.admins ?? this.admins;\n\n // Register the command in the client actions\n window.client.actions.commands.push(this);\n\n window.client.emit('action', this, 'created');\n }\n\n run(this: Client, args: string[], event: CommandEvent): void {}\n\n verify(nickname: string, roles: string[], args: string[]): boolean {\n if (this.arguments === true && (!args || !args.length)) {\n return false;\n }\n\n if (this.admins.some((a) => nickname.toLocaleLowerCase() === a.toLocaleLowerCase())) {\n return true;\n }\n\n if (this.permissions === true || typeof this.permissions === 'undefined' || (Array.isArray(this.permissions) && !this.permissions.length)) {\n return false;\n }\n\n if (Array.isArray(this.permissions) && this.permissions.some((p) => roles.map((r) => r.toLowerCase()).includes(p.toLowerCase()))) {\n return true;\n }\n\n return false;\n }\n\n parse(text: string, event: CommandEvent): boolean {\n if (!(window.client instanceof Client)) return false;\n\n const args = text\n .replace(this.prefix, '')\n .split(' ')\n .slice(1)\n .map((a) => a.trim());\n\n var nickname: string = '';\n var roles: string[] = [];\n\n const rAliases = { bits: 'cheer', premium: 'prime' };\n\n switch (event.provider) {\n case 'twitch': {\n const data = event.data;\n\n nickname = data.event.data.nick || data.event.data.displayName;\n\n if (data.event.data.tags?.badges) {\n const tags = data.event.data.tags.badges.toString().replace(/\\/\\d+/g, '').split(',');\n\n roles = tags.map((t) => (t in rAliases ? rAliases[t as keyof typeof rAliases] : t));\n }\n\n break;\n }\n case 'youtube': {\n const data = event.data;\n\n const rMap = {\n isVerified: 'verified',\n isChatOwner: 'owner',\n isChatSponsor: 'sponsor',\n isChatModerator: 'moderator',\n };\n\n nickname = data.event.data.nick || data.event.data.displayName;\n\n roles = Object.entries(data.event.data.authorDetails)\n .filter(([k, v]) => k.startsWith('is') && v)\n .map(([k]) => rMap[k as keyof typeof rMap])\n .filter(Boolean);\n\n break;\n }\n case 'kick': {\n return false;\n\n break;\n }\n }\n\n const verify = this.verify(nickname, roles, args);\n\n if (verify === true) {\n this.run.apply(window.client, [args, event]);\n }\n\n return verify;\n }\n\n static execute(received: CommandEvent): boolean {\n if (!(window.client instanceof Client)) return false;\n\n const data = received.data;\n\n try {\n if (window.client.actions.commands.length && window.client.actions.commands.some((c) => data.event.data.text.startsWith(c.prefix))) {\n const command = window.client.actions.commands.find((c) => data.event.data.text.replace(c.prefix, '').split(' ')[0] === c.name);\n\n if (command && command instanceof Command) {\n command.parse(data.event.data.text, received);\n\n window.client.emit('action', command, 'executed');\n\n Tixyel.logger.received(`Command executed: ${data.event.data.text} by ${data.event.data.nick || data.event.data.displayName}`, data);\n\n return true;\n }\n }\n } catch (error) {\n return false;\n } finally {\n return false;\n }\n }\n}\n","import { Button } from '../actions/button.js';\nimport { Command } from '../actions/command.js';\nimport { Simulation } from '../simulation/index.js';\nimport { ClientEvents, Provider } from '../types/client.js';\nimport { _storages } from '../utils/useStorage.js';\nimport { Client } from './index.js';\n\nwindow.addEventListener('load', () => {\n if (window.client instanceof Client) {\n Simulation.start();\n }\n});\n\nwindow.addEventListener('onWidgetLoad', async (data) => {\n const { detail } = data;\n\n if (window.client instanceof Client) {\n const client = window.client;\n\n client.fields = detail.fieldData;\n client.session = detail.session.data;\n\n client.details = {\n ...client.details,\n user: detail.channel,\n currency: detail.currency,\n overlay: detail.overlay,\n };\n\n if (detail.channel.id && !detail.emulated) {\n await fetch(`https://api.streamelements.com/kappa/v2/channels/${detail.channel.id}/`)\n .then((res) => res.json())\n .then((profile) => {\n if (profile.provider) {\n client.details.provider = profile.provider;\n\n return profile.provider;\n } else {\n client.details.provider = 'local';\n }\n })\n .catch(() => {\n client.details.provider = 'local';\n });\n } else {\n client.details.provider = 'local';\n }\n\n client.emit('load', detail);\n\n client.loaded = true;\n\n client.storage.on('load', () => {\n client.storage.add(`avatar.${detail.channel.providerId.toLowerCase()}`, {\n value: detail.channel.avatar,\n timestamp: Date.now(),\n expire: Date.now() + client.cache.avatar * 60 * 60 * 1000,\n });\n });\n }\n});\n\nwindow.addEventListener('onSessionUpdate', (data) => {\n const { detail } = data;\n\n if (window.client instanceof Client) {\n const client = window.client;\n\n client.session = detail.session;\n\n client.emit('session', detail.session);\n }\n});\n\nwindow.addEventListener('onEventReceived', ({ detail }) => {\n if (window.client instanceof Client) {\n var provider: Provider =\n // @ts-ignore\n detail.event?.provider || detail.event?.service || detail.event?.data?.provider || window.client.details.provider;\n\n const actAsStreamElements = ['kvstore:update', 'bot:counter', 'alertService:toggleSound', 'event:skip', 'tip-latest', 'event:test'];\n\n if (actAsStreamElements.some((l) => l === detail.listener)) provider = 'streamelements';\n\n const received = { provider: provider, data: detail } as ClientEvents;\n\n switch (received.provider) {\n case 'streamelements': {\n const data = received.data;\n\n switch (data.listener) {\n case 'tip-latest': {\n const event = data.event;\n break;\n }\n case 'event:skip': {\n const event = data.event;\n break;\n }\n case 'event:test': {\n switch (data.event.listener) {\n case 'widget-button': {\n const event = data.event;\n\n Button.execute(event.field, event.value);\n\n break;\n }\n case 'subscriber-latest': {\n const event = data.event;\n break;\n }\n\n // ... alot more\n }\n\n break;\n }\n case 'kvstore:update': {\n const event = data.event;\n\n if (_storages.length) {\n var storage = _storages.find((s) => s.id === event.data.key.replace('customWidget.', ''));\n\n if (storage) {\n storage.update(event.data.value);\n }\n }\n\n break;\n }\n case 'bot:counter': {\n const event = data.event;\n break;\n }\n case 'alertService:toggleSound': {\n const event = data.event;\n\n client.details.overlay.muted = Boolean(event.muted);\n\n break;\n }\n }\n\n break;\n }\n case 'twitch': {\n const data = received.data;\n\n switch (data.listener) {\n case 'delete-message': {\n const event = data.event;\n break;\n }\n case 'delete-messages': {\n const event = data.event;\n break;\n }\n case 'message': {\n const event = data.event;\n break;\n }\n case 'follower-latest': {\n const event = data.event;\n break;\n }\n case 'cheer-latest': {\n const event = data.event;\n break;\n }\n case 'subscriber-latest': {\n if (!data.event.gifted && !data.event.bulkGifted && !data.event.isCommunityGift) {\n // normal\n const event = data.event;\n } else if (data.event.gifted && !data.event.bulkGifted && !data.event.isCommunityGift) {\n // gift\n const event = data.event;\n } else if (data.event.gifted && !data.event.bulkGifted && data.event.isCommunityGift) {\n // community gift spam\n const event = data.event;\n } else if (!data.event.gifted && data.event.bulkGifted && !data.event.isCommunityGift) {\n // community gift\n const event = data.event;\n }\n\n break;\n }\n case 'raid-latest': {\n const event = data.event;\n break;\n }\n }\n\n break;\n }\n case 'youtube': {\n const data = received.data;\n\n switch (data.listener) {\n case 'message': {\n const event = data.event;\n\n Command.execute({ provider: 'youtube', data: data });\n\n break;\n }\n case 'subscriber-latest': {\n const event = data.event;\n\n break;\n }\n case 'sponsor-latest': {\n const event = data.event;\n\n if (!data.event.gifted && !data.event.bulkGifted && !data.event.isCommunityGift) {\n // normal\n const event = data.event;\n } else if (data.event.gifted && !data.event.bulkGifted && !data.event.isCommunityGift) {\n // gift\n const event = data.event;\n } else if (data.event.gifted && !data.event.bulkGifted && data.event.isCommunityGift) {\n // community gift spam\n const event = data.event;\n } else if (!data.event.gifted && data.event.bulkGifted && !data.event.isCommunityGift) {\n // community gift\n const event = data.event;\n }\n\n break;\n }\n case 'superchat-latest': {\n const event = data.event;\n\n break;\n }\n }\n\n break;\n }\n case 'kick': {\n const data = received.data;\n\n break;\n }\n case 'facebook': {\n const data = received.data;\n\n break;\n }\n }\n\n window.client.emit('event', received);\n }\n});\n","import { Client } from '../client/index.js';\nimport { Tixyel } from '../index.js';\nimport { EventProvider } from './EventProvider.js';\n\ntype QueueEvents<T> = {\n load: [];\n cancel: [];\n update: [queue: QueueItem<T>[], priorityQueue: QueueItem<T>[], history: QueueItem<T>[], timeouts: Array<ReturnType<typeof setTimeout>>];\n process: [item: QueueItem<T>, queue: useQueue<T>];\n};\n\ntype QueueProps = {\n isoDate: string;\n isLoop: boolean;\n isPriority: boolean;\n isImmediate: boolean;\n};\n\ntype QueueItem<T> = { value: T } & QueueProps;\n\ntype QueueProcessor<T> = (item: T, queue: useQueue<T>) => Promise<any>;\n\ninterface QueueOptions<T> {\n duration: number | boolean | undefined;\n processor: QueueProcessor<T>;\n}\n\nexport class useQueue<T> extends EventProvider<QueueEvents<T>> {\n queue: QueueItem<T>[] = [];\n priorityQueue: QueueItem<T>[] = [];\n history: QueueItem<T>[] = [];\n\n timeouts: Array<ReturnType<typeof setTimeout>> = [];\n\n running: boolean = false;\n duration: number | boolean | undefined = undefined;\n\n loaded: boolean = false;\n\n processor!: QueueProcessor<T>;\n\n constructor(options: QueueOptions<T>) {\n if (!(window.client instanceof Client)) return;\n\n super();\n\n this.duration = options.duration;\n this.processor = options.processor;\n\n window.client.on('load', () => {\n this.emit('load');\n\n this.loaded = true;\n });\n }\n\n enqueue(value: T, options: Partial<QueueProps> = {}): this {\n const item: QueueItem<T> = {\n isoDate: new Date().toISOString(),\n isLoop: options?.isLoop ?? false,\n isPriority: options?.isPriority ?? false,\n isImmediate: options?.isImmediate ?? false,\n value,\n };\n\n const hasItems = this.hasItems();\n\n if (item.isPriority && item.isImmediate) {\n this.cancel();\n this.priorityQueue.unshift(item);\n } else {\n const targetQueue = item.isPriority ? this.priorityQueue : this.queue;\n\n targetQueue.push(item);\n }\n\n // Always process immediately if it's not running\n if (this.running === false && hasItems === false) {\n this.run();\n }\n\n this.emit('update', this.queue, this.priorityQueue, this.history, this.timeouts);\n\n return this;\n }\n\n private async run() {\n if (!this.hasItems()) {\n this.running = false;\n return;\n }\n\n this.running = true;\n\n await this.next();\n\n if (typeof this.duration === 'number' && this.duration > 0) {\n this.timeouts.push(setTimeout(() => this.run(), this.duration));\n } else if (this.duration === 0 || this.duration === false) this.run();\n }\n\n private async next() {\n const nextItem = this.priorityQueue.length > 0 ? this.priorityQueue.shift() : this.queue.shift();\n\n if (!nextItem) {\n this.running = false;\n\n return;\n }\n\n try {\n await this.processor.apply(this, [nextItem.value, this]);\n\n this.emit('process', nextItem, this);\n } catch (error) {\n Tixyel.logger.error(`Error during item processing: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n this.history.push(nextItem);\n\n const targetQueue = nextItem.isPriority ? this.priorityQueue : this.queue;\n\n if (nextItem.isLoop) targetQueue.push(nextItem);\n }\n\n public resume() {\n this.cancel();\n\n if (this.hasItems()) this.run();\n\n return this;\n }\n\n public update(save: Partial<useQueue<T>>): this {\n this.queue = save.queue ?? this.queue;\n this.priorityQueue = save.priorityQueue ?? this.priorityQueue;\n this.history = save.history ?? this.history;\n\n if (this.hasItems() && this.running === false) {\n window.client?.on('load', () => this.run());\n }\n\n return this;\n }\n\n public cancel() {\n this.timeouts.forEach((timeout) => clearTimeout(timeout));\n this.timeouts = [];\n this.running = false;\n\n this.emit('cancel');\n }\n\n public hasItems(): boolean {\n return this.queue.length > 0 || this.priorityQueue.length > 0;\n }\n}\n","import { Client } from './client/index.js';\nimport { Simulation } from './simulation/index.js';\nimport { onEventReceivedEvent } from './types/streamelements/events/onEventReceived.js';\nimport { onSessionUpdateEvent } from './types/streamelements/events/onSessionUpdate.js';\nimport { onWidgetLoadEvent } from './types/streamelements/events/onWidgetLoad.js';\nimport { Logger } from './utils/Logger.js';\nimport './client/listener.js';\nimport { Button } from './actions/button.js';\nimport { Command } from './actions/command.js';\nimport { findEmotesInText, replaceEmotesWithHTML } from './utils/Message.js';\nimport { EventProvider } from './utils/EventProvider.js';\nimport { useStorage } from './utils/useStorage.js';\nimport { useQueue } from './utils/useQueue.js';\n\nexport * from './types/index.js';\n\nexport const Tixyel = {\n Client,\n Simulation,\n logger: new Logger(),\n utils: {\n findEmotesInText,\n replaceEmotesWithHTML,\n },\n modules: {\n Button,\n Command,\n EventProvider,\n useStorage,\n useQueue,\n },\n} as const;\n\ntype _Tixyel_ = {\n Client: typeof Client;\n Simulation: typeof Simulation;\n logger: Logger;\n utils: {\n findEmotesInText: typeof findEmotesInText;\n replaceEmotesWithHTML: typeof replaceEmotesWithHTML;\n };\n modules: {\n Button: typeof Button;\n Command: typeof Command;\n EventProvider: typeof EventProvider;\n useStorage: typeof useStorage;\n useQueue: typeof useQueue;\n };\n};\n\ndeclare global {\n interface Window {\n Tixyel: _Tixyel_;\n client: Client;\n }\n\n interface WindowEventMap {\n onWidgetLoad: onWidgetLoadEvent;\n onSessionUpdate: onSessionUpdateEvent;\n onEventReceived: onEventReceivedEvent;\n }\n\n var Tixyel: _Tixyel_;\n var client: Client;\n}\n\nif (typeof window !== 'undefined') {\n window.Tixyel = Tixyel;\n}\n"],"names":["EventProvider","eventName","args","listener","callback","listeners","fn","wrapper","_storages","useStorage","options","save","data","path","value","obj","keys","current","i","Client","Alejo$Pronouns","findEmotesInText","text","emotes","Simulation","result","emote","name","searchIndex","start","index","before","after","a","b","replaceEmotesWithHTML","imgUrl","generateBadges","badges","provider","e","max","_","badge","details","acc","key","_Simulation","settings","defaultOptions","normalizeFieldSettings","allVariables","href","cssRules","rule","prop","filteredVariables","suffix","ignoreName","usedSubgroups","fields","type","names","n","transform","fieldAddons","addonKey","addonValue","subgroupKey","c","matchingSubgroupVars","label","customOptions","values","optionLabel","val","errors","field","hasInvalidLabel","isInvalidValue","Tixyel","localFiles","file","res","customfields","load","opacity","color","hex","ohex","decimal","percentage","str","s","alpha","r","g","h","l","min","float","rand","threshold","length","chars","arr","rangeDays","past","string","pattern","promises","match","groups","promise","replacements","template","mergeSpanStyles","flatten","k","v","username","amount","REGEX","MODIFIERS","param","ALIASES","applyModifier","canonical","aliases","alias","use","replaceAll","fullMatch","modifier","newValue","parseModifiers","len","parseText","stopChar","out","parseModifier","paramStart","outerStyle","innerHTML","innerStyle","content","prefix","itemPath","types","available","generate","generateRecentData","config","items","generateObjectData","processedKey","processTypedConfig","session","subKey","subValue","currency","currencies","randomProvider","randomEvent","message","renderedText","userId","time","avatar","tier","sender","addons","subTypes","subType","muted","Logger","theme","styles","signal","logFn","textContent","arg","objectContent","css","log","Button","f","error","button","Command","event","nickname","roles","p","rAliases","t","rMap","verify","received","command","detail","client","profile","storage","useQueue","item","hasItems","nextItem","targetQueue","timeout"],"mappings":"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L,8EAA8E,KAAKA,CAAC,EAC/E,OAIP,CACE,YACA,eACA,OACA,aACA,QACA,QACA,SACA,QACA,iBACA,OACA,aACA,QACA,YACA,YACA,aACA,YACA,QACA,iBACA,WACA,UACA,OACA,WACA,WACA,gBACA,WACA,YACA,WACA,YACA,cACA,iBACA,aACA,aACA,UACA,aACA,eACA,gBACA,gBACA,gBACA,gBACA,aACA,WACA,cACA,UACA,UACA,aACA,YACA,cACA,cACA,UACA,YACA,aACA,OACA,YACA,OACA,QACA,cACA,OACA,WACA,UACA,YACA,SACA,QACA,QACA,WACA,gBACA,YACA,eACA,YACA,aACA,YACA,uBACA,YACA,aACA,YACA,YACA,cACA,gBACA,eACA,iBACA,iBACA,iBACA,cACA,OACA,YACA,QACA,UACA,SACA,mBACA,aACA,eACA,eACA,iBACA,kBACA,oBACA,kBACA,kBACA,eACA,YACA,YACA,WACA,cACA,OACA,UACA,QACA,YACA,SACA,YACA,SACA,gBACA,YACA,gBACA,gBACA,aACA,YACA,OACA,OACA,OACA,aACA,SACA,gBACA,MACA,YACA,YACA,cACA,SACA,aACA,WACA,WACA,SACA,SACA,UACA,YACA,YACA,YACA,OACA,cACA,YACA,MACA,OACA,UACA,SACA,YACA,SACA,QACA,QACA,aACA,SACA,cACA,aAAA,EACA,SAASA,EAAE,YAAA,CAAa,EAEnB,iBAGF,EACT,CAAA,EAGF9C,EAAO,KAAO,CACZ,MAAMc,EAA4E,MAAe,CAC/F,OAAQA,EAAA,CACN,QACA,IAAK,MACH,MAAO,IAAI,KAAK,MAAM,KAAK,SAAW,QAAQ,EAC3C,SAAS,EAAE,EACX,SAAS,EAAG,GAAG,CAAC,GAErB,IAAK,OAAQ,CACX,MAAM2B,EAAM,IAAI,KAAK,MAAM,KAAK,OAAA,EAAW,QAAQ,EAChD,SAAS,EAAE,EACX,SAAS,EAAG,GAAG,CAAC,GAEbM,EAAQ,KAAK,MAAM,KAAK,OAAA,EAAW,GAAG,EACzC,SAAS,EAAE,EACX,SAAS,EAAG,GAAG,EAElB,OAA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"}