A userscript library for adding support back to GM_ non async functions
目前為
此腳本不應該直接安裝,它是一個供其他腳本使用的函式庫。欲使用本函式庫,請在腳本 metadata 寫上: // @require https://update.gf.qytechs.cn/scripts/534637/1581323/LegacyGMjs.js
/* LegacyGM.js
- Version: 1.0.0
- Author: Haka
- Description: A userscript library for adding support back to GM_ non async functions
- GitHub: https://github.com/Psyyke/A.C.A.S/
*/
(async () => {
const noLegacyInfo = typeof globalThis?.GM_info === 'undefined' && typeof GM?.info !== 'undefined',
setValueExists = typeof GM?.setValue === 'function',
getValueExists = typeof GM?.getValue === 'function',
deleteValueExists = typeof GM?.deleteValue === 'function',
listValuesExists = typeof GM?.listValues === 'function',
openInTabExists = typeof GM?.openInTab === 'function';
if(noLegacyInfo) globalThis.GM_info = GM.info;
if(!listValuesExists && !getValueExists && !setValueExists) return;
const gmCache = {};
const gmFunctions = {
GM_setValue: (key, value) => {
GM.setValue(key, value);
gmCache[key] = value;
},
GM_getValue: (key, defaultValue) => {
return key in gmCache ? gmCache[key] : defaultValue;
},
GM_deleteValue: (key) => {
GM.deleteValue(key);
delete gmCache[key];
},
GM_listValues: () => {
return Object.keys(gmCache);
},
GM_openInTab: (url, options = false) => {
if(openInTabExists)
return GM.openInTab(url, options);
return window.open(url, '_blank');
},
};
setInterval(async () => {
const keys = await GM.listValues();
// Load existing
for(const key of keys) {
gmCache[key] = await GM.getValue(key);
}
// Remove old
for(const key in gmCache) {
if(!keys.includes(key)) {
delete gmCache[key];
}
}
}, 1);
// Define legacy functions
for(const [name, func] of Object.entries(gmFunctions)) {
if(typeof globalThis[name] === 'undefined') {
Object.defineProperty(globalThis, name, {
value: func,
writable: false,
configurable: false,
enumerable: false,
});
}
}
});