@allior/wmake-emotes 1.0.4 → 1.0.5

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.
@@ -0,0 +1,7 @@
1
+ const o = async (t) => (await (await fetch(`https://7tv.io/v3/users/twitch/${t}`)).json()).emote_set.emotes, a = async () => (await (await fetch("https://7tv.io/v3/emote-sets/global")).json()).emotes, n = (t) => t.filter((e) => e.flags === 1 && e.id);
2
+ export {
3
+ n as extractZeroWidthEmotes,
4
+ a as get7TVGlobalEmoteSet,
5
+ o as get7TVUserEmoteSet
6
+ };
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/root/7tv/set.ts","../../src/root/7tv/utils.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"],"names":["get7TVUserEmoteSet","providerId","get7TVGlobalEmoteSet","extractZeroWidthEmotes","emotes"],"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;"}
@@ -1,6 +1,6 @@
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) => {
1
+ const n = /* @__PURE__ */ new Map(), u = async (t, e) => {
2
2
  const s = `user:${t}:${e}`;
3
- let a = o.get(s);
3
+ let a = n.get(s);
4
4
  return a || (a = (async () => {
5
5
  const r = await fetch(
6
6
  `https://api.betterttv.net/3/${t}/${e}`
@@ -13,25 +13,25 @@ const m = async (t) => (await (await fetch(`https://7tv.io/v3/users/twitch/${t}`
13
13
  channelEmotes: [],
14
14
  sharedEmotes: []
15
15
  };
16
- const n = await r.json();
16
+ const o = await r.json();
17
17
  return {
18
- ...n,
19
- channelEmotes: n.channelEmotes ?? [],
20
- sharedEmotes: n.sharedEmotes ?? []
18
+ ...o,
19
+ channelEmotes: o.channelEmotes ?? [],
20
+ sharedEmotes: o.sharedEmotes ?? []
21
21
  };
22
- })(), o.set(s, a), a);
23
- }, u = async () => {
22
+ })(), n.set(s, a), a);
23
+ }, m = async () => {
24
24
  const t = "global";
25
- let e = o.get(t);
25
+ let e = n.get(t);
26
26
  return e || (e = fetch("https://api.betterttv.net/3/cached/emotes/global").then(
27
27
  (s) => s.json()
28
- ), o.set(t, e), e);
28
+ ), n.set(t, e), e);
29
29
  }, c = (t) => {
30
30
  const e = [];
31
31
  for (const s of Object.values(t))
32
32
  e.push(...s.emoticons || []);
33
33
  return e;
34
- }, f = async (t) => {
34
+ }, l = async (t) => {
35
35
  try {
36
36
  const s = await (await fetch(
37
37
  `https://api.frankerfacez.com/v1/room/twitch/${t}`
@@ -40,7 +40,7 @@ const m = async (t) => (await (await fetch(`https://7tv.io/v3/users/twitch/${t}`
40
40
  } catch {
41
41
  return [];
42
42
  }
43
- }, b = async () => {
43
+ }, p = async () => {
44
44
  try {
45
45
  const e = await (await fetch("https://api.frankerfacez.com/v1/set/global")).json();
46
46
  return c(e.sets);
@@ -51,12 +51,9 @@ const m = async (t) => (await (await fetch(`https://7tv.io/v3/users/twitch/${t}`
51
51
  var h = /* @__PURE__ */ ((t) => (t.Twitch = "twitch", t.Youtube = "youtube", t))(h || {});
52
52
  export {
53
53
  h as E,
54
- m as a,
55
- u as b,
56
- p as c,
57
- b as d,
58
- l as e,
59
- f,
60
- i as g
54
+ u as a,
55
+ p as b,
56
+ l as c,
57
+ m as g
61
58
  };
62
- //# sourceMappingURL=provider-DBZ3iJv2.js.map
59
+ //# sourceMappingURL=provider-Izfa1t1_.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-Izfa1t1_.js","sources":["../src/root/betterttv/set.ts","../src/root/frankerfacez/set.ts","../src/root/common/enums/provider.ts"],"sourcesContent":["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":["byKey","getBetterTTVUserEmoteCacheResponse","provider","providerId","key","p","res","data","getBetterTTVGlobalEmoteSet","r","getEmotesFromSets","sets","emotes","set","getFrankerFaceZUserEmoteSet","username","getFrankerFaceZGlobalEmoteSet","EmotesProvider"],"mappings":"AAIA,MAAMA,wBAAY,IAAA,GAELC,IAAqC,OAChDC,GACAC,MAC0C;AAC1C,QAAMC,IAAM,QAAQF,CAAQ,IAAIC,CAAU;AAC1C,MAAIE,IAAIL,EAAM,IAAII,CAAG;AACrB,SAAIC,MACJA,KAAK,YAAY;AACf,UAAMC,IAAM,MAAM;AAAA,MAChB,+BAA+BJ,CAAQ,IAAIC,CAAU;AAAA,IAAA;AAEvD,QAAI,CAACG,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,GACAP,EAAM,IAAII,GAAKC,CAAC,GACTA;AACT,GAEaG,IAA6B,YAErC;AACH,QAAMJ,IAAM;AACZ,MAAIC,IAAIL,EAAM,IAAII,CAAG;AACrB,SAAIC,MACJA,IAAI,MAAM,kDAAkD,EAAE;AAAA,IAAK,CAACI,MAClEA,EAAE,KAAA;AAAA,EAAK,GAETT,EAAM,IAAII,GAAKC,CAAC,GACTA;AACT,GC3CMK,IAAoB,CACxBC,MACyB;AACzB,QAAMC,IAA+B,CAAA;AACrC,aAAWC,KAAO,OAAO,OAAOF,CAAI;AAClC,IAAAC,EAAO,KAAK,GAAIC,EAAI,aAAa,CAAA,CAAG;AAEtC,SAAOD;AACT,GAKaE,IAA8B,OACzCC,MACkC;AAClC,MAAI;AAIF,UAAMR,IAAkC,OAHvB,MAAM;AAAA,MACrB,+CAA+CQ,CAAQ;AAAA,IAAA,GAEF,KAAA;AACvD,WAAOL,EAAkBH,EAAK,IAAI;AAAA,EACpC,QAAQ;AACN,WAAO,CAAA;AAAA,EACT;AACF,GAKaS,IAAgC,YAExC;AACH,MAAI;AAEF,UAAMT,IAA0C,OAD/B,MAAM,MAAM,4CAA4C,GACV,KAAA;AAC/D,WAAOG,EAAkBH,EAAK,IAAI;AAAA,EACpC,QAAQ;AACN,WAAO,CAAA;AAAA,EACT;AACF;AC7CO,IAAKU,sBAAAA,OACVA,EAAA,SAAS,UACTA,EAAA,UAAU,WAFAA,IAAAA,KAAA,CAAA,CAAA;"}
@@ -1,52 +1,53 @@
1
- import { E as i, b as V, c as b, g as k, a as v, e as Z, d as R, f as W } from "../provider-DBZ3iJv2.js";
1
+ import { get7TVGlobalEmoteSet as V, get7TVUserEmoteSet as b, extractZeroWidthEmotes as k } from "../7tv/index.js";
2
+ import { E as i, g as v, a as Z, b as R, c as W } from "../provider-Izfa1t1_.js";
2
3
  import { useState as o, useRef as y, useCallback as z, useEffect as B } from "react";
3
4
  const U = [i.Twitch], x = ({
4
- username: r,
5
+ username: c,
5
6
  providerId: e,
6
7
  providers: a = U
7
8
  }) => {
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
+ const [l, h] = o([]), [E, u] = o([]), [T, S] = o([]), [F, d] = o([]), [g, n] = o(!1), f = y(!1), m = z(async () => {
9
10
  if (a.length === 0) {
10
11
  n(!0);
11
12
  return;
12
13
  }
13
14
  n(!1);
14
15
  try {
15
- const c = await V();
16
+ const r = await v();
16
17
  if (e)
17
18
  for (const t of a)
18
19
  try {
19
- const s = await b(
20
+ const s = await Z(
20
21
  t,
21
22
  e
22
23
  );
23
- c.push(
24
+ r.push(
24
25
  ...s.channelEmotes ?? [],
25
26
  ...s.sharedEmotes ?? []
26
27
  );
27
28
  } catch {
28
29
  }
29
30
  if (a.includes(i.Twitch)) {
30
- const t = await k();
31
- e && t.push(...await v(e)), u(Z(t));
31
+ const t = await V();
32
+ e && t.push(...await b(e)), u(k(t));
32
33
  const s = await R();
33
- r && s.push(...await W(r)), S(s), h(t);
34
+ c && s.push(...await W(c)), S(s), h(t);
34
35
  }
35
- F(c);
36
+ d(r);
36
37
  } finally {
37
38
  n(!0);
38
39
  }
39
- }, [r, e, a]), w = (c) => m.includes(c);
40
+ }, [c, e, a]), w = (r) => E.includes(r);
40
41
  return B(() => {
41
- f.current || (f.current = !0, E());
42
- }, [E]), {
43
- BetterTTVEmotes: d,
42
+ f.current || (f.current = !0, m());
43
+ }, [m]), {
44
+ BetterTTVEmotes: F,
44
45
  FrankerFaceZEmotes: T,
45
46
  SevenTVEmotes: l,
46
- SevenTVZeroWidthEmotes: m,
47
+ SevenTVZeroWidthEmotes: E,
47
48
  isLoaded: g,
48
49
  isZeroWidthEmote: w,
49
- reloadEmotes: E
50
+ reloadEmotes: m
50
51
  };
51
52
  };
52
53
  export {
@@ -1 +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;"}
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;"}
@@ -1,16 +1,17 @@
1
- import { E as o, e as s, g as c, a as n, b as m, c as E, d as p, f } from "../provider-DBZ3iJv2.js";
1
+ import { extractZeroWidthEmotes as a, get7TVGlobalEmoteSet as s, get7TVUserEmoteSet as c } from "../7tv/index.js";
2
+ import { E as n, g as p, a as E, b as f, c as g } from "../provider-Izfa1t1_.js";
2
3
  function t(e) {
3
4
  return e.includes("cdn.frankerfacez.com") ? e.replace("https:https:", "https:") : e;
4
5
  }
5
6
  export {
6
- o as EmotesProvider,
7
- s as extractZeroWidthEmotes,
7
+ n as EmotesProvider,
8
+ a as extractZeroWidthEmotes,
8
9
  t as fixFrankerFaceZDoubleHttps,
9
- c as get7TVGlobalEmoteSet,
10
- n as get7TVUserEmoteSet,
11
- m as getBetterTTVGlobalEmoteSet,
10
+ s as get7TVGlobalEmoteSet,
11
+ c as get7TVUserEmoteSet,
12
+ p as getBetterTTVGlobalEmoteSet,
12
13
  E as getBetterTTVUserEmoteCacheResponse,
13
- p as getFrankerFaceZGlobalEmoteSet,
14
- f as getFrankerFaceZUserEmoteSet
14
+ f as getFrankerFaceZGlobalEmoteSet,
15
+ g as getFrankerFaceZUserEmoteSet
15
16
  };
16
17
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/root/frankerfacez/utils.ts"],"sourcesContent":["export function fixFrankerFaceZDoubleHttps(url: string): string {\r\n if (url.includes(\"cdn.frankerfacez.com\")) {\r\n return url.replace(\"https:https:\", \"https:\");\r\n }\r\n return url;\r\n }"],"names":["fixFrankerFaceZDoubleHttps","url"],"mappings":";AAAO,SAASA,EAA2BC,GAAqB;AAC5D,SAAIA,EAAI,SAAS,sBAAsB,IAC9BA,EAAI,QAAQ,gBAAgB,QAAQ,IAEtCA;AACT;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/root/frankerfacez/utils.ts"],"sourcesContent":["export function fixFrankerFaceZDoubleHttps(url: string): string {\r\n if (url.includes(\"cdn.frankerfacez.com\")) {\r\n return url.replace(\"https:https:\", \"https:\");\r\n }\r\n return url;\r\n }"],"names":["fixFrankerFaceZDoubleHttps","url"],"mappings":";;AAAO,SAASA,EAA2BC,GAAqB;AAC5D,SAAIA,EAAI,SAAS,sBAAsB,IAC9BA,EAAI,QAAQ,gBAAgB,QAAQ,IAEtCA;AACT;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allior/wmake-emotes",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "description": "Emote providers: 7TV, BetterTTV, FrankerFaceZ.",
5
5
  "type": "module",
6
6
  "types": "./dist/root/index.d.ts",
@@ -14,6 +14,10 @@
14
14
  "types": "./dist/react/index.d.ts",
15
15
  "import": "./dist/react/index.js"
16
16
  },
17
+ "./7tv": {
18
+ "types": "./dist/root/7tv/index.d.ts",
19
+ "import": "./dist/root/7tv/index.js"
20
+ },
17
21
  "./src/*": "./src/*"
18
22
  },
19
23
  "files": [
@@ -23,8 +27,8 @@
23
27
  ],
24
28
  "scripts": {
25
29
  "pub": "npm publish --access public",
26
- "build": "bun -e \"import fs from 'node:fs'; try { fs.rmSync('dist', { recursive: true, force: true }); } catch {}\" && bun ../node_modules/vite/bin/vite.js build && VITE_IIFE_ENTRY=root bun ../node_modules/vite/bin/vite.js build --config vite.iife.config.ts && VITE_IIFE_ENTRY=react bun ../node_modules/vite/bin/vite.js build --config vite.iife.config.ts && bun ../node_modules/typescript/lib/tsc.js -p tsconfig.types.json",
27
- "build:iife": "VITE_IIFE_ENTRY=root bun ../node_modules/vite/bin/vite.js build --config vite.iife.config.ts && VITE_IIFE_ENTRY=react bun ../node_modules/vite/bin/vite.js build --config vite.iife.config.ts",
30
+ "build": "bun -e \"import fs from 'node:fs'; try { fs.rmSync('dist', { recursive: true, force: true }); } catch {}\" && bun ../node_modules/vite/bin/vite.js build && bun ../node_modules/cross-env/dist/bin/cross-env.js VITE_IIFE_ENTRY=root bun ../node_modules/vite/bin/vite.js build --config vite.iife.config.ts && bun ../node_modules/cross-env/dist/bin/cross-env.js VITE_IIFE_ENTRY=react bun ../node_modules/vite/bin/vite.js build --config vite.iife.config.ts && bun ../node_modules/typescript/lib/tsc.js -p tsconfig.types.json",
31
+ "build:iife": "bun ../node_modules/cross-env/dist/bin/cross-env.js VITE_IIFE_ENTRY=root bun ../node_modules/vite/bin/vite.js build --config vite.iife.config.ts && bun ../node_modules/cross-env/dist/bin/cross-env.js VITE_IIFE_ENTRY=react bun ../node_modules/vite/bin/vite.js build --config vite.iife.config.ts",
28
32
  "clean": "rimraf dist",
29
33
  "prepublishOnly": "bun run build"
30
34
  },
@@ -1 +0,0 @@
1
- {"version":3,"file":"provider-DBZ3iJv2.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;"}