🏠 Home 

Mordern Background Image injector

Discord background Image injector


Install this script?
  1. // ==UserScript==
  2. // @name Mordern Background Image injector
  3. // @namespace Mordern
  4. // @version Mordern.1
  5. // @description Discord background Image injector
  6. // @author You
  7. // @match https://discord.com/channels/*
  8. // @match https://discord.com/channels/*/*
  9. // @icon https://cdn.discordapp.com/avatars/834842435204284527/8ab16792caaa54dd6ff2a3e9de7a57b0.png?size=4096
  10. // @grant GM.xmlHttpRequest
  11. // @grant GM.registerMenuCommand
  12. // @grant GM.getValue
  13. // @grant GM.setValue
  14. // @grant GM.addElement
  15. // @connect i.imgur.com
  16. // ==/UserScript==
  17. (async window => {
  18. 'use strict';
  19. let intervalTime = 30 * 1000;
  20. let urls = [
  21. 'https://i.imgur.com/MMJhM6R.jpeg',
  22. 'https://i.imgur.com/6Y0waqQ.png',
  23. 'https://i.imgur.com/SGbjs36.png',
  24. 'https://i.imgur.com/87njjbP.jpeg',
  25. 'https://i.imgur.com/y5tyz7v.jpeg',
  26. 'https://i.imgur.com/7vEByIE.png',
  27. 'https://i.imgur.com/N8FAHgN.jpeg',
  28. 'https://i.imgur.com/CTAgXGz.jpeg',
  29. 'https://i.imgur.com/ax6pZjY.jpeg',
  30. 'https://i.imgur.com/GQWtuEg.jpeg',
  31. 'https://i.imgur.com/wTYqtSV.jpeg',
  32. 'https://i.imgur.com/tWx7OqJ.jpeg',
  33. 'https://i.imgur.com/EgkJFvo.jpeg',
  34. 'https://i.imgur.com/dHqTbO4.jpeg',
  35. ];
  36. let g_elm = null;
  37. const del = () => {
  38. if(g_elm) {
  39. g_elm.remove();
  40. g_elm = null;
  41. return true;
  42. }
  43. else return false;
  44. };
  45. const addInput = async value => {
  46. if(del()) return;
  47. g_elm = await GM.addElement(document.body, 'div', {});
  48. Object.assign(g_elm.style, {
  49. 'position': 'fixed',
  50. 'width': '50vw',
  51. 'height': '30vh',
  52. 'display': 'flex',
  53. 'flex-wrap': 'wrap',
  54. 'justify-content': 'center',
  55. 'align-items': 'center',
  56. 'z-index': Infinity
  57. });
  58. const input = await GM.addElement(g_elm, 'textarea', {
  59. textContent: value
  60. });
  61. Object.assign(input.style, {
  62. 'width': '10vw',
  63. 'height': '30vh',
  64. 'font-size': '30px',
  65. 'font-weight': 'bold'
  66. });
  67. const btnSave = await GM.addElement(g_elm, 'button', {
  68. textContent: 'save'
  69. });
  70. await GM.addElement(g_elm, 'div', {
  71. textContent: ' '
  72. });
  73. const btnCancel = await GM.addElement(g_elm, 'button', {
  74. textContent: 'cancel'
  75. });
  76. for(const v of [btnSave, btnCancel]) Object.assign(v.style, {
  77. 'color': 'white',
  78. 'backgroundColor': 'red'
  79. });
  80. return new Promise((resolve, reject) => {
  81. btnSave.addEventListener('click', () => del() && resolve(input.value));
  82. btnCancel.addEventListener('click', () => del() && reject());
  83. });
  84. };
  85. const key1 = 'intervalTime';
  86. GM.registerMenuCommand('config interval time', async () => {
  87. const res = await addInput(await GM.getValue(key1, intervalTime));
  88. if(!res) return;
  89. const m = res.match(/[0-9]+/);
  90. if(!m) return;
  91. const n = Number(m[0]);
  92. intervalTime = n;
  93. GM.setValue(key1, n);
  94. });
  95. intervalTime = await GM.getValue(key1, intervalTime);
  96. const key2 = 'URL';
  97. GM.registerMenuCommand('config URL', async () => {
  98. const res = await addInput(await GM.getValue(key2, urls.join('\n')));
  99. if(!res) return;
  100. const a = findURL(res);
  101. if(!a.length) return;
  102. urls = a;
  103. GM.setValue(key2, a.join('\n'));
  104. });
  105. urls = (await GM.getValue(key2, urls.join('\n'))).split('\n');
  106. const findURL = str => {
  107. };
  108. const memo = new Map;
  109. const get = async url => {
  110. if(memo.has(url)) return memo.get(url);
  111. const res = await GM.xmlHttpRequest({
  112. method: 'GET',
  113. url: url,
  114. withCredentials: true,
  115. responseType: 'arraybuffer',
  116. });
  117. const _url = URL.createObjectURL(new Blob([res.response], {type: 'application/octet-binary'}));
  118. memo.set(url, _url);
  119. return _url;
  120. };
  121. let g_url = await get(urls[0]);
  122. const wait = resolve => {
  123. if(document.querySelector('[class^="chatContent"]')) return resolve();
  124. setTimeout(() => wait(resolve), 500);
  125. };
  126. await new Promise(resolve => wait(resolve));
  127. const setURL = () => {
  128. Object.assign(document.body.children[0].style, {
  129. 'background-image': 'url("' + g_url + '")',
  130. 'background-attachment': 'fixed',
  131. 'background-position': 'center center',
  132. 'background-size': 'cover',
  133. 'background-repeat': 'no-repeat',
  134. 'transition-duration': '1.5s'
  135. });
  136. };
  137. setURL();
  138. const setOther = () => {
  139. for(const v of document.querySelectorAll('*')) v.style.backgroundColor = 'rgba(0, 0, 0, 0)';
  140. document.body.children[0].children[3].style.backgroundColor = 'rgba(0, 0, 0, 0.7)';
  141. };
  142. setOther();
  143. let _url = location.href,
  144. _time = 0,
  145. index = 0;
  146. const update = async () => {
  147. const time = performance.now();
  148. if(time - _time > intervalTime) {
  149. g_url = await get(urls[(++index) % urls.length]);
  150. _time = performance.now();
  151. setURL();
  152. }
  153. else {
  154. const url = location.href;
  155. if(url !== _url) {
  156. _url = url;
  157. setOther();
  158. }
  159. }
  160. requestAnimationFrame(update);
  161. };
  162. update();
  163. })(window.unsafeWindow || window);