@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.
Files changed (84) hide show
  1. package/README.md +105 -0
  2. package/dist/provider-CDtB3U-Z.js +62 -0
  3. package/dist/provider-CDtB3U-Z.js.map +1 -0
  4. package/dist/react/hooks/index.d.ts +2 -0
  5. package/dist/react/hooks/index.d.ts.map +1 -0
  6. package/dist/react/hooks/useEmotes.d.ts +17 -0
  7. package/dist/react/hooks/useEmotes.d.ts.map +1 -0
  8. package/dist/react/index.d.ts +2 -0
  9. package/dist/react/index.d.ts.map +1 -0
  10. package/dist/react/index.iife.js +2 -0
  11. package/dist/react/index.iife.js.map +1 -0
  12. package/dist/react/index.js +55 -0
  13. package/dist/react/index.js.map +1 -0
  14. package/dist/root/7tv/index.d.ts +4 -0
  15. package/dist/root/7tv/index.d.ts.map +1 -0
  16. package/dist/root/7tv/set.d.ts +4 -0
  17. package/dist/root/7tv/set.d.ts.map +1 -0
  18. package/dist/root/7tv/types/emote.d.ts +5 -0
  19. package/dist/root/7tv/types/emote.d.ts.map +1 -0
  20. package/dist/root/7tv/types/index.d.ts +6 -0
  21. package/dist/root/7tv/types/index.d.ts.map +1 -0
  22. package/dist/root/7tv/types/seven-tv.d.ts +91 -0
  23. package/dist/root/7tv/types/seven-tv.d.ts.map +1 -0
  24. package/dist/root/7tv/utils.d.ts +3 -0
  25. package/dist/root/7tv/utils.d.ts.map +1 -0
  26. package/dist/root/betterttv/index.d.ts +3 -0
  27. package/dist/root/betterttv/index.d.ts.map +1 -0
  28. package/dist/root/betterttv/set.d.ts +5 -0
  29. package/dist/root/betterttv/set.d.ts.map +1 -0
  30. package/dist/root/betterttv/types/cached-user-response.d.ts +62 -0
  31. package/dist/root/betterttv/types/cached-user-response.d.ts.map +1 -0
  32. package/dist/root/betterttv/types/index.d.ts +5 -0
  33. package/dist/root/betterttv/types/index.d.ts.map +1 -0
  34. package/dist/root/common/enums/index.d.ts +2 -0
  35. package/dist/root/common/enums/index.d.ts.map +1 -0
  36. package/dist/root/common/enums/provider.d.ts +5 -0
  37. package/dist/root/common/enums/provider.d.ts.map +1 -0
  38. package/dist/root/common/index.d.ts +3 -0
  39. package/dist/root/common/index.d.ts.map +1 -0
  40. package/dist/root/common/types/emote.d.ts +9 -0
  41. package/dist/root/common/types/emote.d.ts.map +1 -0
  42. package/dist/root/common/types/index.d.ts +3 -0
  43. package/dist/root/common/types/index.d.ts.map +1 -0
  44. package/dist/root/frankerfacez/index.d.ts +4 -0
  45. package/dist/root/frankerfacez/index.d.ts.map +1 -0
  46. package/dist/root/frankerfacez/set.d.ts +10 -0
  47. package/dist/root/frankerfacez/set.d.ts.map +1 -0
  48. package/dist/root/frankerfacez/types/frankerfacez.d.ts +104 -0
  49. package/dist/root/frankerfacez/types/frankerfacez.d.ts.map +1 -0
  50. package/dist/root/frankerfacez/types/index.d.ts +5 -0
  51. package/dist/root/frankerfacez/types/index.d.ts.map +1 -0
  52. package/dist/root/frankerfacez/utils.d.ts +2 -0
  53. package/dist/root/frankerfacez/utils.d.ts.map +1 -0
  54. package/dist/root/index.d.ts +5 -0
  55. package/dist/root/index.d.ts.map +1 -0
  56. package/dist/root/index.iife.js +2 -0
  57. package/dist/root/index.iife.js.map +1 -0
  58. package/dist/root/index.js +16 -0
  59. package/dist/root/index.js.map +1 -0
  60. package/package.json +41 -0
  61. package/src/react/hooks/index.ts +1 -0
  62. package/src/react/hooks/useEmotes.ts +105 -0
  63. package/src/react/index.ts +1 -0
  64. package/src/root/7tv/index.ts +3 -0
  65. package/src/root/7tv/set.ts +16 -0
  66. package/src/root/7tv/types/emote.ts +4 -0
  67. package/src/root/7tv/types/index.ts +6 -0
  68. package/src/root/7tv/types/seven-tv.ts +100 -0
  69. package/src/root/7tv/utils.ts +5 -0
  70. package/src/root/betterttv/index.ts +2 -0
  71. package/src/root/betterttv/set.ts +49 -0
  72. package/src/root/betterttv/types/cached-user-response.ts +62 -0
  73. package/src/root/betterttv/types/index.ts +6 -0
  74. package/src/root/common/enums/index.ts +1 -0
  75. package/src/root/common/enums/provider.ts +4 -0
  76. package/src/root/common/index.ts +2 -0
  77. package/src/root/common/types/emote.ts +8 -0
  78. package/src/root/common/types/index.ts +2 -0
  79. package/src/root/frankerfacez/index.ts +3 -0
  80. package/src/root/frankerfacez/set.ts +46 -0
  81. package/src/root/frankerfacez/types/frankerfacez.ts +113 -0
  82. package/src/root/frankerfacez/types/index.ts +6 -0
  83. package/src/root/frankerfacez/utils.ts +6 -0
  84. 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,2 @@
1
+ export * from "./useEmotes";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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,2 @@
1
+ export * from "./hooks";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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,4 @@
1
+ export * from "./types";
2
+ export * from "./set";
3
+ export * from "./utils";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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,4 @@
1
+ import type { SevenTV } from "./types";
2
+ export declare const get7TVUserEmoteSet: (providerId: string) => Promise<SevenTV.Emote[]>;
3
+ export declare const get7TVGlobalEmoteSet: () => Promise<SevenTV.Emote[]>;
4
+ //# sourceMappingURL=set.d.ts.map
@@ -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,5 @@
1
+ export interface EmoteReference {
2
+ id: string;
3
+ name: string;
4
+ }
5
+ //# sourceMappingURL=emote.d.ts.map
@@ -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,6 @@
1
+ /**
2
+ * Экспорт всех типов 7TV
3
+ */
4
+ export * from "./seven-tv";
5
+ export * from "./emote";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ import type { SevenTV } from "./types";
2
+ export declare const extractZeroWidthEmotes: (emotes: SevenTV.Emote[]) => SevenTV.Emote[];
3
+ //# sourceMappingURL=utils.d.ts.map
@@ -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,3 @@
1
+ export * from "./types";
2
+ export * from "./set";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,5 @@
1
+ /**
2
+ * Экспорт всех типов BetterTTV
3
+ */
4
+ export * from "./cached-user-response";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -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,2 @@
1
+ export * from "./provider";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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,5 @@
1
+ export declare enum EmotesProvider {
2
+ Twitch = "twitch",
3
+ Youtube = "youtube"
4
+ }
5
+ //# sourceMappingURL=provider.d.ts.map
@@ -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,3 @@
1
+ export * from "./types";
2
+ export * from "./enums";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,9 @@
1
+ /**
2
+ * Эмоут в формате сообщения (Twitch/7TV/BTTV/FFZ и т.д.)
3
+ */
4
+ export interface MessageEmote {
5
+ id?: string;
6
+ name: string;
7
+ urls: Record<string, string>;
8
+ }
9
+ //# sourceMappingURL=emote.d.ts.map
@@ -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,3 @@
1
+ export * from "./emote";
2
+ export * from "../enums/provider";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,4 @@
1
+ export * from "./set";
2
+ export * from "./types";
3
+ export * from "./utils";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}