@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,119 @@
|
|
|
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
|
+
/**
|
|
16
|
+
* Бейдж пользователя (как в event.data.badges)
|
|
17
|
+
*/
|
|
18
|
+
export interface TwitchBadge {
|
|
19
|
+
type: string;
|
|
20
|
+
version?: string;
|
|
21
|
+
url?: string;
|
|
22
|
+
description?: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Парсит месяц подписки из badge-info.
|
|
27
|
+
* Формат: "subscriber/<NUMBER>" — номер месяца текущей подписки.
|
|
28
|
+
* @returns номер месяца или null, если нет/не подписчик
|
|
29
|
+
*/
|
|
30
|
+
export function parseSubscriberMonth(tags: TwitchMessageTags): number | null {
|
|
31
|
+
const badgeInfo = tags["badge-info"] ?? "";
|
|
32
|
+
const match = badgeInfo.match(/^subscriber\/(\d+)$/);
|
|
33
|
+
if (!match) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
const n = parseInt(match[1], 10);
|
|
37
|
+
return Number.isNaN(n) ? null : n;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Подписка активна, если:
|
|
42
|
+
* - в badge-info subscriber/<NUMBER> и NUMBER !== 0, или
|
|
43
|
+
* - в badges есть broadcaster/1 (стример всегда «активный подписчик» в своём чате).
|
|
44
|
+
*/
|
|
45
|
+
export function isSubscriptionActive(tags: TwitchMessageTags): boolean {
|
|
46
|
+
const month = parseSubscriberMonth(tags);
|
|
47
|
+
if (month !== null && month !== 0) {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
const badges = tags.badges ?? "";
|
|
51
|
+
return badges.includes("broadcaster/1");
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export const isSubscriber = isSubscriptionActive;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Подписка активна, если:
|
|
58
|
+
* - в badge-info subscriber/<NUMBER> и NUMBER !== 0, или
|
|
59
|
+
* - в badges есть broadcaster/1 (стример всегда «активный подписчик» в своём чате).
|
|
60
|
+
*/
|
|
61
|
+
export function isBroadcaster(tags: TwitchMessageTags): boolean {
|
|
62
|
+
const badges = tags.badges ?? "";
|
|
63
|
+
return badges.includes("broadcaster/1");
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Первое сообщение в чате: first-msg === "1".
|
|
68
|
+
*/
|
|
69
|
+
export function isFirstMessageChatter(tags: TwitchMessageTags): boolean {
|
|
70
|
+
return tags["first-msg"] === "1";
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Twitch Turbo: turbo === "1".
|
|
75
|
+
*/
|
|
76
|
+
export function isTurbo(tags: TwitchMessageTags): boolean {
|
|
77
|
+
return tags.turbo === "1";
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* VIP: vip === "1" или бейдж vip/1.
|
|
82
|
+
*/
|
|
83
|
+
export function isVip(tags: TwitchMessageTags): boolean {
|
|
84
|
+
const badges = tags.badges ?? "";
|
|
85
|
+
return tags.vip === "1" || badges.includes("vip/1");
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Модератор: mod === "1", бейдж moderator/1 или user-type === "mod".
|
|
90
|
+
*/
|
|
91
|
+
export function isModerator(tags: TwitchMessageTags): boolean {
|
|
92
|
+
const badges = tags.badges ?? "";
|
|
93
|
+
const userType = tags["user-type"] ?? "";
|
|
94
|
+
return (
|
|
95
|
+
tags.mod === "1" || badges.includes("moderator/1") || userType === "mod"
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Artist: бейдж artist-badge/1.
|
|
101
|
+
*/
|
|
102
|
+
export function isArtist(tags: TwitchMessageTags): boolean {
|
|
103
|
+
const badges = tags.badges ?? "";
|
|
104
|
+
return badges.includes("artist-badge/1");
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Возвращает URL бейджа по типу из массива бейджей (формат как в event.data.badges).
|
|
109
|
+
* @param badges массив вида [{ type, version, url, description }, ...]
|
|
110
|
+
* @param type тип бейджа (например "subscriber", "broadcaster")
|
|
111
|
+
* @returns url бейджа или undefined
|
|
112
|
+
*/
|
|
113
|
+
export function getBadgeUrlByType(
|
|
114
|
+
badges: TwitchBadge[],
|
|
115
|
+
type: string,
|
|
116
|
+
): string | undefined {
|
|
117
|
+
const badge = badges.find((b) => b.type === type);
|
|
118
|
+
return badge?.url;
|
|
119
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
export const testAlerts = {
|
|
2
|
+
follower: {
|
|
3
|
+
listener: "follower-latest",
|
|
4
|
+
event: {
|
|
5
|
+
name: "An1by",
|
|
6
|
+
},
|
|
7
|
+
},
|
|
8
|
+
communityGiftAnonymous: {
|
|
9
|
+
listener: "event",
|
|
10
|
+
event: {
|
|
11
|
+
type: "communityGiftPurchase",
|
|
12
|
+
provider: "twitch",
|
|
13
|
+
channel: "663b10ba6cd449c4162a2230",
|
|
14
|
+
activityGroup: "41a50a915794e4ae7cf5e600fd3445d4",
|
|
15
|
+
data: {
|
|
16
|
+
amount: 2,
|
|
17
|
+
username: "anonymous",
|
|
18
|
+
displayName: "AnAnonymousGifter",
|
|
19
|
+
tier: "2000",
|
|
20
|
+
sender: "Anonymous",
|
|
21
|
+
},
|
|
22
|
+
_id: "699868d7df734989ec85d393",
|
|
23
|
+
activityId: "699868d7df734989ec85d393",
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
communityGift: {
|
|
27
|
+
listener: "event",
|
|
28
|
+
event: {
|
|
29
|
+
type: "communityGiftPurchase",
|
|
30
|
+
provider: "twitch",
|
|
31
|
+
channel: "663b10ba6cd449c4162a2230",
|
|
32
|
+
activityGroup: "841592c0bccbf3e1e7de71e1c8f4d9f0",
|
|
33
|
+
data: {
|
|
34
|
+
amount: 1,
|
|
35
|
+
username: "rishamon",
|
|
36
|
+
displayName: "rishamon",
|
|
37
|
+
tier: "1000",
|
|
38
|
+
sender: "rishamon",
|
|
39
|
+
},
|
|
40
|
+
_id: "699867c7fef23197a6a089f5",
|
|
41
|
+
activityId: "699867c7fef23197a6a089f5",
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
sub: {
|
|
45
|
+
listener: "subscriber-latest",
|
|
46
|
+
event: {
|
|
47
|
+
name: "An1by",
|
|
48
|
+
amount: 1,
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
selfSub: {
|
|
52
|
+
listener: "event",
|
|
53
|
+
event: {
|
|
54
|
+
type: "subscriber",
|
|
55
|
+
provider: "twitch",
|
|
56
|
+
channel: "663b10ba6cd449c4162a2230",
|
|
57
|
+
data: {
|
|
58
|
+
amount: 1,
|
|
59
|
+
username: "rishamon",
|
|
60
|
+
displayName: "rishamon",
|
|
61
|
+
tier: "1000",
|
|
62
|
+
},
|
|
63
|
+
_id: "6998676317aed69e62b8f283",
|
|
64
|
+
activityId: "6998676317aed69e62b8f283",
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
soloSubToSomeone: {
|
|
68
|
+
listener: "event",
|
|
69
|
+
event: {
|
|
70
|
+
type: "subscriber",
|
|
71
|
+
provider: "twitch",
|
|
72
|
+
channel: "663b10ba6cd449c4162a2230",
|
|
73
|
+
data: {
|
|
74
|
+
amount: 1,
|
|
75
|
+
username: "encry_s",
|
|
76
|
+
displayName: "encry_s",
|
|
77
|
+
message:
|
|
78
|
+
"rishamon gifted a Tier 1 sub to encry_s! This is their first Gift Sub in the channel!",
|
|
79
|
+
tier: "1000",
|
|
80
|
+
sender: "rishamon",
|
|
81
|
+
gifted: true,
|
|
82
|
+
},
|
|
83
|
+
_id: "699866e82d9cd9a70854baf2",
|
|
84
|
+
activityId: "699866e82d9cd9a70854baf2",
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
subRenewal: {
|
|
88
|
+
listener: "event",
|
|
89
|
+
event: {
|
|
90
|
+
type: "subscriber",
|
|
91
|
+
provider: "twitch",
|
|
92
|
+
channel: "663b10ba6cd449c4162a2230",
|
|
93
|
+
data: {
|
|
94
|
+
amount: 8,
|
|
95
|
+
username: "silgestian",
|
|
96
|
+
displayName: "SilgeStian",
|
|
97
|
+
tier: "1000",
|
|
98
|
+
},
|
|
99
|
+
_id: "69986dfaf25724ff4162bd1a",
|
|
100
|
+
activityId: "69986dfaf25724ff4162bd1a",
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
bits: {
|
|
104
|
+
listener: "cheer-latest",
|
|
105
|
+
event: {
|
|
106
|
+
name: "An1by",
|
|
107
|
+
amount: 30,
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
raid: {
|
|
111
|
+
listener: "raid-latest",
|
|
112
|
+
event: {
|
|
113
|
+
name: "An1by",
|
|
114
|
+
amount: 50,
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
donationShortText: {
|
|
118
|
+
listener: "donation",
|
|
119
|
+
event: {
|
|
120
|
+
data: {
|
|
121
|
+
alert_type: "1",
|
|
122
|
+
currency: "RUB",
|
|
123
|
+
billing_system: "CARD",
|
|
124
|
+
id: 5,
|
|
125
|
+
amount_main: 500,
|
|
126
|
+
amount: 500,
|
|
127
|
+
username: "An1by",
|
|
128
|
+
message: "Simple message text",
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
donationLongText: {
|
|
133
|
+
listener: "donation",
|
|
134
|
+
event: {
|
|
135
|
+
data: {
|
|
136
|
+
alert_type: "1",
|
|
137
|
+
currency: "RUB",
|
|
138
|
+
billing_system: "CARD",
|
|
139
|
+
id: 5,
|
|
140
|
+
amount_main: 500,
|
|
141
|
+
amount: 500,
|
|
142
|
+
username: "An1by",
|
|
143
|
+
message:
|
|
144
|
+
"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.",
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
donation: {
|
|
149
|
+
listener: "donation",
|
|
150
|
+
event: {
|
|
151
|
+
data: {
|
|
152
|
+
alert_type: "1",
|
|
153
|
+
currency: "RUB",
|
|
154
|
+
billing_system: "CARD",
|
|
155
|
+
id: 5,
|
|
156
|
+
amount_main: 500,
|
|
157
|
+
amount: 500,
|
|
158
|
+
username: "An1by",
|
|
159
|
+
message: "",
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
};
|