// ==UserScript== // @name 巴哈天天簽到 // @namespace https://github.com/FlandreDaisuki // @description 在巴哈任何頁面自動簽到 // @match *://*.gamer.com.tw/* // @exclude *://user.gamer.com.tw/* // @icon https://i.imgur.com/LeSlv8b.png // @grant GM.setValue // @grant GM.getValue // @grant GM.xmlHttpRequest // @grant GM_setValue // @grant GM_getValue // @grant GM_xmlhttpRequest // @require https://code.jquery.com/jquery-3.3.1.min.js // @connect gamer.com.tw // @version 0.1.5 // @noframes // @author FlandreDaisuki // @homepageURL https://github.com/FlandreDaisuki/Bahamut-Daily // @license MIT, Copyright (c) 2018 FlandreDaisuki // @compatible firefox // @compatible chrome // @downloadURL https://update.greasyfork.icu/scripts/367737/%E5%B7%B4%E5%93%88%E5%A4%A9%E5%A4%A9%E7%B0%BD%E5%88%B0.user.js // @updateURL https://update.greasyfork.icu/scripts/367737/%E5%B7%B4%E5%93%88%E5%A4%A9%E5%A4%A9%E7%B0%BD%E5%88%B0.meta.js // ==/UserScript== const store = { async get(name, failv = null) { if (window.GM_getValue) { // eslint-disable-next-line new-cap return Promise.resolve(GM_getValue(name) || failv); } else { return (await GM.getValue(name)) || failv; } }, async set(name, value) { if (window.GM_setValue) { // eslint-disable-next-line new-cap GM_setValue(name, value); } else { GM.setValue(name, value); } }, }; (async () => { const BAHAID = document.cookie.replace(/.*\bBAHAID=(\w+)\b.*/ig, '$1'); if (!BAHAID) { // not logged in return; } const today = (new Date()).toLocaleDateString(); const signinDay = await store.get(BAHAID); if (signinDay === today) { // check and early return to save bandwidth to bahamut return; } else { if (await checkSignedIn()) { await store.set(BAHAID, today); } else { const result = await doSignIn(); if (result.message === '簽到成功') { await store.set(BAHAID, today); popupAwardTable($.noConflict(true), result); } } } })(); async function ajax(details) { const xhr = window.GM_xmlhttpRequest || (GM ? GM.xmlHttpRequest : null); if (!xhr) { return Promise.reject(); } return new Promise((resolve, reject) => { Object.assign(details, { onload: resolve, onabort: reject, onerror: reject, ontimeout: reject, }); xhr(details); }); } async function checkSignedIn() { const response = await ajax({ method: 'POST', url: 'https://www.gamer.com.tw/ajax/signin.php', data: 'action=2', headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Cookie': document.cookie, }, }).catch(console.error); // signin: -1, 未登入 // signin: 0, 未簽到 // signin: 1, 已簽到 return JSON.parse(response.responseText).signin > 0; } async function getToken() { const response = await ajax({ method: 'GET', url: `https://www.gamer.com.tw/ajax/get_csrf_token.php?_=${Date.now()}`, headers: { Cookie: document.cookie, }, }).catch(console.error); return response.responseText; } async function doSignIn() { const token = await getToken(); const response = await ajax({ method: 'POST', url: 'https://www.gamer.com.tw/ajax/signin.php', data: `action=1&token=${token}`, headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Cookie': document.cookie, }, }).catch(console.error); const result = JSON.parse(response.responseText); // prevent remote script injection result.nowd = Number(result.nowd); result.days = Number(result.days); console.info(result.message); return result; } function popupAwardTable($, { nowd, days }) { /* nowd: 表格簽到數 === (days - 1 % 28) + 1 */ /* days: 連續簽到日數 */ setTimeout(() => { $('.reword-progress-bar') .css('transition', `width ${nowd * 100}ms linear`) .css('width', `calc((100% / 28) * ${nowd})`); $('.bonus-day').slice(0, nowd).toArray().forEach((e, i) => { setTimeout(() => { $(e).addClass('is-active'); if (i % 7 === 6) { $($('.reword-content > .daily-img')[Math.floor(i / 7)]).addClass('passthrough-effect'); } }, 100 * i); }); $('#📅, .popoup-close').on('click', (event) => { $('#📅').fadeOut(600); setTimeout(() => { $('#📅').remove(); }, 1000); return false; }); }, 1000); const bonusMonthTitle = Array(7) .fill() .map((e, i) => i + 1) .reduce((str, num) => { return str + $(`