-
-
Notifications
You must be signed in to change notification settings - Fork 20
/
Copy pathbadge.ts
68 lines (63 loc) · 1.74 KB
/
badge.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import { debugLog } from "../utils";
import {
YTAuthorBadge,
YTLiveChatTextMessageRenderer,
} from "../interfaces/yt/chat";
import { Membership } from "../interfaces/misc";
export function parseMembership(badge: YTAuthorBadge): Membership | undefined {
const renderer = badge.liveChatAuthorBadgeRenderer;
if (!renderer.customThumbnail) return;
const match = /^(.+?)(?:\s\((.+)\))?$/.exec(renderer.tooltip);
if (match) {
const [_, status, since] = match;
const membership = {
status,
since,
thumbnail:
renderer.customThumbnail.thumbnails[
renderer.customThumbnail.thumbnails.length - 1
].url,
};
return membership;
}
}
export function parseBadges(renderer: YTLiveChatTextMessageRenderer) {
let isVerified = false,
isOwner = false,
isModerator = false,
membership: Membership | undefined = undefined;
if ("authorBadges" in renderer && renderer.authorBadges) {
for (const badge of renderer.authorBadges) {
const renderer = badge.liveChatAuthorBadgeRenderer;
const iconType = renderer.icon?.iconType;
switch (iconType) {
case "VERIFIED":
isVerified = true;
break;
case "OWNER":
isOwner = true;
break;
case "MODERATOR":
isModerator = true;
break;
case undefined:
// membership
membership = parseMembership(badge);
break;
default:
debugLog(
`[action required] Unrecognized iconType:`,
iconType,
JSON.stringify(renderer)
);
throw new Error("Unrecognized iconType: " + iconType);
}
}
}
return {
isOwner,
isVerified,
isModerator,
membership,
};
}