app.js

part of Rulesy's script

此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.gf.qytechs.cn/scripts/31199/204803/appjs.js

  1. var app = {
  2.  
  3. init: function() {
  4.  
  5. log('app.init()');
  6.  
  7. app.addStyle(GM_getResourceText('style.css'), 'style-css');
  8.  
  9. for (var moduleName in modules) {
  10.  
  11. var module = modules[moduleName];
  12. if (window.location.hash.match(new RegExp(module.pages)) && 'false' != localStorage.getItem('modules.' + moduleName + '.enabled')) {
  13. module.init();
  14. }
  15. }
  16.  
  17. },
  18. settings: {
  19.  
  20. init: function() {
  21.  
  22. log('app.settings.init()');
  23.  
  24. // create settings button
  25.  
  26. if ($('#appsettings').length == 0) {
  27.  
  28. var content = $('<div/>').attr('id', 'appsettings').html('<div class="content">Open Settings</div>');
  29.  
  30. $('.infoBar .forumButton').before(content);
  31.  
  32. $('#appsettings').on('click', '.content', function() {
  33. app.settings.openSettings();
  34. });
  35. }
  36.  
  37. },
  38.  
  39. openSettings: function() {
  40.  
  41. log('app.settings.openSettings()');
  42.  
  43. var html = '<table id="gameLayout" class="appsettings guide"><tbody><tr><td class="sidePanel"><div class="block mapBlock"><div class="header"></div><div class="bg">';
  44. html += '<ul id="modules">';
  45. html += '<li class="main">Modules</li>';
  46.  
  47. for (var module in modules) {
  48.  
  49. html += '<li class="sub ';
  50. html += localStorage.getItem('modules.' + module + '.enabled') == 'false' ? 'disabled' : 'enabled';
  51. html += '" data-module-id="' + module + '">';
  52. html += '<img height="16" width="16" alt="' + modules[module].name + '" src="' + modules[module].icon + '"> <span>' + modules[module].name + '</span><span class="tick"></li>';
  53. }
  54.  
  55. html += ' </ul>\
  56. </div> \
  57. <div class="footer"></div> \
  58. </div> \
  59. </td> \
  60. <td class="contentPanel"> \
  61. <div class="block contentBlock"> \
  62. <div class="header"></div> \
  63. <div class="bg"> \
  64. <div id="generic_section"></div> \
  65. </div> \
  66. <div class="footer"></div> \
  67. <div class="clear"></div> \
  68. </div> \
  69. </td> \
  70. </tr> \
  71. </tbody> \
  72. </table>';
  73.  
  74. if ($('#gameLayout').hasClass('appsettings')) {
  75. $('#gameLayout').replaceWith($(html));
  76. } else {
  77. var currentLayout = $('#gameBodyLight > :last-child');
  78. var id = currentLayout.attr('id');
  79. currentLayout.attr('data-old-id', id).attr('id', 'settings-hidden').hide();
  80.  
  81. $('#gameBodyLight').append(html);
  82.  
  83. $('#appsettings .content').html('Close Settings');
  84. }
  85.  
  86. var moduleToOpen = localStorage.getItem('app.settings.lastOpened') || $('#modules li.sub:first').attr('data-module-id');
  87. $('#modules li.sub[data-module-id="' + moduleToOpen + '"]').addClass('active');
  88.  
  89. app.settings.moduleSettings(moduleToOpen);
  90.  
  91. $('#gameLayout').off().on('click', 'li.sub', function() {
  92. var moduleName = $(this).attr('data-module-id');
  93. app.settings.moduleSettings(moduleName);
  94. })
  95.  
  96. $('#appsettings').off().on('click', '.content', function() {
  97. app.settings.closeSettings();
  98. })
  99.  
  100. },
  101.  
  102. moduleSettings: function(moduleName) {
  103.  
  104. log('app.settings.moduleSettings(' + moduleName + ')');
  105.  
  106. moduleName = moduleName || localStorage.getItem('app.settings.lastOpened');
  107.  
  108. if (!moduleName || !modules[moduleName]) {
  109. moduleName = $('#modules li.sub:first').attr('data-module-id');
  110. }
  111.  
  112. localStorage.setItem('app.settings.lastOpened', moduleName);
  113.  
  114. var module = modules[moduleName];
  115.  
  116. $('.appsettings .active').removeClass('active');
  117. $('#modules li[data-module-id="' + moduleName + '"]').addClass('active');
  118.  
  119. var html = '<h1>' + module.name + '<span>' +
  120. '<label for="modules-' + moduleName + '-enabled">Module Enabled:</label>' +
  121. '<input type="checkbox" id="modules-' + moduleName + '-enabled" class="modules-settings-enabled" data-module-id="' + moduleName + '" value="1" ' +
  122. (localStorage.getItem('modules.' + moduleName + '.enabled') == 'false' ? '' : 'checked="checked"') +
  123. '></span></h1>';
  124.  
  125. if (module.description) {
  126. html += '<p class="description">' + module.description + '</p>';
  127. }
  128.  
  129. if (undefined !== module.config) {
  130. html += module.config();
  131. } else {
  132. html += '<p>This module has no configuration options.</p>';
  133. }
  134.  
  135. $('#gameLayout #generic_section').html(html);
  136.  
  137. if (undefined !== module.configInit) {
  138. module.configInit();
  139. }
  140.  
  141. $('#gameLayout #generic_section').off('change', '.modules-settings-enabled');
  142.  
  143. $('#gameLayout #generic_section').on('change', '.modules-settings-enabled', function() {
  144.  
  145. var moduleName = $(this).attr('data-module-id');
  146.  
  147. $('li[data-module-id="' + moduleName + '"]').toggleClass('enabled disabled');
  148.  
  149. localStorage.setItem('modules.' + moduleName + '.enabled', $(this).is(':checked') ? 'true' : 'false');
  150. })
  151.  
  152. },
  153.  
  154. closeSettings: function() {
  155.  
  156. log('app.settings.closeSettings()');
  157.  
  158. $('#gameLayout').remove();
  159.  
  160. var currentLayout = $('#gameBodyLight > :last-child');
  161. currentLayout.attr('id', currentLayout.attr('data-old-id')).show();
  162.  
  163. $('#appsettings').off().on('click', '.content', function() {
  164. app.settings.openSettings();
  165. })
  166.  
  167. $('#appsettings .content').html('Open Settings');
  168.  
  169. app.init();
  170.  
  171. },
  172.  
  173. checkbox: function(id, label, defaultCheckedStatus, onChange) {
  174.  
  175. var storageKey = id;
  176. var elementId = id.replace(/\./g, '_');
  177.  
  178. var moduleHtml = '';
  179. var checked = localStorage.getItem(storageKey) ? (localStorage.getItem(storageKey) == 'true') : (defaultCheckedStatus == 'true');
  180.  
  181. moduleHtml += '<input type="checkbox" id="' + elementId + '" value="1" data-storage-key="' + storageKey + '"' + ((checked == true) ? ' checked="checked"' : '') + ' >';
  182. moduleHtml += '<label for="' + elementId + '">' + label + '</label>';
  183.  
  184. if (onChange) {
  185. $('#gameLayout #generic_section').on('change', '#' + elementId, onChange);
  186. } else {
  187. $('#gameLayout #generic_section').on('change', '#' + elementId, function(e) {
  188. var target = $(e.target);
  189. localStorage.setItem(target.attr('data-storage-key'), target.is(':checked') ? 'true' : 'false');
  190. });
  191. }
  192.  
  193. return moduleHtml;
  194. },
  195.  
  196. select: function(id, selected, indexes, values) {
  197.  
  198. if (!selected) {
  199. selected = indexes[0];
  200. }
  201.  
  202. if (!values) {
  203. values = indexes;
  204. }
  205.  
  206. var content = '<select id="' + id + '">';
  207.  
  208. for (var i in indexes) {
  209. var index = indexes[i];
  210. var value = values[i];
  211. content += '<option value="' + index + '"';
  212. if (selected == index) {
  213. content += ' selected="selected"';
  214. }
  215. content += '>' + value + '</option>';
  216. }
  217.  
  218. content += '</select>';
  219.  
  220. return content;
  221.  
  222. }
  223.  
  224. },
  225.  
  226. addStyle: function(css, className, replace) {
  227.  
  228. log('app.addStyle(css, ' + className + ')');
  229.  
  230. var sheet;
  231.  
  232. if (true !== replace) {
  233. replace = false;
  234. }
  235.  
  236. sheet = $('.' + className);
  237.  
  238. if (sheet.length > 0) {
  239. if (replace) {
  240. sheet.remove();
  241. } else {
  242. return;
  243. }
  244. }
  245.  
  246. var style = document.createElement('style');
  247. style.className = className;
  248. style.type = 'text/css';
  249. style.innerHTML = css;
  250. $('head').append(style);
  251. }
  252. }

QingJ © 2025

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