Skin Storage Script

a script to easily store as many skins as you want

  1. // ==UserScript==
  2. // @name Skin Storage Script
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.54
  5. // @description a script to easily store as many skins as you want
  6. // @author Oki
  7. // @match https://*.jstris.jezevec10.com/*
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11. /**************************
  12. Skin Storage Script
  13. **************************/
  14. (function() {
  15.  
  16. window.addEventListener('load', function(){
  17.  
  18. localStorage.customSkins = localStorage.customSkins || "";
  19. localStorage.activeSkins = localStorage.activeSkins || "";
  20. localStorage.randomizeKey = localStorage.randomizeKey || 'F4'
  21.  
  22. if(typeof trim != "function"){var trim=a=>{a=a.slice(0,-1);a=a.substr(a.indexOf("{")+1);return a}}
  23. if(typeof getParams != "function"){var getParams=a=>{var params=a.slice(a.indexOf("(")+1);params=params.substr(0,params.indexOf(")")).split(",");return params}}
  24.  
  25.  
  26. document.getElementsByName("bSkin").forEach((radioButton, i)=>{
  27. i>2&&(radioButton.type = "checkbox")
  28. })
  29.  
  30. var randomizeOption = document.createElement("tr");
  31. randomizeOption.innerHTML = '<td>Randomize skin:</td><td><input maxlength="1" id="input421" type="text" size="7" value="'+localStorage.randomizeKey+'"></td><td id="kc421">0</td>'
  32. tab_controls.children[2].appendChild(randomizeOption);
  33.  
  34.  
  35. var randomizeListener = `"input421\"==e.target.id?(e.preventDefault(),input421.value=e.key,kc421.innerHTML=e.keyCode,localStorage.randomizeKey=e.key):e.key==localStorage.randomizeKey&&Game['deployRandomSkin']();\n`
  36.  
  37. if(window.onkeyup == null) {
  38. window.onkeyup = function(e){}
  39. }
  40.  
  41. var keyupFunc = window.onkeyup.toString()
  42.  
  43. if(!keyupFunc.endsWith(randomizeListener)){
  44. keyupParams = getParams(keyupFunc)
  45. keyupFunc = trim(keyupFunc) + randomizeListener
  46. window.onkeyup = new Function(...keyupParams, keyupFunc)
  47. }
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54. var plusButton=document.createElement("div");
  55. plusButton.style = "width:20px;height:20px;background-color:green;text-align:center;font-weight:1000";
  56. plusButton.innerHTML = "+";
  57. plusButton.id = "plusButton";
  58.  
  59.  
  60. var modalStyles=document.createElement("style");
  61. modalStyles.innerHTML='#skinModal {display: none;position: fixed;z-index: 100;padding-top: 200px;left: 0;top: 0;width: 100%;height: 100%;background-color: rgba(0,0,0,0.4)} #modalContent {color:black;background-color: white;margin: auto;padding: 20px;border: 1px solid #888;width: 60%} .xbutton {width:20px;height:20px;background-size:cover;margin-bottom:4px;margin-left:20px;filter: invert(100%)}';
  62. document.body.appendChild(modalStyles);
  63.  
  64. var modal=document.createElement("div");
  65. modal.id = "skinModal";
  66. modal.innerHTML = '<div id="modalContent"><p>Please enter the new skin url. For animated skins, use this format: url1;size1 url2;size2 ...</p><input id="modalInput" style="border:2px solid black;z-index: 1000" type="text" value="https://i.imgur.com/u4SJJgE.png"><br><br><button id="modalClose" style="float:left down">Cancel</button><button id="modalConfirm" style="float:left down">OK</button></div></div>'
  67. app.appendChild(modal);
  68.  
  69.  
  70. var skinModalText = "";
  71.  
  72. modalConfirm.onclick = J=>{
  73. addSkin(1)
  74. }
  75.  
  76. modalClose.onclick = N=>{
  77. addSkin(0)
  78. }
  79.  
  80. function addSkin(flag) {
  81. skinModal.style.display = "none";
  82. skinModalText = modalInput.value
  83. if(skinModalText == ""){flag = 0}
  84. modalInput.value = "";
  85.  
  86. if(!flag){
  87. return;
  88. }
  89.  
  90. var skinNumber = localStorage.customSkins.split(",").length-1;
  91. localStorage.customSkins += ","+skinModalText;
  92. refreshSkins()
  93.  
  94. }
  95.  
  96. plusButton.onclick = X=>{
  97. skinModal.style.display = "block";
  98. }
  99.  
  100. document.getElementsByName("blockSkin")[0].appendChild(plusButton);
  101.  
  102.  
  103. function refreshSkins() {
  104. stopPreviewAnimation();
  105. var oldContainer = document.getElementById("allSkinContainer");
  106. oldContainer.parentNode.removeChild(oldContainer);
  107. addSkins();
  108. startPreviewAnimation();
  109. }
  110.  
  111.  
  112. function addSkins() {
  113. var skins = localStorage.customSkins.split(",")
  114. var allSkinContainer = document.createElement("div")
  115. allSkinContainer.id = "allSkinContainer"
  116.  
  117. skins.map((skin,i)=>{
  118. if(i>0) {
  119. var src = skin.split(";")[0];
  120. allSkinContainer.innerHTML += `<div><input id="bskin`+i+`" type="checkbox" name="bSkin"><label for="bskin`+i+`"><img src="`+src+`" height="20"></label><img src="https://jstris.jezevec10.com/res/svg/dark/rubbish.svg" name="xbutton" class="xbutton" ></div>`
  121. var xbutton = document.getElementById("xbutton")
  122. }
  123. })
  124.  
  125. document.getElementsByName("blockSkin")[0].insertBefore(allSkinContainer,plusButton)
  126. document.getElementsByName("xbutton").forEach((button, i)=>{
  127. button.addEventListener("click", W=>{var temp=localStorage.customSkins.split(',');temp.splice(i+1, 1);localStorage.customSkins=temp;refreshSkins()});
  128. })
  129.  
  130. }
  131.  
  132.  
  133.  
  134. function testCors(url) {
  135. /*
  136. var skinImg = new Image();
  137. skinImg.onload = function(){
  138. loadSkin(this.src,this.height)
  139. };
  140. */
  141. var myRequest = new XMLHttpRequest();
  142. myRequest.open('GET', url, true);
  143. myRequest.onreadystatechange = () => {
  144. if (myRequest.readyState !== 4) {
  145. return
  146. //skinImg.src = url
  147. }
  148. if (myRequest.status != 200) {
  149. var myImage = document.createElement('img');
  150. //myImage.onerror=x=>{skinImg.src = "https://s.jezevec10.com/res/b1.png";}
  151. myImage.onload=a=>{loadSkin("https://s.jezevec10.com/res/b1.png",32)/*loadSkin("https://cors-anywhere.herokuapp.com/" + myImage.src, myImage.height);*/}
  152. myImage.src = url;
  153. } else {
  154. var myImage = document.createElement('img');
  155. myImage.onload=a=>{loadSkin(myImage.src, myImage.height);}
  156. myImage.src = url
  157. }
  158. };
  159. myRequest.send();
  160. }
  161.  
  162.  
  163.  
  164. function loadSkinNoSize(src) {
  165. var spliced = src.split(";")
  166. console.log(src)
  167. if(spliced.length>1){
  168. Game['animatedSkin'] = src.split(" ").map(x=>x.split(";"))
  169. }
  170.  
  171. if(spliced[0].endsWith(".mp4") || spliced[0].endsWith(".webm") || spliced[0].endsWith(".gif")){
  172. loadVideoSkin(spliced[0])
  173. } else {
  174. testCors(spliced[0])
  175. }
  176.  
  177. }
  178.  
  179.  
  180.  
  181. Game['deployRandomSkin'] = function() {
  182. if (typeof Game['stopAnim'] == 'function') {
  183. Game['stopAnim']();
  184. Game['animatedSkin'] = []
  185. }
  186.  
  187. var candidates = localStorage.activeSkins.split(",").slice(1);
  188. var choice = candidates[Math.floor(Math.random()*candidates.length)];
  189. console.log(choice)
  190. var numberOfDefaultSkins = document.getElementsByName("bSkin").length - localStorage.customSkins.split(",").length
  191. if(choice > numberOfDefaultSkins-1) {
  192. frames = localStorage.customSkins.split(",")[choice-numberOfDefaultSkins].split(" ")
  193.  
  194. if(frames.length>1){
  195. Game['animatedSkin'] = frames.map(x=>x.split(";"))
  196. Game['animationRunning']&&Game['startAnim']();
  197. }
  198. }
  199.  
  200. loadSkinNoSize(document.getElementsByName("bSkin")[choice].nextSibling.children[0].src)
  201. }
  202.  
  203.  
  204. settingsSave.onmouseup = Y=>{
  205.  
  206. try{
  207. stopPreviewAnimation();
  208.  
  209. localStorage.activeSkins = ""
  210. document.getElementsByName("bSkin").forEach((e,i)=>{
  211. if(i>2 && e.checked){
  212. localStorage.activeSkins += ","+i;
  213. }
  214. })
  215. Game['deployRandomSkin']()
  216. } catch(e) {
  217. console.log("_")
  218. }
  219.  
  220. }
  221.  
  222.  
  223.  
  224.  
  225.  
  226.  
  227.  
  228.  
  229. var randomizeStart = Game['prototype']['readyGo'].toString()
  230. randomizeStart = trim(randomizeStart) + ";setTimeout(x=>{Game['deployRandomSkin']()}, "+0+");"
  231. Game['prototype']['readyGo'] = new Function(randomizeStart);
  232.  
  233.  
  234.  
  235.  
  236.  
  237. settings.onmouseup = Z=>{
  238. startPreviewAnimation();
  239.  
  240. setTimeout(U=>{
  241. for(var checkbox of document.getElementsByName("bSkin")) {
  242. checkbox.checked = false;
  243. }
  244. var skins = localStorage.activeSkins.split(",");
  245. if(skins.length > 0) {
  246. for (var i = 1; i < skins.length; i++) {
  247. document.getElementsByName("bSkin")[skins[i]].checked = true
  248. }
  249. } else {
  250. document.getElementsByName("bSkin")[3].checked = true
  251. }
  252.  
  253. }, 100)
  254. }
  255.  
  256.  
  257. var previewIntervals = []
  258. var previewsAnimated = false;
  259.  
  260. function startPreviewAnimation() {
  261. var skins = localStorage.customSkins.split(",")
  262.  
  263. skins.map((skin,j)=>{
  264. var frames = skin.split(" ").map(x=>x.split(";"))
  265. if(frames.length > 1) {
  266.  
  267. var animLength = frames.length*localStorage.animSpeed
  268. frames.map((x,i)=>{
  269. setTimeout(()=>{previewIntervals.push(setInterval(()=>{
  270. document.getElementById("bskin"+j).nextSibling.children[0].src = frames[i][0]
  271. }, animLength))}, i*(animLength/frames.length))
  272. })
  273. }
  274. })
  275. previewsAnimated = true
  276. }
  277.  
  278. function stopPreviewAnimation() {
  279. for (var i=0; i < previewIntervals.length; i++) {
  280. clearInterval(previewIntervals[i]);
  281. }
  282. }
  283.  
  284. addSkins();
  285. Game['deployRandomSkin']();
  286.  
  287. });
  288. })();