// ==UserScript==
// @name 巴哈姆特 - 覆寫小屋樣式
// @namespace -
// @version 20190207
// @description RT
// @author LianSheng
// @match https://home.gamer.com.tw/*
// @require https://greasyfork.org/scripts/377302-general-source-code-injection-tool/code/General%20Source%20Code%20Injection%20Tool.js?version=667827
// @run-at document-start
// @grant GM_getValue
// @grant GM_setValue
// @compatible chrome >= 71
// @compatible firefox >= 65
// @license MIT
// ==/UserScript==
// 內部版本號: 2.0.0
(function() {
'use strict';
let debug = false;
// 解決由淺色字導致導航欄搜尋框文字難以辨讀的問題。無論是否啓用小屋覆蓋。////
let nav_input = `
input#gsc-i-id1 {
color: #000;
}
`;
addStyleImportant(nav_input, "html", "tm_nav_input_style");
//////////////////////////////////////////////////////////////////
let url_string = location.href;
let url = new URL(url_string);
let owner = url.searchParams.get("owner");
let sn = `sn${url.searchParams.get("sn")}`;
let html = `
<div style="position: absolute; top: 10px; left: 30vw; height: 24px">
<input id="tm_open_custom_style" type="checkbox" style="width: 20px; height: 20px;">
<span style="user-select: none; height: 22px; line-height: 22px; font-size: 22px;"> 開啓小屋覆寫樣式 </span>
</div>
`;
if(owner != null) {
owner = owner.toLowerCase();
if(GM_getValue(owner)) enable();
// 頁面讀取後才載入額外元件
window.onload = function(){
addHTML(html, "div#BH-top-data");
let check_enable = document.querySelector("input#tm_open_custom_style");
try{
check_enable.addEventListener("change", function(){
console.log(check_enable.checked);
if(check_enable.checked) {
enable();
GM_setValue(owner, Math.round(new Date().getTime()/1000));
} else {
disable();
GM_setValue(owner, false);
}
});
} catch (e) {
// 添加監聽失敗,終止腳本
console.log(`%c【錯誤】%c在 %c"${check_enable}" %c嘗試 %caddEventListener %c失敗:\n"${e}"`, "font-size: 16px; color: red", "color: auto", "color: blue", "color: auto", "color: brown", "color: auto");
console.log(`%c【腳本已終止】`, "font-size: 16px; color: red");
return 0;
}
if(GM_getValue(owner)) check_enable.checked = true;
};
// 可能在創作或 homeindex.php
} else {
// 從創作編號 sn 判斷
if(GM_getValue(sn)){
let temp_owner = GM_getValue(sn);
if(GM_getValue(temp_owner)) {
enable();
console.log("從 sn 判斷啓用覆蓋樣式");
}
} else {
console.log(GM_getValue(sn));
}
// 頁面讀取後才載入額外元件
window.onload = function(){
// 針對創作頁面
if(document.body.querySelector("img.msghead.gamercard")) owner = document.querySelector("img.msghead.gamercard").getAttribute("data-gamercard-userid");
// 針對 homeindex.php
if(document.body.querySelector("img.MSG-myavatar")) owner = document.querySelector("img.MSG-myavatar").src.match(/[a-zA-Z0-9]+\.png$/)[0].replace(/\.png$/, "");
if(owner != null) {
owner = owner.toLowerCase();
if(GM_getValue(owner)) enable();
addHTML(html, "div#BH-top-data");
let check_enable = document.querySelector("input#tm_open_custom_style");
try{
check_enable.addEventListener("change", function(){
console.log(check_enable.checked);
if(check_enable.checked) {
enable();
GM_setValue(owner, Math.round(new Date().getTime()/1000));
} else {
disable();
GM_setValue(owner, false);
}
});
} catch (e) {
// 添加監聽失敗,終止腳本
console.log(`%c【錯誤】%c在 %c"${check_enable}" %c嘗試 %caddEventListener %c失敗:\n"${e}"`, "font-size: 16px; color: red", "color: auto", "color: blue", "color: auto", "color: brown", "color: auto");
console.log(`%c【腳本已終止】`, "font-size: 16px; color: red");
return 0;
}
if(GM_getValue(owner)) check_enable.checked = true;
} else {
console.log("判斷此頁爲例外。\n(非勇者小屋,無須開啓樣式覆蓋)");
}
};
}
// 判斷是否在創作相關頁面,用於預判是否載入設定 ///////////////////////////
// 針對創作清單頁面
(function(){
if( url_string.match(/creation\.php/) != null || url_string.match(/creationCategory\.php/) != null) {
owner = owner.toLowerCase();
let full_response = get(url_string);
let sn_origin = full_response.match(/href=\"creationDetail\.php\?sn=\d+/g);
let prev_sn = "";
// 擷取 sn,將其標示爲該創作頁面的勇者
for(let i=0; i<sn_origin.length; i++){
let single_sn = sn_origin[i].match(/\d+$/)[0];
if( single_sn != prev_sn ) {
GM_setValue(`sn${single_sn}`, owner);
prev_sn = single_sn;
}
}
}
})();
// 針對單篇創作頁面(底下關聯創作可能涵蓋其他勇者)(TODO)
(function(){
if( url_string.match(/creationDetail\.php/) != null ) {
let creation_detail = get(location.href).replace(/\n/g, "");
// 相關創作(對於縮圖不是勇造的文章將無法取得資訊)
let relation_list = creation_detail.match(/class=\"HOME-mainbox1a\ BC5\">.+?creationDetail\.php\?sn=\d+?\"><img.+?l\/i\/.+?\/[a-zA-Z0-9]+?\.png\" \/>/g);
if(relation_list != null) {
for(let i=0; i<relation_list.length; i++){
let sn_author = relation_list[i].match(/i\/.+?\/([a-zA-Z0-9]+?)\.png/)[1];
let sn = relation_list[i].match(/creationDetail\.php\?sn=(\d+)/)[1];
GM_setValue(`sn${sn}`, sn_author);
}
}
// 最底之前一篇與後一篇
window.onload = function(){
if(document.body.querySelector("img.msghead.gamercard")) {
owner = document.querySelector("img.msghead.gamercard").getAttribute("data-gamercard-userid");
let prev_sn = creation_detail.match(/<span>前一篇:.+?creationDetail\.php\?sn=(\d+?)"/);
let next_sn = creation_detail.match(/<span>後一篇:.+?creationDetail\.php\?sn=(\d+?)"/);
if(prev_sn != null) GM_setValue(`sn${prev_sn[1]}`, owner);
if(next_sn != null) GM_setValue(`sn${next_sn[1]}`, owner);
// 本篇文章
GM_setValue(sn, owner);
}
}
}
})();
// 針對同標籤作品搜尋
(function(){
if( url_string.match(/search\.php/) != null ) {
let same_tag_origin = get(location.href).replace(/\n/g, "");
// 同標籤作品主要清單
let main_list = same_tag_origin.match(/<span\ class=\"ST1\">.+?class=\"BH-txtmore\ msggoon\">/g);
for(let i=0; i<main_list.length; i++){
let sn_author = main_list[i].match(/href=\"\/\/home\.gamer\.com\.tw\/([a-zA-Z0-9]+?)\"/)[1];
let sn = main_list[i].match(/href=\"creationDetail\.php\?sn=(\d+?)\"/)[1];
GM_setValue(`sn${sn}`, sn_author);
}
// 最多人訂閱的小屋之最新創作
let popular_list = same_tag_origin.match(/home\.gamer\.com\.tw\/home\.php\?owner\=.+?\"\ class=\"HOME-rbox3A\".+?href=\"creationDetail\.php\?sn=\d+?\">/g);
for(let i=0; i<popular_list.length; i++){
let sn_author = popular_list[i].match(/href=\"\/\/home\.gamer\.com\.tw\/home\.php\?owner=([a-zA-Z0-9]+?)\"/)[1];
let sn = popular_list[i].match(/href=\"creationDetail\.php\?sn=(\d+?)\"/)[1];
GM_setValue(`sn${sn}`, sn_author);
}
}
})();
////////////////////////////////////////////////////////////////////
function enable() {
let css = `
/* 背景 */
body {
background-image: url("");
background-color: #0009;
}
/* 所有標題 */
h1, h2, h3, h4, h5, h6 {
background-image: url("");
background-color: #0000;
color: #fff;
}
/* 導航欄 */
#BH-main_menu, #BH-pathbox {
background-image: url("");
background-color: #0004;
}
a#mmenunow{
background-color: #0004;
}
/******************** 首頁 ********************/
/* 左側區塊 */
div[class^="BH-lbox MSG-box"] {
background-image: url("");
background-color: #0004;
color: #fff;
}
/* 右側區塊 */
div[class^=BH-rbox] {
background-image: url("");
background-color: #0004;
}
/* 大聲說 */
#BH-talkmain2 {
background-image: url("");
background-color: #0004;
border: 0;
}
/* 個人資訊(主圖) */
div.MSG-mainpic {
background-image: url("");
background-color: #0004;
color: #fff;
}
/* 按鈕群內個別按鈕 */
a.BH-slave_btnA {
background-image: url("");
background-color: #0000;
}
a.BH-slave_btnA:hover {
background-image: url("");
background-color: #0000;
}
/* 其他勇者資訊(如訪客、追蹤者) */
a.user-info {
background-image: url("");
background-color: #0008;
color: #fff;
}
/* 訪客留言 */
.MSG-list18 > div[id^=msg] {
color: #fff;
}
.MSG-list18 > div[id^=msg] > .ST1 {
color: #bbb;
}
/* 雜項 */
.HOME-mainbox1c {
background-image: url("");
background-color: #0004;
}
/******************** 叭啦 ********************/
[class^=BH-master] * {
background-image: url("");
background-color: #0004;
color: #fff;
}
#noMsg {
background-image: url("");
background-color: #0004;
color: #fff;
}
/******************** 創作 ********************/
.BH-lbox {
background-image: url("");
background-color: #0004;
color: #fff;
}
a.msgdel, .prev, .next, .BH-search {
background-image: url("");
background-color: #0004;
color: #fff;
}
/* 分頁選單 */
p.BH-pagebtnA > a:not(.pagenow) {
background-image: url("");
background-color: #0004;
}
/* 創作底下按鈕 */
.AB1, .AB2, .AB3, .AB4 {
background-image: url("");
background-color: #0004;
}
/* 創作留言回覆 */
.msgreport {
background-image: url("");
background-color: #0004;
}
/******************** 精華 ********************/
.BH-table, .TBC2 {
background-image: url("");
background-color: #0004;
color: #fff;
border: 0;
}
/******************** ACG ********************/
.ACG-star {
background: url(https://i2.bahamut.com.tw/acg/star_s.png);
height: 23px;
}
/******************** 好友圈 ********************/
dialog * {
background-image: url("");
background-color: #0004;
color: #fff;
}
/******************** 右上通知區塊 ********************/
[id^=topBarMsg_light_] *, [id^=topBarMsg_] * {
background-image: url("");
background-color: #000d;
color: #ddd;
}
/******************** 通用元素 ***********************/
li, span, p {
color: #fff;
}
input, button, textarea {
border: 1px white solid;
background-color: #0004;
color: #fff;
}
a, a * {
color: #ffc;
}
a:hover, a *:hover {
color: #f00;
}
`;
addStyleImportant(css, "html", "tm_insert_custom_style");
}
function disable() {
document.querySelector("style#tm_insert_custom_style").remove();
}
// HTTP GET
function get(url, set=false) {
let temp;
let xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == XMLHttpRequest.DONE) {
temp = xhr.responseText;
}
}
xhr.open('GET', url, set);
xhr.send(null);
return temp;
}
// Debug 模式:提供公開函數以利測試。
if(debug) {
console.log(`${GM_info.script.name}\nDebug mode: ON`);
unsafeWindow.tm_debug = function() {
return {
get: function (url, set=false) {
return get(url, set);
}
}
}();
}
})();