PADDB相关功能先决定为现在的UI

This commit is contained in:
枫谷剑仙 2023-01-28 21:40:20 +08:00
parent 9e8adfdb71
commit 1961680cf0
8 changed files with 171 additions and 62 deletions

View File

@ -3,17 +3,18 @@
{name: "Optional chaining (?.) / 可选链操作符(?.)", version:{firefox:74,chrome:80,safari:13.4}, url: "https://caniuse.com/mdn-javascript_operators_optional_chaining", test: ()=>Boolean(eval("undefined?.undefined || true"))},
{name: "Nullish coalescing operator (??) / 空值合并操作符(??)", version:{firefox:72,chrome:80,safari:13.4}, url: "https://caniuse.com/mdn-javascript_operators_nullish_coalescing", test: ()=>Boolean(eval("undefined ?? true"))},
{name: "BigInt value (1n) / BigInt 数据类型(1n)", version:{firefox:79,chrome:67,safari:14}, url: "https://caniuse.com/bigint", test: ()=>Boolean(eval("1n"))},
{name: "CSS selector: :is() / CSS选择器: :is()", version:{firefox:78,chrome:88,safari:14}, url: "https://caniuse.com/css-matches-pseudo", test: ()=>Boolean(eval("document.querySelector(':is()') || true"))},
{name: "CSS selector: :where() / CSS选择器: :where()", version:{firefox:78,chrome:88,safari:14}, url: "https://caniuse.com/mdn-css_selectors_where", test: ()=>Boolean(eval("document.querySelector(':where()') || true"))},
// {name: "CSS selector: :is() / CSS选择器: :is()", version:{firefox:78,chrome:88,safari:14}, url: "https://caniuse.com/css-matches-pseudo", test: ()=>Boolean(eval("document.querySelector(':is()') || true"))},
// {name: "CSS selector: :where() / CSS选择器: :where()", version:{firefox:78,chrome:88,safari:14}, url: "https://caniuse.com/mdn-css_selectors_where", test: ()=>Boolean(eval("document.querySelector(':where()') || true"))},
{name: "CSS selector: :not() / CSS选择器: :not()", version:{firefox:84,chrome:88,safari:9}, url: "https://caniuse.com/css-not-sel-list", test: ()=>Boolean(eval("document.querySelector(':not(html)') || true"))},
//{name: "Private class fields (#name) / 类私有域(#name)", version:{firefox:90,chrome:74,safari:14.5}, url: "https://caniuse.com/mdn-javascript_classes_private_class_fields", test: ()=>Boolean(eval("class test {#v = 0;}; true;"))},
//{name: "Dialog element / Dialog 元素", version:{firefox:98,chrome:37,safari:15.4}, url: "https://caniuse.com/dialog", test: ()=>Boolean(eval("HTMLDialogElement"))},
// {name: "Private class fields (#name) / 类私有域(#name)", version:{firefox:90,chrome:74,safari:14.5}, url: "https://caniuse.com/mdn-javascript_classes_private_class_fields", test: ()=>Boolean(eval("class test {#v = 0;}; true;"))},
// {name: "Dialog element / Dialog 元素", version:{firefox:98,chrome:37,safari:15.4}, url: "https://caniuse.com/dialog", test: ()=>Boolean(eval("HTMLDialogElement"))},
]
return features.filter(feature=>{
try {
return !feature.test();
} catch (e) {
if (e.name !== 'SyntaxError') throw e // Throw the error if it is not a SyntaxError
if (e.name !== 'SyntaxError')
console.error(e);
return true;
}
})

View File

@ -4,7 +4,7 @@
// @name:zh-HK 龍圖急速陣型鏈接助手
// @name:zh-TW 龍圖急速陣型鏈接助手
// @namespace http://www.mapaler.com/
// @version 1.0.1
// @version 1.0.2
// @description Helps obtain team data from external cross-domain servers such as PADDB
// @description:zh-CN 帮助获取 PADDB 等外部跨域服务器的队伍分享数据
// @description:zh-HK 幫助獲取 PADDB 等外部跨域服務器的隊伍分享數據
@ -25,18 +25,14 @@
(function() {
'use strict';
if (GM?.xmlHttpRequest) { //For Greasemonkey 4.x
window.GM_xmlhttpRequest = GM.xmlHttpRequest;
window["GM_xmlhttpRequest"] = GM.xmlHttpRequest;
}
const qrDialog = document.querySelector("#qr-code-frame");
const actionButtonBox = qrDialog.querySelector(".action-button-box");
const txtStringInput = actionButtonBox.querySelector(".string-input"); //输入的字符串
const btnReadString = actionButtonBox.querySelector(".read-string"); //读取字符串按钮
document.body.classList.add("external-link-support");
//新增的按钮
const btnReadExternalLink = actionButtonBox.appendChild(document.createElement("button"));
btnReadExternalLink.className = "read-external-link brown-button";
async function pGM_xmlhttpRequest(options) {
const btnExternalSupport = document.querySelector("#external-support");
if (!btnExternalSupport) return;
btnExternalSupport.GM_xmlhttpRequest = GM_xmlhttpRequest;
btnExternalSupport.asyncGM_xmlhttpRequest = async function(options) {
return new Promise(function(resolve, reject) {
options.onload = function(response) {
resolve(response);
@ -47,33 +43,4 @@
GM_xmlhttpRequest(options);
});
}
btnReadExternalLink.readExternalLink = async function(urlStr) {
const url = new URL(urlStr);
const paddbPathPrefix = "/team/";
if (url.host == "paddb.net" && url.pathname.startsWith(paddbPathPrefix)) {
const teamId = url.pathname.substring(url.pathname.indexOf(paddbPathPrefix) + paddbPathPrefix.length),
postBody = JSON.stringify({id: teamId});
const options = {
method: "POST",
url: `https://api2.paddb.net/getTeam`,
data: postBody,
headers: {
"Content-Type": "application/json",
"User-Agent": "okhttp/4.9.2",
"Content-Length": postBody.length,
}
};
return pGM_xmlhttpRequest(options);
} else {
return false;
}
}
btnReadExternalLink.onclick = function(){
const request = this.readExternalLink(txtStringInput.value);
request?.then(response=>{
txtStringInput.value = response.response;
btnReadString.click();
});
}
actionButtonBox.appendChild(btnReadExternalLink);
})();

View File

@ -514,7 +514,7 @@ label[for="box-have"]::after
}
.control-box .btn-qrcode::before{
content: "\f029 二维码";
content: "\f029 二维码 和 \f0ec 数据交换";
}
.read-qr-box::before
@ -556,6 +556,34 @@ label[for="sourceSelect"]::before
{
content: "\f1c5 读取二维码图片";
}
#qr-code-frame .paddb-team-edit::before
{
content: "将队伍数据上传至 PADDB";
}
label[for="paddb-username"]::before
{
content: "PADDB 用户名:";
}
label[for="paddb-password"]::before
{
content: "PADDB 密码:";
}
label[for="paddb-team-id"]::before
{
content: "PADDB 队伍 ID";
}
#paddb-save-or-upload-team::before
{
content: "保存";
}
#paddb-team-id:placeholder-shown+#paddb-save-or-upload-team::before {
content: "上传新队伍";
}
body:not(.external-link-support) #external-support::before
{
content: "\f552 安装辅助脚本以使用 PADDB 相关功能";
}
#qr-code-frame .read-external-link::before
{
content: "\f0c1 解析 PADDB 链接";

View File

@ -1325,6 +1325,7 @@ var formation = new Formation(teamsCount,5);
</svg>
<div id="qr-code-frame" class="mask display-none">
<button class="mask-close brown-button"></button>
<button id="external-support" class="brown-button"></button>
<div class="mask-content">
<div class="read-qr-box">
<div class="action-button-box">
@ -1354,6 +1355,16 @@ var formation = new Formation(teamsCount,5);
<div class="qr-box"><img class="qr-code-image" /></div>
<a download="" class="save-qr-img brown-button"><!--保存QR 图片--></a>
</div>
<div class="paddb-team-edit">
<div class="user">
<label for="paddb-username"></label><input id="paddb-username" type="text" placeholder="ID (2~12)">
<label for="paddb-password"></label><input id="paddb-password" type="password" placeholder="password (4~20)">
</div>
<div class="action">
<label for="paddb-team-id"></label><input id="paddb-team-id" type="text" placeholder="Team ID">
<button id="paddb-save-or-upload-team" class="brown-button"></button>
</div>
</div>
</div>
</div>

View File

@ -26,6 +26,8 @@ const className_displayNone = "display-none";
const dataAttrName = "data-value"; //用于储存默认数据的属性名
const isGuideMod = !unsupportFeatures.length && Boolean(Number(getQueryString("guide"))); //是否以图鉴模式启动
const PAD_PASS_BADGE = 1<<7 | 1; //月卡徽章编号129
//用油猴扩展装上把GM_xmlhttpRequest引入的脚本
const ExternalLinkScriptURL = "https://greasyfork.org/scripts/458521";
if (location.search.includes('&amp;')) {
location.search = location.search.replace(/&amp;/ig, '&');
@ -1425,7 +1427,7 @@ function creatNewUrl(arg) {
}
}
function ObjToUrl(obj)
function qrObjToUrl(obj)
{
let fileName;
switch (obj.d.f.length)
@ -1445,6 +1447,7 @@ function ObjToUrl(obj)
}
const newUrl = new URL(fileName, location);
newUrl.searchParams.set("d",JSON.stringify(obj.d));
//数据服版本
if (!obj.s || obj.s == "ja")
{
newUrl.searchParams.delete("s");
@ -1452,11 +1455,17 @@ function ObjToUrl(obj)
{
newUrl.searchParams.set("s", obj.s);
}
//保持当前的语言
let l = getQueryString("l");
if (l)
{
newUrl.searchParams.set("l", l);
}
//数据服版本
if (obj.paddbId)
{
newUrl.searchParams.set("_id", obj.paddbId);
}
return newUrl;
}
//解析从QR图里获取的字符串
@ -1467,7 +1476,7 @@ async function inputFromQrString(string)
ERROR_No_formation_data = 2,
ERROR_illegal_JSON_format = 3,
ERROR_illegal_URL_format = 4;
//code 1~99 为各种编码
//JSON 类
if (string[0] === "{" && string[string.length-1] === "}")
{ //生成的二维码
try{
@ -1475,12 +1484,14 @@ async function inputFromQrString(string)
if (typeof obj?.d == "object") { //PADDF的对象格式
re.type = "PADDF";
//re.message = "发现队伍数据 | Formation data founded";
re.url = ObjToUrl(obj);
re.url = qrObjToUrl(obj);
}
else if (typeof obj?.team == "string" && obj.team[0] === "{" && obj.team[obj.team.length-1] === "}") { //PADDB的对象格式
re.type = "PADDB";
const newFotmation = paddbFotmationToPdfFotmation(obj);
re.url = ObjToUrl(newFotmation.getPdfQrObj(false));
const qrObj = newFotmation.getPdfQrObj(false);
qrObj.paddbId = obj._id;
re.url = qrObjToUrl(qrObj);
}
else {
re.error = ERROR_No_formation_data;
@ -1492,6 +1503,7 @@ async function inputFromQrString(string)
//re.message = "错误的 JSON 格式 | The illegal JSON format";
}
}
//URL 类
else if (/^(https?|file):\/\//i.test(string))
{ //网址二维码
let url = new URL(string);
@ -1503,7 +1515,7 @@ async function inputFromQrString(string)
}
re.type = "PADDF";
//re.message = "发现队伍数据 | Formation data founded";
re.url = ObjToUrl(obj);
re.url = qrObjToUrl(obj);
} catch(error) {
console.error(error);
re.error = ERROR_illegal_URL_format;
@ -1516,16 +1528,18 @@ async function inputFromQrString(string)
//re.message = "发现 PADDB 网址 | PADDB URL found";
const qrDialog = document.querySelector("#qr-code-frame");
const actionButtonBox = qrDialog.querySelector(".action-button-box");
//const txtStringInput = actionButtonBox.querySelector(".string-input"); //输入的字符串
const txtStringInput = actionButtonBox.querySelector(".string-input"); //输入的字符串
//const btnReadString = actionButtonBox.querySelector(".read-string"); //读取字符串按钮
const btnReadExternalLink = actionButtonBox.querySelector(".read-external-link");
if (btnReadExternalLink?.readExternalLink) {
const request = btnReadExternalLink.readExternalLink(string);
const response = await request;
try{
let obj = JSON.parse(response.response);
let obj = JSON.parse(txtStringInput.value = response.response);
const newFotmation = paddbFotmationToPdfFotmation(obj);
re.url = ObjToUrl(newFotmation.getPdfQrObj(false));
const qrObj = newFotmation.getPdfQrObj(false);
qrObj.paddbId = obj._id;
re.url = qrObjToUrl(qrObj);
} catch(error) {
console.error(error);
re.error = ERROR_illegal_JSON_format;
@ -1533,7 +1547,7 @@ async function inputFromQrString(string)
} else {
re.error = ERROR_Unsupported_format;
re.message = localTranslating.link_read_message.need_user_script;
re.url = "https://greasyfork.org/scripts/458521";
re.url = ExternalLinkScriptURL;
re.urlName = localTranslating.link_read_message.user_script_link;
}
}
@ -1542,19 +1556,61 @@ async function inputFromQrString(string)
//re.message = "无队伍数据 | No formation data";
}
}
//PDC
else if(/^\d[\d\-\w,\]}]+}/.test(string))
{ //PDC
{
re.type = "PDC";
//re.message = "发现 PDC 格式 | PDC format found";
const newFotmation = pdcFotmationToPdfFotmation(string);
re.url = ObjToUrl(newFotmation.getPdfQrObj(false));
re.url = qrObjToUrl(newFotmation.getPdfQrObj(false));
}
// //快速输入类,仅为评估支持
// else if(/^>\s\d+(?:|\d+)?(?:,\s*\d+(?:|\d+)?)*\s*$/.test(string))
// {
// re.type = "FastInput";
// const newFotmation = FastInputToPdfFotmation(string);
// re.url = qrObjToUrl(newFotmation.getPdfQrObj(false));
// }
else
{
re.error = ERROR_Unsupported_format;
//re.message = "不支持的格式 | Unsupported format";
}
return re;
// //解析PADDB的数据
// function FastInputToPdfFotmation(string)
// {
// let str = string.replace(/^>\s/,'');
// let teams = str.split(/\s*,\s*/);
// const team = JSON.parse(obj.team);
// console.log(team);
// const f = new Formation(1, 6);
// f.title = team.name;
// f.detail = team.memo;
// const t = f.teams[0];
// //队伍徽章
// t[2] = paddbBadgeMap.find(badge=>badge.paddb === team.badge).pdf;
// const members = t[0], assists = t[1];
// for (let i = 0; i< members.length; i++) {
// const m = members[i], a = assists[i], dm = team.monsters[i], da = team.assists[i];
// if (dm) {
// m.id = dm.transform || dm.num;
// m.level = dm.level;
// m.plus = dm.plus.concat();
// m.awoken = dm.awoken;
// m.sawoken = dm.super_awoken - 2;
// m.latent = dm.latent_awokens.map(paddbLatent=>paddbLatentMap.find(latent=>latent.paddb === paddbLatent)?.pdf ?? 0);
// m.skilllevel = dm.active_skill_level;
// }
// if (da) {
// a.id = da.num;
// a.level = da.level;
// a.plus = da.plus ? [99,99,99]:[0,0,0];
// a.skilllevel = da.active_skill_level;
// }
// }
// return f;
// }
}
//解析PDC的数据
@ -1852,7 +1908,6 @@ function initialize() {
qrReadBox.sourceSelect = qrReadBox.querySelector("#sourceSelect");
qrReadBox.qrStr = qrReadBox.querySelector(".string-input");
qrReadBox.info.show = function(message, code = 0, error = false, url="", urlName="") {
qrReadBox.info.message.innerHTML = '';
qrReadBox.info.message.append(message);
qrReadBox.info.code.textContent = code;
@ -2076,6 +2131,16 @@ function initialize() {
console.error(err)
});
}
const paddbTeamEdit = qrContent.querySelector(".paddb-team-edit");
//paddb的用户名和密码
const paddbUsername = paddbTeamEdit.querySelector("#paddb-username");
const paddbPassword = paddbTeamEdit.querySelector("#paddb-password");
paddbUsername.value = localStorage.getItem(cfgPrefix + paddbUsername.id);
paddbPassword.value = localStorage.getItem(cfgPrefix + paddbPassword.id);
paddbUsername.onchange = paddbPassword.onchange = function(e){
if (e) localStorage.setItem(cfgPrefix + this.id, this.value);
}
const playerDataFrame = document.body.querySelector("#player-data-frame");
const btnPlayerData = controlBox.querySelector(`.btn-player-data`);
@ -2195,7 +2260,7 @@ function initialize() {
changeid(deck.members[idx]?.assist ?? {id: 0}, li.querySelector(".monster.assist"));
});
const newFotmation = deck.toFormation();
teamLink.href = ObjToUrl(newFotmation.getPdfQrObj(true));
teamLink.href = qrObjToUrl(newFotmation.getPdfQrObj(true));
}
return clone;
}

View File

@ -1167,6 +1167,7 @@ var formation = new Formation(teamsCount,6);
</svg>
<div id="qr-code-frame" class="mask display-none">
<button class="mask-close brown-button"></button>
<button id="external-support" class="brown-button"></button>
<div class="mask-content">
<div class="read-qr-box">
<div class="action-button-box">
@ -1196,6 +1197,16 @@ var formation = new Formation(teamsCount,6);
<div class="qr-box"><img class="qr-code-image" /></div>
<a download="" class="save-qr-img brown-button"><!--保存QR 图片--></a>
</div>
<div class="paddb-team-edit">
<div class="user">
<label for="paddb-username"></label><input id="paddb-username" type="text" placeholder="ID (2~12)">
<label for="paddb-password"></label><input id="paddb-password" type="password" placeholder="password (4~20)">
</div>
<div class="action">
<label for="paddb-team-id"></label><input id="paddb-team-id" type="text" placeholder="Team ID">
<button id="paddb-save-or-upload-team" class="brown-button"></button>
</div>
</div>
</div>
</div>

View File

@ -1813,7 +1813,7 @@ icon.inflicts::after
.search-box .selected-awokens-div .selected-awokens{
min-height: 32px;
box-sizing: border-box;
width: calc(100% - 90px);
width: calc(100% - 95px);
min-width: 320px;
background-color: #00000044;
border-radius: 6px;
@ -3345,12 +3345,27 @@ table .orb-icon
padding-bottom: 10px;
}
.read-qr-box::before,
.save-qr-box::before
#qr-code-frame .read-qr-box::before,
#qr-code-frame .save-qr-box::before,
#qr-code-frame .paddb-team-edit::before
{
display: block;
text-align: left;
}
body:not(.solo.external-link-support) .paddb-team-edit{
/*没有装插件的不显示PADDB上传功能*/
display: none;
}
body.external-link-support #external-support{
/*装了插件的不显示请求装插件的消息*/
display: none;
}
#qr-code-frame #external-support {
float: right;
}
#paddb-team-id {
width: 200px;
}
.qr-data-type-ul .qr-data-type-radio
{

View File

@ -2227,6 +2227,7 @@ var formation = new Formation(teamsCount,6);
</svg>
<div id="qr-code-frame" class="mask display-none">
<button class="mask-close brown-button"></button>
<button id="external-support" class="brown-button"></button>
<div class="mask-content">
<div class="read-qr-box">
<div class="action-button-box">
@ -2256,6 +2257,16 @@ var formation = new Formation(teamsCount,6);
<div class="qr-box"><img class="qr-code-image" /></div>
<a download="" class="save-qr-img brown-button"><!--保存QR 图片--></a>
</div>
<div class="paddb-team-edit">
<div class="user">
<label for="paddb-username"></label><input id="paddb-username" type="text" placeholder="ID (2~12)">
<label for="paddb-password"></label><input id="paddb-password" type="password" placeholder="password (4~20)">
</div>
<div class="action">
<label for="paddb-team-id"></label><input id="paddb-team-id" type="text" placeholder="Team ID">
<button id="paddb-save-or-upload-team" class="brown-button"></button>
</div>
</div>
</div>
</div>