index.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. /*const wiki = document.getElementById('wb-settings-wiki');
  2. if ( wiki ) wiki.addEventListener( 'input', function (event) {
  3. if ( wiki.validity.valid ) {
  4. wiki.setCustomValidity('I am expecting an e-mail address!');
  5. }
  6. else {
  7. wiki.setCustomValidity();
  8. }
  9. } );
  10. const prefix = document.getElementById('wb-settings-prefix');
  11. if ( prefix ) prefix.addEventListener( 'input', function (event) {
  12. if ( prefix.validity.patternMismatch ) {
  13. prefix.setCustomValidity('The prefix may not include spaces or code markdown!');
  14. }
  15. else {
  16. prefix.setCustomValidity();
  17. }
  18. } );
  19. const form = document.getElementById('wb-settings');
  20. if ( form ) form.addEventListener( 'submit', function (event) {
  21. if ( prefix && prefix.validity.patternMismatch ) {
  22. prefix.setCustomValidity('The prefix may not include spaces or code markdown!');
  23. event.preventDefault();
  24. }
  25. else if ( wiki && wiki.validity.valid ) {
  26. wiki.value
  27. fetch()
  28. got.get( wikinew + 'api.php?&action=query&meta=siteinfo&siprop=general&format=json' ).then( response => {
  29. if ( !isForced && response.statusCode === 404 && typeof response.body === 'string' ) {
  30. let api = cheerio.load(response.body)('head link[rel="EditURI"]').prop('href');
  31. if ( api ) {
  32. wikinew = new Wiki(api.split('api.php?')[0], wikinew);
  33. return got.get( wikinew + 'api.php?action=query&meta=siteinfo&siprop=generals&format=json' );
  34. }
  35. }
  36. return response;
  37. } ).then( response => {
  38. var body = response.body;
  39. if ( response.statusCode !== 200 || !body?.query?.allmessages || !body?.query?.general || !body?.query?.extensions ) {
  40. console.log( '- ' + response.statusCode + ': Error while testing the wiki: ' + body?.error?.info );
  41. if ( reaction ) reaction.removeEmoji();
  42. msg.reactEmoji('nowiki', true);
  43. return msg.replyMsg( lang.get('settings.wikiinvalid') + wikihelp, {}, true );
  44. }
  45. if ( !isForced ) wikinew.updateWiki(body.query.general);
  46. if ( wikinew.isGamepedia() && !isForced ) {
  47. let site = allSites.find( site => site.wiki_domain === wikinew.hostname );
  48. if ( site ) wikinew = new Wiki('https://' + ( site.wiki_crossover || site.wiki_domain ) + '/');
  49. }
  50. else if ( wikinew.isFandom() && !isForced ) {
  51. let crossover = '';
  52. if ( body.query.allmessages[0]['*'] ) {
  53. crossover = 'https://' + body.query.allmessages[0]['*'] + '.gamepedia.com/';
  54. }
  55. else if ( body.query.allmessages[1]['*'] ) {
  56. let merge = body.query.allmessages[1]['*'].split('/');
  57. crossover = 'https://' + merge[0] + '.fandom.com/' + ( merge[1] ? merge[1] + '/' : '' );
  58. }
  59. if ( crossover ) wikinew = new Wiki(crossover);
  60. }
  61. }, ferror => {
  62. console.log( '- Error while testing the wiki: ' + ferror );
  63. if ( reaction ) reaction.removeEmoji();
  64. msg.reactEmoji('nowiki', true);
  65. return msg.replyMsg( lang.get('settings.wikiinvalid') + wikihelp, {}, true );
  66. } );
  67. }
  68. else form.dispatchEvent(new Event('submit'));
  69. } );
  70. var collapsible = document.getElementsByClassName('collapsible');
  71. for ( var i = 0; i < collapsible.length; i++ ) {
  72. collapsible[i].onclick = function() {
  73. this.classList.toggle('active');
  74. if ( this.id === 'wb-settings-wiki-search' ) {
  75. wiki.toggleAttribute('readonly');
  76. }
  77. var content = this.nextElementSibling;
  78. if ( content.style.display === 'block' ) {
  79. content.style.display = 'none';
  80. }
  81. else {
  82. content.style.display = 'block';
  83. }
  84. }
  85. }
  86. */
  87. var baseSelect = document.getElementsByTagName('select');
  88. for ( var b = 0; b < baseSelect.length; b++ ) {
  89. if ( baseSelect[b].parentNode.querySelector('button.addmore') ) {
  90. baseSelect[b].addEventListener( 'input', toggleOption );
  91. toggleOption.call(baseSelect[b]);
  92. }
  93. }
  94. var addmore = document.getElementsByClassName('addmore');
  95. for ( var j = 0; j < addmore.length; j++ ) {
  96. addmore[j].onclick = function() {
  97. var clone = this.previousElementSibling.cloneNode(true);
  98. clone.classList.add('wb-settings-additional-select');
  99. clone.removeAttribute('id');
  100. clone.removeAttribute('required');
  101. clone.childNodes.forEach( function(child) {
  102. child.removeAttribute('hidden');
  103. child.removeAttribute('selected');
  104. } );
  105. clone.querySelector('option.defaultSelect').setAttribute('selected', '');
  106. clone.addEventListener( 'input', toggleOption );
  107. this.before(clone);
  108. toggleOption.call(clone);
  109. }
  110. }
  111. /**
  112. * @this HTMLSelectElement
  113. */
  114. function toggleOption() {
  115. var options = [];
  116. var selected = [];
  117. var allSelect = this.parentNode.querySelectorAll('select');
  118. allSelect.forEach( function(select) {
  119. options.push(...select.options);
  120. selected.push(...select.selectedOptions);
  121. } );
  122. var button = this.parentNode.querySelector('button.addmore');
  123. if ( selected.some( function(option) {
  124. if ( option && option.value ) return false;
  125. else return true;
  126. } ) || allSelect.length >= 10 || allSelect.length >= this.options.length-1 ) {
  127. button.setAttribute('hidden', '');
  128. }
  129. else button.removeAttribute('hidden');
  130. selected = selected.filter( function(option) {
  131. if ( option && option.value ) return true;
  132. else return false;
  133. } ).map( function(option) {
  134. return option.value;
  135. } );
  136. options.forEach( function(option) {
  137. if ( selected.includes(option.value) && !option.selected ) {
  138. option.setAttribute('disabled', '');
  139. }
  140. else if ( option.disabled ) option.removeAttribute('disabled');
  141. } );
  142. }
  143. const wiki = document.getElementById('wb-settings-wiki');
  144. if ( wiki ) {
  145. const feeds = document.getElementById('wb-settings-feeds');
  146. if ( feeds ) {
  147. const hidefeeds = document.getElementById('wb-settings-feeds-hide');
  148. const feedsonly = document.getElementById('wb-settings-feeds-only');
  149. const hidefeedsonly = document.getElementById('wb-settings-feeds-only-hide');
  150. feeds.addEventListener( 'change', function() {
  151. if ( this.checked ) {
  152. hidefeedsonly.removeAttribute('style');
  153. if ( !hidefeeds.hasAttribute('style') ) feedsonly.removeAttribute('disabled');
  154. }
  155. else {
  156. hidefeedsonly.setAttribute('style', 'visibility: hidden;');
  157. feedsonly.setAttribute('disabled', '');
  158. }
  159. } );
  160. wiki.addEventListener( 'input', function() {
  161. if ( this.validity.valid && /\.(?:fandom\.com|wikia\.org)$/.test(new URL(this.value).hostname) ) {
  162. hidefeeds.removeAttribute('style');
  163. feeds.removeAttribute('disabled');
  164. if ( !hidefeedsonly.hasAttribute('style') ) feedsonly.removeAttribute('disabled');
  165. }
  166. else {
  167. hidefeeds.setAttribute('style', 'visibility: hidden;');
  168. feeds.setAttribute('disabled', '');
  169. feedsonly.setAttribute('disabled', '');
  170. }
  171. } );
  172. }
  173. }