|
1 | 1 | (function () { |
2 | 2 | const HOST = "https://vpzone.tv"; |
3 | 3 | const SOURCE_NAME = "VPZone"; |
4 | | - const SOURCE_IMG = HOST + "/favicon.ico"; |
| 4 | + const SOURCE_IMG = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+PHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiByeD0iMTQiIGZpbGw9IiMxMTE4MjciLz48cGF0aCBkPSJNMTQgMThoMTBsOCAyNCA4LTI0aDEwTDM3IDUwSDI3TDE0IDE4eiIgZmlsbD0iIzEyYzdjMiIvPjxjaXJjbGUgY3g9IjQ4IiBjeT0iMTYiIHI9IjYiIGZpbGw9IiM3YzVjZmYiLz48L3N2Zz4="; |
5 | 5 | const CONFIG_KEY = "vpzoneWsConfig"; |
6 | 6 | const TOKEN_KEY = "vpzoneWsTokens"; |
7 | 7 | const OAUTH_KEY = "vpzoneOAuthState"; |
|
975 | 975 | return ev && (ev.createdAt || ev.timestamp || ev.sentAt || ev.ts) ? (ev.createdAt || ev.timestamp || ev.sentAt || ev.ts) : ""; |
976 | 976 | } |
977 | 977 |
|
| 978 | + function flagValue(value) { |
| 979 | + var text; |
| 980 | + if (value === true || value === 1) return true; |
| 981 | + if (value === false || value === 0 || value == null) return false; |
| 982 | + text = String(value).toLowerCase(); |
| 983 | + return text === "true" || text === "1" || text === "yes"; |
| 984 | + } |
| 985 | + |
| 986 | + function eventValue(ev, keys) { |
| 987 | + var meta = ev && ev.metadata && typeof ev.metadata === "object" ? ev.metadata : {}; |
| 988 | + var i; |
| 989 | + if (!ev) return ""; |
| 990 | + for (i = 0; i < keys.length; i += 1) { |
| 991 | + if (ev[keys[i]] != null && ev[keys[i]] !== "") return ev[keys[i]]; |
| 992 | + if (meta[keys[i]] != null && meta[keys[i]] !== "") return meta[keys[i]]; |
| 993 | + } |
| 994 | + return ""; |
| 995 | + } |
| 996 | + |
| 997 | + function eventFlag(ev, keys) { |
| 998 | + var meta = ev && ev.metadata && typeof ev.metadata === "object" ? ev.metadata : {}; |
| 999 | + var roles = []; |
| 1000 | + var i; |
| 1001 | + var j; |
| 1002 | + for (i = 0; i < keys.length; i += 1) { |
| 1003 | + if (flagValue(ev && ev[keys[i]])) return true; |
| 1004 | + if (flagValue(meta && meta[keys[i]])) return true; |
| 1005 | + } |
| 1006 | + if (Array.isArray(ev && ev.roles)) roles = roles.concat(ev.roles); |
| 1007 | + if (Array.isArray(meta.roles)) roles = roles.concat(meta.roles); |
| 1008 | + for (j = 0; j < roles.length; j += 1) { |
| 1009 | + var role = String(roles[j] || "").toLowerCase(); |
| 1010 | + for (i = 0; i < keys.length; i += 1) { |
| 1011 | + if (role === String(keys[i]).toLowerCase().replace(/^is_?/, "")) return true; |
| 1012 | + } |
| 1013 | + } |
| 1014 | + return false; |
| 1015 | + } |
| 1016 | + |
| 1017 | + function eventMessageId(ev) { |
| 1018 | + var value = eventValue(ev, ["messageId", "message_id", "chatMessageId", "chat_message_id", "id"]); |
| 1019 | + return value != null && value !== "" ? String(value) : ""; |
| 1020 | + } |
| 1021 | + |
978 | 1022 | function mapEventName(value) { |
979 | 1023 | value = String(value || "").toLowerCase(); |
980 | 1024 | if (value === "msg" || value === "message" || value === "new_message" || value === "chat") return "chat_message"; |
981 | 1025 | if (value === "viewer_join") return "joined"; |
982 | 1026 | if (value === "viewer_quit") return "left"; |
983 | 1027 | if (value === "follow") return "new_follower"; |
984 | 1028 | if (value === "subscribe" || value === "subscription") return "new_subscriber"; |
985 | | - if (value === "gift") return "gift_subscription"; |
| 1029 | + if (value === "gift" || value === "gift_subscription" || value === "gifted_subscription" || value === "subscription_gift" || value === "subgift") return "subscription_gift"; |
986 | 1030 | if (value === "raid") return "raid"; |
987 | 1031 | if (value === "clip") return "clip"; |
988 | 1032 | if (value === "level_up") return "level_up"; |
|
1001 | 1045 | if (Array.isArray(ev.chatbadges)) badges = badges.concat(ev.chatbadges); |
1002 | 1046 | if (Array.isArray(ev.badges)) badges = badges.concat(ev.badges); |
1003 | 1047 | if (ev.is_owner || ev.isOwner) badges.push(svgBadge("OP", "#c071f5", 20)); |
1004 | | - if (ev.is_subscriber || ev.isSubscriber) badges.push(svgBadge(subLabel, ev.tier === "tier3" ? "#00E9E2" : (ev.tier === "tier2" ? "#FF6DE4" : "#f9376b"))); |
| 1048 | + if (eventFlag(ev, ["is_moderator", "isModerator", "moderator", "mod"])) badges.push(svgBadge("MOD", "#00a7ff", 28)); |
| 1049 | + if (eventFlag(ev, ["is_vip", "isVip", "vip"])) badges.push(svgBadge("VIP", "#ff68b3", 24)); |
| 1050 | + if (eventFlag(ev, ["is_subscriber", "isSubscriber", "subscriber", "member"])) badges.push(svgBadge(subLabel, ev.tier === "tier3" ? "#00E9E2" : (ev.tier === "tier2" ? "#FF6DE4" : "#f9376b"))); |
1005 | 1051 | if (ev.metadata && ev.metadata.source === "twitch") badges.push(svgBadge("TW", "#9146FF", 20)); |
1006 | 1052 | return badges; |
1007 | 1053 | } |
1008 | 1054 |
|
1009 | 1055 | function buildChat(ev) { |
1010 | 1056 | var rawName = ev.actorDisplayName || ev.displayName || ev.actorUsername || ev.username || ""; |
| 1057 | + var messageId = eventMessageId(ev); |
| 1058 | + var isSubscriber = eventFlag(ev, ["is_subscriber", "isSubscriber", "subscriber", "member"]); |
| 1059 | + var isModerator = eventFlag(ev, ["is_moderator", "isModerator", "moderator", "mod"]); |
| 1060 | + var isVip = eventFlag(ev, ["is_vip", "isVip", "vip"]); |
| 1061 | + var isOwner = eventFlag(ev, ["is_owner", "isOwner", "owner", "broadcaster"]); |
1011 | 1062 | if (!rawName || String(rawName).toLowerCase() === "system") return null; |
1012 | 1063 | var data = basePayload(); |
| 1064 | + if (messageId) data.id = messageId; |
1013 | 1065 | data.chatname = esc(rawName); |
| 1066 | + data.username = ev.actorUsername || ev.username || ""; |
1014 | 1067 | data.chatmessage = renderMessage(ev.message || ev.text || ev.body || ev.content || ""); |
1015 | 1068 | data.chatimg = absUrl(ev.actorAvatarUrl || ev.avatarUrl || ev.actorAvatar || ev.avatar_url || ev.profileImage || ""); |
1016 | 1069 | data.contentimg = absUrl(ev.contentimg || ev.contentImage || ev.imageUrl || ""); |
1017 | 1070 | data.chatbadges = buildBadges(ev); |
1018 | | - data.membership = ev.metadata && ev.metadata.actorRank ? nice(ev.metadata.actorRank) : ((ev.is_subscriber || ev.isSubscriber) ? "Subscriber" : ""); |
| 1071 | + data.membership = ev.metadata && ev.metadata.actorRank ? nice(ev.metadata.actorRank) : (isSubscriber ? "Subscriber" : ""); |
1019 | 1072 | data.nameColor = ev.actorNameColor || ev.nameColor || ev.color || "#c084fc"; |
1020 | 1073 | data.userid = ev.actorUserId != null ? String(ev.actorUserId) : (ev.userId != null ? String(ev.userId) : (ev.actorUsername || ev.username || "")); |
| 1074 | + if (isModerator) data.mod = true; |
| 1075 | + if (isVip) data.vip = true; |
| 1076 | + if (isSubscriber) data.member = true; |
1021 | 1077 | data.timestamp = eventTime(ev); |
1022 | | - data.meta = { id: ev.id != null ? ev.id : null, streamUsername: ev.streamUsername || state.currentChannel || state.cfg.channel, createdAt: eventTime(ev), actorUsername: ev.actorUsername || ev.username || "", actorRank: ev.metadata && ev.metadata.actorRank ? ev.metadata.actorRank : "", rawEventType: ev.eventType || ev.type || "chat_message", transport: "websocket", isSubscriber: !!(ev.is_subscriber || ev.isSubscriber), subMonths: Number(ev.sub_months || ev.subMonths || 0), isOwner: !!(ev.is_owner || ev.isOwner) }; |
| 1078 | + data.meta = { streamUsername: ev.streamUsername || state.currentChannel || state.cfg.channel, createdAt: eventTime(ev), actorUsername: ev.actorUsername || ev.username || "", actorRank: ev.metadata && ev.metadata.actorRank ? ev.metadata.actorRank : "", rawEventType: ev.eventType || ev.type || "chat_message", transport: "websocket", isSubscriber: isSubscriber, subMonths: Number(ev.sub_months || ev.subMonths || 0), isOwner: isOwner, isModerator: isModerator, isVip: isVip }; |
| 1079 | + if (messageId) data.meta.messageId = messageId; |
1023 | 1080 | return data.chatname && data.chatmessage ? data : null; |
1024 | 1081 | } |
1025 | 1082 |
|
1026 | 1083 | function buildEvent(ev) { |
1027 | 1084 | var mapped = mapEventName(ev.eventType || ev.type || ""); |
1028 | 1085 | var data; |
| 1086 | + var messageId = eventMessageId(ev); |
| 1087 | + var isSubscriber = eventFlag(ev, ["is_subscriber", "isSubscriber", "subscriber", "member"]); |
| 1088 | + var isModerator = eventFlag(ev, ["is_moderator", "isModerator", "moderator", "mod"]); |
| 1089 | + var isVip = eventFlag(ev, ["is_vip", "isVip", "vip"]); |
| 1090 | + var isOwner = eventFlag(ev, ["is_owner", "isOwner", "owner", "broadcaster"]); |
1029 | 1091 | if (!mapped || mapped === "presence" || mapped === "chat_message") return null; |
1030 | 1092 | if (state.settings.hideevents) return null; |
1031 | 1093 | if (mapped === "joined" && state.settings.capturejoinedevent === false) return null; |
1032 | 1094 | var rawName = ev.actorDisplayName || ev.displayName || ev.actorUsername || ev.username || ""; |
1033 | 1095 | if (!rawName || String(rawName).toLowerCase() === "system") return null; |
1034 | 1096 | data = basePayload(); |
| 1097 | + if (messageId) data.id = messageId; |
1035 | 1098 | data.event = mapped; |
1036 | 1099 | data.chatname = esc(rawName); |
| 1100 | + data.username = ev.actorUsername || ev.username || ""; |
1037 | 1101 | data.chatmessage = renderMessage(ev.body || ev.message || ev.text || mapped); |
1038 | 1102 | data.chatimg = absUrl(ev.actorAvatarUrl || ev.avatarUrl || ev.actorAvatar || ev.avatar_url || ev.profileImage || ""); |
1039 | 1103 | data.chatbadges = buildBadges(ev); |
1040 | | - data.membership = ev.metadata && ev.metadata.actorRank ? nice(ev.metadata.actorRank) : ((ev.is_subscriber || ev.isSubscriber) ? "Subscriber" : ""); |
| 1104 | + data.membership = ev.metadata && ev.metadata.actorRank ? nice(ev.metadata.actorRank) : (isSubscriber ? "Subscriber" : ""); |
1041 | 1105 | data.nameColor = ev.actorNameColor || ev.nameColor || ev.color || "#c084fc"; |
1042 | 1106 | data.userid = ev.actorUserId != null ? String(ev.actorUserId) : (ev.userId != null ? String(ev.userId) : (ev.actorUsername || ev.username || "")); |
| 1107 | + if (isModerator) data.mod = true; |
| 1108 | + if (isVip) data.vip = true; |
| 1109 | + if (isSubscriber) data.member = true; |
1043 | 1110 | data.timestamp = eventTime(ev); |
1044 | | - data.meta = { id: ev.id != null ? ev.id : null, streamUsername: ev.streamUsername || state.currentChannel || state.cfg.channel, createdAt: eventTime(ev), actorUsername: ev.actorUsername || ev.username || "", actorRank: ev.metadata && ev.metadata.actorRank ? ev.metadata.actorRank : "", rawEventType: ev.eventType || ev.type || "", transport: "websocket" }; |
| 1111 | + data.meta = { streamUsername: ev.streamUsername || state.currentChannel || state.cfg.channel, createdAt: eventTime(ev), actorUsername: ev.actorUsername || ev.username || "", actorRank: ev.metadata && ev.metadata.actorRank ? ev.metadata.actorRank : "", rawEventType: ev.eventType || ev.type || "", transport: "websocket", isSubscriber: isSubscriber, isOwner: isOwner, isModerator: isModerator, isVip: isVip }; |
| 1112 | + if (messageId) data.meta.messageId = messageId; |
1045 | 1113 | if (mapped === "new_follower") data.meta.followedOn = eventTime(ev); |
1046 | 1114 | if (mapped === "new_subscriber") data.meta.subscribedOn = eventTime(ev); |
1047 | 1115 | return data.chatname ? data : null; |
|
0 commit comments