Code Injector - Bonk.io

Allows different userscripts to define functions that modify the game's code

目前為 2021-10-13 提交的版本,檢視 最新版本

// ==UserScript==
// @name         Code Injector - Bonk.io
// @version      1.0.0
// @description  Allows different userscripts to define functions that modify the game's code
// @author       Excigma & kklkkj
// @namespace    https://gf.qytechs.cn/users/416480 
// @match        https://bonk.io/gameframe-release.html
// @run-at       document-body
// @grant        GM_xmlhttpRequest
// @grant        unsafeWindow
// ==/UserScript==

// What this does:
// - Finds other userscripts that have defined their injectors in `window.bonkCodeInjectors`, and runs them

// Credits to https://github.com/kklkkj for creating this system where multiple
// extensions can edit different parts of Bonk.io' code.

// Much of the code below was copied from or inspired by https://github.com/kklkkj/kklee/blob/master/src/runInjectors.js

// Go thank kklkkj for this

(() => {
	// Original `document.head.appendChild` function that we're going to overwrite
	const _appendChild = document.head.appendChild;

	// When RequireJS tries to add alpha2s.js to <head> we will intercept it,
	// and patch it using functions defined by other scripts in window.bonkCodeInjectors
	document.head.appendChild = (...args) => {
		// Sure, I can do `args?.[0]?.src.includes("alpha2s.js")`, but it's more difficult to read
		if (args[0] && args[0].src.includes("alpha2s.js")) {
			console.log("[Injector] Fetching original alpha2s.js...");
			// Store the url of the original unmodified alpha2s.js
			const alpha2sURL = args[0].src;

			// Remove the src attribute so it doesn't try to load the original alpha2s.js script
			args[0].removeAttribute("src");

			// Fetch the original unmodified alpha2s.js so we can patch it
			// eslint-disable-next-line no-undef
			GM_xmlhttpRequest({
				method: "GET",
				url: alpha2sURL,
				onload: (response) => {
					console.log("[Injector] Fetched alpha2s.js. Patching...");
					// Original alpha2s.js' code
					let str = response.responseText;

					// No bonkCodeInjectors found, this might mean that the user does not have any bonk userscripts installed
					// or that they failed to load before this script

					/* I commented this out because people who prefer userscripts over extensions likely
					 * enjoy the flexibility of being able to disable userscripts easily, and are thus likely to have
					 * all their userscripts disabled
					*/

					// if (!unsafeWindow.bonkCodeInjectors) {
					// 	unsafeWindow.bonkCodeInjectors = [];
					// 	alert("Did not find any Bonk.io userscripts to load. This may be an error, make sure you have scripts installed.");
					// }

					// Loop through `bonkCodeInjectors` and pass alpha2s.js' code in for them to modify
					for (const injector of unsafeWindow.bonkCodeInjectors) {
						try {
							// Run injector from other userscripts
							str = injector(str);
						} catch (error) {
							// An injector from one of the other userscripts failed to load
							alert("One of your Bonk.io userscripts was unable to be loaded");
							console.error(error);
						}
					}

					// Add the new script to the <script>'s contents
					args[0].textContent = str;

					// Make RequireJS think that the script loaded properly
					args[0].dispatchEvent(new Event("load"));

					console.log("[Injector] Patched alpha2s.js successfully");

					// Append the modified <script> tag to document.head
					return _appendChild.apply(document.head, args);
				},
				onerror: (error) => {
					// Error fetching original alpha2s.js
					console.error(error);
					alert("An error occurred whilst loading bonk injectors.");
					return _appendChild.apply(document.head, args);
				}
			});
		} else {
			return _appendChild.apply(document.head, args);
		}
	};
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址