// ==UserLibrary== // @name bw_learn_tool_utl_lib // @namespace https://learn.baowugroup.com/ // @version 1.0.0 // @description 宝武学习平台 工具库 // @author 令狐不太冲 // @license MIT // ==/UserLibrary== (function (window) { 'use strict'; var BWUTL = { version: '1.0.0', // 强制新窗口在当前标签页打开(防止弹出新窗口) fswn: function() { window.open = function(url) { if (url) { try { location.href = new URL(url, location.href).href; } catch { location.href = url; } } return { closed: true, document: null, focus: function(){}, close: function(){} }; }; }, // 循环执行任务 loop: function(task, runImmediately, intervalMs) { var exec = async function() { try { await task(); } catch (e) { console.error('[BW loop]', e); } if (intervalMs > 0) setTimeout(exec, intervalMs); }; if (runImmediately) exec(); else setTimeout(exec, intervalMs); }, // 本地数据存储 createDataStore: function(key, defaultData) { var data = Object.assign({}, defaultData); return { init: function() { try { var s = JSON.parse(localStorage.getItem(key)); if (s) data = Object.assign(defaultData, s); } catch (e) {} }, save: function(partial) { Object.assign(data, partial); localStorage.setItem(key, JSON.stringify(data)); }, get: function(k) { return data[k]; } }; }, // 等待 sleep: function(ms) { return new Promise(function(r) { setTimeout(r, ms); }); }, // 时间戳格式化 now: function() { var d = new Date(); return '[' + String(d.getHours()).padStart(2,'0') + ':' + String(d.getMinutes()).padStart(2,'0') + ':' + String(d.getSeconds()).padStart(2,'0') + ']'; } }; window.BWUTL = BWUTL; })(typeof unsafeWindow !== 'undefined' ? unsafeWindow : window);