@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.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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UACE,MAAM;AAAA,UACN,WAAW;AAAA,UACX,MAAM;AAAA,QAAA;AAAA,QAER;AAAA,UACE,MAAM;AAAA,UACN,WAAW;AAAA,UACX,MAAM;AAAA,QAAA;AAAA,QAER;AAAA,UACE,MAAM;AAAA,UACN,WAAW;AAAA,UACX,MAAM;AAAA,QAAA;AAAA,QAER;AAAA,UACE,MAAM;AAAA,UACN,WAAW;AAAA,UACX,MAAM;AAAA,QAAA;AAAA,QAER;AAAA,UACE,MAAM;AAAA,UACN,WAAW;AAAA,UACX,MAAM;AAAA,QAAA;AAAA,QAER;AAAA,UACE,MAAM;AAAA,UACN,WAAW;AAAA,UACX,MAAM;AAAA,QAAA;AAAA,QAER;AAAA,UACE,MAAM;AAAA,UACN,WAAW;AAAA,UACX,MAAM;AAAA,QAAA;AAAA,QAER;AAAA,UACE,MAAM;AAAA,UACN,WAAW;AAAA,UACX,MAAM;AAAA,QAAA;AAAA,QAER;AAAA,UACE,MAAM;AAAA,UACN,WAAW;AAAA,UACX,MAAM;AAAA,QAAA;AAAA,QAER;AAAA,UACE,MAAM;AAAA,UACN,WAAW;AAAA,UACX,MAAM;AAAA,QAAA;AAAA,QAER;AAAA,UACE,MAAM;AAAA,UACN,WAAW;AAAA,UACX,MAAM;AAAA,QAAA;AAAA,QAER;AAAA,UACE,MAAM;AAAA,UACN,WAAW;AAAA,UACX,MAAM;AAAA,QAAA;AAAA,QAER;AAAA,UACE,MAAM;AAAA,UACN,WAAW;AAAA,UACX,MAAM;AAAA,QAAA;AAAA,QAER;AAAA,UACE,MAAM;AAAA,UACN,WAAW;AAAA,UACX,MAAM;AAAA,QAAA;AAAA,QAER;AAAA,UACE,MAAM;AAAA,UACN,WAAW;AAAA,UACX,MAAM;AAAA,QAAA;AAAA,QAER;AAAA,UACE,MAAM;AAAA,UACN,WAAW;AAAA,UACX,MAAM;AAAA,QAAA;AAAA,QAER;AAAA,UACE,MAAM;AAAA,UACN,WAAW;AAAA,UACX,MAAM;AAAA,QAAA;AAAA,QAER;AAAA,UACE,MAAM;AAAA,UACN,WAAW;AAAA,UACX,MAAM;AAAA,QAAA;AAAA,QAER;AAAA,UACE,MAAM;AAAA,UACN,WAAW;AAAA,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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/root/keys.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIhE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI9D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../../../src/root/message/event.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,2EAA2E;AAC3E,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC;CACtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/root/message/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,SAAS,CAAA;AACvB,cAAc,QAAQ,CAAA"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { TwitchMessageTags } from "./tags";
|
|
2
|
+
export declare namespace Message {
|
|
3
|
+
interface Event {
|
|
4
|
+
service: "twitch";
|
|
5
|
+
data: Data;
|
|
6
|
+
renderedText: string;
|
|
7
|
+
}
|
|
8
|
+
interface Data {
|
|
9
|
+
tags: TwitchMessageTags;
|
|
10
|
+
nick: string;
|
|
11
|
+
userId: string;
|
|
12
|
+
displayName: string;
|
|
13
|
+
displayColor?: string;
|
|
14
|
+
badges: Array<Badge>;
|
|
15
|
+
channel: string;
|
|
16
|
+
text: string;
|
|
17
|
+
isAction: boolean;
|
|
18
|
+
emotes: Array<Emote>;
|
|
19
|
+
msgId: string;
|
|
20
|
+
time?: number;
|
|
21
|
+
}
|
|
22
|
+
interface Badge {
|
|
23
|
+
type: string;
|
|
24
|
+
version?: string;
|
|
25
|
+
url?: string;
|
|
26
|
+
description?: string;
|
|
27
|
+
}
|
|
28
|
+
interface Emote {
|
|
29
|
+
type: string;
|
|
30
|
+
name: string;
|
|
31
|
+
id: string;
|
|
32
|
+
urls: Record<string, string>;
|
|
33
|
+
start?: number;
|
|
34
|
+
end?: number;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=message.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../../src/root/message/message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAEhD,yBAAiB,OAAO,CAAC;IACvB,UAAiB,KAAK;QACpB,OAAO,EAAE,QAAQ,CAAC;QAClB,IAAI,EAAE,IAAI,CAAC;QACX,YAAY,EAAE,MAAM,CAAC;KACtB;IAED,UAAiB,IAAI;QACnB,IAAI,EAAE,iBAAiB,CAAC;QACxB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QACrB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;KACf;IAED,UAAiB,KAAK;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB;IAED,UAAiB,KAAK;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,GAAG,CAAC,EAAE,MAAM,CAAC;KACd;CACF"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type TwitchMessageTags } from "./tags";
|
|
2
|
+
export type UserRole = "broadcaster" | "moderator" | "vip" | "artist" | "subscriber" | "turbo" | "default";
|
|
3
|
+
export declare function determineUserRoles(tags: TwitchMessageTags | Record<string, string>): UserRole[];
|
|
4
|
+
//# sourceMappingURL=roles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../../../src/root/message/roles.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,iBAAiB,EACvB,MAAM,QAAQ,CAAC;AAEhB,MAAM,MAAM,QAAQ,GAChB,aAAa,GACb,WAAW,GACX,KAAK,GACL,QAAQ,GACR,YAAY,GACZ,OAAO,GACP,SAAS,CAAC;AAEd,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/C,QAAQ,EAAE,CAqBZ"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Минимальный тип тегов Twitch (IRCParser / StreamElements)
|
|
3
|
+
*/
|
|
4
|
+
export type TwitchMessageTags = Record<string, unknown> & {
|
|
5
|
+
"badge-info"?: string;
|
|
6
|
+
badges?: string;
|
|
7
|
+
"first-msg"?: string;
|
|
8
|
+
turbo?: string;
|
|
9
|
+
subscriber?: string;
|
|
10
|
+
mod?: string;
|
|
11
|
+
vip?: string;
|
|
12
|
+
"user-type"?: string;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Бейдж пользователя (как в event.data.badges)
|
|
16
|
+
*/
|
|
17
|
+
export interface TwitchBadge {
|
|
18
|
+
type: string;
|
|
19
|
+
version?: string;
|
|
20
|
+
url?: string;
|
|
21
|
+
description?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Парсит месяц подписки из badge-info.
|
|
25
|
+
* Формат: "subscriber/<NUMBER>" — номер месяца текущей подписки.
|
|
26
|
+
* @returns номер месяца или null, если нет/не подписчик
|
|
27
|
+
*/
|
|
28
|
+
export declare function parseSubscriberMonth(tags: TwitchMessageTags): number | null;
|
|
29
|
+
/**
|
|
30
|
+
* Подписка активна, если:
|
|
31
|
+
* - в badge-info subscriber/<NUMBER> и NUMBER !== 0, или
|
|
32
|
+
* - в badges есть broadcaster/1 (стример всегда «активный подписчик» в своём чате).
|
|
33
|
+
*/
|
|
34
|
+
export declare function isSubscriptionActive(tags: TwitchMessageTags): boolean;
|
|
35
|
+
export declare const isSubscriber: typeof isSubscriptionActive;
|
|
36
|
+
/**
|
|
37
|
+
* Подписка активна, если:
|
|
38
|
+
* - в badge-info subscriber/<NUMBER> и NUMBER !== 0, или
|
|
39
|
+
* - в badges есть broadcaster/1 (стример всегда «активный подписчик» в своём чате).
|
|
40
|
+
*/
|
|
41
|
+
export declare function isBroadcaster(tags: TwitchMessageTags): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Первое сообщение в чате: first-msg === "1".
|
|
44
|
+
*/
|
|
45
|
+
export declare function isFirstMessageChatter(tags: TwitchMessageTags): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Twitch Turbo: turbo === "1".
|
|
48
|
+
*/
|
|
49
|
+
export declare function isTurbo(tags: TwitchMessageTags): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* VIP: vip === "1" или бейдж vip/1.
|
|
52
|
+
*/
|
|
53
|
+
export declare function isVip(tags: TwitchMessageTags): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Модератор: mod === "1", бейдж moderator/1 или user-type === "mod".
|
|
56
|
+
*/
|
|
57
|
+
export declare function isModerator(tags: TwitchMessageTags): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Artist: бейдж artist-badge/1.
|
|
60
|
+
*/
|
|
61
|
+
export declare function isArtist(tags: TwitchMessageTags): boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Возвращает URL бейджа по типу из массива бейджей (формат как в event.data.badges).
|
|
64
|
+
* @param badges массив вида [{ type, version, url, description }, ...]
|
|
65
|
+
* @param type тип бейджа (например "subscriber", "broadcaster")
|
|
66
|
+
* @returns url бейджа или undefined
|
|
67
|
+
*/
|
|
68
|
+
export declare function getBadgeUrlByType(badges: TwitchBadge[], type: string): string | undefined;
|
|
69
|
+
//# sourceMappingURL=tags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../../src/root/message/tags.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACxD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAA;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,GAAG,IAAI,CAQ3E;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAOrE;AAED,eAAO,MAAM,YAAY,6BAAuB,CAAC;AAEjD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAG9D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAEtE;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAExD;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAGtD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAM5D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAGzD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EAAE,EACrB,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,SAAS,CAGpB"}
|