Downloadable Flash Games | NewGrounds.com | ArmorGames.com | Kongregate.com and more!

creates download button for flash games websites. (If game isn't flash game or game file doesn't found, then downloading will not work)

  1. // ==UserScript==
  2. // @name Downloadable Flash Games | NewGrounds.com | ArmorGames.com | Kongregate.com and more!
  3. // @namespace -
  4. // @version 1.3.0
  5. // @description creates download button for flash games websites. (If game isn't flash game or game file doesn't found, then downloading will not work)
  6. // @author NotYou
  7. // @match *://www.newgrounds.com/portal/view/*
  8. // @match *://armorgames.com/play/*
  9. // @match *://*.y8.com/games/*
  10. // @match *://www.kongregate.com/games/*/*
  11. // @match *://www.silvergames.com/*/*
  12. // @match *://www.nitrome.com/games/*
  13. // @match *://www.miniplay.com/game/*
  14. // @match *://frivez.com/*
  15. // @match *://www.twoplayergames.org/game/*
  16. // @run-at document-end
  17. // @license GPL-3.0-or-later
  18. // @icon data:image/jpg;base64,/9j/4AAQSkZJRgABAQEAAAAAAAD/4QBCRXhpZgAATU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAkAAAAMAAAABAAAAAEABAAEAAAABAAAAAAAAAAAAAP/bAEMACwkJBwkJBwkJCQkLCQkJCQkJCwkLCwwLCwsMDRAMEQ4NDgwSGRIlGh0lHRkfHCkpFiU3NTYaKjI+LSkwGTshE//bAEMBBwgICwkLFQsLFSwdGR0sLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLP/AABEIAdoB2gMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/AMu6ZvtEvP8Ac7D+4Kh3P6/oKlu/+PiX/gH/AKAKgrwnuftUPhQ7c/r+go3P6/oKbRSLHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FP3P6/oKip9A0SXf/HxL/wD/wBAFQVPd/8AHxL/AMA/9AFQU3uZw+FBRRRSLCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACn0yn0DRJd/8fEv/AP/AEAVBU93/wAfEv8AwD/0AVBTe5nD4UFFFFIsKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKfTKfQNEl3/x8S/8A/8AQBUFT3f/AB8S/wDAP/QBUFN7mcPhQUUUUiwooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAp9Mp9A0SXf/HxL/wD/wBAFQVPd/8AHxL/AMA/9AFQU3uZw+FBRRRSLCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo+v600yRL96RB9WFMmUlH4nYdRURubUdZk/A5pv2u0/56r+tPll2MHiqC3mvvRPRRRUnQFFFFAwooooAKKKKACiiigAooooAKfTKfQNEl3/x8S/8A/8AQBUFT3f/AB8S/wDAP/QBUFN7mcPhQUUUUiwooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKgmuoIeCdz/wB1eT+JppN6Iyq1oUY89R2RPUck8EX35FB9Op/IVly3txLkA7F9F6/iarV0RofzHzeJ4gjHShG/m/8AL/hjSfUlGRHGT7ucD8hVZ727fo4UeiDH61WordU4roeDWzTFVt5temn5Dmklb7zufqxptFFWefKTk7ydwoHUfUfzooHUfUfzpiW50I6L9B/KigdF+g/lRXln6utgooooGFFFFABRRRQAUUUUAFFFFABT6ZT6Boku/wDj4l/4B/6AKgqe7/4+Jf8AgH/oAqCm9zOHwoKKKKRYUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUjukalnYKo7mo5544F3Ock/dUdWNZE08s7bnPH8KjotbU6bnr0PHzDNKeDXKtZ9u3qWLi+kkysWUTuf4jVKiiuyMVFWR8PiMTVxMueq7hRRRVHOFFFFABRRRQAUDqPqP50UDqPqP50AtzoR0X6D+VFA6L9B/KivLP1dbBRRRQMKKKKACiiigAooooAKKKKACn0yn0DRJd/8AHxL/AMA/9AFQVPd/8fEv/AP/AEAVBTe5nD4UFFFFIsKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAqG4uEt0yeXP3F9fc06eZIELt16KO7GsWSR5XZ3OSfyA9BW1OnzavY8PNczWEj7On8b/AA8/8hJJHlYu5yx/IewptFFdux8JKTk3KTu2FFFFMQUUUUAFFFFABRRRQAUDqPqP50UDqPqP50AtzoR0X6D+VFA6L9B/KivLP1dbBRRRQMKKKKACiiigAooooAKKKKACn0yn0DRJd/8AHxL/AMA/9AFQVPd/8fEv/AP/AEAVBTe5nD4UFFFFIsKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACkZlRWdjhVGSaWsu+uPMbykPyIfmx/E3/ANatIQ53Y4MfjI4Ok6j36LzK887zyFzwo4RfQVFRRXelZWR+c1Kkqs3Obu2FFFFMgKKKKACiiigAooooAKKfHFLKcRoWPt0H1NXI9OkP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QAUUUUAFFFFABRRRQAUUUUAFWLL/AI+Yf+BfyNV6sWX/AB8w/wDAv5Gon8LOvA/7zT/xL8zZooorzj9NCiiigAooooAKKKKACiiigAooooAKKKKACiiigAp9Mp9A0SXf/HxL/wAA/wDQBUFT3f8Ax8S/8A/9AFQU3uZw+FBRRRSLCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiioLubyYWIPzv8AKn1Pemld2RlWqxo03UnsjOvZvNmIB+SP5F+vc1Woor0YrlVkfmVetKvUlVluwoooqjEKKKKACiiigAoq/BYpJEkjsylskAY6dql/s2D/AJ6SfpWTqxTsevTyfF1Iqajo/My6K1P7Ng/56SfpR/ZsH/PST9KXtoF/2HjOy+9GXRWp/ZsH/PST9KP7Ng/56SfpR7aAf2HjOy+9GXRWp/ZsH/PST9KP7Ng/56SfpR7aAf2HjOy+9GXViy/4+Yf+BfyNXP7Ng/56SfpT4rKKGRZFdyVzgHGOeKmVWLTR0YXJ8VTrQnJKyae/mWqKKK4z7YKKKKACiiigAooooAKKKKACiiigAooooAKKKKACn0yn0DRJd/8AHxL/AMA/9AFQVPd/8fEv/AP/AEAVBTe5nD4UFFFFIsKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKxbufzpSR9xPlT/Grt/cbE8lT87j5sdl/+vWXXXRh9pnx+e47mf1aD0W/r2Ciiiuk+XCiiigAooooAKkhjMsscY/iPP0HWo60tOiwrzEct8qfQdTWdSXLG53ZfhvrWIjT6bv0L4AAAHQAAfQUUUV55+khRRRQMKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAp9Mp9A0SXf/HxL/wD/wBAFQVPd/8AHxL/AMA/9AFQU3uZw+FBRRRSLCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKjnmWCMu3Xoo9TT3dI1Z3OFUZJrFuJ2ncseFHCL6CtadPnfkeRmeYLB07R+N7f5kbu0jM7HLMcmm0UV3H5+25O73CiiimIKKKKACiiigByI0joi9WIAreRFjREXooAH4VQ06H707D/ZT+prQrjrSu7H2+RYT2VH20t5fl/wf8gooornPoQooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAp9Mp9A0SXf/HxL/wAA/wDQBUFT3f8Ax8S/8A/9AFQU3uZw+FBRRRSLCiiigAooooAKKKKACiiigAooooAKKKKACiiigApHdEUu5AUckmmyzRQruc49B3J9hWRcXMlw3PCD7qjoPc+9a06bn6HlZhmVPBxtvLov8xbm5a4bjIjU/Kvr7mq9FFdySSsj4GtWnXm6lR3bCiiimZBRRRQAUUUUAFOjjaV0jXqxx9B3NNrTsINqmZh8zjCey+v41E5cqud2AwjxddU+nX0LqIsaIi/dUACloorzz9IjFRVlsFFFFIoKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKfTKfQNEl3/x8S/8AAP8A0AVBU93/AMfEv/AP/QBUFN7mcPhQUUUUiwooooAKKKKACiiigAooooAKKKKACimPLDH9+RV+p5/KqsmoxLkRqXPqeF/xq4wlLZHJXxlDDr95NL8/uLtU576OPKxYd/X+EVQluZ5vvthf7q8LUNdEKFtZHzOMz6Uvdw6t5vf5IdJJJKxd2LMfXt9KbRRXRsfMyk5Pmk7sKKKKYgooooAKKKKACiilVWZlVRlmOAPegEm3ZE1rAZ5Qv8C8ufb0raAAAAGABgD2qK3hWCMIPvHlz6mpa4Kk+Zn6FleB+qUfe+J7/wCXyCiiisj1gooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKfTKfQNEl3/wAfEv8AwD/0AVBU93/x8S/8A/8AQBUFN7mcPhQUUUUiwooooAKKKKACiiigAooooAbISI5COCFYj8qwzNOw+aSQ/VjW5L/q5f8Acb+VYFdVBaM+R4hnKMoJPowooorqPlQooooAKKKKACiiigAooooAKKKKACtSytvLAlkHzsPlB/hU1DZWu4iaQfKOUU/xH1Nadctap9lH1uS5ba2Jqr0X6/5feFFFFcp9WFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU+mU+gaJLv8A4+Jf+Af+gCoKnu/+PiX/AIB/6AKgpvczh8KCiiikWFFFFABRRRQAUUUU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
  19. // @grant GM.xmlHttpRequest
  20. // ==/UserScript==
  21.  
  22. (function() {
  23. class NewGrounds {
  24. static init() {
  25. const RE_SWF = /:(\\.*?.swf)/
  26. const SCRIPT = document.querySelector('#outer-skin script[src] + script')
  27. const SWF = SCRIPT.textContent.match(RE_SWF)[1]
  28. const GAME_HEADER = document.querySelector('#embed_header > div span ~ span')
  29.  
  30. if(GAME_HEADER) {
  31. GAME_HEADER.insertAdjacentHTML(
  32. 'afterend',
  33. '<span><a class="icon-download" href="'+ SWF +'" title="Download" rel="nofollow noreferrer">Download</a></span>'
  34. )
  35. }
  36. }
  37. }
  38.  
  39. class ArmorGames {
  40. static init() {
  41. const SWF = document.querySelector('[value*=".swf"]').value
  42. const HEADER = document.querySelector('.game-header h1')
  43. const LINK = document.createElement('a')
  44.  
  45. LINK.href = SWF
  46. LINK.style.cssText = 'position: relative; top: 13px; left: 4px; height: 18px;'
  47. LINK.innerHTML = '<i style="background-image: url(../../images/sprites/sprites.png);background-position: -256px -120px;width: 19px;height: 18px;display: block;"></i>'
  48.  
  49. HEADER.style.display = 'flex'
  50. HEADER.appendChild(LINK)
  51. }
  52. }
  53.  
  54. class Y8 {
  55. static init() {
  56. let swf
  57.  
  58. const ITEM_CONTAINER = document.querySelector('#item-container')
  59.  
  60. if(ITEM_CONTAINER) {
  61. const ASYNC_CONTENT = ITEM_CONTAINER.dataset.asyncContent
  62.  
  63. try {
  64. swf = ASYNC_CONTENT.match(/src=['"](.*?\.swf)\?.*['"]/)[1]
  65. } catch(_) {
  66. swf = document.querySelector('[value*=".swf"]').value
  67. }
  68. }
  69.  
  70.  
  71. const BTN = document.createElement('a')
  72. BTN.rel = 'nofollow noreferrer'
  73. BTN.href = swf
  74. BTN.className = 'button button--light-grey'
  75. BTN.style.marginLeft = '7px'
  76.  
  77. const ICON = document.createElement('img')
  78. ICON.src = 'https://www.svgrepo.com/download/507480/arrow-down-alt.svg' // Icon licensed under "MIT License", author "scarlab"
  79. ICON.style.width = '16px'
  80.  
  81. const TEXT = document.createElement('span')
  82. TEXT.style.marginLeft = '7px'
  83. TEXT.textContent = 'Download'
  84.  
  85. BTN.appendChild(ICON)
  86. BTN.appendChild(TEXT)
  87.  
  88. const BTNS_LIST = document.querySelector('#details .fav-part')
  89. BTNS_LIST.appendChild(BTN)
  90. }
  91. }
  92.  
  93. class Kongregate {
  94. static init() {
  95. const DL = document.createElement('li')
  96. DL.id = 'quicklinks_download_block'
  97. DL.className = 'save lbOn'
  98. DL.innerHTML = '<a href="#!" style="padding: 0;"><i class="kong_ico prs">d</i><span>Download</span></a>'
  99.  
  100. const RE_IFRAME = /iframe_url['"]:['"](.*?)['"]/
  101. const GAME_SCRIPT = document.querySelector('#gameiframe + script')
  102. const FETCH_URL = GAME_SCRIPT.textContent.match(RE_IFRAME)[1]
  103.  
  104. const BTN_TEXT = DL.querySelector('span')
  105. let prevText = ''
  106.  
  107. console.log(FETCH_URL)
  108.  
  109. DL.addEventListener('click', () => {
  110. prevText = BTN_TEXT.textContent
  111. BTN_TEXT.textContent = 'Downloading'
  112. DL.style.pointerEvents = 'none'
  113.  
  114. GM.xmlHttpRequest({
  115. method: 'GET',
  116. url: FETCH_URL,
  117. onload: function(res) {
  118. const CONTENT = res.responseText
  119. const DOC = new DOMParser().parseFromString(CONTENT, 'text/html')
  120. const RE_SWF = /swf_location = ['"](.*?)['"];/
  121. const GAME_FRAME_SCRIPT= DOC.querySelector('#game_wrapper + script + script')
  122. const SWF = GAME_FRAME_SCRIPT.textContent.match(RE_SWF)[1]
  123.  
  124. console.log(SWF)
  125.  
  126. openUrl(SWF)
  127.  
  128. DL.style.pointerEvents = ''
  129. BTN_TEXT.textContent = prevText
  130. }
  131. })
  132. })
  133.  
  134. if(FETCH_URL.includes('konggames.com/games/')) {
  135. const QUICK_LINKS = document.querySelector('#quicklinks')
  136.  
  137. QUICK_LINKS.appendChild(DL)
  138. }
  139. }
  140. }
  141.  
  142. class SilverGames {
  143. static init() {
  144. const GSTAT = document.querySelector('#gstat')
  145. const GAME_ID = GSTAT.dataset.id
  146. const FETCH_URL = 'https://f.silvergames.com/emu/waffle/?id=' + GAME_ID
  147. const DL = document.createElement('a')
  148.  
  149. DL.href = '#!'
  150. DL.style.cssText = 'margin-left: 8px;font-size: large;'
  151. DL.textContent = '(Download)'
  152.  
  153. let prevText = ''
  154.  
  155. DL.addEventListener('click', () => {
  156. DL.style.pointerEvents = 'none'
  157. prevText = DL.textContent
  158. DL.textContent = '(Downloading)'
  159.  
  160. GM.xmlHttpRequest({
  161. method: 'GET',
  162. url: FETCH_URL,
  163. onload: function(res) {
  164. const CONTENT = res.responseText
  165. const DOC = new DOMParser().parseFromString(CONTENT, 'text/html')
  166. const RE_SWF = /swf[u|U]rl: ['"](.*?)['"]/
  167. const SCRIPT = DOC.querySelector('head script')
  168. const SWF = SCRIPT.textContent.match(RE_SWF)[1]
  169.  
  170. openUrl(SWF)
  171.  
  172. DL.style.pointerEvents = ''
  173. DL.textContent = prevText
  174. }
  175. })
  176. })
  177.  
  178. const HEADER = document.querySelector('h2')
  179. HEADER.appendChild(DL)
  180. }
  181. }
  182.  
  183. class Nitrome {
  184. static init() {
  185. const GAME = document.title.split(' - ')[0]
  186. const GAME_FILENAME = GAME.replace(/[\s-]/g, '_')
  187. const GAME_NAME = GAME.replace(/\-/g, ' ')
  188. const DL = document.createElement('a')
  189. DL.style.height = '16px'
  190. DL.style.display = 'inline-block'
  191.  
  192. DL.title = `Download ${GAME}\n\nIcon licensed under Attribution 4.0 International (CC BY 4.0); https://creativecommons.org/licenses/by/4.0/`
  193. DL.target = '_blank'
  194. DL.href = `https://archive.org/download/all_nitrome_games/${encodeURIComponent(GAME_NAME)}/${encodeURIComponent(GAME_FILENAME)}.swf`
  195. DL.innerHTML = '<img src="https://icons.iconarchive.com/icons/famfamfam/mini/16/arrow-down-icon.png" style="position: relative;top: 2px;">'
  196.  
  197. const TOP_BAR_BOX = document.querySelector('#top_bar_box')
  198.  
  199. TOP_BAR_BOX.appendChild(DL)
  200. }
  201. }
  202.  
  203. class MiniPlay {
  204. static init() {
  205. const DL = document.createElement('div')
  206. const GAME_HEADER = document.querySelector('h1[itemprop="name"]')
  207. const GAME_NAME = GAME_HEADER.textContent.toLowerCase().replace(/[^\w\d]/g, '')
  208. DL.innerHTML = '<a target="_blank" href="https://www.minijuegosgratis.com/flash1234/no_hotlink/' + GAME_NAME + '.swf"><span class="ic ic-mb-download"></span></a>'
  209.  
  210. const GAME_ACTIONS_WRAPPER = document.querySelector('.game-actions-wrapper')
  211.  
  212. GAME_ACTIONS_WRAPPER.appendChild(DL)
  213. }
  214. }
  215.  
  216. class FrivEZ {
  217. static init() {
  218. const DL = document.createElement('button')
  219. DL.className = 'btn btn-link ml-3 p-0'
  220.  
  221. const SWF = `https://frivez.com/games${location.pathname}.swf`
  222.  
  223. DL.innerHTML = `<a target="_blank" href="${SWF}"><i class="far fa-save h5"></i></a>`
  224.  
  225. const FLASH_IFRAME = document.querySelector('iframe[src*="flash"]')
  226.  
  227. if(FLASH_IFRAME) {
  228. const LEFT_TEXT = document.querySelector('.container .text-left')
  229.  
  230. LEFT_TEXT.appendChild(DL)
  231. }
  232. }
  233. }
  234.  
  235. class TwoPlayerGames {
  236. static init() {
  237. const RE_SWF = /d['"]:['"](h.*?.swf)['"]/
  238. const SCRIPT = document.querySelector('script[defer] + script[src] + script')
  239. const SWF = SCRIPT.textContent.match(RE_SWF)[1]
  240. const DL = document.createElement('div')
  241.  
  242. DL.innerHTML = `<a rel="nofollow noreferrer" target="_blank" href="${SWF}" style="display: flex;background: rgb(192, 183, 152);padding: 2px 8px 2px 5px;border-radius: 10px;"><img src="https://api.iconify.design/material-symbols:arrow-downward-rounded.svg"> Download</a>`
  243.  
  244. const GAME_PAGE_LIKE = document.querySelector('.game-page-social')
  245. GAME_PAGE_LIKE.appendChild(DL)
  246. }
  247. }
  248.  
  249. const DOMAIN_DATA = {
  250. NewGrounds: 'www.newgrounds.com',
  251. ArmorGames: 'armorgames.com',
  252. Y8: 'y8.com',
  253. Kongregate: 'www.kongregate.com',
  254. SilverGames: 'www.silvergames.com',
  255. Nitrome: 'www.nitrome.com',
  256. MiniPlay: 'www.miniplay.com',
  257. FrivEZ: 'frivez.com',
  258. TwoPlayerGames: 'www.twoplayergames.org'
  259. }
  260.  
  261. class Main {
  262. static init() {
  263. const CLASSES = [
  264. NewGrounds,
  265. ArmorGames,
  266. Y8,
  267. Kongregate,
  268. SilverGames,
  269. Nitrome,
  270. MiniPlay,
  271. FrivEZ,
  272. TwoPlayerGames
  273. ]
  274.  
  275. for (let i = 0; i < CLASSES.length; i++) {
  276. const CLASS = CLASSES[i]
  277. const CLASS_NAME = CLASS.name
  278. const DOMAIN = DOMAIN_DATA[CLASS_NAME]
  279.  
  280. if(!DOMAIN) {
  281. console.error(CLASS_NAME, 'does not have domain info!')
  282. continue
  283. }
  284.  
  285. if(location.host.indexOf(DOMAIN) !== -1) {
  286. if(CLASS.init) {
  287. try {
  288. console.log(CLASS_NAME + '.init is initialized')
  289. CLASS.init()
  290. } catch(e) {
  291. console.error(CLASS_NAME, 'has error', e)
  292. continue
  293. }
  294. } else {
  295. console.error(CLASS_NAME, 'does not have `init` method!')
  296. continue
  297. }
  298. }
  299. }
  300. }
  301. }
  302.  
  303. Main.init()
  304.  
  305. function openUrl(url) {
  306. const LINK = document.createElement('a')
  307. LINK.href = url
  308. LINK.rel = 'nofollow noreferrer'
  309. LINK.target = '_blank'
  310.  
  311. document.body.appendChild(LINK)
  312.  
  313. LINK.click()
  314.  
  315. document.body.removeChild(LINK)
  316. }
  317. })()