SuperGM

Extends the GM_setValue and GM_getValue functions for any javascript variable type. basis on https://userscripts-mirror.org/scripts/source/107941.user.js

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.gf.qytechs.cn/scripts/389206/727035/SuperGM.js

  1. // ==UserScript==
  2. // @name SuperGM
  3. // @version 0.0.1
  4. // @description Extends the GM_setValue and GM_getValue functions for any javascript variable type. basis on https://userscripts-mirror.org/scripts/source/107941.user.js
  5. // @namespace userscripts.org/users/158640
  6. // ==/UserScript==
  7. (function () {
  8. String.prototype.startsWith = function (str) {
  9. return this.slice(0, str.length) == str;
  10. };
  11. String.prototype.endsWith = function (str) {
  12. return this.slice(-str.length) == str;
  13. };
  14. String.prototype.contains = function (str) {
  15. return this.indexOf(str) > -1;
  16. };
  17.  
  18. var SuperGM = function (version, _expiredMilliseconds) {
  19. var versionkeybasic = 'tsharp.org:key:v:';
  20. var expiredkeybasic = 'tsharp.org:key:e:';
  21. var JSON_MarkerStr = 'json_val: ';
  22. var FunctionMarker = 'function_code: ';
  23. var expiredMilliseconds = -1;
  24. if (typeof version != 'undefine') { version = -1; }
  25. if (typeof _expiredMilliseconds != 'undefine') {
  26. expiredMilliseconds = -1;
  27. }
  28. else {
  29. expiredMilliseconds = _expiredMilliseconds;
  30. }
  31. function ReportError(msg) {
  32. if (console && console.error) {
  33. console.log(msg);
  34. }
  35. else {
  36. throw new Error(msg);
  37. }
  38. }
  39.  
  40. //--- Check that the environment is proper.
  41. if (typeof GM_setValue != "function") {
  42. ReportError('This library requires Greasemonkey! GM_setValue is missing.');
  43. }
  44. if (typeof GM_getValue != "function") {
  45. ReportError('This library requires Greasemonkey! GM_getValue is missing.');
  46. }
  47. if (typeof version != 'integer') {
  48. ReportError('Arg version should be a integer type if you wana set it.');
  49. }
  50. if (typeof expiredMilliseconds != 'integer') {
  51. ReportError('Arg expiredMilliseconds should be a integer type if you wana set it.');
  52. }
  53.  
  54. this.set = function (varName, varValue) {
  55.  
  56. if (!varName) {
  57. ReportError('Illegal varName sent to GM_SuperValue.set().');
  58. return;
  59. }
  60. if (/[^\w _-]/.test(varName)) {
  61. ReportError('Suspect, probably illegal, varName sent to GM_SuperValue.set().');
  62. }
  63. var versionKey = versionkeybasic + varName;
  64. GM_setValue(versionKey, version);
  65. var expiredkey = expiredkeybasic + varName;
  66. GM_setValue(expiredkey, new Date().getTime());
  67.  
  68. if (typeof varValue == 'function') {
  69. varValue = varValue();
  70. }
  71.  
  72. switch (typeof varValue) {
  73. case 'undefined':
  74. ReportError('Illegal varValue sent to GM_SuperValue.set().');
  75. break;
  76. case 'boolean':
  77. case 'string':
  78. //--- These 2 types are safe to store, as is.
  79. GM_setValue(varName, varValue);
  80. break;
  81. case 'number':
  82. /*--- Numbers are ONLY safe if they are integers.
  83. Note that hex numbers, EG 0xA9, get converted
  84. and stored as decimals, EG 169, automatically.
  85. That's a feature of JavaScript.
  86. Also, only a 32-bit, signed integer is allowed.
  87. So we only process +/-2147483647 here.
  88. */
  89. if (varValue === parseInt(varValue) && Math.abs(varValue) < 2147483647) {
  90. GM_setValue(varName, varValue);
  91. break;
  92. }
  93. case 'object':
  94. /*--- For all other cases (but functions), and for
  95. unsafe numbers, store the value as a JSON string.
  96. */
  97. var safeStr = JSON_MarkerStr + JSON.stringify(varValue);
  98. GM_setValue(varName, safeStr);
  99. break;
  100. case 'function':
  101. /*--- Functions need special handling.
  102. */
  103. var safeStr = FunctionMarker + varValue.toString();
  104. GM_setValue(varName, safeStr);
  105. break;
  106.  
  107. default:
  108. ReportError('Unknown type in GM_SuperValue.set()!');
  109. break;
  110. }
  111. };//-- End of set()
  112.  
  113. this.getOrAdd = function (varName, defaultValue) {
  114.  
  115. if (!varName) {
  116. ReportError('Illegal varName sent to GM_SuperValue.get().');
  117. return;
  118. }
  119. if (/[^\w _-]/.test(varName)) {
  120. ReportError('Suspect, probably illegal, varName sent to GM_SuperValue.get().');
  121. }
  122. var versionKey = versionkeybasic + varName;
  123. var savedversion = GM_getValue(versionKey);
  124. if (version != savedversion) { //需判断设置默认-1时
  125. if (typeof GM_deleteValue != "function") {
  126. GM_deleteValue(varName);
  127. GM_deleteValue(versionKey);
  128. }
  129. if (typeof defaultValue == 'function') {
  130. var varvalue = defaultValue();
  131. set(varName, varvalue);
  132. return varvalue;
  133. }
  134. else {
  135. set(varName, varvalue);
  136. return defaultValue;
  137. }
  138. }
  139. var expiredkey = expiredkeybasic + varName;
  140. var expire = GM_getValue(expiredkey);
  141. if (new Date().getTime() - expire > expiredMilliseconds) {
  142. if (typeof GM_deleteValue != "function") {
  143. GM_deleteValue(varName);
  144. GM_deleteValue(expiredkey);
  145. }
  146. }
  147. //--- Attempt to get the value from storage.
  148. var varValue = GM_getValue(varName);
  149. if (!varValue)
  150. return defaultValue;
  151.  
  152. //--- We got a value from storage. Now unencode it, if necessary.
  153. if (typeof varValue == "string") {
  154. //--- Is it a JSON value?
  155. var regxp = new RegExp('^' + JSON_MarkerStr + '(.+)$');
  156. var m = varValue.match(regxp);
  157. if (m && m.length > 1) {
  158. varValue = JSON.parse(m[1]);
  159. return varValue;
  160. }
  161.  
  162. //--- Is it a function?
  163. var regxp = new RegExp('^' + FunctionMarker + '((?:.|\n|\r)+)$');
  164. var m = varValue.match(regxp);
  165. if (m && m.length > 1) {
  166. varValue = eval('(' + m[1] + ')');
  167. return varValue;
  168. }
  169. }
  170.  
  171. return varValue;
  172. };//-- End of get()
  173.  
  174. this.del = function (varname) {
  175. if (typeof GM_deleteValue != "function")
  176. ReportError('Using del function requires Greasemonkey and grant rights for it! GM_deleteValue is missing.');
  177. GM_deleteValue(varName);
  178. };
  179. this.delStartsWith = function (varname) {
  180. if (typeof GM_deleteValue != "function")
  181. ReportError('Using delStartsWith function requires Greasemonkey and grant rights for it! GM_deleteValue is missing.');
  182. if (typeof GM_listValues != "function")
  183. ReportError('Using delStartsWith function requires Greasemonkey and grant rights for it! GM_listValues is missing.');
  184. for (var item in GM_listValues()) {
  185. if (item.startsWith(varname)) {
  186. GM_deleteValue(item);
  187. }
  188. }
  189. };
  190. }
  191. })();

QingJ © 2025

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