Kerwin612

用户脚本的基础,包含读取配置的功能;利用此脚本,用户可以忽略配置相关的代码;直接定义功能就可以;

此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.cn-greasyfork.org/scripts/404294/810055/Kerwin612.js

  1. // ==UserScript==
  2. // @name Kerwin612
  3. // @version 0.1
  4. // @author kerwin612
  5. // @license MIT
  6. // @include *
  7. // @run-at document-start
  8. // @grant GM.getValue
  9. // @noframes
  10. // ==/UserScript==
  11.  
  12. //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Kerwin612's UserScript CORE<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  13.  
  14. //默认配置信息
  15. var config = {
  16. run: (() => {
  17. //在此配置主方法,读完配置后会执行此方法
  18. var key = 'default';
  19. var url = window.location.href;
  20.  
  21. for (let [k, v] of Object.entries(fs)) {
  22. if ((url === k || url.startsWith(k) || new RegExp(k).test(url))) {
  23. key = k;
  24. break;
  25. }
  26. }
  27. var obj = fs[key];
  28. if (!obj) return;
  29. obj.startup(obj.ctx);
  30. obj.readyInterval = setInterval((function(){
  31. if (this.ready(this.ctx)) {
  32. clearInterval(this.readyInterval);
  33. this.run(this.ctx);
  34. }
  35. }).bind(obj), 30);
  36. }).bind(this)
  37. };
  38.  
  39. function getConfig(config, keys, index) {
  40. index = index || 0;
  41. var key = keys[index++];
  42. var value = config[key];
  43. return new Promise((resolve) => {
  44. GM.getValue(key, value)
  45. .then((cv) => {
  46. if (key === 'config') {
  47. config = Object.assign(config, cv);
  48. } else {
  49. config[key] = (typeof config[key]) === 'object' ? Object.assign(config[key], cv) : cv;
  50. }
  51. })
  52. .finally(() => {
  53. if (index > keys.length - 1) {
  54. resolve(config);
  55. } else {
  56. getConfig(config, keys, index).then((c) => {resolve(c)});
  57. }
  58. });
  59. });
  60. }
  61. setTimeout(() => {
  62. if (GM && GM.getValue) {
  63. getConfig(config, ['config'].concat(Object.keys(config))).then((c) => {
  64. Object.assign(config, c).run();
  65. });
  66. } else {
  67. //如果不支持用户配置,就直接用默认配置
  68. config.run();
  69. }
  70. }, 500);
  71.  
  72. var fs = {};
  73.  
  74. /*
  75. func(
  76. () => {}, //启动方法
  77. () => {}, //判断页面是否准备好
  78. () => {}, //主方法
  79. string.., //URL匹配项
  80. );
  81. */
  82. function func() {
  83. //arguments is an array-like object, but not an array
  84. var as = arguments;
  85. if (as.length < 3) return;
  86. var obj = {};
  87. obj.startup = as[0].bind(obj);
  88. obj.ready = as[1].bind(obj);
  89. obj.run = as[2].bind(obj);
  90. obj.ctx = {};
  91. if (as.length === 3) {
  92. fs['default'] = obj;
  93. return;
  94. }
  95. [].forEach.call(as, function(value, index) {
  96. if (index < 3) return;
  97. fs[value||'default'] = obj;
  98. });
  99. }
  100.  
  101. ////默认配置,如有配置项,将按照以下模板将配置写在>>>>>Kerwin612's UserScript CORE>>>>>以下
  102. //config.configKey = configVal
  103.  
  104. ////方法模板,将此模板copy到>>>>>Kerwin612's UserScript CORE>>>>>以下,可多次
  105. //func(
  106. // //startup: url匹配上时就会执行的方法,无须返回值,仅执行一次
  107. // (ctx) => {
  108. // },
  109. // //ready: url匹配上时就会执行的方法,返回bool类型的值,每30ms执行一次,直至此方法返回true后就不再执行
  110. // (ctx) => {
  111. // return true;
  112. // },
  113. // //run: url匹配上且以上的ready方法返回true后执行的方法,无须返回值,仅执行一次
  114. // (ctx) => {
  115. // },
  116. // //URL匹配项,可定义多个;当URL匹配时才执行上面的方法;当URL为空或未定义时,上述方法为默认执行的方法
  117. // 'url1','url2','url3'
  118. //);
  119.  
  120. //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Kerwin612's UserScript CORE>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>