@allior/wmake-streamelements-events 0.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.
- package/README.md +46 -0
- package/README_RU.md +46 -0
- package/dist/react/hooks/index.d.ts +4 -0
- package/dist/react/hooks/index.d.ts.map +1 -0
- package/dist/react/hooks/use-event-listener.d.ts +4 -0
- package/dist/react/hooks/use-event-listener.d.ts.map +1 -0
- package/dist/react/hooks/use-on-event-received.d.ts +44 -0
- package/dist/react/hooks/use-on-event-received.d.ts.map +1 -0
- package/dist/react/hooks/use-on-widget-load.d.ts +4 -0
- package/dist/react/hooks/use-on-widget-load.d.ts.map +1 -0
- package/dist/react/index.d.ts +4 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.iife.js +2 -0
- package/dist/react/index.iife.js.map +1 -0
- package/dist/react/index.js +179 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/types/index.d.ts +2 -0
- package/dist/react/types/index.d.ts.map +1 -0
- package/dist/react/types/window-events.d.ts +3 -0
- package/dist/react/types/window-events.d.ts.map +1 -0
- package/dist/root/aggregate.d.ts +12 -0
- package/dist/root/aggregate.d.ts.map +1 -0
- package/dist/root/classifier.d.ts +9 -0
- package/dist/root/classifier.d.ts.map +1 -0
- package/dist/root/commands.d.ts +9 -0
- package/dist/root/commands.d.ts.map +1 -0
- package/dist/root/data/event-detail.d.ts +10 -0
- package/dist/root/data/event-detail.d.ts.map +1 -0
- package/dist/root/data/field-value.d.ts +3 -0
- package/dist/root/data/field-value.d.ts.map +1 -0
- package/dist/root/data/index.d.ts +3 -0
- package/dist/root/data/index.d.ts.map +1 -0
- package/dist/root/data/widget-load.d.ts +5 -0
- package/dist/root/data/widget-load.d.ts.map +1 -0
- package/dist/root/index.d.ts +10 -0
- package/dist/root/index.d.ts.map +1 -0
- package/dist/root/index.iife.js +2 -0
- package/dist/root/index.iife.js.map +1 -0
- package/dist/root/index.js +2692 -0
- package/dist/root/index.js.map +1 -0
- package/dist/root/keys.d.ts +6 -0
- package/dist/root/keys.d.ts.map +1 -0
- package/dist/root/message/event.d.ts +7 -0
- package/dist/root/message/event.d.ts.map +1 -0
- package/dist/root/message/index.d.ts +5 -0
- package/dist/root/message/index.d.ts.map +1 -0
- package/dist/root/message/message.d.ts +37 -0
- package/dist/root/message/message.d.ts.map +1 -0
- package/dist/root/message/roles.d.ts +4 -0
- package/dist/root/message/roles.d.ts.map +1 -0
- package/dist/root/message/tags.d.ts +69 -0
- package/dist/root/message/tags.d.ts.map +1 -0
- package/dist/root/sources/alerts.d.ts +162 -0
- package/dist/root/sources/alerts.d.ts.map +1 -0
- package/dist/root/sources/index.d.ts +5 -0
- package/dist/root/sources/index.d.ts.map +1 -0
- package/dist/root/sources/messages.d.ts +963 -0
- package/dist/root/sources/messages.d.ts.map +1 -0
- package/dist/root/sources/on-widget-load-detail.d.ts +542 -0
- package/dist/root/sources/on-widget-load-detail.d.ts.map +1 -0
- package/dist/root/types/index.d.ts +3 -0
- package/dist/root/types/index.d.ts.map +1 -0
- package/dist/root/types/on-event-received.d.ts +170 -0
- package/dist/root/types/on-event-received.d.ts.map +1 -0
- package/dist/root/types/on-widget-load.d.ts +135 -0
- package/dist/root/types/on-widget-load.d.ts.map +1 -0
- package/dist/root/window-event-map.d.ts +10 -0
- package/dist/root/window-event-map.d.ts.map +1 -0
- package/package.json +48 -0
- package/src/react/hooks/index.ts +3 -0
- package/src/react/hooks/use-event-listener.ts +17 -0
- package/src/react/hooks/use-on-event-received.ts +206 -0
- package/src/react/hooks/use-on-widget-load.ts +15 -0
- package/src/react/index.ts +3 -0
- package/src/react/types/index.ts +1 -0
- package/src/react/types/window-events.ts +6 -0
- package/src/root/aggregate.ts +258 -0
- package/src/root/classifier.ts +208 -0
- package/src/root/commands.ts +33 -0
- package/src/root/data/event-detail.ts +14 -0
- package/src/root/data/field-value.ts +2 -0
- package/src/root/data/index.ts +2 -0
- package/src/root/data/widget-load.ts +5 -0
- package/src/root/index.ts +9 -0
- package/src/root/keys.ts +14 -0
- package/src/root/message/event.ts +7 -0
- package/src/root/message/index.ts +4 -0
- package/src/root/message/message.ts +40 -0
- package/src/root/message/roles.ts +43 -0
- package/src/root/message/tags.ts +119 -0
- package/src/root/sources/alerts.ts +163 -0
- package/src/root/sources/index.ts +5 -0
- package/src/root/sources/messages.ts +1245 -0
- package/src/root/sources/on-widget-load-detail.ts +969 -0
- package/src/root/types/index.ts +2 -0
- package/src/root/types/on-event-received.ts +198 -0
- package/src/root/types/on-widget-load.ts +171 -0
- package/src/root/window-event-map.ts +11 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.iife.js","sources":["../../src/root/classifier.ts","../../src/root/aggregate.ts","../../src/root/sources/on-widget-load-detail.ts","../../src/root/sources/alerts.ts","../../src/root/sources/messages.ts","../../src/root/commands.ts","../../src/root/keys.ts","../../src/root/message/tags.ts","../../src/root/message/roles.ts"],"sourcesContent":["/**\r\n * Shared classification and tier parsing for Twitch/StreamElements subscription events.\r\n * Used by aggregate normalizer.\r\n */\r\n\r\nimport type {\r\n IncomingDetail,\r\n TierInfo,\r\n ClassifiedEvent,\r\n} from \"./types/on-event-received.js\";\r\n\r\nexport function parseTier(raw: string | number | null | undefined): TierInfo {\r\n if (raw == null) return { tier: 0, tierText: \"\" };\r\n const tierText = typeof raw === \"string\" ? raw : String(raw);\r\n const num = parseInt(tierText, 10);\r\n if (isNaN(num)) return { tier: 0, tierText };\r\n const tier = num >= 3000 ? 3 : num >= 2000 ? 2 : num >= 1000 ? 1 : 0;\r\n return { tier, tierText };\r\n}\r\n\r\nexport function getCacheKey(detail: IncomingDetail): string {\r\n const listener = detail.listener;\r\n const event = detail.event ?? {};\r\n const ag = event.activityGroup;\r\n const aid = event.activityId ?? event._id;\r\n if (ag) return String(ag);\r\n if (aid) return String(aid);\r\n if (listener === \"subscriber-latest\" && event.bulkGifted) {\r\n return (\r\n \"sl-bulk-\" +\r\n (event.sender ?? \"\") +\r\n \"-\" +\r\n (event.amount ?? \"\") +\r\n \"-\" +\r\n (event.tier ?? \"\") +\r\n \"-\" +\r\n (event._id ?? \"\")\r\n );\r\n }\r\n return \"sl-\" + (event._id ?? event.activityId ?? \"\");\r\n}\r\n\r\nexport function classifyEvent(detail: IncomingDetail): ClassifiedEvent | null {\r\n const listener = detail.listener;\r\n const event = detail.event ?? {};\r\n const data = (event.data ?? event) as Record<string, unknown>;\r\n const tierInfo = parseTier(\r\n (data.tier ?? event.tier) as string | number | undefined,\r\n );\r\n\r\n if (listener === \"event\") {\r\n if (event.type === \"communityGiftPurchase\") {\r\n const isAnon =\r\n (data.username &&\r\n String(data.username).toLowerCase() === \"anonymous\") ||\r\n data.sender === \"Anonymous\";\r\n return {\r\n type: isAnon ? \"community-gift-anonymous\" : \"community-gift\",\r\n tier: tierInfo.tier,\r\n tierText: tierInfo.tierText,\r\n totalAmount: parseInt(String(data.amount), 10) || 1,\r\n recipients: [],\r\n sender: isAnon\r\n ? undefined\r\n : ((data.sender ?? data.displayName ?? data.username) as string),\r\n anonymousDisplayName: isAnon\r\n ? ((data.displayName as string) ?? \"Anonymous\")\r\n : undefined,\r\n };\r\n }\r\n if (event.type === \"subscriber\") {\r\n const gifted = data.gifted === true;\r\n const sender = data.sender as string | undefined;\r\n const amount = parseInt(String(data.amount), 10) || 1;\r\n const username = (data.username ?? data.displayName) as\r\n | string\r\n | undefined;\r\n const activityGroup = event.activityGroup as string | undefined;\r\n\r\n if (sender === \"Anonymous\" && activityGroup) {\r\n return {\r\n type: \"community-gift-anonymous\",\r\n _role: \"recipient\",\r\n activityGroup,\r\n recipient: (username ?? data.displayName) as string,\r\n tier: tierInfo.tier,\r\n tierText: tierInfo.tierText,\r\n };\r\n }\r\n if (gifted && sender && sender !== \"Anonymous\") {\r\n const isCommunity =\r\n data.communityGifted === true ||\r\n (activityGroup != null && activityGroup !== \"\");\r\n if (!isCommunity) {\r\n const firstGift =\r\n String(data.message ?? \"\").indexOf(\"first Gift Sub\") !== -1;\r\n return {\r\n type: \"solo-sub-to-someone\",\r\n sender,\r\n recipient: (username ?? data.displayName) as string,\r\n tier: tierInfo.tier,\r\n tierText: tierInfo.tierText,\r\n firstGiftInChannel: firstGift,\r\n };\r\n }\r\n return {\r\n type: \"community-gift\",\r\n _role: \"recipient\",\r\n activityGroup: activityGroup!,\r\n recipient: (username ?? data.displayName) as string,\r\n tier: tierInfo.tier,\r\n tierText: tierInfo.tierText,\r\n };\r\n }\r\n if (!gifted && amount > 1) {\r\n return {\r\n type: \"sub-renewal\",\r\n name: (username ?? data.displayName) as string,\r\n months: amount,\r\n tier: tierInfo.tier,\r\n tierText: tierInfo.tierText,\r\n };\r\n }\r\n if (!gifted && amount === 1) {\r\n return {\r\n type: \"self-sub\",\r\n name: (username ?? data.displayName) as string,\r\n tier: tierInfo.tier,\r\n tierText: tierInfo.tierText,\r\n };\r\n }\r\n if (activityGroup) {\r\n return {\r\n type: \"community-gift\",\r\n _role: \"recipient\",\r\n activityGroup,\r\n recipient: (username ?? data.displayName) as string,\r\n tier: tierInfo.tier,\r\n tierText: tierInfo.tierText,\r\n };\r\n }\r\n return null;\r\n }\r\n return null;\r\n }\r\n\r\n if (listener === \"subscriber-latest\") {\r\n const bulkGifted = event.bulkGifted === true;\r\n const sender = event.sender as string | undefined;\r\n const name = event.name as string | undefined;\r\n const amount = parseInt(String(event.amount), 10) || 1;\r\n const gifted = event.gifted === true;\r\n const isCommunityGift =\r\n event.isCommunityGift === true || event.communityGifted === true;\r\n\r\n if (bulkGifted && sender === \"Anonymous\") {\r\n return {\r\n type: \"community-gift-anonymous\",\r\n tier: tierInfo.tier,\r\n tierText: tierInfo.tierText,\r\n totalAmount: amount,\r\n recipients: [],\r\n };\r\n }\r\n if (bulkGifted && sender) {\r\n return {\r\n type: \"community-gift\",\r\n sender,\r\n tier: tierInfo.tier,\r\n tierText: tierInfo.tierText,\r\n totalAmount: amount,\r\n recipients: [],\r\n };\r\n }\r\n if (gifted && !isCommunityGift && sender) {\r\n const firstGift =\r\n String(event.message ?? \"\").indexOf(\"first Gift Sub\") !== -1;\r\n return {\r\n type: \"solo-sub-to-someone\",\r\n sender,\r\n recipient: name ?? \"\",\r\n tier: tierInfo.tier,\r\n tierText: tierInfo.tierText,\r\n firstGiftInChannel: firstGift,\r\n };\r\n }\r\n if (!gifted && amount > 1) {\r\n return {\r\n type: \"sub-renewal\",\r\n name: name ?? \"\",\r\n months: amount,\r\n tier: tierInfo.tier,\r\n tierText: tierInfo.tierText,\r\n };\r\n }\r\n if (!gifted && amount === 1 && (sender == null || name === sender)) {\r\n return {\r\n type: \"self-sub\",\r\n name: name ?? \"\",\r\n tier: tierInfo.tier,\r\n tierText: tierInfo.tierText,\r\n };\r\n }\r\n return null;\r\n }\r\n\r\n return null;\r\n}\r\n","/**\r\n * Event normalizer — aggregate mode: buffer events by activityGroup,\r\n * merge into one normalized event per action (timeout 2.5s).\r\n */\r\n\r\nimport { classifyEvent, getCacheKey } from \"./classifier.js\";\r\nimport type {\r\n IncomingDetail,\r\n NormalizerOptions,\r\n CacheSubsByType,\r\n ClassifiedEvent,\r\n} from \"./types/on-event-received.js\";\r\n\r\nconst AGGREGATE_TIMEOUT_MS = 2500;\r\n\r\ninterface BufferEntry {\r\n type: string;\r\n subscribers: Array<{\r\n recipient?: string;\r\n username?: string;\r\n name?: string;\r\n sender?: string;\r\n }>;\r\n tier: number;\r\n tierText: string;\r\n totalAmount: number;\r\n purchase?: ClassifiedEvent;\r\n sender?: string;\r\n}\r\n\r\nconst bufferByGroup: Record<string, BufferEntry> = {};\r\nconst bufferTimers: Record<string, ReturnType<typeof setTimeout>> = {};\r\n\r\nfunction getCacheForType(\r\n cacheSubs: CacheSubsByType | undefined,\r\n type: string,\r\n): {\r\n _has: (k: string) => boolean;\r\n _set: (k: string, v: boolean) => void;\r\n} | null {\r\n if (!cacheSubs) return null;\r\n if (\r\n typeof cacheSubs._has === \"function\" &&\r\n typeof cacheSubs._set === \"function\"\r\n ) {\r\n return cacheSubs as unknown as {\r\n _has: (k: string) => boolean;\r\n _set: (k: string, v: boolean) => void;\r\n };\r\n }\r\n const c = cacheSubs[type];\r\n return c && typeof (c as { _has?: unknown })._has === \"function\"\r\n ? (c as {\r\n _has: (k: string) => boolean;\r\n _set: (k: string, v: boolean) => void;\r\n })\r\n : null;\r\n}\r\n\r\nfunction emitAggregated(\r\n groupKey: string,\r\n merged: Record<string, unknown>,\r\n cacheSubs: CacheSubsByType | undefined,\r\n onNormalized: (event: ClassifiedEvent | null) => void,\r\n): void {\r\n const cache = getCacheForType(cacheSubs, merged.type as string);\r\n if (cache && cache._has(groupKey)) return;\r\n if (cache) cache._set(groupKey, true);\r\n onNormalized(merged as ClassifiedEvent);\r\n}\r\n\r\nfunction flushBuffer(\r\n groupKey: string,\r\n cacheSubs: CacheSubsByType | undefined,\r\n onNormalized: (event: ClassifiedEvent | null) => void,\r\n broadcaster: string,\r\n): void {\r\n const buf = bufferByGroup[groupKey];\r\n if (!buf) return;\r\n delete bufferByGroup[groupKey];\r\n if (bufferTimers[groupKey]) {\r\n clearTimeout(bufferTimers[groupKey]);\r\n delete bufferTimers[groupKey];\r\n }\r\n const purchase = buf.purchase as Record<string, unknown> | undefined;\r\n const subscribers = buf.subscribers ?? [];\r\n const type = buf.type;\r\n const tier = buf.tier;\r\n const tierText = buf.tierText;\r\n const totalAmount = buf.totalAmount ?? subscribers.length;\r\n const recipients = subscribers\r\n .map((s) => s.recipient ?? s.username ?? s.name)\r\n .filter(Boolean) as string[];\r\n const firstSub = subscribers[0];\r\n const senderFromSub = firstSub?.sender;\r\n const sender = purchase?.sender ?? buf.sender ?? senderFromSub;\r\n if (type === \"community-gift\" && broadcaster && sender === broadcaster) {\r\n return;\r\n }\r\n if (type === \"community-gift-anonymous\") {\r\n emitAggregated(\r\n groupKey,\r\n {\r\n type: \"community-gift-anonymous\",\r\n tier,\r\n tierText,\r\n totalAmount,\r\n recipients,\r\n anonymousDisplayName: purchase?.anonymousDisplayName,\r\n },\r\n cacheSubs,\r\n onNormalized,\r\n );\r\n } else {\r\n emitAggregated(\r\n groupKey,\r\n {\r\n type: \"community-gift\",\r\n sender,\r\n tier,\r\n tierText,\r\n totalAmount,\r\n recipients,\r\n },\r\n cacheSubs,\r\n onNormalized,\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Normalizes an incoming subscription event (StreamElements/Twitch).\r\n * Buffers community-gift recipients by activityGroup, then emits one normalized event per group.\r\n * For self-sub, solo-sub, sub-renewal emits immediately (with optional cache dedup).\r\n */\r\nexport function normalizeIncomingEvent(\r\n detail: IncomingDetail,\r\n options: NormalizerOptions | undefined,\r\n onNormalized: (event: ClassifiedEvent | null) => void,\r\n): void {\r\n const cacheSubs = options?.cacheSubs;\r\n const broadcaster = options?.broadcasterLogin ?? \"\";\r\n\r\n const classified = classifyEvent(detail);\r\n if (!classified) {\r\n onNormalized(null);\r\n return;\r\n }\r\n\r\n const cache = getCacheForType(cacheSubs, classified.type);\r\n const cacheKey = getCacheKey(detail);\r\n const event = detail.event ?? {};\r\n const data = (event.data ?? event) as Record<string, unknown>;\r\n\r\n if ((classified as Record<string, unknown>)._role === \"recipient\") {\r\n const ag =\r\n ((classified as Record<string, unknown>).activityGroup as string) ??\r\n cacheKey;\r\n if (!bufferByGroup[ag]) {\r\n bufferByGroup[ag] = {\r\n type: classified.type,\r\n subscribers: [],\r\n tier: classified.tier,\r\n tierText: classified.tierText,\r\n totalAmount: 0,\r\n };\r\n }\r\n if (bufferTimers[ag]) clearTimeout(bufferTimers[ag]);\r\n bufferTimers[ag] = setTimeout(() => {\r\n flushBuffer(ag, cacheSubs, onNormalized, broadcaster);\r\n }, AGGREGATE_TIMEOUT_MS);\r\n bufferByGroup[ag].subscribers.push({\r\n recipient: (classified as Record<string, unknown>).recipient as string,\r\n username: data.username as string,\r\n name: data.displayName as string,\r\n sender: data.sender as string,\r\n });\r\n if (bufferByGroup[ag].totalAmount === 0) bufferByGroup[ag].totalAmount = 1;\r\n return;\r\n }\r\n\r\n if (\r\n classified.type === \"community-gift-anonymous\" ||\r\n classified.type === \"community-gift\"\r\n ) {\r\n const isPurchase =\r\n detail.listener === \"event\" && event.type === \"communityGiftPurchase\";\r\n if (isPurchase) {\r\n const ag = (event.activityGroup ??\r\n (data && data.activityGroup) ??\r\n cacheKey) as string;\r\n if (!bufferByGroup[ag]) {\r\n bufferByGroup[ag] = {\r\n type: classified.type,\r\n purchase: classified,\r\n subscribers: [],\r\n tier: classified.tier,\r\n tierText: classified.tierText,\r\n totalAmount:\r\n Number((classified as Record<string, unknown>).totalAmount) || 0,\r\n sender: (classified as Record<string, unknown>).sender as string,\r\n };\r\n bufferTimers[ag] = setTimeout(() => {\r\n flushBuffer(ag, cacheSubs, onNormalized, broadcaster);\r\n }, AGGREGATE_TIMEOUT_MS);\r\n } else {\r\n bufferByGroup[ag].purchase = classified;\r\n bufferByGroup[ag].tier = classified.tier;\r\n bufferByGroup[ag].tierText = classified.tierText;\r\n bufferByGroup[ag].totalAmount =\r\n ((classified as Record<string, unknown>).totalAmount as number) ??\r\n bufferByGroup[ag].totalAmount;\r\n bufferByGroup[ag].sender = (classified as Record<string, unknown>)\r\n .sender as string;\r\n if (bufferTimers[ag]) clearTimeout(bufferTimers[ag]);\r\n bufferTimers[ag] = setTimeout(() => {\r\n flushBuffer(ag, cacheSubs, onNormalized, broadcaster);\r\n }, AGGREGATE_TIMEOUT_MS);\r\n }\r\n return;\r\n }\r\n if (detail.listener === \"subscriber-latest\") {\r\n const c = classified as Record<string, unknown>;\r\n if (\r\n classified.type === \"community-gift\" &&\r\n broadcaster &&\r\n c.sender === broadcaster\r\n ) {\r\n onNormalized(null);\r\n return;\r\n }\r\n return;\r\n }\r\n return;\r\n }\r\n\r\n if (\r\n classified.type === \"self-sub\" ||\r\n classified.type === \"solo-sub-to-someone\" ||\r\n classified.type === \"sub-renewal\"\r\n ) {\r\n if (cache?._has(cacheKey)) {\r\n onNormalized(null);\r\n return;\r\n }\r\n if (cache) cache._set(cacheKey, true);\r\n const c = classified as Record<string, unknown>;\r\n if (\r\n classified.type === \"solo-sub-to-someone\" &&\r\n broadcaster &&\r\n c.sender === broadcaster\r\n ) {\r\n onNormalized(null);\r\n return;\r\n }\r\n onNormalized(classified);\r\n }\r\n}\r\n","export default {\r\n session: {\r\n data: {\r\n \"follower-latest\": {\r\n name: \"imacanadiannn\",\r\n },\r\n \"follower-session\": {\r\n count: 0,\r\n },\r\n \"follower-week\": {\r\n count: 0,\r\n },\r\n \"follower-month\": {\r\n count: 0,\r\n },\r\n \"follower-goal\": {\r\n amount: 137,\r\n },\r\n \"follower-total\": {\r\n count: 118,\r\n activityId: \"\",\r\n sessionTop: false,\r\n },\r\n \"subscriber-latest\": {\r\n name: \"\",\r\n amount: 0,\r\n tier: \"\",\r\n message: \"\",\r\n },\r\n \"subscriber-new-latest\": {\r\n name: \"\",\r\n amount: 0,\r\n message: \"\",\r\n },\r\n \"subscriber-resub-latest\": {\r\n name: \"\",\r\n amount: 0,\r\n message: \"\",\r\n },\r\n \"subscriber-gifted-latest\": {\r\n name: \"\",\r\n amount: 0,\r\n message: \"\",\r\n tier: \"\",\r\n sender: \"\",\r\n },\r\n \"subscriber-session\": {\r\n count: 0,\r\n },\r\n \"subscriber-new-session\": {\r\n count: 0,\r\n },\r\n \"subscriber-resub-session\": {\r\n count: 0,\r\n },\r\n \"subscriber-gifted-session\": {\r\n count: 0,\r\n },\r\n \"subscriber-week\": {\r\n count: 0,\r\n },\r\n \"subscriber-month\": {\r\n count: 0,\r\n },\r\n \"subscriber-goal\": {\r\n amount: 0,\r\n },\r\n \"subscriber-total\": {\r\n count: 0,\r\n activityId: \"\",\r\n sessionTop: false,\r\n },\r\n \"subscriber-points\": {\r\n amount: 0,\r\n activityId: \"\",\r\n sessionTop: false,\r\n },\r\n \"subscriber-alltime-gifter\": {\r\n name: \"\",\r\n amount: 0,\r\n },\r\n \"host-latest\": {\r\n name: \"\",\r\n amount: 0,\r\n },\r\n \"raid-latest\": {\r\n name: \"agnascor2\",\r\n amount: 6,\r\n },\r\n \"cheer-session\": {\r\n amount: 0,\r\n },\r\n \"cheer-week\": {\r\n amount: 0,\r\n },\r\n \"cheer-month\": {\r\n amount: 0,\r\n },\r\n \"cheer-total\": {\r\n amount: 0,\r\n },\r\n \"cheer-count\": {\r\n count: 0,\r\n },\r\n \"cheer-goal\": {\r\n amount: 0,\r\n },\r\n \"cheer-latest\": {\r\n name: \"\",\r\n amount: 0,\r\n },\r\n \"cheer-session-top-donation\": {\r\n amount: 0,\r\n name: \"\",\r\n },\r\n \"cheer-weekly-top-donation\": {\r\n amount: 0,\r\n name: \"\",\r\n },\r\n \"cheer-monthly-top-donation\": {\r\n amount: 0,\r\n name: \"\",\r\n },\r\n \"cheer-alltime-top-donation\": {\r\n amount: 0,\r\n name: \"\",\r\n },\r\n \"cheer-session-top-donator\": {\r\n amount: 0,\r\n name: \"\",\r\n },\r\n \"cheer-weekly-top-donator\": {\r\n amount: 0,\r\n name: \"\",\r\n },\r\n \"cheer-monthly-top-donator\": {\r\n amount: 0,\r\n name: \"\",\r\n },\r\n \"cheer-alltime-top-donator\": {\r\n amount: 0,\r\n name: \"\",\r\n },\r\n \"tip-latest\": {\r\n name: \"\",\r\n amount: 0,\r\n },\r\n \"tip-session-top-donation\": {\r\n amount: 0,\r\n name: \"\",\r\n },\r\n \"tip-weekly-top-donation\": {\r\n name: \"\",\r\n amount: 0,\r\n },\r\n \"tip-monthly-top-donation\": {\r\n name: \"\",\r\n amount: 0,\r\n },\r\n \"tip-alltime-top-donation\": {\r\n name: \"\",\r\n amount: 0,\r\n },\r\n \"tip-session-top-donator\": {\r\n amount: 0,\r\n name: \"\",\r\n },\r\n \"tip-weekly-top-donator\": {\r\n name: \"\",\r\n amount: 0,\r\n },\r\n \"tip-monthly-top-donator\": {\r\n name: \"\",\r\n amount: 0,\r\n },\r\n \"tip-alltime-top-donator\": {\r\n name: \"\",\r\n amount: 0,\r\n },\r\n \"tip-session\": {\r\n amount: 0,\r\n },\r\n \"tip-week\": {\r\n amount: 0,\r\n },\r\n \"tip-month\": {\r\n amount: 0,\r\n },\r\n \"tip-total\": {\r\n amount: 0,\r\n },\r\n \"tip-count\": {\r\n count: 0,\r\n },\r\n \"tip-goal\": {\r\n amount: 0,\r\n },\r\n \"merch-goal-orders\": {\r\n amount: 0,\r\n },\r\n \"merch-goal-items\": {\r\n amount: 0,\r\n },\r\n \"merch-goal-total\": {\r\n amount: 0,\r\n },\r\n \"merch-latest\": {\r\n name: \"\",\r\n amount: 0,\r\n items: [],\r\n },\r\n \"charityCampaignDonation-latest\": {\r\n name: \"\",\r\n amount: 0,\r\n },\r\n \"charityCampaignDonation-weekly-top-donation\": {\r\n name: \"\",\r\n amount: 0,\r\n },\r\n \"charityCampaignDonation-monthly-top-donation\": {\r\n name: \"\",\r\n amount: 0,\r\n },\r\n \"charityCampaignDonation-alltime-top-donation\": {\r\n name: \"\",\r\n amount: 0,\r\n },\r\n \"charityCampaignDonation-weekly-top-donator\": {\r\n name: \"\",\r\n amount: 0,\r\n },\r\n \"charityCampaignDonation-monthly-top-donator\": {\r\n name: \"\",\r\n amount: 0,\r\n },\r\n \"charityCampaignDonation-alltime-top-donator\": {\r\n name: \"\",\r\n amount: 0,\r\n },\r\n \"cheerPurchase-latest\": {\r\n name: \"\",\r\n amount: 0,\r\n },\r\n \"cheerPurchase-weekly-top-donation\": {\r\n name: \"\",\r\n amount: 0,\r\n },\r\n \"cheerPurchase-monthly-top-donation\": {\r\n name: \"\",\r\n amount: 0,\r\n },\r\n \"cheerPurchase-alltime-top-donation\": {\r\n name: \"\",\r\n amount: 0,\r\n },\r\n \"cheerPurchase-weekly-top-donator\": {\r\n name: \"\",\r\n amount: 0,\r\n },\r\n \"cheerPurchase-monthly-top-donator\": {\r\n name: \"\",\r\n amount: 0,\r\n },\r\n \"cheerPurchase-alltime-top-donator\": {\r\n name: \"\",\r\n amount: 0,\r\n },\r\n \"superchat-latest\": {\r\n name: \"\",\r\n amount: 0,\r\n },\r\n \"superchat-weekly-top-donation\": {\r\n name: \"\",\r\n amount: 0,\r\n },\r\n \"superchat-monthly-top-donation\": {\r\n name: \"\",\r\n amount: 0,\r\n },\r\n \"superchat-alltime-top-donation\": {\r\n name: \"\",\r\n amount: 0,\r\n },\r\n \"superchat-weekly-top-donator\": {\r\n name: \"\",\r\n amount: 0,\r\n },\r\n \"superchat-monthly-top-donator\": {\r\n name: \"\",\r\n amount: 0,\r\n },\r\n \"superchat-alltime-top-donator\": {\r\n name: \"\",\r\n amount: 0,\r\n },\r\n \"superchat-session\": {\r\n amount: 0,\r\n },\r\n \"superchat-week\": {\r\n amount: 0,\r\n },\r\n \"superchat-month\": {\r\n amount: 0,\r\n },\r\n \"superchat-total\": {\r\n amount: 0,\r\n },\r\n \"superchat-count\": {\r\n count: 0,\r\n },\r\n \"superchat-goal\": {\r\n amount: 0,\r\n },\r\n \"purchase-latest\": {\r\n name: \"\",\r\n amount: 0,\r\n avatar: \"\",\r\n message: \"\",\r\n items: [],\r\n },\r\n \"follower-recent\": [\r\n {\r\n name: \"imacanadiannn\",\r\n createdAt: \"2026-01-13T01:53:50.296Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"piwo143\",\r\n createdAt: \"2026-01-13T01:51:39.472Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"latvan_\",\r\n createdAt: \"2026-01-12T23:54:29.235Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"wheinwait\",\r\n createdAt: \"2026-01-12T23:11:28.946Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"agnascor2\",\r\n createdAt: \"2026-01-12T23:11:14.880Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"sunlitetuts\",\r\n createdAt: \"2026-01-12T21:03:59.207Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"ayanamya\",\r\n createdAt: \"2026-01-12T20:00:55.509Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"hopeless28\",\r\n createdAt: \"2026-01-12T18:35:21.731Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"kakoytoclown\",\r\n createdAt: \"2026-01-11T18:39:36.843Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"dababe__jq1\",\r\n createdAt: \"2024-10-10T23:27:49.699Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"jjjllkmf\",\r\n createdAt: \"2024-05-05T09:44:16.287Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"d4c_valintine\",\r\n createdAt: \"2024-05-03T15:13:28.365Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"angelbliss_\",\r\n createdAt: \"2024-04-30T20:07:23.132Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"o1zich\",\r\n createdAt: \"2024-04-22T16:23:26.139Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"nearbuziky\",\r\n createdAt: \"2024-04-19T19:21:27.569Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"samirkasamsa\",\r\n createdAt: \"2024-04-19T17:06:38.963Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"flip1mip\",\r\n createdAt: \"2024-04-19T17:06:18.276Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"valerie_solo\",\r\n createdAt: \"2024-04-19T17:06:07.473Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"sxaelence\",\r\n createdAt: \"2024-04-19T07:06:46.330Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"avokadik99\",\r\n createdAt: \"2024-04-17T16:11:29.604Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"blackvoronstream\",\r\n createdAt: \"2024-04-16T21:29:33.306Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"baldejniyy\",\r\n createdAt: \"2024-04-16T21:29:09.647Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"p3ch4n_ka\",\r\n createdAt: \"2024-04-16T16:37:31.841Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"kakosik_bee\",\r\n createdAt: \"2024-04-16T15:56:27.435Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"hikotoru\",\r\n createdAt: \"2024-04-16T15:13:25.226Z\",\r\n type: \"follower\",\r\n },\r\n ],\r\n \"subscriber-recent\": [],\r\n \"host-recent\": [],\r\n \"raid-recent\": [\r\n {\r\n name: \"agnascor2\",\r\n amount: 6,\r\n createdAt: \"2026-01-12T23:08:21.815Z\",\r\n type: \"raid\",\r\n },\r\n {\r\n name: \"justduckomgg\",\r\n amount: 7,\r\n createdAt: \"2024-04-19T17:05:53.185Z\",\r\n type: \"raid\",\r\n },\r\n {\r\n name: \"veessmk\",\r\n amount: 6,\r\n createdAt: \"2024-04-17T15:40:43.945Z\",\r\n type: \"raid\",\r\n },\r\n {\r\n name: \"night_sculptor\",\r\n amount: 12,\r\n createdAt: \"2024-04-16T18:07:40.040Z\",\r\n type: \"raid\",\r\n },\r\n {\r\n name: \"pixiemays\",\r\n amount: 6,\r\n createdAt: \"2024-04-16T16:37:24.433Z\",\r\n type: \"raid\",\r\n },\r\n {\r\n name: \"night_sculptor\",\r\n amount: 8,\r\n createdAt: \"2024-04-14T18:31:20.049Z\",\r\n type: \"raid\",\r\n },\r\n {\r\n name: \"pixiemays\",\r\n amount: 19,\r\n createdAt: \"2024-04-14T13:22:05.794Z\",\r\n type: \"raid\",\r\n },\r\n {\r\n name: \"pixiemays\",\r\n amount: 15,\r\n createdAt: \"2024-04-12T17:03:36.115Z\",\r\n type: \"raid\",\r\n },\r\n {\r\n name: \"alechkavt\",\r\n amount: 9,\r\n createdAt: \"2024-04-11T17:54:47.691Z\",\r\n type: \"raid\",\r\n },\r\n {\r\n name: \"pixiemays\",\r\n amount: 8,\r\n createdAt: \"2024-04-11T14:10:49.548Z\",\r\n type: \"raid\",\r\n },\r\n {\r\n name: \"night_sculptor\",\r\n amount: 22,\r\n createdAt: \"2024-04-09T16:13:41.195Z\",\r\n type: \"raid\",\r\n },\r\n {\r\n name: \"pixiemays\",\r\n amount: 5,\r\n createdAt: \"2024-04-08T09:54:01.603Z\",\r\n type: \"raid\",\r\n },\r\n {\r\n name: \"aki_neki\",\r\n amount: 5,\r\n createdAt: \"2024-04-07T21:52:45.919Z\",\r\n type: \"raid\",\r\n },\r\n {\r\n name: \"alechkavt\",\r\n amount: 11,\r\n createdAt: \"2024-04-07T18:59:39.286Z\",\r\n type: \"raid\",\r\n },\r\n {\r\n name: \"veessmk\",\r\n amount: 15,\r\n createdAt: \"2024-04-07T16:13:25.172Z\",\r\n type: \"raid\",\r\n },\r\n {\r\n name: \"veessmk\",\r\n amount: 10,\r\n createdAt: \"2024-03-17T16:11:38.631Z\",\r\n type: \"raid\",\r\n },\r\n ],\r\n \"charityCampaignDonation-recent\": [],\r\n \"cheer-recent\": [],\r\n \"cheerPurchase-recent\": [],\r\n \"superchat-recent\": [],\r\n \"tip-recent\": [],\r\n \"merch-recent\": [],\r\n \"channel-points-latest\": {\r\n amount: 0,\r\n message: \"\",\r\n name: \"\",\r\n redemption: \"\",\r\n },\r\n \"community-gift-latest\": {\r\n amount: 0,\r\n name: \"\",\r\n tier: \"\",\r\n },\r\n \"charityCampaignDonation-session-top-donation\": {\r\n amount: 0,\r\n name: \"\",\r\n },\r\n \"charityCampaignDonation-session-top-donator\": {\r\n amount: 0,\r\n name: \"\",\r\n },\r\n \"cheerPurchase-session-top-donation\": {\r\n amount: 0,\r\n name: \"\",\r\n },\r\n \"cheerPurchase-session-top-donator\": {\r\n amount: 0,\r\n name: \"\",\r\n },\r\n \"hypetrain-latest\": {\r\n active: 0,\r\n amount: 0,\r\n level: 0,\r\n levelChanged: 0,\r\n name: \"\",\r\n type: \"\",\r\n },\r\n \"hypetrain-latest-top-contributors\": [],\r\n \"hypetrain-level-goal\": {\r\n amount: 0,\r\n },\r\n \"hypetrain-level-progress\": {\r\n amount: 0,\r\n percent: 0,\r\n },\r\n \"hypetrain-total\": {\r\n amount: 0,\r\n },\r\n \"superchat-session-top-donation\": {\r\n amount: 0,\r\n name: \"\",\r\n },\r\n \"superchat-session-top-donator\": {\r\n amount: 0,\r\n name: \"\",\r\n },\r\n },\r\n settings: {\r\n autoReset: true,\r\n calendar: false,\r\n resetOnStart: false,\r\n },\r\n },\r\n recents: [\r\n {\r\n name: \"imacanadiannn\",\r\n createdAt: \"2026-01-13T01:53:50.296Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"piwo143\",\r\n createdAt: \"2026-01-13T01:51:39.472Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"latvan_\",\r\n createdAt: \"2026-01-12T23:54:29.235Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"wheinwait\",\r\n createdAt: \"2026-01-12T23:11:28.946Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"agnascor2\",\r\n createdAt: \"2026-01-12T23:11:14.880Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"sunlitetuts\",\r\n createdAt: \"2026-01-12T21:03:59.207Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"ayanamya\",\r\n createdAt: \"2026-01-12T20:00:55.509Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"hopeless28\",\r\n createdAt: \"2026-01-12T18:35:21.731Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"kakoytoclown\",\r\n createdAt: \"2026-01-11T18:39:36.843Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"dababe__jq1\",\r\n createdAt: \"2024-10-10T23:27:49.699Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"jjjllkmf\",\r\n createdAt: \"2024-05-05T09:44:16.287Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"d4c_valintine\",\r\n createdAt: \"2024-05-03T15:13:28.365Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"angelbliss_\",\r\n createdAt: \"2024-04-30T20:07:23.132Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"o1zich\",\r\n createdAt: \"2024-04-22T16:23:26.139Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"nearbuziky\",\r\n createdAt: \"2024-04-19T19:21:27.569Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"samirkasamsa\",\r\n createdAt: \"2024-04-19T17:06:38.963Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"flip1mip\",\r\n createdAt: \"2024-04-19T17:06:18.276Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"valerie_solo\",\r\n createdAt: \"2024-04-19T17:06:07.473Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"sxaelence\",\r\n createdAt: \"2024-04-19T07:06:46.330Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"avokadik99\",\r\n createdAt: \"2024-04-17T16:11:29.604Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"blackvoronstream\",\r\n createdAt: \"2024-04-16T21:29:33.306Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"baldejniyy\",\r\n createdAt: \"2024-04-16T21:29:09.647Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"p3ch4n_ka\",\r\n createdAt: \"2024-04-16T16:37:31.841Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"kakosik_bee\",\r\n createdAt: \"2024-04-16T15:56:27.435Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"hikotoru\",\r\n createdAt: \"2024-04-16T15:13:25.226Z\",\r\n type: \"follower\",\r\n },\r\n {\r\n name: \"agnascor2\",\r\n amount: 6,\r\n createdAt: \"2026-01-12T23:08:21.815Z\",\r\n type: \"raid\",\r\n },\r\n {\r\n name: \"justduckomgg\",\r\n amount: 7,\r\n createdAt: \"2024-04-19T17:05:53.185Z\",\r\n type: \"raid\",\r\n },\r\n {\r\n name: \"veessmk\",\r\n amount: 6,\r\n createdAt: \"2024-04-17T15:40:43.945Z\",\r\n type: \"raid\",\r\n },\r\n {\r\n name: \"night_sculptor\",\r\n amount: 12,\r\n createdAt: \"2024-04-16T18:07:40.040Z\",\r\n type: \"raid\",\r\n },\r\n {\r\n name: \"pixiemays\",\r\n amount: 6,\r\n createdAt: \"2024-04-16T16:37:24.433Z\",\r\n type: \"raid\",\r\n },\r\n {\r\n name: \"night_sculptor\",\r\n amount: 8,\r\n createdAt: \"2024-04-14T18:31:20.049Z\",\r\n type: \"raid\",\r\n },\r\n {\r\n name: \"pixiemays\",\r\n amount: 19,\r\n createdAt: \"2024-04-14T13:22:05.794Z\",\r\n type: \"raid\",\r\n },\r\n {\r\n name: \"pixiemays\",\r\n amount: 15,\r\n createdAt: \"2024-04-12T17:03:36.115Z\",\r\n type: \"raid\",\r\n },\r\n {\r\n name: \"alechkavt\",\r\n amount: 9,\r\n createdAt: \"2024-04-11T17:54:47.691Z\",\r\n type: \"raid\",\r\n },\r\n {\r\n name: \"pixiemays\",\r\n amount: 8,\r\n createdAt: \"2024-04-11T14:10:49.548Z\",\r\n type: \"raid\",\r\n },\r\n {\r\n name: \"night_sculptor\",\r\n amount: 22,\r\n createdAt: \"2024-04-09T16:13:41.195Z\",\r\n type: \"raid\",\r\n },\r\n {\r\n name: \"pixiemays\",\r\n amount: 5,\r\n createdAt: \"2024-04-08T09:54:01.603Z\",\r\n type: \"raid\",\r\n },\r\n {\r\n name: \"aki_neki\",\r\n amount: 5,\r\n createdAt: \"2024-04-07T21:52:45.919Z\",\r\n type: \"raid\",\r\n },\r\n {\r\n name: \"alechkavt\",\r\n amount: 11,\r\n createdAt: \"2024-04-07T18:59:39.286Z\",\r\n type: \"raid\",\r\n },\r\n {\r\n name: \"veessmk\",\r\n amount: 15,\r\n createdAt: \"2024-04-07T16:13:25.172Z\",\r\n type: \"raid\",\r\n },\r\n {\r\n name: \"veessmk\",\r\n amount: 10,\r\n createdAt: \"2024-03-17T16:11:38.631Z\",\r\n type: \"raid\",\r\n },\r\n ],\r\n currency: {\r\n code: \"USD\",\r\n name: \"U.S. Dollar\",\r\n symbol: \"$\",\r\n },\r\n channel: {\r\n username: \"encry_s\",\r\n apiToken: \"HAHANOTNOW\",\r\n id: \"65ba7503dc0415cb368947b1\",\r\n providerId: \"485678132\",\r\n avatar:\r\n \"https://static-cdn.jtvnw.net/jtv_user_pictures/6fe93724-803a-4e5a-b58a-1d42fbc84661-profile_image-300x300.jpeg\",\r\n },\r\n fieldData: {\r\n testMessageButton: \"zaytri_dynamicchatbubbles\",\r\n previewMode: false,\r\n previewType: \"random\",\r\n previewMessage: \"\",\r\n theme: \"animal-crossing\",\r\n corner: \"round\",\r\n darkMode: false,\r\n highlightStyle: \"normal\",\r\n actionStyle: \"italics\",\r\n maxWidth: 400,\r\n maxHeight: 300,\r\n fixedWidth: false,\r\n positionMode: \"list\",\r\n listDirection: \"bottom\",\r\n listAlignment: \"center\",\r\n topEdge: true,\r\n bottomEdge: true,\r\n leftEdge: true,\r\n rightEdge: true,\r\n edgeDeviation: 0,\r\n padding: 30,\r\n animation: \"dynamic\",\r\n dynamicModifier: 1.75,\r\n maxMessages: 25,\r\n hideOutOfBounds: true,\r\n lifetime: 0,\r\n delay: 1,\r\n googleFont: \"Nunito\",\r\n customFont: \"\",\r\n fontSize: 18,\r\n fontWeight: \"bold\",\r\n textDirection: \"ltr\",\r\n useCustomBorderColors: true,\r\n borderColor: \"#fed400\",\r\n nameColor: \"#000000\",\r\n useCustomMessageColors: true,\r\n backgroundColor: \"#fff3c0\",\r\n textColor: \"#000000\",\r\n pronounsMode: \"suffix\",\r\n pronounsLowercase: true,\r\n pronounsBadgeCustomColors: false,\r\n pronounsBadgeBackgroundColor: \"#000000\",\r\n pronounsBadgeBorderColor: \"#FFFFFF\",\r\n pronounsBadgeTextColor: \"#FFFFFF\",\r\n showBadges: true,\r\n largeEmotes: true,\r\n ffzGlobal: false,\r\n bttvGlobal: false,\r\n emoteOnly: false,\r\n highlightOnly: false,\r\n allowedStrings: [],\r\n minMessages: 0,\r\n messageCooldown: 0,\r\n raidCooldown: 0,\r\n raidMin: 0,\r\n includeEveryone: true,\r\n includeFollowers: \"true\",\r\n minFollowTime: 1,\r\n includeSubs: true,\r\n includeVIPs: true,\r\n includeMods: true,\r\n allowUserList: [],\r\n ignoreUserList: [\"StreamElements\", \"Streamlabs\", \"Nightbot\", \"Sery_Bot\"],\r\n ignorePrefixList: [\"!\"],\r\n volume: 50,\r\n soundGroup1: [],\r\n userLevelSoundGroup1: \"everyone\",\r\n specificUsersSoundGroup1: [],\r\n messageTypeSoundGroup1: \"all\",\r\n soundGroup2: [],\r\n userLevelSoundGroup2: \"everyone\",\r\n specificUsersSoundGroup2: [],\r\n messageTypeSoundGroup2: \"all\",\r\n soundGroup3: [],\r\n userLevelSoundGroup3: \"everyone\",\r\n specificUsersSoundGroup3: [],\r\n messageTypeSoundGroup3: \"all\",\r\n soundGroup4: [],\r\n userLevelSoundGroup4: \"everyone\",\r\n specificUsersSoundGroup4: [],\r\n messageTypeSoundGroup4: \"all\",\r\n soundGroup5: [],\r\n userLevelSoundGroup5: \"everyone\",\r\n specificUsersSoundGroup5: [],\r\n messageTypeSoundGroup5: \"all\",\r\n soundGroup6: [],\r\n userLevelSoundGroup6: \"everyone\",\r\n specificUsersSoundGroup6: [],\r\n messageTypeSoundGroup6: \"all\",\r\n soundGroup7: [],\r\n userLevelSoundGroup7: \"everyone\",\r\n specificUsersSoundGroup7: [],\r\n messageTypeSoundGroup7: \"all\",\r\n soundGroup8: [],\r\n userLevelSoundGroup8: \"everyone\",\r\n specificUsersSoundGroup8: [],\r\n messageTypeSoundGroup8: \"all\",\r\n soundGroup9: [],\r\n userLevelSoundGroup9: \"everyone\",\r\n specificUsersSoundGroup9: [],\r\n messageTypeSoundGroup9: \"all\",\r\n soundGroup10: [],\r\n userLevelSoundGroup10: \"everyone\",\r\n specificUsersSoundGroup10: [],\r\n messageTypeSoundGroup10: \"all\",\r\n widgetName: \"Chat Bubbles\",\r\n widgetAuthor: \"Zaytri\",\r\n widgetVersion: \"2.12.0\",\r\n widgetUpdateUrl:\r\n \"https://github.com/zaytri/stream-elements-widgets/blob/main/DynamicChatBubbles\",\r\n ignoreFirst: true,\r\n },\r\n overlay: {\r\n isEditorMode: true,\r\n muted: false,\r\n },\r\n };\r\n ","export const testAlerts = {\n follower: {\n listener: \"follower-latest\",\n event: {\n name: \"An1by\",\n },\n },\n communityGiftAnonymous: {\n listener: \"event\",\n event: {\n type: \"communityGiftPurchase\",\n provider: \"twitch\",\n channel: \"663b10ba6cd449c4162a2230\",\n activityGroup: \"41a50a915794e4ae7cf5e600fd3445d4\",\n data: {\n amount: 2,\n username: \"anonymous\",\n displayName: \"AnAnonymousGifter\",\n tier: \"2000\",\n sender: \"Anonymous\",\n },\n _id: \"699868d7df734989ec85d393\",\n activityId: \"699868d7df734989ec85d393\",\n },\n },\n communityGift: {\n listener: \"event\",\n event: {\n type: \"communityGiftPurchase\",\n provider: \"twitch\",\n channel: \"663b10ba6cd449c4162a2230\",\n activityGroup: \"841592c0bccbf3e1e7de71e1c8f4d9f0\",\n data: {\n amount: 1,\n username: \"rishamon\",\n displayName: \"rishamon\",\n tier: \"1000\",\n sender: \"rishamon\",\n },\n _id: \"699867c7fef23197a6a089f5\",\n activityId: \"699867c7fef23197a6a089f5\",\n },\n },\n sub: {\n listener: \"subscriber-latest\",\n event: {\n name: \"An1by\",\n amount: 1,\n },\n },\n selfSub: {\n listener: \"event\",\n event: {\n type: \"subscriber\",\n provider: \"twitch\",\n channel: \"663b10ba6cd449c4162a2230\",\n data: {\n amount: 1,\n username: \"rishamon\",\n displayName: \"rishamon\",\n tier: \"1000\",\n },\n _id: \"6998676317aed69e62b8f283\",\n activityId: \"6998676317aed69e62b8f283\",\n },\n },\n soloSubToSomeone: {\n listener: \"event\",\n event: {\n type: \"subscriber\",\n provider: \"twitch\",\n channel: \"663b10ba6cd449c4162a2230\",\n data: {\n amount: 1,\n username: \"encry_s\",\n displayName: \"encry_s\",\n message:\n \"rishamon gifted a Tier 1 sub to encry_s! This is their first Gift Sub in the channel!\",\n tier: \"1000\",\n sender: \"rishamon\",\n gifted: true,\n },\n _id: \"699866e82d9cd9a70854baf2\",\n activityId: \"699866e82d9cd9a70854baf2\",\n },\n },\n subRenewal: {\n listener: \"event\",\n event: {\n type: \"subscriber\",\n provider: \"twitch\",\n channel: \"663b10ba6cd449c4162a2230\",\n data: {\n amount: 8,\n username: \"silgestian\",\n displayName: \"SilgeStian\",\n tier: \"1000\",\n },\n _id: \"69986dfaf25724ff4162bd1a\",\n activityId: \"69986dfaf25724ff4162bd1a\",\n },\n },\n bits: {\n listener: \"cheer-latest\",\n event: {\n name: \"An1by\",\n amount: 30,\n },\n },\n raid: {\n listener: \"raid-latest\",\n event: {\n name: \"An1by\",\n amount: 50,\n },\n },\n donationShortText: {\n listener: \"donation\",\n event: {\n data: {\n alert_type: \"1\",\n currency: \"RUB\",\n billing_system: \"CARD\",\n id: 5,\n amount_main: 500,\n amount: 500,\n username: \"An1by\",\n message: \"Simple message text\",\n },\n },\n },\n donationLongText: {\n listener: \"donation\",\n event: {\n data: {\n alert_type: \"1\",\n currency: \"RUB\",\n billing_system: \"CARD\",\n id: 5,\n amount_main: 500,\n amount: 500,\n username: \"An1by\",\n message:\n \"A plain gray stone lay on the shore, basking in the sun's warmth. A shove broke its peace—a thoughtless toss sent it flying. The stone splashed into water. Ripples spread, yet none noticed. It sank to the bottom, heavy with loneliness. \\\"Didn't I deserve to stay where I was happy still?\\\" it wondered.\",\n },\n },\n },\n donation: {\n listener: \"donation\",\n event: {\n data: {\n alert_type: \"1\",\n currency: \"RUB\",\n billing_system: \"CARD\",\n id: 5,\n amount_main: 500,\n amount: 500,\n username: \"An1by\",\n message: \"\",\n },\n },\n },\n};\n","export const testMessages = {\n \"zeroWidthEmotesInRow\": {\n \"listener\": \"message\",\n \"event\": {\n \"service\": \"twitch\",\n \"data\": {\n \"time\": 1768317417111,\n \"tags\": {\n \"badge-info\": \"subscriber/23\",\n \"badges\": \"broadcaster/1,subscriber/0\",\n \"client-nonce\": \"f70c4cd8b6034d1f805298246ee1bc35\",\n \"color\": \"#DAA520\",\n \"display-name\": \"An1by\",\n \"emotes\": \"\",\n \"first-msg\": \"0\",\n \"flags\": \"\",\n \"id\": \"5f752ae3-4be9-4f93-82d1-d78575ba07fd\",\n \"mod\": \"0\",\n \"returning-chatter\": \"0\",\n \"room-id\": \"958683839\",\n \"subscriber\": \"1\",\n \"tmi-sent-ts\": \"1768317416862\",\n \"turbo\": \"0\",\n \"user-id\": \"958683839\",\n \"user-type\": \"\"\n },\n \"nick\": \"an1by\",\n \"userId\": \"958683839\",\n \"displayName\": \"An1by\",\n \"displayColor\": \"#DAA520\",\n \"badges\": [\n {\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 {\n \"type\": \"subscriber\",\n \"version\": \"0\",\n \"url\": \"https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/3\",\n \"description\": \"Subscriber\"\n }\n ],\n \"channel\": \"an1by\",\n \"text\": \"Censored Censored Censored emotes in row\",\n \"isAction\": false,\n \"emotes\": [\n {\n \"type\": \"7tv\",\n \"name\": \"Censored\",\n \"id\": \"01GC2KBETR0009QMKQRDSHDTVB\",\n \"gif\": true,\n \"animated\": true,\n \"urls\": {\n \"1\": \"https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/1x.webp\",\n \"2\": \"https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/2x.webp\",\n \"3\": \"https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/3x.webp\",\n \"4\": \"https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/4x.webp\"\n },\n \"start\": 0,\n \"end\": 8\n },\n {\n \"type\": \"7tv\",\n \"name\": \"Censored\",\n \"id\": \"01GC2KBETR0009QMKQRDSHDTVB\",\n \"gif\": true,\n \"animated\": true,\n \"urls\": {\n \"1\": \"https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/1x.webp\",\n \"2\": \"https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/2x.webp\",\n \"3\": \"https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/3x.webp\",\n \"4\": \"https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/4x.webp\"\n },\n \"start\": 9,\n \"end\": 17\n },\n {\n \"type\": \"7tv\",\n \"name\": \"Censored\",\n \"id\": \"01GC2KBETR0009QMKQRDSHDTVB\",\n \"gif\": true,\n \"animated\": true,\n \"urls\": {\n \"1\": \"https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/1x.webp\",\n \"2\": \"https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/2x.webp\",\n \"3\": \"https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/3x.webp\",\n \"4\": \"https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/4x.webp\"\n },\n \"start\": 18,\n \"end\": 26\n }\n ],\n \"msgId\": \"5f752ae3-4be9-4f93-82d1-d78575ba07fd\"\n },\n \"renderedText\": \"<img src=\\\"https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/1x.webp\\\" srcset=\\\"https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/1x.webp 1x, https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/2x.webp 2x, https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/4x.webp 4x\\\" title=\\\"Censored\\\" class=\\\"emote\\\"><img src=\\\"https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/1x.webp\\\" srcset=\\\"https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/1x.webp 1x, https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/2x.webp 2x, https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/4x.webp 4x\\\" title=\\\"Censored\\\" class=\\\"emote\\\"><img src=\\\"https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/1x.webp\\\" srcset=\\\"https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/1x.webp 1x, https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/2x.webp 2x, https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/4x.webp 4x\\\" title=\\\"Censored\\\" class=\\\"emote\\\">emotes in row\"\n }\n },\n \"zeroWidthEmoteInMiddle\": {\n \"listener\": \"message\",\n \"event\": {\n \"service\": \"twitch\",\n \"data\": {\n \"time\": 1768317383248,\n \"tags\": {\n \"badge-info\": \"subscriber/23\",\n \"badges\": \"broadcaster/1,subscriber/0\",\n \"client-nonce\": \"847f9c27722340d090eddcb0d0662b5b\",\n \"color\": \"#DAA520\",\n \"display-name\": \"An1by\",\n \"emotes\": \"\",\n \"first-msg\": \"0\",\n \"flags\": \"\",\n \"id\": \"3dea1e1e-89f7-4a5f-b743-13ba0386492f\",\n \"mod\": \"0\",\n \"returning-chatter\": \"0\",\n \"room-id\": \"958683839\",\n \"subscriber\": \"1\",\n \"tmi-sent-ts\": \"1768317382987\",\n \"turbo\": \"0\",\n \"user-id\": \"958683839\",\n \"user-type\": \"\"\n },\n \"nick\": \"an1by\",\n \"userId\": \"958683839\",\n \"displayName\": \"An1by\",\n \"displayColor\": \"#DAA520\",\n \"badges\": [\n {\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 {\n \"type\": \"subscriber\",\n \"version\": \"0\",\n \"url\": \"https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/3\",\n \"description\": \"Subscriber\"\n }\n ],\n \"channel\": \"an1by\",\n \"text\": \"text and Censored emote\",\n \"isAction\": false,\n \"emotes\": [\n {\n \"type\": \"7tv\",\n \"name\": \"Censored\",\n \"id\": \"01GC2KBETR0009QMKQRDSHDTVB\",\n \"gif\": true,\n \"animated\": true,\n \"urls\": {\n \"1\": \"https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/1x.webp\",\n \"2\": \"https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/2x.webp\",\n \"3\": \"https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/3x.webp\",\n \"4\": \"https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/4x.webp\"\n },\n \"start\": 9,\n \"end\": 17\n }\n ],\n \"msgId\": \"3dea1e1e-89f7-4a5f-b743-13ba0386492f\"\n },\n \"renderedText\": \"text and <img src=\\\"https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/1x.webp\\\" srcset=\\\"https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/1x.webp 1x, https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/2x.webp 2x, https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/4x.webp 4x\\\" title=\\\"Censored\\\" class=\\\"emote\\\">emote\"\n }\n },\n \"zeroWidthEmoteFirst\": {\n \"listener\": \"message\",\n \"event\": {\n \"service\": \"twitch\",\n \"data\": {\n \"time\": 1768317236883,\n \"tags\": {\n \"badge-info\": \"subscriber/23\",\n \"badges\": \"broadcaster/1,subscriber/0\",\n \"client-nonce\": \"e9d0621827184c1b940fd700ae599d60\",\n \"color\": \"#DAA520\",\n \"display-name\": \"An1by\",\n \"emotes\": \"\",\n \"first-msg\": \"0\",\n \"flags\": \"\",\n \"id\": \"6f347337-354a-42e5-bab0-935e19d74152\",\n \"mod\": \"0\",\n \"returning-chatter\": \"0\",\n \"room-id\": \"958683839\",\n \"subscriber\": \"1\",\n \"tmi-sent-ts\": \"1768317236625\",\n \"turbo\": \"0\",\n \"user-id\": \"958683839\",\n \"user-type\": \"\"\n },\n \"nick\": \"an1by\",\n \"userId\": \"958683839\",\n \"displayName\": \"An1by\",\n \"displayColor\": \"#DAA520\",\n \"badges\": [\n {\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 {\n \"type\": \"subscriber\",\n \"version\": \"0\",\n \"url\": \"https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/3\",\n \"description\": \"Subscriber\"\n }\n ],\n \"channel\": \"an1by\",\n \"text\": \"Censored <- zeroWidth emote on the first place\",\n \"isAction\": false,\n \"emotes\": [\n {\n \"type\": \"7tv\",\n \"name\": \"Censored\",\n \"id\": \"01GC2KBETR0009QMKQRDSHDTVB\",\n \"gif\": true,\n \"animated\": true,\n \"urls\": {\n \"1\": \"https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/1x.webp\",\n \"2\": \"https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/2x.webp\",\n \"3\": \"https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/3x.webp\",\n \"4\": \"https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/4x.webp\"\n },\n \"start\": 0,\n \"end\": 8\n }\n ],\n \"msgId\": \"6f347337-354a-42e5-bab0-935e19d74152\"\n },\n \"renderedText\": \"<img src=\\\"https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/1x.webp\\\" srcset=\\\"https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/1x.webp 1x, https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/2x.webp 2x, https://cdn.7tv.app/emote/01GC2KBETR0009QMKQRDSHDTVB/4x.webp 4x\\\" title=\\\"Censored\\\" class=\\\"emote\\\"><- zeroWidth emote on the first place\"\n }\n },\n \"veryShort\": {\n \"listener\": \"message\",\n \"event\": {\n \"service\": \"twitch\",\n \"data\": {\n \"time\": 1749743750546,\n \"tags\": {\n \"badge-info\": \"\",\n \"badges\": \"\",\n \"client-nonce\": \"a3fe71a5771d0c31466dd333c963231e\",\n \"color\": \"\",\n \"display-name\": \"An1by\",\n \"emotes\": \"\",\n \"first-msg\": \"0\",\n \"flags\": \"\",\n \"id\": \"3d0d1a43-45e5-4652-be59-0b31dfeba796\",\n \"mod\": \"0\",\n \"returning-chatter\": \"0\",\n \"room-id\": \"958683839\",\n \"subscriber\": \"0\",\n \"tmi-sent-ts\": \"1749743749437\",\n \"turbo\": \"0\",\n \"user-id\": \"958683839\",\n \"user-type\": \"\"\n },\n \"nick\": \"IHaveVeryBigNickname\",\n \"userId\": \"958683839\",\n \"displayName\": \"IHaveVeryBigNickname\",\n \"displayColor\": \"\",\n \"badges\": [],\n \"channel\": \"IHaveVeryBigNickname\",\n \"text\": \"A!\",\n \"isAction\": false,\n \"emotes\": [],\n \"msgId\": \"3d0d1a43-45e5-4652-be59-0b31dfeba796\"\n },\n \"renderedText\": \"A!\"\n }\n },\n \"viewer\": {\n \"listener\": \"message\",\n \"event\": {\n \"service\": \"twitch\",\n \"data\": {\n \"time\": 1749743750546,\n \"tags\": {\n \"badge-info\": \"\",\n \"badges\": \"\",\n \"client-nonce\": \"a3fe71a5771d0c31466dd333c963231e\",\n \"color\": \"\",\n \"display-name\": \"An1by\",\n \"emotes\": \"\",\n \"first-msg\": \"0\",\n \"flags\": \"\",\n \"id\": \"3d0d1a43-45e5-4652-be59-0b31dfeba796\",\n \"mod\": \"0\",\n \"returning-chatter\": \"0\",\n \"room-id\": \"958683839\",\n \"subscriber\": \"0\",\n \"tmi-sent-ts\": \"1749743749437\",\n \"turbo\": \"0\",\n \"user-id\": \"958683839\",\n \"user-type\": \"\"\n },\n \"nick\": \"SimpleViewer\",\n \"userId\": \"958683839\",\n \"displayName\": \"SimpleViewer\",\n \"displayColor\": \"\",\n \"badges\": [],\n \"channel\": \"SimpleViewer\",\n \"text\": \"I finally finished it...\",\n \"isAction\": false,\n \"emotes\": [],\n \"msgId\": \"3d0d1a43-45e5-4652-be59-0b31dfeba796\"\n },\n \"renderedText\": \"I finally finished it...\"\n }\n },\n \"vip\": {\n \"listener\": \"message\",\n \"event\": {\n \"service\": \"twitch\",\n \"data\": {\n \"time\": 1749743844261,\n \"tags\": {\n \"badge-info\": \"\",\n \"badges\": \"vip/1\",\n \"client-nonce\": \"fd72ba163a9cc1a6486b2eddb0f5d893\",\n \"color\": \"\",\n \"display-name\": \"An1by\",\n \"emotes\": \"\",\n \"first-msg\": \"0\",\n \"flags\": \"\",\n \"id\": \"51cac44b-9908-49d2-b424-489276e1e521\",\n \"mod\": \"0\",\n \"returning-chatter\": \"0\",\n \"room-id\": \"958683839\",\n \"subscriber\": \"0\",\n \"tmi-sent-ts\": \"1749743843170\",\n \"turbo\": \"0\",\n \"user-id\": \"958683839\",\n \"user-type\": \"\",\n \"vip\": \"1\"\n },\n \"nick\": \"VipPersona\",\n \"userId\": \"958683839\",\n \"displayName\": \"VipPersona\",\n \"displayColor\": \"\",\n \"badges\": [\n {\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 ],\n \"channel\": \"VipPersona\",\n \"text\": \"I am a VIP persona!\",\n \"isAction\": false,\n \"emotes\": [],\n \"msgId\": \"51cac44b-9908-49d2-b424-489276e1e521\"\n },\n \"renderedText\": \"I am a VIP persona!\"\n }\n },\n \"vipLong\": {\n \"listener\": \"message\",\n \"event\": {\n \"service\": \"twitch\",\n \"data\": {\n \"time\": 1749743844261,\n \"tags\": {\n \"badge-info\": \"\",\n \"badges\": \"vip/1\",\n \"client-nonce\": \"fd72ba163a9cc1a6486b2eddb0f5d893\",\n \"color\": \"\",\n \"display-name\": \"An1by\",\n \"emotes\": \"\",\n \"first-msg\": \"0\",\n \"flags\": \"\",\n \"id\": \"51cac44b-9908-49d2-b424-489276e1e521\",\n \"mod\": \"0\",\n \"returning-chatter\": \"0\",\n \"room-id\": \"958683839\",\n \"subscriber\": \"0\",\n \"tmi-sent-ts\": \"1749743843170\",\n \"turbo\": \"0\",\n \"user-id\": \"958683839\",\n \"user-type\": \"\",\n \"vip\": \"1\"\n },\n \"nick\": \"VipPersona\",\n \"userId\": \"958683839\",\n \"displayName\": \"VipPersona\",\n \"displayColor\": \"\",\n \"badges\": [\n {\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 ],\n \"channel\": \"VipPersona\",\n \"text\": \"I am a VIP persona! Are you see this?\",\n \"isAction\": false,\n \"emotes\": [],\n \"msgId\": \"51cac44b-9908-49d2-b424-489276e1e521\"\n },\n \"renderedText\": \"I am a VIP persona! Are you see this?\"\n }\n },\n \"artist\": {\n \"listener\": \"message\",\n \"event\": {\n \"service\": \"twitch\",\n \"data\": {\n \"time\": 1749743916482,\n \"tags\": {\n \"badge-info\": \"\",\n \"badges\": \"artist-badge/1\",\n \"client-nonce\": \"54128d734d44e28ffc32e1ce236993f5\",\n \"color\": \"\",\n \"display-name\": \"An1by\",\n \"emotes\": \"\",\n \"first-msg\": \"0\",\n \"flags\": \"\",\n \"id\": \"8ee7e71a-3608-486a-bd82-a82b65982ca7\",\n \"mod\": \"0\",\n \"returning-chatter\": \"0\",\n \"room-id\": \"958683839\",\n \"subscriber\": \"0\",\n \"tmi-sent-ts\": \"1749743915371\",\n \"turbo\": \"0\",\n \"user-id\": \"958683839\",\n \"user-type\": \"\"\n },\n \"nick\": \"StarArtist\",\n \"userId\": \"958683839\",\n \"displayName\": \"StarArtist\",\n \"displayColor\": \"\",\n \"badges\": [\n {\n \"type\": \"artist-badge\",\n \"version\": \"1\",\n \"url\": \"https://static-cdn.jtvnw.net/badges/v1/4300a897-03dc-4e83-8c0e-c332fee7057f/3\",\n \"description\": \"Artist\"\n }\n ],\n \"channel\": \"StarArtist\",\n \"text\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\",\n \"isAction\": false,\n \"emotes\": [],\n \"msgId\": \"8ee7e71a-3608-486a-bd82-a82b65982ca7\"\n },\n \"renderedText\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\"\n }\n },\n \"subscriber\": {\n \"listener\": \"message\",\n \"event\": {\n \"data\": {\n \"tags\": {\n \"badges\": \"subscriber/1\",\n \"color\": \"#ff69b4\",\n \"vip\": \"0\",\n \"subscriber\": \"1\",\n \"user-id\": \"100135110\",\n \"user-type\": \"subscriber\"\n },\n \"userId\": \"100135110\",\n \"displayName\": \"YourSub\",\n \"displayColor\": \"#ff69b4\",\n \"badges\": [\n {\n \"type\": \"partner\",\n \"version\": \"1\",\n \"url\": \"https://static-cdn.jtvnw.net/badges/v1/d12a2e27-16f6-41d0-ab77-b780518f00a3/3\",\n \"description\": \"Verified\"\n }\n ],\n \"text\": \"This is a subscriber's test message. I'm just a subscriber, srsly.\",\n \"emotes\": [],\n \"msgId\": \"43285909-412c-4eee-b80d-89f1482ba53142\"\n },\n \"renderedText\": \"This is a subscriber's test message. I'm just a subscriber, srsly.\"\n }\n },\n \"founder\": {\n \"listener\": \"message\",\n \"event\": {\n \"service\": \"twitch\",\n \"data\": {\n \"time\": 1749743750546,\n \"tags\": {\n \"badge-info\": \"\",\n \"badges\": \"founder/1,subscriber/1\",\n \"client-nonce\": \"a3fe71a5771d0c31466dd333c963231e\",\n \"color\": \"\",\n \"display-name\": \"sub__founder\",\n \"emotes\": \"\",\n \"first-msg\": \"0\",\n \"flags\": \"\",\n \"id\": \"3d0d1a43-45e5-4652-be59-0b31dfeba796\",\n \"mod\": \"0\",\n \"returning-chatter\": \"0\",\n \"room-id\": \"958683839\",\n \"subscriber\": \"1\",\n \"tmi-sent-ts\": \"1749743749437\",\n \"turbo\": \"0\",\n \"user-id\": \"958683839\",\n \"user-type\": \"\"\n },\n \"nick\": \"sub__founder\",\n \"userId\": \"958683839\",\n \"displayName\": \"sub__founder\",\n \"displayColor\": \"\",\n \"badges\": [\n {\n \"type\": \"founder\"\n }\n ],\n \"channel\": \"an1by\",\n \"text\": \"I finally finished it...\",\n \"isAction\": false,\n \"emotes\": [],\n \"msgId\": \"3d0d1a43-45e5-4652-be59-0b31dfeba796\"\n },\n \"renderedText\": \"I finally finished it...\"\n }\n },\n \"moderator\": {\n \"listener\": \"message\",\n \"event\": {\n \"service\": \"twitch\",\n \"data\": {\n \"time\": 1749743997223,\n \"tags\": {\n \"badge-info\": \"\",\n \"badges\": \"moderator/1\",\n \"color\": \"\",\n \"display-name\": \"An1by\",\n \"emotes\": \"\",\n \"first-msg\": \"0\",\n \"flags\": \"\",\n \"id\": \"3e7ba532-f181-4bcc-90f1-a3c48ca3c820\",\n \"mod\": \"1\",\n \"returning-chatter\": \"0\",\n \"room-id\": \"958683839\",\n \"subscriber\": \"0\",\n \"tmi-sent-ts\": \"1749743996136\",\n \"turbo\": \"0\",\n \"user-id\": \"958683839\",\n \"user-type\": \"mod\"\n },\n \"nick\": \"mediator\",\n \"userId\": \"958683839\",\n \"displayName\": \"mediator\",\n \"displayColor\": \"\",\n \"badges\": [\n {\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 ],\n \"channel\": \"mediator\",\n \"text\": \"Did someone say... MODERATOR!?\",\n \"isAction\": false,\n \"emotes\": [],\n \"msgId\": \"3e7ba532-f181-4bcc-90f1-a3c48ca3c820\"\n },\n \"renderedText\": \"Did someone say... MODERATOR!?\"\n }\n },\n \"moderatorLong\": {\n \"listener\": \"message\",\n \"event\": {\n \"service\": \"twitch\",\n \"data\": {\n \"time\": 1749743997223,\n \"tags\": {\n \"badge-info\": \"\",\n \"badges\": \"moderator/1\",\n \"color\": \"\",\n \"display-name\": \"An1by\",\n \"emotes\": \"\",\n \"first-msg\": \"0\",\n \"flags\": \"\",\n \"id\": \"3e7ba532-f181-4bcc-90f1-a3c48ca3c820\",\n \"mod\": \"1\",\n \"returning-chatter\": \"0\",\n \"room-id\": \"958683839\",\n \"subscriber\": \"0\",\n \"tmi-sent-ts\": \"1749743996136\",\n \"turbo\": \"0\",\n \"user-id\": \"958683839\",\n \"user-type\": \"mod\"\n },\n \"nick\": \"mediator\",\n \"userId\": \"958683839\",\n \"displayName\": \"mediator\",\n \"displayColor\": \"\",\n \"badges\": [\n {\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 ],\n \"channel\": \"mediator\",\n \"text\": \"Did someone say... MODERATOR!? Yes, I am moderator!\",\n \"isAction\": false,\n \"emotes\": [],\n \"msgId\": \"3e7ba532-f181-4bcc-90f1-a3c48ca3c820\"\n },\n \"renderedText\": \"Did someone say... MODERATOR!? Yes, I am moderator!\"\n }\n },\n \"broadcaster\": {\n \"listener\": \"message\",\n \"event\": {\n \"service\": \"twitch\",\n \"data\": {\n \"time\": 1749744800809,\n \"tags\": {\n \"badge-info\": \"subscriber/16\",\n \"badges\": \"broadcaster/1,subscriber/0,minecraft-15th-anniversary-celebration/1\",\n \"client-nonce\": \"6989104421ee14c0a8c216ef1c6bb5ed\",\n \"color\": \"#DAA520\",\n \"display-name\": \"An1by\",\n \"emotes\": \"\",\n \"first-msg\": \"0\",\n \"flags\": \"\",\n \"id\": \"35a9bea7-076e-4d17-8cb7-7e65c8111b3d\",\n \"mod\": \"0\",\n \"returning-chatter\": \"0\",\n \"room-id\": \"958683839\",\n \"subscriber\": \"1\",\n \"tmi-sent-ts\": \"1749744799706\",\n \"turbo\": \"0\",\n \"user-id\": \"958683839\",\n \"user-type\": \"\"\n },\n \"nick\": \"an1by\",\n \"userId\": \"958683839\",\n \"displayName\": \"An1by\",\n \"displayColor\": \"#DAA520\",\n \"badges\": [\n {\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 {\n \"type\": \"subscriber\",\n \"version\": \"0\",\n \"url\": \"https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/3\",\n \"description\": \"Subscriber\"\n },\n {\n \"type\": \"minecraft-15th-anniversary-celebration\",\n \"version\": \"1\",\n \"url\": \"https://static-cdn.jtvnw.net/badges/v1/178077b2-8b86-4f8d-927c-66ed6c1b025f/3\",\n \"description\": \"Minecraft 15th Anniversary Celebration\"\n }\n ],\n \"channel\": \"an1by\",\n \"text\": \"I made this chat Besplatno\",\n \"isAction\": false,\n \"emotes\": [\n {\n \"type\": \"7tv\",\n \"name\": \"Besplatno\",\n \"id\": \"01FE70VRT00009TR6M9N941A28\",\n \"gif\": true,\n \"animated\": true,\n \"urls\": {\n \"1\": \"https://cdn.7tv.app/emote/01FE70VRT00009TR6M9N941A28/1x.webp\",\n \"2\": \"https://cdn.7tv.app/emote/01FE70VRT00009TR6M9N941A28/2x.webp\",\n \"3\": \"https://cdn.7tv.app/emote/01FE70VRT00009TR6M9N941A28/3x.webp\",\n \"4\": \"https://cdn.7tv.app/emote/01FE70VRT00009TR6M9N941A28/4x.webp\"\n },\n \"start\": 17,\n \"end\": 26\n }\n ],\n \"msgId\": \"35a9bea7-076e-4d17-8cb7-7e65c8111b3d\"\n },\n \"renderedText\": \"I made this chat <img src=\\\"https://cdn.7tv.app/emote/01FE70VRT00009TR6M9N941A28/1x.webp\\\" srcset=\\\"https://cdn.7tv.app/emote/01FE70VRT00009TR6M9N941A28/1x.webp 1x, https://cdn.7tv.app/emote/01FE70VRT00009TR6M9N941A28/2x.webp 2x, https://cdn.7tv.app/emote/01FE70VRT00009TR6M9N941A28/4x.webp 4x\\\" title=\\\"Besplatno\\\" class=\\\"emote\\\">\"\n }\n },\n \"broadcasterShort\": {\n \"listener\": \"message\",\n \"event\": {\n \"service\": \"twitch\",\n \"data\": {\n \"time\": 1749744800809,\n \"tags\": {\n \"badge-info\": \"subscriber/16\",\n \"badges\": \"broadcaster/1,subscriber/0,minecraft-15th-anniversary-celebration/1\",\n \"client-nonce\": \"6989104421ee14c0a8c216ef1c6bb5ed\",\n \"color\": \"#DAA520\",\n \"display-name\": \"An1by\",\n \"emotes\": \"\",\n \"first-msg\": \"0\",\n \"flags\": \"\",\n \"id\": \"35a9bea7-076e-4d17-8cb7-7e65c8111b3d\",\n \"mod\": \"0\",\n \"returning-chatter\": \"0\",\n \"room-id\": \"958683839\",\n \"subscriber\": \"1\",\n \"tmi-sent-ts\": \"1749744799706\",\n \"turbo\": \"0\",\n \"user-id\": \"958683839\",\n \"user-type\": \"\"\n },\n \"nick\": \"an1by\",\n \"userId\": \"958683839\",\n \"displayName\": \"An1by\",\n \"displayColor\": \"#DAA520\",\n \"badges\": [\n {\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 {\n \"type\": \"subscriber\",\n \"version\": \"0\",\n \"url\": \"https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/3\",\n \"description\": \"Subscriber\"\n },\n {\n \"type\": \"minecraft-15th-anniversary-celebration\",\n \"version\": \"1\",\n \"url\": \"https://static-cdn.jtvnw.net/badges/v1/178077b2-8b86-4f8d-927c-66ed6c1b025f/3\",\n \"description\": \"Minecraft 15th Anniversary Celebration\"\n }\n ],\n \"channel\": \"an1by\",\n \"text\": \"okak\",\n \"isAction\": false,\n \"emotes\": [],\n \"msgId\": \"35a9bea7-076e-4d17-8cb7-7e65c8111b3d\"\n },\n \"renderedText\": \"I made this chat <img src=\\\"https://cdn.7tv.app/emote/01FE70VRT00009TR6M9N941A28/1x.webp\\\" srcset=\\\"https://cdn.7tv.app/emote/01FE70VRT00009TR6M9N941A28/1x.webp 1x, https://cdn.7tv.app/emote/01FE70VRT00009TR6M9N941A28/2x.webp 2x, https://cdn.7tv.app/emote/01FE70VRT00009TR6M9N941A28/4x.webp 4x\\\" title=\\\"Besplatno\\\" class=\\\"emote\\\">\"\n }\n },\n \"emoteSolo\": {\n \"listener\": \"message\",\n \"event\": {\n \"service\": \"twitch\",\n \"data\": {\n \"time\": 1749744097330,\n \"tags\": {\n \"badge-info\": \"\",\n \"badges\": \"\",\n \"color\": \"\",\n \"display-name\": \"An1by\",\n \"emotes\": \"\",\n \"first-msg\": \"0\",\n \"flags\": \"\",\n \"id\": \"9ab645b9-7c27-4c6f-99fd-f63727ca3700\",\n \"mod\": \"0\",\n \"returning-chatter\": \"0\",\n \"room-id\": \"958683839\",\n \"subscriber\": \"0\",\n \"tmi-sent-ts\": \"1749744096217\",\n \"turbo\": \"0\",\n \"user-id\": \"958683839\",\n \"user-type\": \"\"\n },\n \"nick\": \"tr0l1\",\n \"userId\": \"958683839\",\n \"displayName\": \"tr0l1\",\n \"displayColor\": \"\",\n \"badges\": [],\n \"channel\": \"tr0l1\",\n \"text\": \"🤤😮💀👈👉\",\n \"isAction\": false,\n \"emotes\": [\n {\n \"type\": \"emoji\",\n \"name\": \"1f62e\",\n \"id\": \"1f62e\",\n \"gif\": false,\n \"urls\": {\n \"1\": \"https://twemoji.maxcdn.com/36x36/1f62e.png\"\n }\n },\n {\n \"type\": \"emoji\",\n \"name\": \"1f480\",\n \"id\": \"1f480\",\n \"gif\": false,\n \"urls\": {\n \"1\": \"https://twemoji.maxcdn.com/36x36/1f480.png\"\n }\n },\n {\n \"type\": \"emoji\",\n \"name\": \"1f448\",\n \"id\": \"1f448\",\n \"gif\": false,\n \"urls\": {\n \"1\": \"https://twemoji.maxcdn.com/36x36/1f448.png\"\n }\n },\n {\n \"type\": \"emoji\",\n \"name\": \"1f449\",\n \"id\": \"1f449\",\n \"gif\": false,\n \"urls\": {\n \"1\": \"https://twemoji.maxcdn.com/36x36/1f449.png\"\n }\n }\n ],\n \"msgId\": \"9ab645b9-7c27-4c6f-99fd-f63727ca3700\"\n },\n \"renderedText\": \"🤤😮💀👈👉\"\n }\n },\n \"emoteOne\": {\n \"listener\": \"message\",\n \"event\": {\n \"service\": \"twitch\",\n \"data\": {\n \"time\": 1749744131183,\n \"tags\": {\n \"badge-info\": \"\",\n \"badges\": \"\",\n \"color\": \"\",\n \"display-name\": \"An1by\",\n \"emotes\": \"41:20-27/245:29-43/28087:45-51/58765:53-63/555555584:65-66/64138:10-18\",\n \"first-msg\": \"0\",\n \"flags\": \"\",\n \"id\": \"beb957ea-dfbd-4184-82a3-458121f44867\",\n \"mod\": \"0\",\n \"returning-chatter\": \"0\",\n \"room-id\": \"958683839\",\n \"subscriber\": \"0\",\n \"tmi-sent-ts\": \"1749744130018\",\n \"turbo\": \"0\",\n \"user-id\": \"958683839\",\n \"user-type\": \"\"\n },\n \"nick\": \"tr0l1\",\n \"userId\": \"958683839\",\n \"displayName\": \"tr0l1\",\n \"displayColor\": \"\",\n \"badges\": [],\n \"channel\": \"tr0l1\",\n \"text\": \"SeemsGood\",\n \"isAction\": false,\n \"emotes\": [\n {\n \"type\": \"twitch\",\n \"name\": \"SeemsGood\",\n \"id\": \"64138\",\n \"gif\": false,\n \"animated\": false,\n \"urls\": {\n \"1\": \"https://static-cdn.jtvnw.net/emoticons/v2/64138/static/dark/1.0\",\n \"2\": \"https://static-cdn.jtvnw.net/emoticons/v2/64138/static/dark/2.0\",\n \"4\": \"https://static-cdn.jtvnw.net/emoticons/v2/64138/static/dark/3.0\"\n },\n \"start\": 0,\n \"end\": 9\n }\n ],\n \"msgId\": \"beb957ea-dfbd-4184-82a3-458121f44867\"\n },\n \"renderedText\": \"<img src=\\\"https://static-cdn.jtvnw.net/emoticons/v2/64138/static/dark/1.0\\\" srcset=\\\"https://static-cdn.jtvnw.net/emoticons/v2/64138/static/dark/1.0 1x, https://static-cdn.jtvnw.net/emoticons/v2/64138/static/dark/2.0 2x, https://static-cdn.jtvnw.net/emoticons/v2/64138/static/dark/3.0 4x\\\" title=\\\"SeemsGood\\\" class=\\\"emote\\\">\"\n }\n },\n \"emoteText\": {\n \"listener\": \"message\",\n \"event\": {\n \"service\": \"twitch\",\n \"data\": {\n \"time\": 1749744131183,\n \"tags\": {\n \"badge-info\": \"\",\n \"badges\": \"\",\n \"color\": \"\",\n \"display-name\": \"7TVUser\",\n \"emotes\": \"41:20-27/245:29-43/28087:45-51/58765:53-63/555555584:65-66/64138:10-18\",\n \"first-msg\": \"0\",\n \"flags\": \"\",\n \"id\": \"beb957ea-dfbd-4184-82a3-458121f44867\",\n \"mod\": \"0\",\n \"returning-chatter\": \"0\",\n \"room-id\": \"958683839\",\n \"subscriber\": \"0\",\n \"tmi-sent-ts\": \"1749744130018\",\n \"turbo\": \"0\",\n \"user-id\": \"958683839\",\n \"user-type\": \"\"\n },\n \"nick\": \"7TVUser\",\n \"userId\": \"958683839\",\n \"displayName\": \"7TVUser\",\n \"displayColor\": \"\",\n \"badges\": [],\n \"channel\": \"7TVUser\",\n \"text\": \"Not emote SeemsGood Kreygasm ResidentSleeper WutFace NotLikeThis <3\",\n \"isAction\": false,\n \"emotes\": [\n {\n \"type\": \"twitch\",\n \"name\": \"SeemsGood\",\n \"id\": \"64138\",\n \"gif\": false,\n \"animated\": false,\n \"urls\": {\n \"1\": \"https://static-cdn.jtvnw.net/emoticons/v2/64138/static/dark/1.0\",\n \"2\": \"https://static-cdn.jtvnw.net/emoticons/v2/64138/static/dark/2.0\",\n \"4\": \"https://static-cdn.jtvnw.net/emoticons/v2/64138/static/dark/3.0\"\n },\n \"start\": 10,\n \"end\": 19\n },\n {\n \"type\": \"twitch\",\n \"name\": \"Kreygasm\",\n \"id\": \"41\",\n \"gif\": false,\n \"animated\": false,\n \"urls\": {\n \"1\": \"https://static-cdn.jtvnw.net/emoticons/v2/41/static/dark/1.0\",\n \"2\": \"https://static-cdn.jtvnw.net/emoticons/v2/41/static/dark/2.0\",\n \"4\": \"https://static-cdn.jtvnw.net/emoticons/v2/41/static/dark/3.0\"\n },\n \"start\": 20,\n \"end\": 28\n },\n {\n \"type\": \"twitch\",\n \"name\": \"ResidentSleeper\",\n \"id\": \"245\",\n \"gif\": false,\n \"animated\": false,\n \"urls\": {\n \"1\": \"https://static-cdn.jtvnw.net/emoticons/v2/245/static/dark/1.0\",\n \"2\": \"https://static-cdn.jtvnw.net/emoticons/v2/245/static/dark/2.0\",\n \"4\": \"https://static-cdn.jtvnw.net/emoticons/v2/245/static/dark/3.0\"\n },\n \"start\": 29,\n \"end\": 44\n },\n {\n \"type\": \"twitch\",\n \"name\": \"WutFace\",\n \"id\": \"28087\",\n \"gif\": false,\n \"animated\": false,\n \"urls\": {\n \"1\": \"https://static-cdn.jtvnw.net/emoticons/v2/28087/static/dark/1.0\",\n \"2\": \"https://static-cdn.jtvnw.net/emoticons/v2/28087/static/dark/2.0\",\n \"4\": \"https://static-cdn.jtvnw.net/emoticons/v2/28087/static/dark/3.0\"\n },\n \"start\": 45,\n \"end\": 52\n },\n {\n \"type\": \"twitch\",\n \"name\": \"NotLikeThis\",\n \"id\": \"58765\",\n \"gif\": false,\n \"animated\": false,\n \"urls\": {\n \"1\": \"https://static-cdn.jtvnw.net/emoticons/v2/58765/static/dark/1.0\",\n \"2\": \"https://static-cdn.jtvnw.net/emoticons/v2/58765/static/dark/2.0\",\n \"4\": \"https://static-cdn.jtvnw.net/emoticons/v2/58765/static/dark/3.0\"\n },\n \"start\": 53,\n \"end\": 64\n },\n {\n \"type\": \"twitch\",\n \"name\": \"<3\",\n \"id\": \"9\",\n \"gif\": false,\n \"animated\": false,\n \"urls\": {\n \"1\": \"https://static-cdn.jtvnw.net/emoticons/v2/9/static/dark/1.0\",\n \"2\": \"https://static-cdn.jtvnw.net/emoticons/v2/9/static/dark/2.0\",\n \"4\": \"https://static-cdn.jtvnw.net/emoticons/v2/9/static/dark/3.0\"\n },\n \"start\": 65,\n \"end\": 67\n }\n ],\n \"msgId\": \"beb957ea-dfbd-4184-82a3-458121f44867\"\n },\n \"renderedText\": \"Not emote <img src=\\\"https://static-cdn.jtvnw.net/emoticons/v2/64138/static/dark/1.0\\\" srcset=\\\"https://static-cdn.jtvnw.net/emoticons/v2/64138/static/dark/1.0 1x, https://static-cdn.jtvnw.net/emoticons/v2/64138/static/dark/2.0 2x, https://static-cdn.jtvnw.net/emoticons/v2/64138/static/dark/3.0 4x\\\" title=\\\"SeemsGood\\\" class=\\\"emote\\\"><img src=\\\"https://static-cdn.jtvnw.net/emoticons/v2/41/static/dark/1.0\\\" srcset=\\\"https://static-cdn.jtvnw.net/emoticons/v2/41/static/dark/1.0 1x, https://static-cdn.jtvnw.net/emoticons/v2/41/static/dark/2.0 2x, https://static-cdn.jtvnw.net/emoticons/v2/41/static/dark/3.0 4x\\\" title=\\\"Kreygasm\\\" class=\\\"emote\\\"><img src=\\\"https://static-cdn.jtvnw.net/emoticons/v2/245/static/dark/1.0\\\" srcset=\\\"https://static-cdn.jtvnw.net/emoticons/v2/245/static/dark/1.0 1x, https://static-cdn.jtvnw.net/emoticons/v2/245/static/dark/2.0 2x, https://static-cdn.jtvnw.net/emoticons/v2/245/static/dark/3.0 4x\\\" title=\\\"ResidentSleeper\\\" class=\\\"emote\\\"><img src=\\\"https://static-cdn.jtvnw.net/emoticons/v2/28087/static/dark/1.0\\\" srcset=\\\"https://static-cdn.jtvnw.net/emoticons/v2/28087/static/dark/1.0 1x, https://static-cdn.jtvnw.net/emoticons/v2/28087/static/dark/2.0 2x, https://static-cdn.jtvnw.net/emoticons/v2/28087/static/dark/3.0 4x\\\" title=\\\"WutFace\\\" class=\\\"emote\\\"><img src=\\\"https://static-cdn.jtvnw.net/emoticons/v2/58765/static/dark/1.0\\\" srcset=\\\"https://static-cdn.jtvnw.net/emoticons/v2/58765/static/dark/1.0 1x, https://static-cdn.jtvnw.net/emoticons/v2/58765/static/dark/2.0 2x, https://static-cdn.jtvnw.net/emoticons/v2/58765/static/dark/3.0 4x\\\" title=\\\"NotLikeThis\\\" class=\\\"emote\\\"><img src=\\\"https://static-cdn.jtvnw.net/emoticons/v2/9/static/dark/1.0\\\" srcset=\\\"https://static-cdn.jtvnw.net/emoticons/v2/9/static/dark/1.0 1x, https://static-cdn.jtvnw.net/emoticons/v2/9/static/dark/2.0 2x, https://static-cdn.jtvnw.net/emoticons/v2/9/static/dark/3.0 4x\\\" title=\\\"<3\\\" class=\\\"emote\\\">\"\n }\n },\n \"zeroWidthEmotes\": {\n \"listener\": \"message\",\n \"event\": {\n \"service\": \"twitch\",\n \"data\": {\n \"time\": 1759956619137,\n \"tags\": {\n \"badge-info\": \"subscriber/20\",\n \"badges\": \"\",\n \"client-nonce\": \"f7b17aea5c07c5c08fd920278fb52b5a\",\n \"color\": \"#DAA520\",\n \"display-name\": \"7TVUser\",\n \"emotes\": \"\",\n \"first-msg\": \"0\",\n \"flags\": \"\",\n \"id\": \"b44d1c53-1de9-454c-a269-bd8849cbcd2d\",\n \"mod\": \"0\",\n \"returning-chatter\": \"0\",\n \"room-id\": \"958683839\",\n \"subscriber\": \"1\",\n \"tmi-sent-ts\": \"1759956618295\",\n \"turbo\": \"0\",\n \"user-id\": \"958683839\",\n \"user-type\": \"\"\n },\n \"nick\": \"7TVUser\",\n \"userId\": \"958683839\",\n \"displayName\": \"7TVUser\",\n \"displayColor\": \"#DAA520\",\n \"badges\": [\n {\n \"type\": \"minecraft-15th-anniversary-celebration\",\n \"version\": \"1\",\n \"url\": \"https://static-cdn.jtvnw.net/badges/v1/178077b2-8b86-4f8d-927c-66ed6c1b025f/3\",\n \"description\": \"Minecraft 15th Anniversary Celebration\"\n }\n ],\n \"channel\": \"7TVUser\",\n \"text\": \"Zero-width emotes AYAYA PETPET right there!!\",\n \"isAction\": false,\n \"emotes\": [\n {\n \"type\": \"7tv\",\n \"name\": \"AYAYA\",\n \"id\": \"01GB32XE6R00018VJGJ4A9BNCV\",\n \"gif\": false,\n \"animated\": false,\n \"urls\": {\n \"1\": \"https://cdn.7tv.app/emote/01GB32XE6R00018VJGJ4A9BNCV/1x.webp\",\n \"2\": \"https://cdn.7tv.app/emote/01GB32XE6R00018VJGJ4A9BNCV/2x.webp\",\n \"3\": \"https://cdn.7tv.app/emote/01GB32XE6R00018VJGJ4A9BNCV/3x.webp\",\n \"4\": \"https://cdn.7tv.app/emote/01GB32XE6R00018VJGJ4A9BNCV/4x.webp\"\n },\n \"start\": 18,\n \"end\": 23\n },\n {\n \"type\": \"7tv\",\n \"name\": \"PETPET\",\n \"id\": \"01FE3XY508000AA32JP519W2EW\",\n \"gif\": true,\n \"animated\": true,\n \"urls\": {\n \"1\": \"https://cdn.7tv.app/emote/01FE3XY508000AA32JP519W2EW/1x.webp\",\n \"2\": \"https://cdn.7tv.app/emote/01FE3XY508000AA32JP519W2EW/2x.webp\",\n \"3\": \"https://cdn.7tv.app/emote/01FE3XY508000AA32JP519W2EW/3x.webp\",\n \"4\": \"https://cdn.7tv.app/emote/01FE3XY508000AA32JP519W2EW/4x.webp\"\n },\n \"start\": 24,\n \"end\": 30\n }\n ],\n \"msgId\": \"b44d1c53-1de9-454c-a269-bd8849cbcd2d\"\n },\n \"renderedText\": \"Zero-width emotes <img src=\\\"https://cdn.7tv.app/emote/01GB32XE6R00018VJGJ4A9BNCV/1x.webp\\\" srcset=\\\"https://cdn.7tv.app/emote/01GB32XE6R00018VJGJ4A9BNCV/1x.webp 1x, https://cdn.7tv.app/emote/01GB32XE6R00018VJGJ4A9BNCV/2x.webp 2x, https://cdn.7tv.app/emote/01GB32XE6R00018VJGJ4A9BNCV/4x.webp 4x\\\" title=\\\"AYAYA\\\" class=\\\"emote\\\"><img src=\\\"https://cdn.7tv.app/emote/01FE3XY508000AA32JP519W2EW/1x.webp\\\" srcset=\\\"https://cdn.7tv.app/emote/01FE3XY508000AA32JP519W2EW/1x.webp 1x, https://cdn.7tv.app/emote/01FE3XY508000AA32JP519W2EW/2x.webp 2x, https://cdn.7tv.app/emote/01FE3XY508000AA32JP519W2EW/4x.webp 4x\\\" title=\\\"PETPET\\\" class=\\\"emote\\\">right there!!\"\n }\n },\n \"sevenTv\": {\n \"listener\": \"message\",\n \"event\": {\n \"service\": \"twitch\",\n \"data\": {\n \"time\": 1749744413746,\n \"tags\": {\n \"badge-info\": \"\",\n \"badges\": \"\",\n \"client-nonce\": \"2bd56e3c058b5a4fc4e46c3e369891e6\",\n \"color\": \"\",\n \"display-name\": \"An1by\",\n \"emotes\": \"\",\n \"first-msg\": \"0\",\n \"flags\": \"\",\n \"id\": \"4c71789c-8c02-4e25-a71f-3a7d0ef19a33\",\n \"mod\": \"0\",\n \"returning-chatter\": \"0\",\n \"room-id\": \"958683839\",\n \"subscriber\": \"0\",\n \"tmi-sent-ts\": \"1749744412641\",\n \"turbo\": \"0\",\n \"user-id\": \"958683839\",\n \"user-type\": \"\"\n },\n \"nick\": \"tr0l1\",\n \"userId\": \"958683839\",\n \"displayName\": \"tr0l1\",\n \"displayColor\": \"\",\n \"badges\": [],\n \"channel\": \"tr0l1\",\n \"text\": \"ало ало Инса Каори Hello everyone! Hello everyone! Hello everyone!Hello everyone! Hello everyone! Hello everyone! Hello everyone! Hello everyone!\",\n \"isAction\": false,\n \"emotes\": [\n {\n \"type\": \"7tv\",\n \"name\": \"ало\",\n \"id\": \"01F6PRA3N80003BH8AEY9DWKDQ\",\n \"gif\": true,\n \"animated\": true,\n \"urls\": {\n \"1\": \"https://cdn.7tv.app/emote/01F6PRA3N80003BH8AEY9DWKDQ/1x.webp\",\n \"2\": \"https://cdn.7tv.app/emote/01F6PRA3N80003BH8AEY9DWKDQ/2x.webp\",\n \"3\": \"https://cdn.7tv.app/emote/01F6PRA3N80003BH8AEY9DWKDQ/3x.webp\",\n \"4\": \"https://cdn.7tv.app/emote/01F6PRA3N80003BH8AEY9DWKDQ/4x.webp\"\n },\n \"start\": 0,\n \"end\": 3\n },\n {\n \"type\": \"7tv\",\n \"name\": \"ало\",\n \"id\": \"01F6PRA3N80003BH8AEY9DWKDQ\",\n \"gif\": true,\n \"animated\": true,\n \"urls\": {\n \"1\": \"https://cdn.7tv.app/emote/01F6PRA3N80003BH8AEY9DWKDQ/1x.webp\",\n \"2\": \"https://cdn.7tv.app/emote/01F6PRA3N80003BH8AEY9DWKDQ/2x.webp\",\n \"3\": \"https://cdn.7tv.app/emote/01F6PRA3N80003BH8AEY9DWKDQ/3x.webp\",\n \"4\": \"https://cdn.7tv.app/emote/01F6PRA3N80003BH8AEY9DWKDQ/4x.webp\"\n },\n \"start\": 4,\n \"end\": 7\n },\n {\n \"type\": \"7tv\",\n \"name\": \"Инса\",\n \"id\": \"01JRE4VRRXWF0922HA3F9BZG6M\",\n \"gif\": false,\n \"animated\": false,\n \"urls\": {\n \"1\": \"https://cdn.7tv.app/emote/01JRE4VRRXWF0922HA3F9BZG6M/1x.webp\",\n \"2\": \"https://cdn.7tv.app/emote/01JRE4VRRXWF0922HA3F9BZG6M/2x.webp\",\n \"3\": \"https://cdn.7tv.app/emote/01JRE4VRRXWF0922HA3F9BZG6M/3x.webp\",\n \"4\": \"https://cdn.7tv.app/emote/01JRE4VRRXWF0922HA3F9BZG6M/4x.webp\"\n },\n \"start\": 8,\n \"end\": 12\n },\n {\n \"type\": \"7tv\",\n \"name\": \"Каори\",\n \"id\": \"01GY6TCEFG000BGHWA5T6NGBRA\",\n \"gif\": false,\n \"animated\": false,\n \"urls\": {\n \"1\": \"https://cdn.7tv.app/emote/01GY6TCEFG000BGHWA5T6NGBRA/1x.webp\",\n \"2\": \"https://cdn.7tv.app/emote/01GY6TCEFG000BGHWA5T6NGBRA/2x.webp\",\n \"3\": \"https://cdn.7tv.app/emote/01GY6TCEFG000BGHWA5T6NGBRA/3x.webp\",\n \"4\": \"https://cdn.7tv.app/emote/01GY6TCEFG000BGHWA5T6NGBRA/4x.webp\"\n },\n \"start\": 13,\n \"end\": 18\n }\n ],\n \"msgId\": \"4c71789c-8c02-4e25-a71f-3a7d0ef19a33\"\n },\n \"renderedText\": \"<img src=\\\"https://cdn.7tv.app/emote/01F6PRA3N80003BH8AEY9DWKDQ/1x.webp\\\" srcset=\\\"https://cdn.7tv.app/emote/01F6PRA3N80003BH8AEY9DWKDQ/1x.webp 1x, https://cdn.7tv.app/emote/01F6PRA3N80003BH8AEY9DWKDQ/2x.webp 2x, https://cdn.7tv.app/emote/01F6PRA3N80003BH8AEY9DWKDQ/4x.webp 4x\\\" title=\\\"ало\\\" class=\\\"emote\\\"><img src=\\\"https://cdn.7tv.app/emote/01F6PRA3N80003BH8AEY9DWKDQ/1x.webp\\\" srcset=\\\"https://cdn.7tv.app/emote/01F6PRA3N80003BH8AEY9DWKDQ/1x.webp 1x, https://cdn.7tv.app/emote/01F6PRA3N80003BH8AEY9DWKDQ/2x.webp 2x, https://cdn.7tv.app/emote/01F6PRA3N80003BH8AEY9DWKDQ/4x.webp 4x\\\" title=\\\"ало\\\" class=\\\"emote\\\"><img src=\\\"https://cdn.7tv.app/emote/01JRE4VRRXWF0922HA3F9BZG6M/1x.webp\\\" srcset=\\\"https://cdn.7tv.app/emote/01JRE4VRRXWF0922HA3F9BZG6M/1x.webp 1x, https://cdn.7tv.app/emote/01JRE4VRRXWF0922HA3F9BZG6M/2x.webp 2x, https://cdn.7tv.app/emote/01JRE4VRRXWF0922HA3F9BZG6M/4x.webp 4x\\\" title=\\\"Инса\\\" class=\\\"emote\\\"><img src=\\\"https://cdn.7tv.app/emote/01GY6TCEFG000BGHWA5T6NGBRA/1x.webp\\\" srcset=\\\"https://cdn.7tv.app/emote/01GY6TCEFG000BGHWA5T6NGBRA/1x.webp 1x, https://cdn.7tv.app/emote/01GY6TCEFG000BGHWA5T6NGBRA/2x.webp 2x, https://cdn.7tv.app/emote/01GY6TCEFG000BGHWA5T6NGBRA/4x.webp 4x\\\" title=\\\"Каори\\\" class=\\\"emote\\\">Hello everyone!\"\n }\n },\n \"sevenTvSolo\": {\n \"listener\": \"message\",\n \"event\": {\n \"service\": \"twitch\",\n \"data\": {\n \"time\": 1768321684253,\n \"tags\": {\n \"badge-info\": \"subscriber/23\",\n \"badges\": \"broadcaster/1,subscriber/0\",\n \"client-nonce\": \"51cc77206bf346eda20774b75aac675d\",\n \"color\": \"#DAA520\",\n \"display-name\": \"An1by\",\n \"emotes\": \"\",\n \"first-msg\": \"0\",\n \"flags\": \"\",\n \"id\": \"e30a02bf-a3c7-40f2-9325-cdc2690d3631\",\n \"mod\": \"0\",\n \"returning-chatter\": \"0\",\n \"room-id\": \"958683839\",\n \"subscriber\": \"1\",\n \"tmi-sent-ts\": \"1768321684074\",\n \"turbo\": \"0\",\n \"user-id\": \"958683839\",\n \"user-type\": \"\"\n },\n \"nick\": \"an1by\",\n \"userId\": \"958683839\",\n \"displayName\": \"An1by\",\n \"displayColor\": \"#DAA520\",\n \"badges\": [\n {\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 {\n \"type\": \"subscriber\",\n \"version\": \"0\",\n \"url\": \"https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/3\",\n \"description\": \"Subscriber\"\n }\n ],\n \"channel\": \"an1by\",\n \"text\": \"DurkaDance ͏\",\n \"isAction\": false,\n \"emotes\": [\n {\n \"type\": \"7tv\",\n \"name\": \"DurkaDance\",\n \"id\": \"01JQBC7K2FX7HE4SFZFJEN6CWY\",\n \"gif\": true,\n \"animated\": true,\n \"urls\": {\n \"1\": \"https://cdn.7tv.app/emote/01JQBC7K2FX7HE4SFZFJEN6CWY/1x.webp\",\n \"2\": \"https://cdn.7tv.app/emote/01JQBC7K2FX7HE4SFZFJEN6CWY/2x.webp\",\n \"3\": \"https://cdn.7tv.app/emote/01JQBC7K2FX7HE4SFZFJEN6CWY/3x.webp\",\n \"4\": \"https://cdn.7tv.app/emote/01JQBC7K2FX7HE4SFZFJEN6CWY/4x.webp\"\n },\n \"start\": 0,\n \"end\": 10\n }\n ],\n \"msgId\": \"e30a02bf-a3c7-40f2-9325-cdc2690d3631\"\n },\n \"renderedText\": \"<img src=\\\"https://cdn.7tv.app/emote/01JQBC7K2FX7HE4SFZFJEN6CWY/1x.webp\\\" srcset=\\\"https://cdn.7tv.app/emote/01JQBC7K2FX7HE4SFZFJEN6CWY/1x.webp 1x, https://cdn.7tv.app/emote/01JQBC7K2FX7HE4SFZFJEN6CWY/2x.webp 2x, https://cdn.7tv.app/emote/01JQBC7K2FX7HE4SFZFJEN6CWY/4x.webp 4x\\\" title=\\\"DurkaDance\\\" class=\\\"emote\\\"> ͏\"\n }\n }\n};\n","/**\r\n * Команды, вызывающие onEventReceived с тестовыми сообщением или алертом.\r\n * Работают только в браузере (требуется window).\r\n */\r\nimport { testMessages, testAlerts } from \"./sources\";\r\n\r\nconst EVENT_NAME = \"onEventReceived\";\r\n\r\n/**\r\n * Отправляет тестовое сообщение по ключу: диспатчит CustomEvent onEventReceived.\r\n */\r\nexport function testMessage(key: string): void {\r\n if (typeof window === \"undefined\") {\r\n return;\r\n }\r\n const msg = testMessages[key as keyof typeof testMessages];\r\n if (msg) {\r\n window.dispatchEvent(new CustomEvent(EVENT_NAME, { detail: msg }));\r\n }\r\n}\r\n\r\n/**\r\n * Отправляет тестовый алерт по ключу: диспатчит CustomEvent onEventReceived.\r\n */\r\nexport function testAlert(key: string): void {\r\n if (typeof window === \"undefined\") {\r\n return;\r\n }\r\n const alert = testAlerts[key as keyof typeof testAlerts];\r\n if (alert) {\r\n window.dispatchEvent(new CustomEvent(EVENT_NAME, { detail: alert }));\r\n }\r\n}\r\n","/**\r\n * Преобразование fieldId виджета в ключ тестовых данных.\r\n */\r\nexport function getTestMessageKey(fieldId: string): string | null {\r\n if (!fieldId.startsWith(\"testMessage\")) return null;\r\n const name = fieldId.replace(\"testMessage\", \"\");\r\n return name.charAt(0).toLowerCase() + name.slice(1);\r\n}\r\n\r\nexport function getTestAlertKey(fieldId: string): string | null {\r\n if (!fieldId.startsWith(\"testAlert\")) return null;\r\n const name = fieldId.replace(\"testAlert\", \"\");\r\n return name.charAt(0).toLowerCase() + name.slice(1);\r\n}\r\n","/**\r\n * Минимальный тип тегов Twitch (IRCParser / StreamElements)\r\n */\r\nexport type TwitchMessageTags = Record<string, unknown> & {\r\n \"badge-info\"?: string;\r\n badges?: string;\r\n \"first-msg\"?: string;\r\n turbo?: string;\r\n subscriber?: string;\r\n mod?: string;\r\n vip?: string;\r\n \"user-type\"?: string;\r\n}\r\n\r\n/**\r\n * Бейдж пользователя (как в event.data.badges)\r\n */\r\nexport interface TwitchBadge {\r\n type: string;\r\n version?: string;\r\n url?: string;\r\n description?: string;\r\n}\r\n\r\n/**\r\n * Парсит месяц подписки из badge-info.\r\n * Формат: \"subscriber/<NUMBER>\" — номер месяца текущей подписки.\r\n * @returns номер месяца или null, если нет/не подписчик\r\n */\r\nexport function parseSubscriberMonth(tags: TwitchMessageTags): number | null {\r\n const badgeInfo = tags[\"badge-info\"] ?? \"\";\r\n const match = badgeInfo.match(/^subscriber\\/(\\d+)$/);\r\n if (!match) {\r\n return null;\r\n }\r\n const n = parseInt(match[1], 10);\r\n return Number.isNaN(n) ? null : n;\r\n}\r\n\r\n/**\r\n * Подписка активна, если:\r\n * - в badge-info subscriber/<NUMBER> и NUMBER !== 0, или\r\n * - в badges есть broadcaster/1 (стример всегда «активный подписчик» в своём чате).\r\n */\r\nexport function isSubscriptionActive(tags: TwitchMessageTags): boolean {\r\n const month = parseSubscriberMonth(tags);\r\n if (month !== null && month !== 0) {\r\n return true;\r\n }\r\n const badges = tags.badges ?? \"\";\r\n return badges.includes(\"broadcaster/1\");\r\n}\r\n\r\nexport const isSubscriber = isSubscriptionActive;\r\n\r\n/**\r\n * Подписка активна, если:\r\n * - в badge-info subscriber/<NUMBER> и NUMBER !== 0, или\r\n * - в badges есть broadcaster/1 (стример всегда «активный подписчик» в своём чате).\r\n */\r\nexport function isBroadcaster(tags: TwitchMessageTags): boolean {\r\n const badges = tags.badges ?? \"\";\r\n return badges.includes(\"broadcaster/1\");\r\n}\r\n\r\n/**\r\n * Первое сообщение в чате: first-msg === \"1\".\r\n */\r\nexport function isFirstMessageChatter(tags: TwitchMessageTags): boolean {\r\n return tags[\"first-msg\"] === \"1\";\r\n}\r\n\r\n/**\r\n * Twitch Turbo: turbo === \"1\".\r\n */\r\nexport function isTurbo(tags: TwitchMessageTags): boolean {\r\n return tags.turbo === \"1\";\r\n}\r\n\r\n/**\r\n * VIP: vip === \"1\" или бейдж vip/1.\r\n */\r\nexport function isVip(tags: TwitchMessageTags): boolean {\r\n const badges = tags.badges ?? \"\";\r\n return tags.vip === \"1\" || badges.includes(\"vip/1\");\r\n}\r\n\r\n/**\r\n * Модератор: mod === \"1\", бейдж moderator/1 или user-type === \"mod\".\r\n */\r\nexport function isModerator(tags: TwitchMessageTags): boolean {\r\n const badges = tags.badges ?? \"\";\r\n const userType = tags[\"user-type\"] ?? \"\";\r\n return (\r\n tags.mod === \"1\" || badges.includes(\"moderator/1\") || userType === \"mod\"\r\n );\r\n}\r\n\r\n/**\r\n * Artist: бейдж artist-badge/1.\r\n */\r\nexport function isArtist(tags: TwitchMessageTags): boolean {\r\n const badges = tags.badges ?? \"\";\r\n return badges.includes(\"artist-badge/1\");\r\n}\r\n\r\n/**\r\n * Возвращает URL бейджа по типу из массива бейджей (формат как в event.data.badges).\r\n * @param badges массив вида [{ type, version, url, description }, ...]\r\n * @param type тип бейджа (например \"subscriber\", \"broadcaster\")\r\n * @returns url бейджа или undefined\r\n */\r\nexport function getBadgeUrlByType(\r\n badges: TwitchBadge[],\r\n type: string,\r\n): string | undefined {\r\n const badge = badges.find((b) => b.type === type);\r\n return badge?.url;\r\n}\r\n","import {\r\n isArtist,\r\n isBroadcaster,\r\n isModerator,\r\n isSubscriber,\r\n isTurbo,\r\n isVip,\r\n type TwitchMessageTags,\r\n} from \"./tags\";\r\n\r\nexport type UserRole =\r\n | \"broadcaster\"\r\n | \"moderator\"\r\n | \"vip\"\r\n | \"artist\"\r\n | \"subscriber\"\r\n | \"turbo\"\r\n | \"default\";\r\n\r\nexport function determineUserRoles(\r\n tags: TwitchMessageTags | Record<string, string>,\r\n): UserRole[] {\r\n const roles: UserRole[] = [\"default\"];\r\n if (isBroadcaster(tags)) {\r\n roles.push(\"broadcaster\");\r\n }\r\n if (isModerator(tags)) {\r\n roles.push(\"moderator\");\r\n }\r\n if (isVip(tags)) {\r\n roles.push(\"vip\");\r\n }\r\n if (isArtist(tags)) {\r\n roles.push(\"artist\");\r\n }\r\n if (isSubscriber(tags)) {\r\n roles.push(\"subscriber\");\r\n }\r\n if (isTurbo(tags)) {\r\n roles.push(\"turbo\");\r\n }\r\n return roles;\r\n}\r\n"],"names":["parseTier","raw","tierText","num","getCacheKey","detail","listener","event","ag","aid","classifyEvent","data","tierInfo","isAnon","gifted","sender","amount","username","activityGroup","firstGift","bulkGifted","name","isCommunityGift","AGGREGATE_TIMEOUT_MS","bufferByGroup","bufferTimers","getCacheForType","cacheSubs","type","c","emitAggregated","groupKey","merged","onNormalized","cache","flushBuffer","broadcaster","buf","purchase","subscribers","tier","totalAmount","recipients","s","firstSub","senderFromSub","normalizeIncomingEvent","options","classified","cacheKey","onWidgetLoadDetail","testAlerts","testMessages","EVENT_NAME","testMessage","key","msg","testAlert","alert","getTestMessageKey","fieldId","getTestAlertKey","parseSubscriberMonth","tags","match","n","isSubscriptionActive","month","isSubscriber","isBroadcaster","isFirstMessageChatter","isTurbo","isVip","badges","isModerator","userType","isArtist","getBadgeUrlByType","badge","b","determineUserRoles","roles"],"mappings":"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BACX,KAAM,UAAA,EAER,CACE,KAAM,cACN,UAAW,2BACX,KAAM,UAAA,EAER,CACE,KAAM,WACN,UAAW,2BACX,KAAM,UAAA,EAER,CACE,KAAM,aACN,UAAW,2BACX,KAAM,UAAA,EAER,CACE,KAAM,eACN,UAAW,2BACX,KAAM,UAAA,EAER,CACE,KAAM,cACN,UAAW,2BACX,KAAM,UAAA,EAER,CACE,KAAM,WACN,UAAW,2BACX,KAAM,UAAA,EAER,CACE,KAAM,gBACN,UAAW,2BACX,KAAM,UAAA,EAER,CACE,KAAM,cACN,UAAW,2BACX,KAAM,UAAA,EAER,CACE,KAAM,SACN,UAAW,2BACX,KAAM,UAAA,EAER,CACE,KAAM,aACN,UAAW,2BACX,KAAM,UAAA,EAER,CACE,KAAM,eACN,UAAW,2BACX,KAAM,UAAA,EAER,CACE,KAAM,WACN,UAAW,2BACX,KAAM,UAAA,EAER,CACE,KAAM,eACN,UAAW,2BACX,KAAM,UAAA,EAER,CACE,KAAM,YACN,UAAW,2BACX,KAAM,UAAA,EAER,CACE,KAAM,aACN,UAAW,2BACX,KAAM,UAAA,EAER,CACE,KAAM,mBACN,UAAW,2BACX,KAAM,UAAA,EAER,CACE,KAAM,aACN,UAAW,2BACX,KAAM,UAAA,EAER,CACE,KAAM,YACN,UAAW,2BACX,KAAM,UAAA,EAER,CACE,KAAM,cACN,UAAW,2BACX,KAAM,UAAA,EAER,CACE,KAAM,WACN,UAAW,2BACX,KAAM,UAAA,EAER,CACE,KAAM,YACN,OAAQ,EACR,UAAW,2BACX,KAAM,MAAA,EAER,CACE,KAAM,eACN,OAAQ,EACR,UAAW,2BACX,KAAM,MAAA,EAER,CACE,KAAM,UACN,OAAQ,EACR,UAAW,2BACX,KAAM,MAAA,EAER,CACE,KAAM,iBACN,OAAQ,GACR,UAAW,2BACX,KAAM,MAAA,EAER,CACE,KAAM,YACN,OAAQ,EACR,UAAW,2BACX,KAAM,MAAA,EAER,CACE,KAAM,iBACN,OAAQ,EACR,UAAW,2BACX,KAAM,MAAA,EAER,CACE,KAAM,YACN,OAAQ,GACR,UAAW,2BACX,KAAM,MAAA,EAER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"}
|