@allior/wmake-emotes 1.0.0
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 +105 -0
- package/dist/provider-CDtB3U-Z.js +62 -0
- package/dist/provider-CDtB3U-Z.js.map +1 -0
- package/dist/react/hooks/index.d.ts +2 -0
- package/dist/react/hooks/index.d.ts.map +1 -0
- package/dist/react/hooks/useEmotes.d.ts +17 -0
- package/dist/react/hooks/useEmotes.d.ts.map +1 -0
- package/dist/react/index.d.ts +2 -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 +55 -0
- package/dist/react/index.js.map +1 -0
- package/dist/root/7tv/index.d.ts +4 -0
- package/dist/root/7tv/index.d.ts.map +1 -0
- package/dist/root/7tv/set.d.ts +4 -0
- package/dist/root/7tv/set.d.ts.map +1 -0
- package/dist/root/7tv/types/emote.d.ts +5 -0
- package/dist/root/7tv/types/emote.d.ts.map +1 -0
- package/dist/root/7tv/types/index.d.ts +6 -0
- package/dist/root/7tv/types/index.d.ts.map +1 -0
- package/dist/root/7tv/types/seven-tv.d.ts +91 -0
- package/dist/root/7tv/types/seven-tv.d.ts.map +1 -0
- package/dist/root/7tv/utils.d.ts +3 -0
- package/dist/root/7tv/utils.d.ts.map +1 -0
- package/dist/root/betterttv/index.d.ts +3 -0
- package/dist/root/betterttv/index.d.ts.map +1 -0
- package/dist/root/betterttv/set.d.ts +5 -0
- package/dist/root/betterttv/set.d.ts.map +1 -0
- package/dist/root/betterttv/types/cached-user-response.d.ts +62 -0
- package/dist/root/betterttv/types/cached-user-response.d.ts.map +1 -0
- package/dist/root/betterttv/types/index.d.ts +5 -0
- package/dist/root/betterttv/types/index.d.ts.map +1 -0
- package/dist/root/common/enums/index.d.ts +2 -0
- package/dist/root/common/enums/index.d.ts.map +1 -0
- package/dist/root/common/enums/provider.d.ts +5 -0
- package/dist/root/common/enums/provider.d.ts.map +1 -0
- package/dist/root/common/index.d.ts +3 -0
- package/dist/root/common/index.d.ts.map +1 -0
- package/dist/root/common/types/emote.d.ts +9 -0
- package/dist/root/common/types/emote.d.ts.map +1 -0
- package/dist/root/common/types/index.d.ts +3 -0
- package/dist/root/common/types/index.d.ts.map +1 -0
- package/dist/root/frankerfacez/index.d.ts +4 -0
- package/dist/root/frankerfacez/index.d.ts.map +1 -0
- package/dist/root/frankerfacez/set.d.ts +10 -0
- package/dist/root/frankerfacez/set.d.ts.map +1 -0
- package/dist/root/frankerfacez/types/frankerfacez.d.ts +104 -0
- package/dist/root/frankerfacez/types/frankerfacez.d.ts.map +1 -0
- package/dist/root/frankerfacez/types/index.d.ts +5 -0
- package/dist/root/frankerfacez/types/index.d.ts.map +1 -0
- package/dist/root/frankerfacez/utils.d.ts +2 -0
- package/dist/root/frankerfacez/utils.d.ts.map +1 -0
- package/dist/root/index.d.ts +5 -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 +16 -0
- package/dist/root/index.js.map +1 -0
- package/package.json +41 -0
- package/src/react/hooks/index.ts +1 -0
- package/src/react/hooks/useEmotes.ts +105 -0
- package/src/react/index.ts +1 -0
- package/src/root/7tv/index.ts +3 -0
- package/src/root/7tv/set.ts +16 -0
- package/src/root/7tv/types/emote.ts +4 -0
- package/src/root/7tv/types/index.ts +6 -0
- package/src/root/7tv/types/seven-tv.ts +100 -0
- package/src/root/7tv/utils.ts +5 -0
- package/src/root/betterttv/index.ts +2 -0
- package/src/root/betterttv/set.ts +49 -0
- package/src/root/betterttv/types/cached-user-response.ts +62 -0
- package/src/root/betterttv/types/index.ts +6 -0
- package/src/root/common/enums/index.ts +1 -0
- package/src/root/common/enums/provider.ts +4 -0
- package/src/root/common/index.ts +2 -0
- package/src/root/common/types/emote.ts +8 -0
- package/src/root/common/types/index.ts +2 -0
- package/src/root/frankerfacez/index.ts +3 -0
- package/src/root/frankerfacez/set.ts +46 -0
- package/src/root/frankerfacez/types/frankerfacez.ts +113 -0
- package/src/root/frankerfacez/types/index.ts +6 -0
- package/src/root/frankerfacez/utils.ts +6 -0
- package/src/root/index.ts +4 -0
package/README.md
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# @allior/wmake-emotes
|
|
2
|
+
|
|
3
|
+
Emote providers for streaming widgets: **7TV**, **BetterTTV**, **FrankerFaceZ**. Load global and user emote sets, zero-width emotes (7TV).
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @allior/wmake-emotes
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
### 7TV
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
import {
|
|
17
|
+
get7TVGlobalEmoteSet,
|
|
18
|
+
get7TVUserEmoteSet,
|
|
19
|
+
extractZeroWidthEmotes,
|
|
20
|
+
type SevenTV,
|
|
21
|
+
} from "@allior/wmake-emotes";
|
|
22
|
+
|
|
23
|
+
const global = await get7TVGlobalEmoteSet();
|
|
24
|
+
const user = await get7TVUserEmoteSet("twitch_channel_id");
|
|
25
|
+
const all = [...global, ...user];
|
|
26
|
+
const zeroWidth = extractZeroWidthEmotes(all);
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### BetterTTV
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
import {
|
|
33
|
+
getBetterTTVGlobalEmoteSet,
|
|
34
|
+
getBetterTTVUserEmoteCacheResponse,
|
|
35
|
+
EmotesProvider,
|
|
36
|
+
type BetterTTV,
|
|
37
|
+
} from "@allior/wmake-emotes";
|
|
38
|
+
|
|
39
|
+
const global = await getBetterTTVGlobalEmoteSet();
|
|
40
|
+
const cache = await getBetterTTVUserEmoteCacheResponse(
|
|
41
|
+
EmotesProvider.Twitch,
|
|
42
|
+
"channel_id",
|
|
43
|
+
);
|
|
44
|
+
const channel = cache.channelEmotes ?? [];
|
|
45
|
+
const shared = cache.sharedEmotes ?? [];
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### FrankerFaceZ
|
|
49
|
+
|
|
50
|
+
```ts
|
|
51
|
+
import {
|
|
52
|
+
getFrankerFaceZGlobalEmoteSet,
|
|
53
|
+
getFrankerFaceZUserEmoteSet,
|
|
54
|
+
type FrankerFaceZ,
|
|
55
|
+
} from "@allior/wmake-emotes";
|
|
56
|
+
|
|
57
|
+
const global = await getFrankerFaceZGlobalEmoteSet();
|
|
58
|
+
const user = await getFrankerFaceZUserEmoteSet("twitch_username");
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Common types
|
|
62
|
+
|
|
63
|
+
- **MessageEmote** — emote in message format (id?, name, urls).
|
|
64
|
+
- **EmotesProvider** — enum: `Twitch`, `Youtube` (for BetterTTV API).
|
|
65
|
+
- **EmoteReference** (7TV) — id, name.
|
|
66
|
+
|
|
67
|
+
## React: hook `useEmotes`
|
|
68
|
+
|
|
69
|
+
Loads emotes from all providers (default Twitch) and returns lists plus zero-width info.
|
|
70
|
+
|
|
71
|
+
```ts
|
|
72
|
+
import { useEmotes, EmotesProvider } from "@allior/wmake-emotes";
|
|
73
|
+
|
|
74
|
+
function Widget() {
|
|
75
|
+
const {
|
|
76
|
+
SevenTVEmotes,
|
|
77
|
+
SevenTVZeroWidthEmotes,
|
|
78
|
+
BetterTTVEmotes,
|
|
79
|
+
FrankerFaceZEmotes,
|
|
80
|
+
isLoaded,
|
|
81
|
+
isZeroWidthEmote,
|
|
82
|
+
reloadEmotes,
|
|
83
|
+
} = useEmotes({
|
|
84
|
+
username: "channel_login", // for FFZ
|
|
85
|
+
providerId: "twitch_id", // for 7TV and BTTV
|
|
86
|
+
providers: [EmotesProvider.Twitch],
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
if (!isLoaded) return <div>Loading emotes…</div>;
|
|
90
|
+
// ...
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Options:
|
|
95
|
+
|
|
96
|
+
- **username** — channel login (FrankerFaceZ).
|
|
97
|
+
- **providerId** — channel ID (7TV, BetterTTV).
|
|
98
|
+
- **providers** — array of providers, default `[EmotesProvider.Twitch]`.
|
|
99
|
+
|
|
100
|
+
## Build
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
npm run build # build dist + IIFE + types
|
|
104
|
+
npm run clean # clean dist
|
|
105
|
+
```
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
const m = async (t) => (await (await fetch(`https://7tv.io/v3/users/twitch/${t}`)).json()).emote_set.emotes, i = async () => (await (await fetch("https://7tv.io/v3/emote-sets/global")).json()).emotes, l = (t) => t.filter((e) => e.flags === 1 && e.id), o = /* @__PURE__ */ new Map(), p = async (t, e) => {
|
|
2
|
+
const s = `user:${t}:${e}`;
|
|
3
|
+
let a = o.get(s);
|
|
4
|
+
return a || (a = (async () => {
|
|
5
|
+
const r = await fetch(
|
|
6
|
+
`https://api.betterttv.net/3/${t}/${e}`
|
|
7
|
+
);
|
|
8
|
+
if (!r.ok)
|
|
9
|
+
return {
|
|
10
|
+
id: "",
|
|
11
|
+
bots: [],
|
|
12
|
+
avatar: "",
|
|
13
|
+
channelEmotes: [],
|
|
14
|
+
sharedEmotes: []
|
|
15
|
+
};
|
|
16
|
+
const n = await r.json();
|
|
17
|
+
return {
|
|
18
|
+
...n,
|
|
19
|
+
channelEmotes: n.channelEmotes ?? [],
|
|
20
|
+
sharedEmotes: n.sharedEmotes ?? []
|
|
21
|
+
};
|
|
22
|
+
})(), o.set(s, a), a);
|
|
23
|
+
}, u = async () => {
|
|
24
|
+
const t = "global";
|
|
25
|
+
let e = o.get(t);
|
|
26
|
+
return e || (e = fetch("https://api.betterttv.net/3/cached/emotes/global").then(
|
|
27
|
+
(s) => s.json()
|
|
28
|
+
), o.set(t, e), e);
|
|
29
|
+
}, c = (t) => {
|
|
30
|
+
const e = [];
|
|
31
|
+
for (const s of Object.values(t))
|
|
32
|
+
e.push(...s.emoticons || []);
|
|
33
|
+
return e;
|
|
34
|
+
}, f = async (t) => {
|
|
35
|
+
try {
|
|
36
|
+
const s = await (await fetch(
|
|
37
|
+
`https://api.frankerfacez.com/v1/room/twitch/${t}`
|
|
38
|
+
)).json();
|
|
39
|
+
return c(s.sets);
|
|
40
|
+
} catch {
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
43
|
+
}, b = async () => {
|
|
44
|
+
try {
|
|
45
|
+
const e = await (await fetch("https://api.frankerfacez.com/v1/set/global")).json();
|
|
46
|
+
return c(e.sets);
|
|
47
|
+
} catch {
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
var h = /* @__PURE__ */ ((t) => (t.Twitch = "twitch", t.Youtube = "youtube", t))(h || {});
|
|
52
|
+
export {
|
|
53
|
+
h as E,
|
|
54
|
+
i as a,
|
|
55
|
+
p as b,
|
|
56
|
+
u as c,
|
|
57
|
+
f as d,
|
|
58
|
+
l as e,
|
|
59
|
+
b as f,
|
|
60
|
+
m as g
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=provider-CDtB3U-Z.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-CDtB3U-Z.js","sources":["../src/root/7tv/set.ts","../src/root/7tv/utils.ts","../src/root/betterttv/set.ts","../src/root/frankerfacez/set.ts","../src/root/common/enums/provider.ts"],"sourcesContent":["import type { SevenTV } from \"./types\";\r\n\r\nexport const get7TVUserEmoteSet = async (\r\n providerId: string,\r\n): Promise<SevenTV.Emote[]> => {\r\n const response = await fetch(`https://7tv.io/v3/users/twitch/${providerId}`);\r\n const data = await response.json();\r\n return data.emote_set.emotes;\r\n};\r\n\r\nexport const get7TVGlobalEmoteSet = async (): Promise<SevenTV.Emote[]> => {\r\n const emotesUrl = \"https://7tv.io/v3/emote-sets/global\";\r\n const response = await fetch(emotesUrl);\r\n const data = await response.json();\r\n return data.emotes;\r\n};\r\n","import type { SevenTV } from \"./types\";\r\n\r\nexport const extractZeroWidthEmotes = (\r\n emotes: SevenTV.Emote[],\r\n): SevenTV.Emote[] => emotes.filter((e) => e.flags === 1 && e.id);\r\n","import type { EmotesProvider } from \"../common\";\r\nimport type { BetterTTV } from \"./types\";\r\n\r\n/** Один запрос на URL — повторные вызовы получают тот же промис. */\r\nconst byKey = new Map<string, Promise<unknown>>();\r\n\r\nexport const getBetterTTVUserEmoteCacheResponse = async (\r\n provider: EmotesProvider,\r\n providerId: string,\r\n): Promise<BetterTTV.CachedUserResponse> => {\r\n const key = `user:${provider}:${providerId}`;\r\n let p = byKey.get(key);\r\n if (p) return p as Promise<BetterTTV.CachedUserResponse>;\r\n p = (async () => {\r\n const res = await fetch(\r\n `https://api.betterttv.net/3/${provider}/${providerId}`,\r\n );\r\n if (!res.ok) {\r\n return {\r\n id: \"\",\r\n bots: [],\r\n avatar: \"\",\r\n channelEmotes: [],\r\n sharedEmotes: [],\r\n };\r\n }\r\n const data = await res.json();\r\n return {\r\n ...data,\r\n channelEmotes: data.channelEmotes ?? [],\r\n sharedEmotes: data.sharedEmotes ?? [],\r\n };\r\n })();\r\n byKey.set(key, p);\r\n return p as Promise<BetterTTV.CachedUserResponse>;\r\n};\r\n\r\nexport const getBetterTTVGlobalEmoteSet = async (): Promise<\r\n BetterTTV.Emote[]\r\n> => {\r\n const key = \"global\";\r\n let p = byKey.get(key);\r\n if (p) return p as Promise<BetterTTV.Emote[]>;\r\n p = fetch(\"https://api.betterttv.net/3/cached/emotes/global\").then((r) =>\r\n r.json(),\r\n );\r\n byKey.set(key, p);\r\n return p as Promise<BetterTTV.Emote[]>;\r\n};\r\n","import type { FrankerFaceZ } from \"./types\";\r\n\r\n/**\r\n * Получить все эмоуты из наборов\r\n */\r\nconst getEmotesFromSets = (\r\n sets: Record<string, FrankerFaceZ.EmoteSet>,\r\n): FrankerFaceZ.Emote[] => {\r\n const emotes: FrankerFaceZ.Emote[] = [];\r\n for (const set of Object.values(sets)) {\r\n emotes.push(...(set.emoticons || []));\r\n }\r\n return emotes;\r\n};\r\n\r\n/**\r\n * Получить набор эмоутов пользователя FrankerFaceZ\r\n */\r\nexport const getFrankerFaceZUserEmoteSet = async (\r\n username: string,\r\n): Promise<FrankerFaceZ.Emote[]> => {\r\n try {\r\n const response = await fetch(\r\n `https://api.frankerfacez.com/v1/room/twitch/${username}`,\r\n );\r\n const data: FrankerFaceZ.RoomResponse = await response.json();\r\n return getEmotesFromSets(data.sets);\r\n } catch {\r\n return [];\r\n }\r\n};\r\n\r\n/**\r\n * Получить глобальные эмоуты FrankerFaceZ\r\n */\r\nexport const getFrankerFaceZGlobalEmoteSet = async (): Promise<\r\n FrankerFaceZ.Emote[]\r\n> => {\r\n try {\r\n const response = await fetch(\"https://api.frankerfacez.com/v1/set/global\");\r\n const data: FrankerFaceZ.GlobalEmotesResponse = await response.json();\r\n return getEmotesFromSets(data.sets);\r\n } catch {\r\n return [];\r\n }\r\n};\r\n","export enum EmotesProvider {\r\n Twitch = \"twitch\",\r\n Youtube = \"youtube\",\r\n}\r\n"],"names":["get7TVUserEmoteSet","providerId","get7TVGlobalEmoteSet","extractZeroWidthEmotes","emotes","byKey","getBetterTTVUserEmoteCacheResponse","provider","key","p","res","data","getBetterTTVGlobalEmoteSet","r","getEmotesFromSets","sets","set","getFrankerFaceZUserEmoteSet","username","getFrankerFaceZGlobalEmoteSet","EmotesProvider"],"mappings":"AAEO,MAAMA,IAAqB,OAChCC,OAGa,OADI,MAAM,MAAM,kCAAkCA,CAAU,EAAE,GAC/C,KAAA,GAChB,UAAU,QAGXC,IAAuB,aAGrB,OADI,MAAM,MADL,qCACoB,GACV,KAAA,GAChB,QCZDC,IAAyB,CACpCC,MACoBA,EAAO,OAAO,CAAC,MAAM,EAAE,UAAU,KAAK,EAAE,EAAE,GCA1DC,wBAAY,IAAA,GAELC,IAAqC,OAChDC,GACAN,MAC0C;AAC1C,QAAMO,IAAM,QAAQD,CAAQ,IAAIN,CAAU;AAC1C,MAAIQ,IAAIJ,EAAM,IAAIG,CAAG;AACrB,SAAIC,MACJA,KAAK,YAAY;AACf,UAAMC,IAAM,MAAM;AAAA,MAChB,+BAA+BH,CAAQ,IAAIN,CAAU;AAAA,IAAA;AAEvD,QAAI,CAACS,EAAI;AACP,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM,CAAA;AAAA,QACN,QAAQ;AAAA,QACR,eAAe,CAAA;AAAA,QACf,cAAc,CAAA;AAAA,MAAC;AAGnB,UAAMC,IAAO,MAAMD,EAAI,KAAA;AACvB,WAAO;AAAA,MACL,GAAGC;AAAA,MACH,eAAeA,EAAK,iBAAiB,CAAA;AAAA,MACrC,cAAcA,EAAK,gBAAgB,CAAA;AAAA,IAAC;AAAA,EAExC,GAAA,GACAN,EAAM,IAAIG,GAAKC,CAAC,GACTA;AACT,GAEaG,IAA6B,YAErC;AACH,QAAMJ,IAAM;AACZ,MAAIC,IAAIJ,EAAM,IAAIG,CAAG;AACrB,SAAIC,MACJA,IAAI,MAAM,kDAAkD,EAAE;AAAA,IAAK,CAACI,MAClEA,EAAE,KAAA;AAAA,EAAK,GAETR,EAAM,IAAIG,GAAKC,CAAC,GACTA;AACT,GC3CMK,IAAoB,CACxBC,MACyB;AACzB,QAAMX,IAA+B,CAAA;AACrC,aAAWY,KAAO,OAAO,OAAOD,CAAI;AAClC,IAAAX,EAAO,KAAK,GAAIY,EAAI,aAAa,CAAA,CAAG;AAEtC,SAAOZ;AACT,GAKaa,IAA8B,OACzCC,MACkC;AAClC,MAAI;AAIF,UAAMP,IAAkC,OAHvB,MAAM;AAAA,MACrB,+CAA+CO,CAAQ;AAAA,IAAA,GAEF,KAAA;AACvD,WAAOJ,EAAkBH,EAAK,IAAI;AAAA,EACpC,QAAQ;AACN,WAAO,CAAA;AAAA,EACT;AACF,GAKaQ,IAAgC,YAExC;AACH,MAAI;AAEF,UAAMR,IAA0C,OAD/B,MAAM,MAAM,4CAA4C,GACV,KAAA;AAC/D,WAAOG,EAAkBH,EAAK,IAAI;AAAA,EACpC,QAAQ;AACN,WAAO,CAAA;AAAA,EACT;AACF;AC7CO,IAAKS,sBAAAA,OACVA,EAAA,SAAS,UACTA,EAAA,UAAU,WAFAA,IAAAA,KAAA,CAAA,CAAA;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { EmotesProvider, type BetterTTV, type EmoteReference, type FrankerFaceZ, type SevenTV } from "@/root";
|
|
2
|
+
interface Props {
|
|
3
|
+
username?: string;
|
|
4
|
+
providerId?: string;
|
|
5
|
+
providers?: EmotesProvider[];
|
|
6
|
+
}
|
|
7
|
+
export declare const useEmotes: ({ username, providerId, providers, }: Props) => {
|
|
8
|
+
BetterTTVEmotes: BetterTTV.Emote[];
|
|
9
|
+
FrankerFaceZEmotes: FrankerFaceZ.Emote[];
|
|
10
|
+
SevenTVEmotes: SevenTV.Emote[];
|
|
11
|
+
SevenTVZeroWidthEmotes: EmoteReference[];
|
|
12
|
+
isLoaded: boolean;
|
|
13
|
+
isZeroWidthEmote: (emote: EmoteReference) => boolean;
|
|
14
|
+
reloadEmotes: () => Promise<void>;
|
|
15
|
+
};
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=useEmotes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useEmotes.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/useEmotes.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EAQd,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,OAAO,EACb,MAAM,QAAQ,CAAC;AAKhB,UAAU,KAAK;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;CAC9B;AAED,eAAO,MAAM,SAAS,GAAI,sCAIvB,KAAK;;;;;;8BA0D2B,cAAc;;CAkBhD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
(function(E,o){"use strict";const b=async e=>(await(await fetch(`https://7tv.io/v3/users/twitch/${e}`)).json()).emote_set.emotes,d=async()=>(await(await fetch("https://7tv.io/v3/emote-sets/global")).json()).emotes,p=e=>e.filter(t=>t.flags===1&&t.id),i=new Map,T=async(e,t)=>{const s=`user:${e}:${t}`;let a=i.get(s);return a||(a=(async()=>{const m=await fetch(`https://api.betterttv.net/3/${e}/${t}`);if(!m.ok)return{id:"",bots:[],avatar:"",channelEmotes:[],sharedEmotes:[]};const n=await m.json();return{...n,channelEmotes:n.channelEmotes??[],sharedEmotes:n.sharedEmotes??[]}})(),i.set(s,a),a)},g=async()=>{const e="global";let t=i.get(e);return t||(t=fetch("https://api.betterttv.net/3/cached/emotes/global").then(s=>s.json()),i.set(e,t),t)},w=e=>{const t=[];for(const s of Object.values(e))t.push(...s.emoticons||[]);return t},S=async e=>{try{const s=await(await fetch(`https://api.frankerfacez.com/v1/room/twitch/${e}`)).json();return w(s.sets)}catch{return[]}},v=async()=>{try{const t=await(await fetch("https://api.frankerfacez.com/v1/set/global")).json();return w(t.sets)}catch{return[]}};var h=(e=>(e.Twitch="twitch",e.Youtube="youtube",e))(h||{});const k=[h.Twitch],F=({username:e,providerId:t,providers:s=k})=>{const[a,m]=o.useState([]),[n,j]=o.useState([]),[R,V]=o.useState([]),[W,Z]=o.useState([]),[z,l]=o.useState(!1),y=o.useRef(!1),f=o.useCallback(async()=>{if(s.length===0){l(!0);return}l(!1);try{const u=await g();if(t)for(const c of s)try{const r=await T(c,t);u.push(...r.channelEmotes??[],...r.sharedEmotes??[])}catch{}if(s.includes(h.Twitch)){const c=await d();t&&c.push(...await b(t)),j(p(c));const r=await v();e&&r.push(...await S(e)),V(r),m(c)}Z(u)}finally{l(!0)}},[e,t,s]),U=u=>n.includes(u);return o.useEffect(()=>{y.current||(y.current=!0,f())},[f]),{BetterTTVEmotes:W,FrankerFaceZEmotes:R,SevenTVEmotes:a,SevenTVZeroWidthEmotes:n,isLoaded:z,isZeroWidthEmote:U,reloadEmotes:f}};E.useEmotes=F,Object.defineProperty(E,Symbol.toStringTag,{value:"Module"})})(this.WmakeEmotesReact=this.WmakeEmotesReact||{},React);
|
|
2
|
+
//# sourceMappingURL=index.iife.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.iife.js","sources":["../../src/root/7tv/set.ts","../../src/root/7tv/utils.ts","../../src/root/betterttv/set.ts","../../src/root/frankerfacez/set.ts","../../src/root/common/enums/provider.ts","../../src/react/hooks/useEmotes.ts"],"sourcesContent":["import type { SevenTV } from \"./types\";\r\n\r\nexport const get7TVUserEmoteSet = async (\r\n providerId: string,\r\n): Promise<SevenTV.Emote[]> => {\r\n const response = await fetch(`https://7tv.io/v3/users/twitch/${providerId}`);\r\n const data = await response.json();\r\n return data.emote_set.emotes;\r\n};\r\n\r\nexport const get7TVGlobalEmoteSet = async (): Promise<SevenTV.Emote[]> => {\r\n const emotesUrl = \"https://7tv.io/v3/emote-sets/global\";\r\n const response = await fetch(emotesUrl);\r\n const data = await response.json();\r\n return data.emotes;\r\n};\r\n","import type { SevenTV } from \"./types\";\r\n\r\nexport const extractZeroWidthEmotes = (\r\n emotes: SevenTV.Emote[],\r\n): SevenTV.Emote[] => emotes.filter((e) => e.flags === 1 && e.id);\r\n","import type { EmotesProvider } from \"../common\";\r\nimport type { BetterTTV } from \"./types\";\r\n\r\n/** Один запрос на URL — повторные вызовы получают тот же промис. */\r\nconst byKey = new Map<string, Promise<unknown>>();\r\n\r\nexport const getBetterTTVUserEmoteCacheResponse = async (\r\n provider: EmotesProvider,\r\n providerId: string,\r\n): Promise<BetterTTV.CachedUserResponse> => {\r\n const key = `user:${provider}:${providerId}`;\r\n let p = byKey.get(key);\r\n if (p) return p as Promise<BetterTTV.CachedUserResponse>;\r\n p = (async () => {\r\n const res = await fetch(\r\n `https://api.betterttv.net/3/${provider}/${providerId}`,\r\n );\r\n if (!res.ok) {\r\n return {\r\n id: \"\",\r\n bots: [],\r\n avatar: \"\",\r\n channelEmotes: [],\r\n sharedEmotes: [],\r\n };\r\n }\r\n const data = await res.json();\r\n return {\r\n ...data,\r\n channelEmotes: data.channelEmotes ?? [],\r\n sharedEmotes: data.sharedEmotes ?? [],\r\n };\r\n })();\r\n byKey.set(key, p);\r\n return p as Promise<BetterTTV.CachedUserResponse>;\r\n};\r\n\r\nexport const getBetterTTVGlobalEmoteSet = async (): Promise<\r\n BetterTTV.Emote[]\r\n> => {\r\n const key = \"global\";\r\n let p = byKey.get(key);\r\n if (p) return p as Promise<BetterTTV.Emote[]>;\r\n p = fetch(\"https://api.betterttv.net/3/cached/emotes/global\").then((r) =>\r\n r.json(),\r\n );\r\n byKey.set(key, p);\r\n return p as Promise<BetterTTV.Emote[]>;\r\n};\r\n","import type { FrankerFaceZ } from \"./types\";\r\n\r\n/**\r\n * Получить все эмоуты из наборов\r\n */\r\nconst getEmotesFromSets = (\r\n sets: Record<string, FrankerFaceZ.EmoteSet>,\r\n): FrankerFaceZ.Emote[] => {\r\n const emotes: FrankerFaceZ.Emote[] = [];\r\n for (const set of Object.values(sets)) {\r\n emotes.push(...(set.emoticons || []));\r\n }\r\n return emotes;\r\n};\r\n\r\n/**\r\n * Получить набор эмоутов пользователя FrankerFaceZ\r\n */\r\nexport const getFrankerFaceZUserEmoteSet = async (\r\n username: string,\r\n): Promise<FrankerFaceZ.Emote[]> => {\r\n try {\r\n const response = await fetch(\r\n `https://api.frankerfacez.com/v1/room/twitch/${username}`,\r\n );\r\n const data: FrankerFaceZ.RoomResponse = await response.json();\r\n return getEmotesFromSets(data.sets);\r\n } catch {\r\n return [];\r\n }\r\n};\r\n\r\n/**\r\n * Получить глобальные эмоуты FrankerFaceZ\r\n */\r\nexport const getFrankerFaceZGlobalEmoteSet = async (): Promise<\r\n FrankerFaceZ.Emote[]\r\n> => {\r\n try {\r\n const response = await fetch(\"https://api.frankerfacez.com/v1/set/global\");\r\n const data: FrankerFaceZ.GlobalEmotesResponse = await response.json();\r\n return getEmotesFromSets(data.sets);\r\n } catch {\r\n return [];\r\n }\r\n};\r\n","export enum EmotesProvider {\r\n Twitch = \"twitch\",\r\n Youtube = \"youtube\",\r\n}\r\n","import {\r\n EmotesProvider,\r\n extractZeroWidthEmotes,\r\n get7TVGlobalEmoteSet,\r\n get7TVUserEmoteSet,\r\n getBetterTTVGlobalEmoteSet,\r\n getBetterTTVUserEmoteCacheResponse,\r\n getFrankerFaceZGlobalEmoteSet,\r\n getFrankerFaceZUserEmoteSet,\r\n type BetterTTV,\r\n type EmoteReference,\r\n type FrankerFaceZ,\r\n type SevenTV,\r\n} from \"@/root\";\r\nimport { useCallback, useEffect, useRef, useState } from \"react\";\r\n\r\nconst DEFAULT_PROVIDERS: EmotesProvider[] = [EmotesProvider.Twitch];\r\n\r\ninterface Props {\r\n username?: string;\r\n providerId?: string;\r\n providers?: EmotesProvider[];\r\n}\r\n\r\nexport const useEmotes = ({\r\n username,\r\n providerId,\r\n providers = DEFAULT_PROVIDERS,\r\n}: Props) => {\r\n const [sevenTvEmotes, setSevenTv] = useState<SevenTV.Emote[]>([]);\r\n const [zeroWidthEmotes, setZeroWidthEmotes] = useState<EmoteReference[]>([]);\r\n const [frankerfacezEmotes, setFrankerFacezEmotes] = useState<\r\n FrankerFaceZ.Emote[]\r\n >([]);\r\n const [betterttvEmotes, setBetterttvEmotes] = useState<BetterTTV.Emote[]>([]);\r\n const [isLoaded, setIsLoaded] = useState(false);\r\n\r\n const loadedRef = useRef(false);\r\n\r\n const loadEmotes = useCallback(async () => {\r\n if (providers.length === 0) {\r\n setIsLoaded(true);\r\n return;\r\n }\r\n setIsLoaded(false);\r\n try {\r\n const betterttvEmotes: BetterTTV.Emote[] =\r\n await getBetterTTVGlobalEmoteSet();\r\n if (providerId) {\r\n for (const provider of providers) {\r\n try {\r\n const cache = await getBetterTTVUserEmoteCacheResponse(\r\n provider,\r\n providerId,\r\n );\r\n betterttvEmotes.push(\r\n ...(cache.channelEmotes ?? []),\r\n ...(cache.sharedEmotes ?? []),\r\n );\r\n } catch {\r\n // 404 or network error\r\n }\r\n }\r\n }\r\n\r\n if (providers.includes(EmotesProvider.Twitch)) {\r\n const sevenTv = await get7TVGlobalEmoteSet();\r\n if (providerId) {\r\n sevenTv.push(...(await get7TVUserEmoteSet(providerId)));\r\n }\r\n setZeroWidthEmotes(extractZeroWidthEmotes(sevenTv));\r\n\r\n const frankerfacez = await getFrankerFaceZGlobalEmoteSet();\r\n if (username) {\r\n frankerfacez.push(...(await getFrankerFaceZUserEmoteSet(username)));\r\n }\r\n setFrankerFacezEmotes(frankerfacez);\r\n setSevenTv(sevenTv);\r\n }\r\n\r\n setBetterttvEmotes(betterttvEmotes);\r\n } finally {\r\n setIsLoaded(true);\r\n }\r\n }, [username, providerId, providers]);\r\n\r\n const isZeroWidthEmote = (emote: EmoteReference) =>\r\n zeroWidthEmotes.includes(emote);\r\n\r\n useEffect(() => {\r\n if (loadedRef.current) return;\r\n loadedRef.current = true;\r\n void loadEmotes();\r\n }, [loadEmotes]);\r\n\r\n return {\r\n BetterTTVEmotes: betterttvEmotes,\r\n FrankerFaceZEmotes: frankerfacezEmotes,\r\n SevenTVEmotes: sevenTvEmotes,\r\n SevenTVZeroWidthEmotes: zeroWidthEmotes,\r\n isLoaded,\r\n isZeroWidthEmote,\r\n reloadEmotes: loadEmotes,\r\n };\r\n};\r\n"],"names":["get7TVUserEmoteSet","providerId","get7TVGlobalEmoteSet","extractZeroWidthEmotes","emotes","e","byKey","getBetterTTVUserEmoteCacheResponse","provider","key","p","res","data","getBetterTTVGlobalEmoteSet","r","getEmotesFromSets","sets","set","getFrankerFaceZUserEmoteSet","username","getFrankerFaceZGlobalEmoteSet","EmotesProvider","DEFAULT_PROVIDERS","useEmotes","providers","sevenTvEmotes","setSevenTv","useState","zeroWidthEmotes","setZeroWidthEmotes","frankerfacezEmotes","setFrankerFacezEmotes","betterttvEmotes","setBetterttvEmotes","isLoaded","setIsLoaded","loadedRef","useRef","loadEmotes","useCallback","cache","sevenTv","frankerfacez","isZeroWidthEmote","emote","useEffect"],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { E as i, c as V, b, a as k, g as v, e as Z, f as R, d as W } from "../provider-CDtB3U-Z.js";
|
|
2
|
+
import { useState as o, useRef as y, useCallback as z, useEffect as B } from "react";
|
|
3
|
+
const U = [i.Twitch], x = ({
|
|
4
|
+
username: r,
|
|
5
|
+
providerId: e,
|
|
6
|
+
providers: a = U
|
|
7
|
+
}) => {
|
|
8
|
+
const [l, h] = o([]), [m, u] = o([]), [T, S] = o([]), [d, F] = o([]), [g, n] = o(!1), f = y(!1), E = z(async () => {
|
|
9
|
+
if (a.length === 0) {
|
|
10
|
+
n(!0);
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
n(!1);
|
|
14
|
+
try {
|
|
15
|
+
const c = await V();
|
|
16
|
+
if (e)
|
|
17
|
+
for (const t of a)
|
|
18
|
+
try {
|
|
19
|
+
const s = await b(
|
|
20
|
+
t,
|
|
21
|
+
e
|
|
22
|
+
);
|
|
23
|
+
c.push(
|
|
24
|
+
...s.channelEmotes ?? [],
|
|
25
|
+
...s.sharedEmotes ?? []
|
|
26
|
+
);
|
|
27
|
+
} catch {
|
|
28
|
+
}
|
|
29
|
+
if (a.includes(i.Twitch)) {
|
|
30
|
+
const t = await k();
|
|
31
|
+
e && t.push(...await v(e)), u(Z(t));
|
|
32
|
+
const s = await R();
|
|
33
|
+
r && s.push(...await W(r)), S(s), h(t);
|
|
34
|
+
}
|
|
35
|
+
F(c);
|
|
36
|
+
} finally {
|
|
37
|
+
n(!0);
|
|
38
|
+
}
|
|
39
|
+
}, [r, e, a]), w = (c) => m.includes(c);
|
|
40
|
+
return B(() => {
|
|
41
|
+
f.current || (f.current = !0, E());
|
|
42
|
+
}, [E]), {
|
|
43
|
+
BetterTTVEmotes: d,
|
|
44
|
+
FrankerFaceZEmotes: T,
|
|
45
|
+
SevenTVEmotes: l,
|
|
46
|
+
SevenTVZeroWidthEmotes: m,
|
|
47
|
+
isLoaded: g,
|
|
48
|
+
isZeroWidthEmote: w,
|
|
49
|
+
reloadEmotes: E
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
export {
|
|
53
|
+
x as useEmotes
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/react/hooks/useEmotes.ts"],"sourcesContent":["import {\r\n EmotesProvider,\r\n extractZeroWidthEmotes,\r\n get7TVGlobalEmoteSet,\r\n get7TVUserEmoteSet,\r\n getBetterTTVGlobalEmoteSet,\r\n getBetterTTVUserEmoteCacheResponse,\r\n getFrankerFaceZGlobalEmoteSet,\r\n getFrankerFaceZUserEmoteSet,\r\n type BetterTTV,\r\n type EmoteReference,\r\n type FrankerFaceZ,\r\n type SevenTV,\r\n} from \"@/root\";\r\nimport { useCallback, useEffect, useRef, useState } from \"react\";\r\n\r\nconst DEFAULT_PROVIDERS: EmotesProvider[] = [EmotesProvider.Twitch];\r\n\r\ninterface Props {\r\n username?: string;\r\n providerId?: string;\r\n providers?: EmotesProvider[];\r\n}\r\n\r\nexport const useEmotes = ({\r\n username,\r\n providerId,\r\n providers = DEFAULT_PROVIDERS,\r\n}: Props) => {\r\n const [sevenTvEmotes, setSevenTv] = useState<SevenTV.Emote[]>([]);\r\n const [zeroWidthEmotes, setZeroWidthEmotes] = useState<EmoteReference[]>([]);\r\n const [frankerfacezEmotes, setFrankerFacezEmotes] = useState<\r\n FrankerFaceZ.Emote[]\r\n >([]);\r\n const [betterttvEmotes, setBetterttvEmotes] = useState<BetterTTV.Emote[]>([]);\r\n const [isLoaded, setIsLoaded] = useState(false);\r\n\r\n const loadedRef = useRef(false);\r\n\r\n const loadEmotes = useCallback(async () => {\r\n if (providers.length === 0) {\r\n setIsLoaded(true);\r\n return;\r\n }\r\n setIsLoaded(false);\r\n try {\r\n const betterttvEmotes: BetterTTV.Emote[] =\r\n await getBetterTTVGlobalEmoteSet();\r\n if (providerId) {\r\n for (const provider of providers) {\r\n try {\r\n const cache = await getBetterTTVUserEmoteCacheResponse(\r\n provider,\r\n providerId,\r\n );\r\n betterttvEmotes.push(\r\n ...(cache.channelEmotes ?? []),\r\n ...(cache.sharedEmotes ?? []),\r\n );\r\n } catch {\r\n // 404 or network error\r\n }\r\n }\r\n }\r\n\r\n if (providers.includes(EmotesProvider.Twitch)) {\r\n const sevenTv = await get7TVGlobalEmoteSet();\r\n if (providerId) {\r\n sevenTv.push(...(await get7TVUserEmoteSet(providerId)));\r\n }\r\n setZeroWidthEmotes(extractZeroWidthEmotes(sevenTv));\r\n\r\n const frankerfacez = await getFrankerFaceZGlobalEmoteSet();\r\n if (username) {\r\n frankerfacez.push(...(await getFrankerFaceZUserEmoteSet(username)));\r\n }\r\n setFrankerFacezEmotes(frankerfacez);\r\n setSevenTv(sevenTv);\r\n }\r\n\r\n setBetterttvEmotes(betterttvEmotes);\r\n } finally {\r\n setIsLoaded(true);\r\n }\r\n }, [username, providerId, providers]);\r\n\r\n const isZeroWidthEmote = (emote: EmoteReference) =>\r\n zeroWidthEmotes.includes(emote);\r\n\r\n useEffect(() => {\r\n if (loadedRef.current) return;\r\n loadedRef.current = true;\r\n void loadEmotes();\r\n }, [loadEmotes]);\r\n\r\n return {\r\n BetterTTVEmotes: betterttvEmotes,\r\n FrankerFaceZEmotes: frankerfacezEmotes,\r\n SevenTVEmotes: sevenTvEmotes,\r\n SevenTVZeroWidthEmotes: zeroWidthEmotes,\r\n isLoaded,\r\n isZeroWidthEmote,\r\n reloadEmotes: loadEmotes,\r\n };\r\n};\r\n"],"names":["DEFAULT_PROVIDERS","EmotesProvider","useEmotes","username","providerId","providers","sevenTvEmotes","setSevenTv","useState","zeroWidthEmotes","setZeroWidthEmotes","frankerfacezEmotes","setFrankerFacezEmotes","betterttvEmotes","setBetterttvEmotes","isLoaded","setIsLoaded","loadedRef","useRef","loadEmotes","useCallback","getBetterTTVGlobalEmoteSet","provider","cache","getBetterTTVUserEmoteCacheResponse","sevenTv","get7TVGlobalEmoteSet","get7TVUserEmoteSet","extractZeroWidthEmotes","frankerfacez","getFrankerFaceZGlobalEmoteSet","getFrankerFaceZUserEmoteSet","isZeroWidthEmote","emote","useEffect"],"mappings":";;AAgBA,MAAMA,IAAsC,CAACC,EAAe,MAAM,GAQrDC,IAAY,CAAC;AAAA,EACxB,UAAAC;AAAA,EACA,YAAAC;AAAA,EACA,WAAAC,IAAYL;AACd,MAAa;AACX,QAAM,CAACM,GAAeC,CAAU,IAAIC,EAA0B,CAAA,CAAE,GAC1D,CAACC,GAAiBC,CAAkB,IAAIF,EAA2B,CAAA,CAAE,GACrE,CAACG,GAAoBC,CAAqB,IAAIJ,EAElD,CAAA,CAAE,GACE,CAACK,GAAiBC,CAAkB,IAAIN,EAA4B,CAAA,CAAE,GACtE,CAACO,GAAUC,CAAW,IAAIR,EAAS,EAAK,GAExCS,IAAYC,EAAO,EAAK,GAExBC,IAAaC,EAAY,YAAY;AACzC,QAAIf,EAAU,WAAW,GAAG;AAC1B,MAAAW,EAAY,EAAI;AAChB;AAAA,IACF;AACA,IAAAA,EAAY,EAAK;AACjB,QAAI;AACF,YAAMH,IACJ,MAAMQ,EAAA;AACR,UAAIjB;AACF,mBAAWkB,KAAYjB;AACrB,cAAI;AACF,kBAAMkB,IAAQ,MAAMC;AAAA,cAClBF;AAAA,cACAlB;AAAA,YAAA;AAEFS,YAAAA,EAAgB;AAAA,cACd,GAAIU,EAAM,iBAAiB,CAAA;AAAA,cAC3B,GAAIA,EAAM,gBAAgB,CAAA;AAAA,YAAC;AAAA,UAE/B,QAAQ;AAAA,UAER;AAIJ,UAAIlB,EAAU,SAASJ,EAAe,MAAM,GAAG;AAC7C,cAAMwB,IAAU,MAAMC,EAAA;AACtB,QAAItB,KACFqB,EAAQ,KAAK,GAAI,MAAME,EAAmBvB,CAAU,CAAE,GAExDM,EAAmBkB,EAAuBH,CAAO,CAAC;AAElD,cAAMI,IAAe,MAAMC,EAAA;AAC3B,QAAI3B,KACF0B,EAAa,KAAK,GAAI,MAAME,EAA4B5B,CAAQ,CAAE,GAEpES,EAAsBiB,CAAY,GAClCtB,EAAWkB,CAAO;AAAA,MACpB;AAEA,MAAAX,EAAmBD,CAAe;AAAA,IACpC,UAAA;AACE,MAAAG,EAAY,EAAI;AAAA,IAClB;AAAA,EACF,GAAG,CAACb,GAAUC,GAAYC,CAAS,CAAC,GAE9B2B,IAAmB,CAACC,MACxBxB,EAAgB,SAASwB,CAAK;AAEhC,SAAAC,EAAU,MAAM;AACd,IAAIjB,EAAU,YACdA,EAAU,UAAU,IACfE,EAAA;AAAA,EACP,GAAG,CAACA,CAAU,CAAC,GAER;AAAA,IACL,iBAAiBN;AAAA,IACjB,oBAAoBF;AAAA,IACpB,eAAeL;AAAA,IACf,wBAAwBG;AAAA,IACxB,UAAAM;AAAA,IACA,kBAAAiB;AAAA,IACA,cAAcb;AAAA,EAAA;AAElB;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/root/7tv/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AACtB,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../../../src/root/7tv/set.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvC,eAAO,MAAM,kBAAkB,GAC7B,YAAY,MAAM,KACjB,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAIzB,CAAC;AAEF,eAAO,MAAM,oBAAoB,QAAa,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAKpE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emote.d.ts","sourceRoot":"","sources":["../../../../src/root/7tv/types/emote.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/root/7tv/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Типы для событий 7TV API, связанных с эмоутами
|
|
3
|
+
*/
|
|
4
|
+
export declare namespace SevenTV {
|
|
5
|
+
/**
|
|
6
|
+
* Формат файла эмоута
|
|
7
|
+
*/
|
|
8
|
+
type EmoteFileFormat = "WEBP" | "AVIF" | "GIF";
|
|
9
|
+
/**
|
|
10
|
+
* Платформа подключения
|
|
11
|
+
*/
|
|
12
|
+
type ConnectionPlatform = "TWITCH" | "DISCORD";
|
|
13
|
+
/**
|
|
14
|
+
* Состояние эмоута
|
|
15
|
+
*/
|
|
16
|
+
type EmoteState = "PERSONAL" | "LISTED" | "GLOBAL";
|
|
17
|
+
/**
|
|
18
|
+
* Файл эмоута
|
|
19
|
+
*/
|
|
20
|
+
interface EmoteFile {
|
|
21
|
+
name: string;
|
|
22
|
+
static_name: string;
|
|
23
|
+
width: number;
|
|
24
|
+
height: number;
|
|
25
|
+
frame_count: number;
|
|
26
|
+
size: number;
|
|
27
|
+
format: EmoteFileFormat;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Хост эмоута (CDN информация)
|
|
31
|
+
*/
|
|
32
|
+
interface EmoteHost {
|
|
33
|
+
url: string;
|
|
34
|
+
files: EmoteFile[];
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Стиль пользователя (может быть пустым объектом)
|
|
38
|
+
*/
|
|
39
|
+
type UserStyle = Record<string, unknown>;
|
|
40
|
+
/**
|
|
41
|
+
* Подключение к платформе
|
|
42
|
+
*/
|
|
43
|
+
interface Connection {
|
|
44
|
+
id: string;
|
|
45
|
+
platform: ConnectionPlatform;
|
|
46
|
+
username: string;
|
|
47
|
+
display_name: string;
|
|
48
|
+
linked_at: number;
|
|
49
|
+
emote_capacity: number;
|
|
50
|
+
emote_set_id: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Владелец эмоута
|
|
54
|
+
*/
|
|
55
|
+
interface EmoteOwner {
|
|
56
|
+
id: string;
|
|
57
|
+
username: string;
|
|
58
|
+
display_name: string;
|
|
59
|
+
avatar_url: string;
|
|
60
|
+
style: UserStyle;
|
|
61
|
+
role_ids: string[];
|
|
62
|
+
connections: Connection[];
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Данные эмоута
|
|
66
|
+
*/
|
|
67
|
+
interface EmoteData {
|
|
68
|
+
id: string;
|
|
69
|
+
name: string;
|
|
70
|
+
flags: number;
|
|
71
|
+
lifecycle: number;
|
|
72
|
+
state: EmoteState[];
|
|
73
|
+
listed: boolean;
|
|
74
|
+
animated: boolean;
|
|
75
|
+
owner: EmoteOwner;
|
|
76
|
+
host: EmoteHost;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Событие эмоута из 7TV API
|
|
80
|
+
*/
|
|
81
|
+
interface Emote {
|
|
82
|
+
id: string;
|
|
83
|
+
name: string;
|
|
84
|
+
flags: number;
|
|
85
|
+
timestamp: number;
|
|
86
|
+
actor_id: string;
|
|
87
|
+
data: EmoteData;
|
|
88
|
+
origin_id: string | null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=seven-tv.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seven-tv.d.ts","sourceRoot":"","sources":["../../../../src/root/7tv/types/seven-tv.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,yBAAiB,OAAO,CAAC;IACvB;;OAEG;IACH,KAAY,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;IAEtD;;OAEG;IACH,KAAY,kBAAkB,GAAG,QAAQ,GAAG,SAAS,CAAC;IAEtD;;OAEG;IACH,KAAY,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAE1D;;OAEG;IACH,UAAiB,SAAS;QACxB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,eAAe,CAAC;KACzB;IAED;;OAEG;IACH,UAAiB,SAAS;QACxB,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,SAAS,EAAE,CAAC;KACpB;IAED;;OAEG;IACH,KAAY,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEhD;;OAEG;IACH,UAAiB,UAAU;QACzB,EAAE,EAAE,MAAM,CAAC;QACX,QAAQ,EAAE,kBAAkB,CAAC;QAC7B,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;KACtB;IAED;;OAEG;IACH,UAAiB,UAAU;QACzB,EAAE,EAAE,MAAM,CAAC;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,SAAS,CAAC;QACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,WAAW,EAAE,UAAU,EAAE,CAAC;KAC3B;IAED;;OAEG;IACH,UAAiB,SAAS;QACxB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,UAAU,EAAE,CAAC;QACpB,MAAM,EAAE,OAAO,CAAC;QAChB,QAAQ,EAAE,OAAO,CAAC;QAClB,KAAK,EAAE,UAAU,CAAC;QAClB,IAAI,EAAE,SAAS,CAAC;KACjB;IAED;;OAEG;IACH,UAAiB,KAAK;QACpB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,SAAS,CAAC;QAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;KAC1B;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/root/7tv/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvC,eAAO,MAAM,sBAAsB,GACjC,QAAQ,OAAO,CAAC,KAAK,EAAE,KACtB,OAAO,CAAC,KAAK,EAAiD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/root/betterttv/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { EmotesProvider } from "../common";
|
|
2
|
+
import type { BetterTTV } from "./types";
|
|
3
|
+
export declare const getBetterTTVUserEmoteCacheResponse: (provider: EmotesProvider, providerId: string) => Promise<BetterTTV.CachedUserResponse>;
|
|
4
|
+
export declare const getBetterTTVGlobalEmoteSet: () => Promise<BetterTTV.Emote[]>;
|
|
5
|
+
//# sourceMappingURL=set.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../../../src/root/betterttv/set.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAKzC,eAAO,MAAM,kCAAkC,GAC7C,UAAU,cAAc,EACxB,YAAY,MAAM,KACjB,OAAO,CAAC,SAAS,CAAC,kBAAkB,CA0BtC,CAAC;AAEF,eAAO,MAAM,0BAA0B,QAAa,OAAO,CACzD,SAAS,CAAC,KAAK,EAAE,CAUlB,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Типы для BetterTTV API
|
|
3
|
+
*/
|
|
4
|
+
export declare namespace BetterTTV {
|
|
5
|
+
/**
|
|
6
|
+
* Тип изображения эмоута
|
|
7
|
+
*/
|
|
8
|
+
type ImageType = "png" | "gif" | "webp";
|
|
9
|
+
/**
|
|
10
|
+
* Пользователь, создавший общий эмоут
|
|
11
|
+
*/
|
|
12
|
+
interface SharedEmoteUser {
|
|
13
|
+
id: string;
|
|
14
|
+
name: string;
|
|
15
|
+
displayName: string;
|
|
16
|
+
providerId: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Универсальный тип эмоута BetterTTV
|
|
20
|
+
* Может иметь либо userId, либо user объект
|
|
21
|
+
*/
|
|
22
|
+
interface Emote {
|
|
23
|
+
id: string;
|
|
24
|
+
code: string;
|
|
25
|
+
imageType: ImageType;
|
|
26
|
+
animated: boolean;
|
|
27
|
+
userId?: string;
|
|
28
|
+
user?: SharedEmoteUser;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Эмоут канала
|
|
32
|
+
* @deprecated Используйте Emote
|
|
33
|
+
*/
|
|
34
|
+
type ChannelEmote = Emote & {
|
|
35
|
+
userId: string;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Глобальный эмоут
|
|
39
|
+
* @deprecated Используйте Emote
|
|
40
|
+
*/
|
|
41
|
+
type GlobalEmote = Emote & {
|
|
42
|
+
userId: string;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Общий эмоут
|
|
46
|
+
* @deprecated Используйте Emote
|
|
47
|
+
*/
|
|
48
|
+
type SharedEmote = Emote & {
|
|
49
|
+
user: SharedEmoteUser;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Ответ API для кэшированных данных пользователя
|
|
53
|
+
*/
|
|
54
|
+
interface CachedUserResponse {
|
|
55
|
+
id: string;
|
|
56
|
+
bots: string[];
|
|
57
|
+
avatar: string;
|
|
58
|
+
channelEmotes: Emote[];
|
|
59
|
+
sharedEmotes: Emote[];
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=cached-user-response.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cached-user-response.d.ts","sourceRoot":"","sources":["../../../../src/root/betterttv/types/cached-user-response.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,yBAAiB,SAAS,CAAC;IACzB;;OAEG;IACH,KAAY,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IAE/C;;OAEG;IACH,UAAiB,eAAe;QAC9B,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;KACpB;IAED;;;OAGG;IACH,UAAiB,KAAK;QACpB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,SAAS,CAAC;QACrB,QAAQ,EAAE,OAAO,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,eAAe,CAAC;KACxB;IAED;;;OAGG;IACH,KAAY,YAAY,GAAG,KAAK,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAEtD;;;OAGG;IACH,KAAY,WAAW,GAAG,KAAK,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAErD;;;OAGG;IACH,KAAY,WAAW,GAAG,KAAK,GAAG;QAAE,IAAI,EAAE,eAAe,CAAA;KAAE,CAAC;IAE5D;;OAEG;IACH,UAAiB,kBAAkB;QACjC,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,KAAK,EAAE,CAAC;QACvB,YAAY,EAAE,KAAK,EAAE,CAAC;KACvB;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/root/betterttv/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/root/common/enums/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../../src/root/common/enums/provider.ts"],"names":[],"mappings":"AAAA,oBAAY,cAAc;IACxB,MAAM,WAAW;IACjB,OAAO,YAAY;CACpB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/root/common/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emote.d.ts","sourceRoot":"","sources":["../../../../src/root/common/types/emote.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/root/common/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/root/frankerfacez/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC"}
|