this repo has no description
1/* eslint-disable no-console */
2/* eslint-disable no-undef */
3
4const starterUrls = ["web.", "sentry."];
5let blockLoading = true;
6let doing = false;
7let collectedUrls = new Set();
8
9chrome.webNavigation.onBeforeNavigate.addListener(async (details) => {
10 const url = new URL(details.url);
11 if (!blockLoading && url.hostname.endsWith("discord.com")) {
12 await chrome.declarativeNetRequest.updateEnabledRulesets({
13 enableRulesetIds: ["modifyResponseHeaders", "blockLoading"]
14 });
15 blockLoading = true;
16 collectedUrls.clear();
17 }
18});
19
20chrome.webRequest.onBeforeRequest.addListener(
21 async (details) => {
22 if (details.tabId === -1) return;
23 if (starterUrls.some((url) => details.url.includes(url))) {
24 console.log("Adding", details.url);
25 collectedUrls.add(details.url);
26 }
27
28 if (collectedUrls.size === starterUrls.length) {
29 if (doing) return;
30 if (!blockLoading) return;
31 doing = true;
32 const urls = [...collectedUrls];
33 console.log("Doing", urls);
34
35 console.log("Running moonlight script");
36 try {
37 await chrome.scripting.executeScript({
38 target: { tabId: details.tabId },
39 world: "MAIN",
40 files: ["index.js"]
41 });
42 } catch (e) {
43 console.log(e);
44 }
45
46 console.log("Initializing moonlight");
47 try {
48 await chrome.scripting.executeScript({
49 target: { tabId: details.tabId },
50 world: "MAIN",
51 func: async () => {
52 try {
53 await window._moonlightBrowserInit();
54 } catch (e) {
55 console.log(e);
56 }
57 }
58 });
59 } catch (e) {
60 console.log(e);
61 }
62
63 console.log("Updating rulesets");
64 try {
65 blockLoading = false;
66 await chrome.declarativeNetRequest.updateEnabledRulesets({
67 disableRulesetIds: ["blockLoading"],
68 enableRulesetIds: ["modifyResponseHeaders"]
69 });
70 } catch (e) {
71 console.log(e);
72 }
73
74 console.log("Readding scripts");
75 try {
76 await chrome.scripting.executeScript({
77 target: { tabId: details.tabId },
78 world: "MAIN",
79 args: [urls],
80 func: async (urls) => {
81 const scripts = [...document.querySelectorAll("script")].filter(
82 (script) =>
83 script.src && urls.some((url) => url.includes(script.src))
84 );
85
86 // backwards
87 urls.reverse();
88 for (const url of urls) {
89 const script = scripts.find((script) => url.includes(script.src));
90 console.log("adding new script", script);
91
92 const newScript = document.createElement("script");
93 for (const { name, value } of script.attributes) {
94 newScript.setAttribute(name, value);
95 }
96
97 script.remove();
98 document.documentElement.appendChild(newScript);
99 }
100 }
101 });
102 } catch (e) {
103 console.log(e);
104 }
105
106 console.log("Done");
107 doing = false;
108 collectedUrls.clear();
109 }
110 },
111 {
112 urls: ["*://*.discord.com/assets/*.js"]
113 }
114);