sanbon完全不希望人们与他交换数据,删除所有的sanbon支持代码。

This commit is contained in:
枫谷剑仙 2024-06-25 01:56:52 +08:00
parent d2aeeeda33
commit 006a72a0ac
6 changed files with 19 additions and 345 deletions

View File

@ -855,6 +855,7 @@ const teamsCount = 2;
<div class="attr" data-attr="any"></div>
<div class="attr" data-attr="any"></div>
<div class="attr" data-attr="any"></div>
<div class="attr" data-attr="any"></div>
</div>
</label>
<div class="attr-selecter-list">
@ -882,6 +883,14 @@ const teamsCount = 2;
<li><input type="checkbox" name="attr-3" value="4" id="search-attr-3-4" /><label for="search-attr-3-4"><span class="attr" data-attr-icon="4"></span></label></li><!---->
<li><input type="checkbox" name="attr-3" value="6" id="search-attr-3-6" /><label for="search-attr-3-6"><span class="attr" data-attr-icon="6"></span></label></li><!--无副属性-->
</ul>
<ul class="attr-list horizontally-radio-list display-none">
<li><input type="checkbox" name="attr-4" value="0" id="search-attr-4-0" /><label for="search-attr-4-0"><span class="attr" data-attr-icon="0"></span></label></li><!---->
<li><input type="checkbox" name="attr-4" value="1" id="search-attr-4-1" /><label for="search-attr-4-1"><span class="attr" data-attr-icon="1"></span></label></li><!---->
<li><input type="checkbox" name="attr-4" value="2" id="search-attr-4-2" /><label for="search-attr-4-2"><span class="attr" data-attr-icon="2"></span></label></li><!---->
<li><input type="checkbox" name="attr-4" value="3" id="search-attr-4-3" /><label for="search-attr-4-3"><span class="attr" data-attr-icon="3"></span></label></li><!---->
<li><input type="checkbox" name="attr-4" value="4" id="search-attr-4-4" /><label for="search-attr-4-4"><span class="attr" data-attr-icon="4"></span></label></li><!---->
<li><input type="checkbox" name="attr-4" value="6" id="search-attr-4-6" /><label for="search-attr-4-6"><span class="attr" data-attr-icon="6"></span></label></li><!--无副属性-->
</ul>
</div>
<button id="attr-clear" type="reset" class="brown-button"></button>
<div class="options"><button id="avatar-save" type="button" class="display-none">💾</button><input type="checkbox" name="fix-main-color" id="fix-main-color" checked><label for="fix-main-color"></label></div>
@ -1508,21 +1517,6 @@ const teamsCount = 2;
<div class="qr-box"><img class="qr-code-image" /></div>
<a download="" class="save-qr-img brown-button fa"><!--保存QR 图片--></a>
</div>
<div class="sanbon-team-edit">
<!--<div class="user">
<label for="sanbon-username"></label><input id="sanbon-username" type="text" placeholder="ID (2~12)">
<label for="sanbon-password"></label><input id="sanbon-password" type="password" placeholder="password (4~20)">
</div>-->
<div class="action">
<label for="sanbon-team-id"></label><input id="sanbon-team-id" type="text" placeholder="Team URL" readonly>
<button id="sanbon-save-or-upload-team" class="brown-button"></button>
</div>
</div>
<div class="sanbon-transfer">
<div class="sanbon-v2">
<label for="sanbon-v2-script"><a id="sanbon-v2-link" href="https://sanbon.me/v2/en-jp/team-builder" target="_blank">Sanbon Team Builder</a> JavaScript (Test function, paste in Browser Console | 测试功能,粘贴到浏览器控制台)</label><br><textarea id="sanbon-v2-script"></textarea>
</div>
</div>
<div class="paddb-team-edit">
<div class="user">
<label for="paddb-username"></label><input id="paddb-username" type="text" placeholder="ID (2~12)">

271
script.js
View File

@ -1369,121 +1369,6 @@ Formation.prototype.getPaddbQrObj = function(keepDataSource = true)
};
return qrObj;
}
function sanbonTranslateRegion(code) {
switch (code) {
case "ja": return "jp";
case "ko": return "kr";
case "en": return "na";
}
};
Formation.prototype.getSanbonV2Script = function()
{
const region = sanbonTranslateRegion(currentDataSource.code);
//sanbon目前只支持单人队伍
const [members,assists,badge] = this.teams[0];
const scriptLines = [`(async ()=>{
"use strict";
let buildId;
if (typeof __NEXT_DATA__ !== 'undefined') {
buildId = __NEXT_DATA__?.buildId;
} else {
const Zstr = window.__next_f.find(o=>o?.[1]?.startsWith("0:"))[1];
const regRes = /"buildId":"([\\w\\-]+)"/ig.exec(Zstr);
buildId = regRes[1];
}
if (!buildId) throw Error("buildId not found.");
const region = "${region}";
async function fetchFlattened(id) {
if (id <= 0) return {};
const url = new URL(location.origin);
url.pathname = \`/_next/data/\${buildId}/\${region}/monster/\${id}.json\`;
url.searchParams.set("lang_region", region);
url.searchParams.set("num", id);
const response = await fetch(url);
const json = await response.json();
return json.pageProps.mon;
}
const tbs = JSON.parse(sessionStorage.getItem("team-build-store"));
const team = tbs.state;
team.badge = ${Formation.sanbonBadgeMap.find(_badge=>_badge.pdf === badge)?.sanbon ?? badge};`];
const _members = {};
for (let i = 0; i < members.length; i++) {
const m = members[i], a = assists[i];
const _m = {
num: m.id,
level: m.level,
superAwoken: m.sawoken ?? 0,
latentAwokens: m.latent.concat().sort((a, b) => latentUseHole(b) - latentUseHole(a)),
awokenCount: m.awoken,
hpPlus: m.plus[0],
atkPlus: m.plus[1],
rcvPlus: m.plus[2],
assistNum: a.id,
assistLevel: a.level,
assistPlus: a?.plus?.every(p=>p>=99) ?? false,
// flattened: cardFlattened(m.card),
// assistFlattened: cardFlattened(a.card),
flattened: `(await fetchFlattened(${m.id}))`,
assistFlattened: `(await fetchFlattened(${a.id}))`,
}
_members[i] = _m;
}
scriptLines.push(`\tteam.members = ${JSON.stringify(_members,null,'\t').replace(/"(\(await fetchFlattened\(\d+\)\))"/igm, "$1")}`);
scriptLines.push(`\tsessionStorage.setItem("team-build-store", JSON.stringify(tbs));
\tlocation.reload();
})();`);
return scriptLines.join('\n');
};
//sanbon的徽章对应数字
Formation.sanbonBadgeMap = [
{pdf:22,sanbon:15}, //除武器,全抗性(耐)
{pdf:23,sanbon:16}, //除武器10SB(S+×5)
{pdf:24,sanbon:20}, //合作,英雄学院
{pdf:25,sanbon:23}, //官桶,画师
{pdf:26,sanbon:22}, //合作,高达
{pdf:27,sanbon:24}, //转生成为史莱姆
{pdf:28,sanbon:25}, //电击文库Index
{pdf:29,sanbon:26}, //奥特曼
{pdf:PAD_PASS_BADGE,sanbon:1}, //月卡
];
Formation.prototype.getSanbonQrObj = function()
{
//sanbon目前只支持单人队伍
const [members,assists,badge] = this.teams[0];
const obj = {
region: sanbonTranslateRegion(currentDataSource.code),
title: this.title ?? "",
content: this.detail ?? "",
//mons: assists.map(m=>m.id).concat(members.map(m=>m.id)),
data: {
badge: Formation.sanbonBadgeMap.find(_badge=>_badge.pdf === badge)?.sanbon ?? badge,
members: {}, //等待下面处理
},
};
for (let i = 0; i < members.length; i++) {
const m = members[i], a = assists[i];
const _m = {
num: m.id,
level: m.level,
superAwoken: m.sawoken ?? 0,
latentAwokens: m.latent.concat().sort((a, b) => latentUseHole(b) - latentUseHole(a)),
awokenCount: m.awoken,
hpPlus: m.plus[0],
atkPlus: m.plus[1],
rcvPlus: m.plus[2],
assistNum: a.id,
assistLevel: a.level,
assistPlus: a?.plus?.every(p=>p>=99) ?? false,
}
obj.data.members[i] = _m;
}
return obj;
};
//daddb的徽章对应数字
Formation.daddbBadgeMap = [
@ -2463,30 +2348,6 @@ async function inputFromQrString(string)
qrObj.paddbId = obj._id;
return qrObjToUrl(qrObj);
}
function sanbonObjToURL(obj, region) {
const newFotmation = sanbonFotmationToPdfFotmation(obj);
const qrObj = newFotmation.getPdfQrObj(false);
if (region == undefined) {
console.debug("从sanbon json数据中获取数据区域");
region = obj.pageProps.members["0"].flattened.region;
}
switch (region) {
case "kr": {
qrObj.s = "ko";
break;
}
case "na": {
qrObj.s = "en";
break;
}
case "jp":
default: {
qrObj.s = "ja";
break;
}
}
return qrObjToUrl(qrObj);
}
//JSON 类
if (string.startsWith("{") && string.endsWith("}"))
{ //生成的二维码
@ -2501,10 +2362,6 @@ async function inputFromQrString(string)
re.type = "PADDB";
re.url = paddbObjToURL(obj)
}
else if ("__N_SSG" in obj) { //SANBON的对象格式
re.type = "SANBON";
re.url = sanbonObjToURL(obj)
}
else if (Array.isArray(obj?.staffs)) { //DADDB的对象格式
re.type = "DADDB";
const newFotmation = daddbFotmationToPdfFotmation(obj);
@ -2540,55 +2397,6 @@ async function inputFromQrString(string)
//re.message = "错误的 网址 格式 | The illegal URL format";
}
}
//sanbon.me 的网址格式之后要调用脚本功能获取跨域JSON
else if(url.host == "sanbon.me" && url.pathname.includes(paddbPathPrefix)) {
const teamId = url.pathname.substring(url.pathname.indexOf(paddbPathPrefix) + paddbPathPrefix.length);
re.type = "SANBON";
const txtStringInput = document.body.querySelector("#qr-code-frame .action-button-box .string-input"); //输入的字符串
const btnExternalSupport = document.body.querySelector("#external-support");
if (btnExternalSupport?.asyncGM_xmlhttpRequest) {
//获取 sanbon.me 的 buildId
const mainpageResponse = await btnExternalSupport.asyncGM_xmlhttpRequest({
method: "GET",
url: "https://sanbon.me/",
});
const domParser = new DOMParser();
const sanbonMainpage = domParser.parseFromString(mainpageResponse.response, "text/html");
const __NEXT_DATA__ = sanbonMainpage.getElementById("__NEXT_DATA__");
const __NEXT_DATA__JSON = JSON.parse(__NEXT_DATA__.innerHTML);
const buildId = __NEXT_DATA__JSON.buildId;
console.debug("sanbon.me 网站当前的框架 buildId 是 %s",buildId);
//获取队伍数据的访问链接
const langString = url.pathname.substring(1, url.pathname.indexOf(paddbPathPrefix));
const langReg = /(?:\w{2}\-)?(\w{2})$/i.exec(langString); //实际上只会有(en|ja|ko)\-(jp|na|kr)
const lang_region = langReg[1];
const dataUrl = new URL("https://sanbon.me/");
dataUrl.pathname = `/_next/data/${buildId}/${lang_region}/team/${teamId}.json`;
dataUrl.searchParams.set("lang_region", lang_region);
dataUrl.searchParams.set("code", teamId);
console.debug("当前的 sanbon.me 队伍数据链接是 %o",dataUrl);
const options = {
method: "GET",
url: dataUrl,
};
const response = await btnExternalSupport.asyncGM_xmlhttpRequest(options);
try{
let obj = JSON.parse(txtStringInput.value = response.response);
re.url = sanbonObjToURL(obj, lang_region);
} catch(error) {
console.error(error);
re.error = ERROR_illegal_JSON_format;
}
} else {
re.error = ERROR_Unsupported_format;
re.message = localTranslating.link_read_message.need_user_script;
re.url = ExternalLinkScriptURL;
re.urlName = localTranslating.link_read_message.user_script_link;
}
}
//PADDB 的网址格式之后要调用脚本功能获取跨域JSON
else if(url.host == "paddb.net" && url.pathname.startsWith(paddbPathPrefix)) {
const teamId = url.pathname.substring(url.pathname.indexOf(paddbPathPrefix) + paddbPathPrefix.length);
@ -2779,35 +2587,6 @@ function paddbFotmationToPdfFotmation(obj)
}
return f;
}
//解析sanbon.me的数据
function sanbonFotmationToPdfFotmation(obj)
{
const team = obj.pageProps;
const f = new Formation(1, 6);
f.title = team.title;
f.detail = team.content;
const t = f.teams[0];
//队伍徽章
t[2] = Formation.sanbonBadgeMap.find(badge=>badge.sanbon === team.badge)?.pdf ?? team.badge;
const members = t[0], assists = t[1];
for (let i = 0; i< members.length; i++) {
const m = members[i], a = assists[i], dm = team.members[i];
if (dm) {
m.id = dm.num;
m.level = dm.level;
m.plus = [dm.hpPlus, dm.atkPlus, dm.rcvPlus];
m.awoken = dm.awokenCount;
m.sawoken = dm.superAwoken;
m.latent = dm.latentAwokens;
a.id = dm.assistNum;
a.awoken = Cards[a.id].awakenings.length;
a.plus = dm.assistPlus ? [99,99,99]:[0,0,0];
a.level = dm.assistLevel;
}
}
return f;
}
//解析DADDB的数据
function daddbFotmationToPdfFotmation(obj)
{
@ -2996,10 +2775,6 @@ function initialize() {
let qrTypeRadio = qrSaveBox.qrDataType.find(radio=>radio.checked);
if (qrTypeRadio) qrTypeRadio.onclick(); //打开二维码窗口就先产生二维码
//生成sanbon v1链接
qrCodeFrame.querySelector("#sanbon-v2-link").href = `https://sanbon.me/${sanbonTranslateRegion(currentDataSource.code)}/team-builder`;
qrCodeFrame.querySelector("#sanbon-v2-script").value = formation.getSanbonV2Script();
};
qrCodeFrame.hide = function(){qrcodeReader.reset();};
@ -3350,52 +3125,6 @@ function initialize() {
}
this.disabled = false;
}
//sanbon.me数据上传
//const sanbonTeamEdit = qrContent.querySelector(".sanbon-team-edit");
const sanbonTeamId = document.querySelector("#sanbon-team-id");
const sanbonSaveOrUpload = document.querySelector("#sanbon-save-or-upload-team");
sanbonSaveOrUpload.onclick = async function(){
this.disabled = true;
if (!btnExternalSupport?.asyncGM_xmlhttpRequest) {
alert(localTranslating.link_read_message.need_user_script);
return;
}
let obj = formation.getSanbonQrObj();
let postBody = JSON.stringify(obj);
const options = {
method: "POST",
url: `https://sanbon.me/api/upload-team-v2`,
data: postBody,
headers: {
"Origin": "https://sanbon.me",
"Referer": `https://sanbon.me/${sanbonTranslateRegion(currentDataSource.code)}/team-builder/upload`,
"Content-Type": "application/json",
//如果只有ascii字符可以用postBody.length
"Content-Length": new Blob([postBody], {type: "application/json"}).size,
}
};
const response = await btnExternalSupport.asyncGM_xmlhttpRequest(options);
if (response.status === 401) {
alert(localTranslating.link_read_message.paddb_unauthorized);
} else if (response.status === 200) {
try {
const result = JSON.parse(response.response);
console.debug("sanbon 数据上传返回结果:%o",result);
if (result.success) {
sanbonTeamId.value = `https://sanbon.me/${sanbonTranslateRegion(currentDataSource.code)}/team/${result.code}`;
alert(localTranslating.link_read_message.paddb_success);
} else {
alert(result.message);
}
} catch(e) {
alert(localTranslating.link_read_message.error[3]);
}
} else {
alert(localTranslating.link_read_message.error[0]);
}
this.disabled = false;
}
const playerDataFrame = document.body.querySelector("#player-data-frame");
const btnPlayerData = controlBox.querySelector(`.btn-player-data`);

View File

@ -6067,7 +6067,7 @@ const cachesMap = new Map([
],
[
"sound/voice/ja/padv2191.wav",
"143e052f3c15efaadaf7eaae277c68e7"
"d07c2fc9a621d4345c053f3d2187a937"
],
[
"sound/voice/ja/padv2192.wav",
@ -29491,7 +29491,7 @@ const cachesMap = new Map([
],
[
"multi.html",
"06dfac154d6c8a3fdece2e5695481b03"
"98b39e54a83572b1f4152ecf70053d88"
],
[
"script-custom_elements.js",
@ -29511,11 +29511,11 @@ const cachesMap = new Map([
],
[
"script.js",
"6e067dad55c4c110450cd0f1fd32cfef"
"b450f4ce283c8802f6e418a72d0fdc39"
],
[
"solo.html",
"3b38841a6ed0189065986db5d40f5e03"
"e5a78c6b958828400095edd5a419f692"
],
[
"style-monsterimages.css",
@ -29523,7 +29523,7 @@ const cachesMap = new Map([
],
[
"style.css",
"dfdca9305210f9a8d9dde03855a51650"
"34ab62d874338ceb3ca3d4f6b38b4b26"
],
[
"temp.js",
@ -29531,7 +29531,7 @@ const cachesMap = new Map([
],
[
"triple.html",
"5c09b746fcb677cb0a468333d1ea4891"
"9fb90a3dfa2f1a30cb961425ecf489e5"
],
[
"languages/en.css",
@ -29867,7 +29867,7 @@ const cachesMap = new Map([
],
[
"doc/images/bluestacks-vhd-mount-vhd-failed.webp",
"e41f2de6990b34ae7995a5acb0e3ea0c"
"7941862be127cb177b86ea4cc2877134"
],
[
"doc/images/bluestacks-vhd-open-disk-management.webp",

View File

@ -1255,21 +1255,6 @@ const teamsCount = 1;
<div class="qr-box"><img class="qr-code-image" /></div>
<a download="" class="save-qr-img brown-button fa"><!--保存QR 图片--></a>
</div>
<div class="sanbon-team-edit">
<!--<div class="user">
<label for="sanbon-username"></label><input id="sanbon-username" type="text" placeholder="ID (2~12)">
<label for="sanbon-password"></label><input id="sanbon-password" type="password" placeholder="password (4~20)">
</div>-->
<div class="action">
<label for="sanbon-team-id"></label><input id="sanbon-team-id" type="text" placeholder="Team URL" readonly>
<button id="sanbon-save-or-upload-team" class="brown-button"></button>
</div>
</div>
<div class="sanbon-transfer">
<div class="sanbon-v2">
<label for="sanbon-v2-script"><a id="sanbon-v2-link" href="https://sanbon.me/v2/en-jp/team-builder" target="_blank">Sanbon Team Builder</a> JavaScript (Test function, paste in Browser Console | 测试功能,粘贴到浏览器控制台)</label><br><textarea id="sanbon-v2-script"></textarea>
</div>
</div>
<div class="paddb-team-edit">
<div class="user">
<label for="paddb-username"></label><input id="paddb-username" type="text" placeholder="ID (2~12)">

View File

@ -3653,47 +3653,28 @@ body:not(.external-link-support) #external-support::before
{
padding-bottom: 10px;
}
#qr-code-frame #sanbon-v2-script
{
width: calc(100% - 20px);
height: 4em;
resize: vertical;
}
#qr-code-frame :where(
.read-qr-box,
.save-qr-box,
.paddb-team-edit,
.sanbon-transfer,
.sanbon-team-edit,
.paddb-team-edit
)::before {
display: block;
text-align: left;
}
body:not(.solo.external-link-support) :where(
.paddb-team-edit,
.sanbon-team-edit,
.paddb-team-edit
) {
/*没有装插件的不显示PADDB上传功能*/
display: none;
}
body.external-link-support .sanbon-transfer {
/*装了插件的不显示sanbon测试功能*/
display: none;
}
body.external-link-support #external-support{
/*装了插件的不显示请求装插件的消息*/
display: none;
}
#paddb-team-id,
#sanbon-team-id {
#paddb-team-id{
width: 350px;
}
.sanbon-transfer::before
{
content: "Sanbon.me(Defective test functionality)";
}
.qr-data-type-ul {
display: flex;

View File

@ -2199,21 +2199,6 @@ const teamsCount = 3;
<div class="qr-box"><img class="qr-code-image" /></div>
<a download="" class="save-qr-img brown-button fa"><!--保存QR 图片--></a>
</div>
<div class="sanbon-team-edit">
<!--<div class="user">
<label for="sanbon-username"></label><input id="sanbon-username" type="text" placeholder="ID (2~12)">
<label for="sanbon-password"></label><input id="sanbon-password" type="password" placeholder="password (4~20)">
</div>-->
<div class="action">
<label for="sanbon-team-id"></label><input id="sanbon-team-id" type="text" placeholder="Team URL" readonly>
<button id="sanbon-save-or-upload-team" class="brown-button"></button>
</div>
</div>
<div class="sanbon-transfer">
<div class="sanbon-v2">
<label for="sanbon-v2-script"><a id="sanbon-v2-link" href="https://sanbon.me/v2/en-jp/team-builder" target="_blank">Sanbon Team Builder</a> JavaScript (Test function, paste in Browser Console | 测试功能,粘贴到浏览器控制台)</label><br><textarea id="sanbon-v2-script"></textarea>
</div>
</div>
<div class="paddb-team-edit">
<div class="user">
<label for="paddb-username"></label><input id="paddb-username" type="text" placeholder="ID (2~12)">