🏠 Home 

Giveaway Left Check

检测其乐论坛福利放送版块的赠key剩余数量/时间


安装此脚本?
  1. /* eslint-disable new-cap */
  2. // ==UserScript==
  3. // @name Giveaway Left Check
  4. // @namespace Giveaway-Left-Check
  5. // @version 0.5
  6. // @description 检测其乐论坛福利放送版块的赠key剩余数量/时间
  7. // @author HCLonely
  8. // @iconURL https://auto-task.hclonely.com/img/favicon.ico
  9. // @homepage https://github.com/HCLonely/user.js
  10. // @supportURL https://github.com/HCLonely/user.js/issues
  11. // @include *://keylol.com/*
  12. // @require https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js
  13. // @run-at document-end
  14. // @grant GM_xmlhttpRequest
  15. // @grant GM_addStyle
  16. // @connect marvelousga.com
  17. // @connect grabfreegame.com
  18. // @connect bananagiveaway.com
  19. // @connect gamehag.com
  20. // @connect prys.revadike.com
  21. // @connect takekey.ru
  22. // @connect alienwarearena.com
  23. // @connect giveaway.su
  24. // @connect givekey.ru
  25. // @connect store.cubejoy.com
  26. // @connect cart.cubejoy.com
  27. // @connect itch.io
  28. // ==/UserScript==
  29. (function () {
  30. 'use strict';
  31. const getTime = (dateStr) => {
  32. const endDate = new Date(dateStr).getTime();
  33. const nowDate = new Date().getTime();
  34. if (nowDate > endDate) return 0;
  35. const restSec = endDate - nowDate;
  36. const day = parseInt(restSec / (60 * 60 * 24 * 1000), 10);
  37. const hour = parseInt(restSec / (60 * 60 * 1000) % 24, 10);
  38. const min = parseInt(restSec / (60 * 1000) % 60, 10);
  39. const sec = parseInt(restSec / 1000 % 60, 10);
  40. return {
  41. time: `${day > 0 ? `${day} ` : ''} ${hour}小时${min}分${sec}秒`,
  42. // eslint-disable-next-line no-nested-ternary
  43. class: day > 0 ? 'lk-green' : (hour > 1 ? 'lk-yellow' : 'lk-red')
  44. };
  45. };
  46. const getClass = (left) => {
  47. const leftKey = parseInt(left, 10);
  48. if (leftKey > 99) {
  49. return 'lk-green';
  50. } else if (leftKey > 0 && leftKey < 100) {
  51. return 'lk-yellow';
  52. }
  53. return 'lk-red';
  54. };
  55. const checkMarvelousga = (id, e) => {
  56. GM_xmlhttpRequest({
  57. method: 'get',
  58. url: 'https://marvelousga.com/',
  59. timeout: 30 * 1000,
  60. ontimeout: () => {
  61. const thisEle = $(`a[href="${$(e).attr('href')}"]`);
  62. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-black" title="请求超时">timeout</font>');
  63. },
  64. onerror: (err) => {
  65. const thisEle = $(`a[href="${$(e).attr('href')}"]`);
  66. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-black" title="请求失败">error</font>');
  67. console.error(err);
  68. },
  69. onload: (response) => {
  70. const thisEle = $(`a[href="${$(e).attr('href')}"]`);
  71. try {
  72. const a = $(`<div>${response.responseText}</div>`).find(`a[href*="${id}"]`);
  73. if (a.length > 0) {
  74. const [leftKey] = a.parent().children('small')
  75. .text()
  76. .trim()
  77. .match(/[\d]+/);
  78. if (!thisEle.next().hasClass('left-keys')) thisEle.after(`<font class="left-keys ${getClass(leftKey)}" title="剩余key数量">${leftKey}</font>`);
  79. } else {
  80. if (!thisEle.next().hasClass('left-keys')) thisEle.after(`<font class="left-keys ${getClass(0)}" title="剩余key数量">0</font>`);
  81. }
  82. } catch (err) {
  83. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-black" title="获取数据失败">error</font>');
  84. console.error(err);
  85. }
  86. }
  87. });
  88. };
  89. const checkGrabfreegame = (url, e) => {
  90. GM_xmlhttpRequest({
  91. method: 'get',
  92. url,
  93. timeout: 30 * 1000,
  94. ontimeout: () => {
  95. const thisEle = $(`a[href="${$(e).attr('href')}"]`);
  96. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-black" title="请求超时">timeout</font>');
  97. },
  98. onerror: (err) => {
  99. const thisEle = $(`a[href="${$(e).attr('href')}"]`);
  100. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-black" title="请求失败">error</font>');
  101. console.error(err);
  102. },
  103. onload: (response) => {
  104. const thisEle = $(`a[href="${$(e).attr('href')}"]`);
  105. try {
  106. const counter = $(`<div>${response.responseText}</div>`).find('#giveaway .left>b');
  107. if (counter.length > 0) {
  108. const leftKey = counter.text().trim();
  109. if (!thisEle.next().hasClass('left-keys')) thisEle.after(`<font class="left-keys ${getClass(leftKey)}" title="剩余key数量">${leftKey}</font>`);
  110. } else {
  111. if (!thisEle.next().hasClass('left-keys')) thisEle.after(`<font class="left-keys ${getClass(0)}" title="剩余key数量">0</font>`);
  112. }
  113. } catch (err) {
  114. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-black" title="获取数据失败">error</font>');
  115. console.error(err);
  116. }
  117. }
  118. });
  119. };
  120. const checkGamehag = (url, e) => {
  121. GM_xmlhttpRequest({
  122. method: 'get',
  123. url,
  124. timeout: 30 * 1000,
  125. ontimeout: () => {
  126. const thisEle = $(`a[href="${$(e).attr('href')}"]`);
  127. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-black" title="请求超时">timeout</font>');
  128. },
  129. onerror: (err) => {
  130. const thisEle = $(`a[href="${$(e).attr('href')}"]`);
  131. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-black" title="请求失败">error</font>');
  132. console.error(err);
  133. },
  134. onload: (response) => {
  135. const thisEle = $(`a[href="${$(e).attr('href')}"]`);
  136. try {
  137. const counter = $(`<div>${response.responseText}</div>`).find('div.giveaway-counter')
  138. .not(':contains("day")')
  139. .find('.strong');
  140. if (counter.length > 0) {
  141. const leftKey = counter.text().trim();
  142. if (!thisEle.next().hasClass('left-keys')) thisEle.after(`<font class="left-keys ${getClass(leftKey)}" title="剩余key数量">${leftKey}</font>`);
  143. } else {
  144. if (!thisEle.next().hasClass('left-keys')) thisEle.after(`<font class="left-keys ${getClass(0)}" title="剩余key数量">0</font>`);
  145. }
  146. } catch (err) {
  147. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-black" title="获取数据失败">error</font>');
  148. console.error(err);
  149. }
  150. }
  151. });
  152. };
  153. const checkPrys = (url, e) => {
  154. GM_xmlhttpRequest({
  155. method: 'get',
  156. url,
  157. timeout: 30 * 1000,
  158. ontimeout: () => {
  159. const thisEle = $(`a[href="${$(e).attr('href')}"]`);
  160. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-black" title="请求超时">timeout</font>');
  161. },
  162. onerror: (err) => {
  163. const thisEle = $(`a[href="${$(e).attr('href')}"]`);
  164. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-black" title="请求失败">error</font>');
  165. console.error(err);
  166. },
  167. onload: (response) => {
  168. const thisEle = $(`a[href="${$(e).attr('href')}"]`);
  169. try {
  170. const counter = $(`<div>${response.responseText}</div>`).find('#header :contains("left")');
  171. if (counter.length > 0) {
  172. const [, leftKey] = counter.text().trim()
  173. .match(/\(([\d]+).*\)/);
  174. if (!thisEle.next().hasClass('left-keys')) thisEle.after(`<font class="left-keys ${getClass(leftKey)}" title="剩余key数量">${leftKey}</font>`);
  175. } else {
  176. if (!thisEle.next().hasClass('left-keys')) thisEle.after(`<font class="left-keys ${getClass(0)}" title="剩余key数量">0</font>`);
  177. }
  178. } catch (err) {
  179. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-black" title="获取数据失败">error</font>');
  180. console.error(err);
  181. }
  182. }
  183. });
  184. };
  185. const checkTakekey = (url, e) => {
  186. GM_xmlhttpRequest({
  187. method: 'get',
  188. url,
  189. timeout: 30 * 1000,
  190. ontimeout: () => {
  191. const thisEle = $(`a[href="${$(e).attr('href')}"]`);
  192. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-black" title="请求超时">timeout</font>');
  193. },
  194. onerror: (err) => {
  195. const thisEle = $(`a[href="${$(e).attr('href')}"]`);
  196. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-black" title="请求失败">error</font>');
  197. console.error(err);
  198. },
  199. onload: (response) => {
  200. const thisEle = $(`a[href="${$(e).attr('href')}"]`);
  201. try {
  202. const counter = $(`<div>${response.responseText}</div>`).find('span.text-muted:contains("Left")');
  203. if (counter.length > 0) {
  204. const [leftKey] = counter.text().trim()
  205. .match(/[\d]+/);
  206. if (!thisEle.next().hasClass('left-keys')) thisEle.after(`<font class="left-keys ${getClass(leftKey)}" title="剩余key数量">${leftKey}</font>`);
  207. } else {
  208. if (!thisEle.next().hasClass('left-keys')) thisEle.after(`<font class="left-keys ${getClass(0)}" title="剩余key数量">0</font>`);
  209. }
  210. } catch (err) {
  211. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-black" title="获取数据失败">error</font>');
  212. console.error(err);
  213. }
  214. }
  215. });
  216. };
  217. const checkAlienwarearena = (url, e) => {
  218. GM_xmlhttpRequest({
  219. method: 'get',
  220. url,
  221. timeout: 30 * 1000,
  222. ontimeout: () => {
  223. const thisEle = $(`a[href="${$(e).attr('href')}"]`);
  224. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-black" title="请求超时">timeout</font>');
  225. },
  226. onerror: (err) => {
  227. const thisEle = $(`a[href="${$(e).attr('href')}"]`);
  228. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-black" title="请求失败">error</font>');
  229. console.error(err);
  230. },
  231. onload: (response) => {
  232. const thisEle = $(`a[href="${$(e).attr('href')}"]`);
  233. try {
  234. let userCountry = response.responseText.match(/user_country.*?=.*?"([\w]+)"/);
  235. userCountry = userCountry ? userCountry[1] : '';
  236. let prestigeLevel = response.responseText.match(/prestige_level.*?=.*?([\d]+)/);
  237. prestigeLevel = prestigeLevel ? parseInt(prestigeLevel[1], 10) : 0;
  238. let fullLevel = response.responseText.match(/full_level.*?=.*?([\d]+)/);
  239. fullLevel = fullLevel ? parseInt(fullLevel[1], 10) : 0;
  240. let countryKeys = response.responseText.match(/countryKeys.*?=.*?(\{.+\});/);
  241. if (countryKeys) {
  242. countryKeys = JSON.parse(countryKeys[1]);
  243. } else {
  244. return;
  245. }
  246. const keyType = prestigeLevel ? 'prestige' : 'normal';
  247. let userCountryKeys = countryKeys[userCountry][keyType];
  248. let lowestLevelWithKeys;
  249. let highestKeysForUser;
  250. let keysForUser = false;
  251. for (const level in userCountryKeys) {
  252. if (userCountryKeys[level] > 0) {
  253. if (!lowestLevelWithKeys) { lowestLevelWithKeys = level; }
  254. if (fullLevel >= level) {
  255. if (!highestKeysForUser || userCountryKeys[level] > highestKeysForUser) { highestKeysForUser = userCountryKeys[level]; }
  256. }
  257. }
  258. }
  259. if (!highestKeysForUser && keyType === 'prestige') {
  260. userCountryKeys = countryKeys[userCountry].normal;
  261. for (const level in userCountryKeys) {
  262. if (userCountryKeys[level] > 0) {
  263. if (!lowestLevelWithKeys) { lowestLevelWithKeys = level; }
  264. if (fullLevel >= level) {
  265. if (!highestKeysForUser || userCountryKeys[level] > highestKeysForUser) { highestKeysForUser = userCountryKeys[level]; }
  266. }
  267. }
  268. }
  269. }
  270. if (highestKeysForUser) {
  271. if (!thisEle.next().hasClass('left-keys')) thisEle.after(`<font class="left-keys ${getClass(highestKeysForUser)}" title="剩余key数量">${highestKeysForUser}</font>`);
  272. keysForUser = true;
  273. }
  274. if (!keysForUser) {
  275. if (lowestLevelWithKeys) {
  276. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-red" title="等级不足">等级不足</font>');
  277. } else {
  278. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-red" title="剩余key数量">0</font>');
  279. }
  280. }
  281. } catch (err) {
  282. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-black" title="获取数据失败">error</font>');
  283. console.error(err);
  284. }
  285. }
  286. });
  287. };
  288. const checkItch = (url, e) => {
  289. GM_xmlhttpRequest({
  290. method: 'get',
  291. url,
  292. timeout: 30 * 1000,
  293. ontimeout: () => {
  294. const thisEle = $(`a[href="${$(e).attr('href')}"]`);
  295. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-black" title="请求超时">timeout</font>');
  296. },
  297. onerror: (err) => {
  298. const thisEle = $(`a[href="${$(e).attr('href')}"]`);
  299. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-black" title="请求失败">error</font>');
  300. console.error(err);
  301. },
  302. onload: (response) => {
  303. const thisEle = $(`a[href="${$(e).attr('href')}"]`);
  304. try {
  305. const counter = $(`<div>${response.responseText}</div>`).find('.promotion_dates .date_format');
  306. if (counter.length > 0) {
  307. const endTime = `${counter.attr('title').trim()}Z`;
  308. const time = getTime(endTime);
  309. if (time !== 0) {
  310. if (!thisEle.next().hasClass('left-keys')) thisEle.after(`<font data-time="${endTime}" class="left-keys ${time.class}" title="剩余时间">${time.time}</font>`);
  311. setInterval(() => {
  312. const leftTimeEle = $(`font[data-time="${endTime}"]`);
  313. const leftTime = getTime(endTime);
  314. if (leftTime !== 0) {
  315. if (!leftTimeEle.hasClass(leftTime.class)) leftTimeEle.attr('class', `left-keys ${leftTime.class}`);
  316. leftTimeEle.text(leftTime.time);
  317. } else {
  318. leftTimeEle.attr('class', 'left-keys lk-red').attr('title', '活动已结束')
  319. .text('end');
  320. }
  321. }, 500);
  322. } else {
  323. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-red" title="活动已结束">end</font>');
  324. }
  325. } else {
  326. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-red" title="活动已结束">end</font>');
  327. }
  328. } catch (err) {
  329. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-black" title="获取数据失败">error</font>');
  330. console.error(err);
  331. }
  332. }
  333. });
  334. };
  335. const checkGiveawaysu = (url, e) => {
  336. GM_xmlhttpRequest({
  337. method: 'get',
  338. url,
  339. timeout: 30 * 1000,
  340. ontimeout: () => {
  341. const thisEle = $(`a[href="${$(e).attr('href')}"]`);
  342. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-black" title="请求超时">timeout</font>');
  343. },
  344. onerror: (err) => {
  345. const thisEle = $(`a[href="${$(e).attr('href')}"]`);
  346. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-black" title="请求失败">error</font>');
  347. console.error(err);
  348. },
  349. onload: (response) => {
  350. const thisEle = $(`a[href="${$(e).attr('href')}"]`);
  351. try {
  352. const counter = $(`<div>${response.responseText}</div>`).find('div.giveaway-ended');
  353. if (counter.length > 0) {
  354. if (!thisEle.next().hasClass('left-keys')) thisEle.after(`<font class="left-keys ${getClass(0)}" title="已结束">End</font>`);
  355. } else {
  356. if (!thisEle.next().hasClass('left-keys')) thisEle.after(`<font class="left-keys ${getClass(100)}" title="进行中">Active</font>`);
  357. }
  358. } catch (err) {
  359. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-black" title="获取数据失败">error</font>');
  360. console.error(err);
  361. }
  362. }
  363. });
  364. };
  365. const checkGivekey = (url, e) => {
  366. GM_xmlhttpRequest({
  367. method: 'get',
  368. url,
  369. timeout: 30 * 1000,
  370. ontimeout: () => {
  371. const thisEle = $(`a[href="${$(e).attr('href')}"]`);
  372. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-black" title="请求超时">timeout</font>');
  373. },
  374. onerror: (err) => {
  375. const thisEle = $(`a[href="${$(e).attr('href')}"]`);
  376. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-black" title="请求失败">error</font>');
  377. console.error(err);
  378. },
  379. onload: (response) => {
  380. const thisEle = $(`a[href="${$(e).attr('href')}"]`);
  381. try {
  382. const counter = $(`<div>${response.responseText}</div>`).find('#keys_count');
  383. if (counter.length > 0) {
  384. const [leftKey] = counter.text().trim()
  385. .match(/[\d]+/);
  386. if (!thisEle.next().hasClass('left-keys')) thisEle.after(`<font class="left-keys ${getClass(leftKey)}" title="剩余key数量">${leftKey}</font>`);
  387. } else {
  388. if (!thisEle.next().hasClass('left-keys')) thisEle.after(`<font class="left-keys ${getClass(0)}" title="剩余key数量">0</font>`);
  389. }
  390. } catch (err) {
  391. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-black" title="获取数据失败">error</font>');
  392. console.error(err);
  393. }
  394. }
  395. });
  396. };
  397. const checkCubejoy = (gameId, e) => {
  398. GM_xmlhttpRequest({
  399. method: 'get',
  400. url: `https://store.cubejoy.com/html/en/store/goodsdetail/detail${gameId}.html`,
  401. timeout: 30 * 1000,
  402. ontimeout: () => {
  403. const thisEle = $(`a[href="${$(e).attr('href')}"]`);
  404. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-black" title="请求超时">timeout</font>');
  405. },
  406. onerror: (err) => {
  407. const thisEle = $(`a[href="${$(e).attr('href')}"]`);
  408. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-black" title="请求失败">error</font>');
  409. console.error(err);
  410. },
  411. onload: (response) => {
  412. const thisEle = $(`a[href="${$(e).attr('href')}"]`);
  413. try {
  414. let price = response.responseText.match(/<span class="gameoriginal">[\D]*?([\d.]+)/)?.[1] || '';
  415. if (!price && response.responseText.includes('免费游戏</span>')) {
  416. price = '0';
  417. }
  418. if (/^[\d.]+$/.test(price)) {
  419. price = parseInt(price, 10);
  420. if (price === 0) {
  421. if (!thisEle.next().hasClass('left-keys')) thisEle.after(`<font class="left-keys ${getClass(100)}" title="游戏价格" 0.00</font>`);
  422. } else if (price > 0) {
  423. if (!thisEle.next().hasClass('left-keys')) thisEle.after(`<font class="left-keys ${getClass(0)}" title="游戏价格" ${price / 100}</font>`);
  424. }
  425. } else {
  426. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-black" title="获取游戏价格失败">error</font>');
  427. }
  428. } catch (err) {
  429. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-black" title="获取数据失败">error</font>');
  430. console.error(err);
  431. }
  432. }
  433. });
  434. };
  435. const leftTitle = $('.subforum_left_title_left_up a').eq(3);
  436. const leftTitleHref = leftTitle.length > 0 ? leftTitle.attr('href') : '';
  437. if ((leftTitleHref.includes('f319-1') || (leftTitleHref.includes('page=1') && leftTitleHref.includes('fid=319'))) && leftTitle.text() === '福利放送') {
  438. const marvelousgaLinks = $('a[href*="marvelousga.com/giveaway/"]');
  439. const grabfreegameLinks = $('a[href*="grabfreegame.com/giveaway/"],a[href*="bananagiveaway.com/giveaway/"]');
  440. const gamehagLinks = $('a[href*="gamehag.com/giveaway/"]');
  441. const prysLinks = $('a[href*="prys.revadike.com/giveaway/?id="]');
  442. const takekeyLinks = $('a[href*="takekey.ru/distribution/"]');
  443. const alienwarearenaLinks = $('a[href*="alienwarearena.com/ucf/show/"]');
  444. const itchLinks = $('a[href*="itch.io/s/"]');
  445. const giveawaysuLinks = $('a[href*="giveaway.su/giveaway/view/"]');
  446. const givekeyLinks = $('a[href*="givekey.ru/giveaway/"]');
  447. const cubejoyLinks = $('a[href*="store.cubejoy.com/html/en/store/goodsdetail/detail"],a[href*="cart.cubejoy.com/shop/xnEdition.html?pid="]');
  448. if (marvelousgaLinks.length > 0) {
  449. for (const e of marvelousgaLinks) {
  450. const test = $(e).attr('href')
  451. .match(/https?:\/\/marvelousga\.com\/giveaway\/(.+)/);
  452. const id = test ? test[1] : false;
  453. if (id) checkMarvelousga(id, e);
  454. }
  455. }
  456. if (grabfreegameLinks.length > 0) {
  457. for (const e of grabfreegameLinks) {
  458. const link = $(e).attr('href');
  459. if (/^https?:\/\/www\.(grabfreegame|bananagiveaway)\.com\/giveaway\/.*/.test(link)) checkGrabfreegame(link, e);
  460. }
  461. }
  462. if (gamehagLinks.length > 0) {
  463. for (const e of gamehagLinks) {
  464. const link = $(e).attr('href');
  465. if (/^https?:\/\/.*?gamehag\.com\/giveaway\/[\d]+.*?/.test(link)) checkGamehag(link, e);
  466. }
  467. }
  468. if (prysLinks.length > 0) {
  469. for (const e of prysLinks) {
  470. const link = $(e).attr('href');
  471. if (/^https?:\/\/prys\.revadike\.com\/giveaway\/\?id=[\d]+/.test(link)) checkPrys(link, e);
  472. }
  473. }
  474. if (takekeyLinks.length > 0) {
  475. for (const e of takekeyLinks) {
  476. const link = $(e).attr('href');
  477. if (/^https?:\/\/takekey\.ru\/distribution\/[\d]+/.test(link)) checkTakekey(link, e);
  478. }
  479. }
  480. if (alienwarearenaLinks.length > 0) {
  481. for (const e of alienwarearenaLinks) {
  482. const link = $(e).attr('href');
  483. if (/^https?:\/\/.*?\.alienwarearena\.com\/ucf\/show\/[\d]+.*?/.test(link)) checkAlienwarearena(link, e);
  484. }
  485. }
  486. if (itchLinks.length > 0) {
  487. for (const e of itchLinks) {
  488. const link = $(e).attr('href');
  489. if (/^https?:\/\/itch\.io\/s\/[\d]+?\/.*/.test(link)) checkItch(link, e);
  490. }
  491. }
  492. if (giveawaysuLinks.length > 0) {
  493. for (const e of giveawaysuLinks) {
  494. const link = $(e).attr('href');
  495. if (/^https?:\/\/giveaway\.su\/giveaway\/view\/[\d]+/.test(link)) checkGiveawaysu(link, e);
  496. }
  497. }
  498. if (givekeyLinks.length > 0) {
  499. for (const e of givekeyLinks) {
  500. const link = $(e).attr('href');
  501. if (/^https?:\/\/givekey\.ru\/giveaway\/[\d]+/.test(link)) checkGivekey(link, e);
  502. }
  503. }
  504. if (cubejoyLinks.length > 0) {
  505. for (const e of cubejoyLinks) {
  506. const link = $(e).attr('href');
  507. const gameId = link.match(/goodsdetail\/detail([\d]+?)\.html/) || link.match(/xnEdition\.html\?pid=([\d]+)/);
  508. if (gameId && gameId[1]) checkCubejoy(gameId[1], e);
  509. }
  510. }
  511. }
  512. GM_addStyle(`
  513. .left-keys{
  514. color: #fff;
  515. border-radius: 10px;
  516. padding: 0 5px;
  517. margin-left: 5px;
  518. }
  519. .lk-green{
  520. background-color: #5cb85c;
  521. }
  522. .lk-yellow{
  523. background-color: #f0ad4e;
  524. }
  525. .lk-red{
  526. background-color: #d9534f;
  527. }
  528. .lk-black{
  529. background-color: #000;
  530. }
  531. `);
  532. }());