// ==UserScript==
// @name 300战绩查询
// @namespace http://tampermonkey.net/
// @version 0.1
// @description 300战绩查询优化
// @author apades
// @match https://300report.jumpw.com/*
// @icon https://www.google.com/s2/favicons?domain=jumpw.com
// @grant GM_setValue
// @grant GM_getValue
// ==/UserScript==
;(async () => {
const baseAvatarUrl = 'https://300report.jumpw.com/list.html?name='
const baseMatchUrl = 'https://300report.jumpw.com/match.html'
const baseImgUrl = `https://300report.jumpw.com/static/images/`
const api_matchUrl = 'https://300report.jumpw.com/api/getmatch?id='
const GenMatchTemplate = (data) => {
let {
avatarUrl,
avatarName,
side,
destory,
kd,
kill,
money,
score,
skill,
equips,
isWin,
scoreStatus,
} = data
return `
<td>
<img src="${avatarUrl}" alt="" height="48" width="48">
</td>
<td>
${avatarName}<br>
上把<span style="color: ${side ? '#fff' : '#db000e'};">${
side ? '队友' : '对面'
}</span>
</td>
<td>
${kd}
</td>
<td>
${isWin ? '胜利' : '失败'}
</td>
<td>
${destory}
</td>
<td>
${kill}
</td>
<td>
${money}
</td>
<td>
${score}
</td>
<td>
${skill.reduce(
(all, sk) => all + `<img src="${sk}" alt="" height="32" width="32">`,
''
)}
</td>
<td>
${equips.reduce(
(all, eq) => all + `<img src="${eq}" alt="" height="32" width="32">`,
''
)}
</td>
<td style="color: ${
(scoreStatus === '牛逼' && '#29c124') ||
(scoreStatus === '拉跨' && '#db000e') ||
'#fff'
};">
${scoreStatus}
</td>
`
}
let $$ = (query) => [...document.querySelectorAll(query)]
let isUrl = (baseUrl) => location.href.indexOf(baseUrl) === 0
const req = (...args) =>
new Promise((resolve) =>
fetch(...args)
.then((res) => res.json())
.then((res) => {
resolve(res)
})
)
// let $ = document.querySelectorAll
/**@type {{ mid:string,isWin:boolean}[]} */
let midList = GM_getValue('midList') || []
if (midList) {
midList = JSON.parse(midList)
}
if (isUrl(baseMatchUrl)) {
let mid = new URLSearchParams(location.search).get('id')
let aElList = $$('td a')
// - 覆盖css
let cssEl = document.createElement('style')
cssEl.textContent = `#com .divbd_c .list_bx{
width:auto;
}`
document.head.appendChild(cssEl)
// - header加上团分项
let headerElList = $$('tbody > tr:nth-child(1)')
headerElList.forEach((el) => {
let toAddEl = document.createElement('th')
toAddEl.textContent = '团分'
el.appendChild(toAddEl)
})
let nowMatchIndex = midList.findIndex((m) => m.mid === mid)
let nowMatch = midList[nowMatchIndex],
nowMatchData = await req(api_matchUrl + nowMatch.mid),
nowMatchDataMap = {}
// - 生成这一把数据map
if (nowMatchData) {
let wmax = 0,
wmin = 0,
wmaxData,
wminData
nowMatchData.Match.WinSide.forEach((roleData) => {
roleData.isWin = true
nowMatchDataMap[roleData.RoleName] = roleData
let score = roleData.KDA
if (score > wmax) {
wmax = score
wmaxData = roleData
}
if (score < wmin) {
wmin = score
wminData = roleData
}
})
wmaxData && (wmaxData.scoreStatus = '牛逼')
wminData && (wminData.scoreStatus = '拉跨')
let lmax = 0,
lmin = 0,
lmaxData,
lminData
nowMatchData.Match.LoseSide.forEach((roleData) => {
roleData.isWin = false
nowMatchDataMap[roleData.RoleName] = roleData
let score = roleData.KDA
if (score > lmax) {
lmax = score
lmaxData = roleData
}
if (score < lmin) {
lmin = score
lminData = roleData
}
})
}
let preMatch = midList[nowMatchIndex + 1]
let preMatchData,
preMatchDataMap = {}
// - 生成上一把数据map
if (preMatch) {
preMatchData = await req(api_matchUrl + preMatch.mid)
let wmax = 0,
wmin = 0,
wmaxData,
wminData
preMatchData.Match.WinSide.forEach((roleData) => {
roleData.isWin = true
preMatchDataMap[roleData.RoleName] = roleData
let score = roleData.KDA
if (score > wmax) {
wmax = score
wmaxData = roleData
}
if (score < wmin) {
wmin = score
wminData = roleData
}
})
wmaxData && (wmaxData.scoreStatus = '牛逼')
wminData && (wminData.scoreStatus = '拉跨')
let lmax = 0,
lmin = 0,
lmaxData,
lminData
preMatchData.Match.LoseSide.forEach((roleData) => {
roleData.isWin = false
preMatchDataMap[roleData.RoleName] = roleData
let score = roleData.KDA
if (score > lmax) {
lmax = score
lmaxData = roleData
}
if (score < lmin) {
lmin = score
lminData = roleData
}
})
lmaxData && (lmaxData.scoreStatus = '牛逼')
lminData && (lminData.scoreStatus = '拉跨')
}
let avatarList = aElList.map((el) => {
let containerEl = el.parentElement.parentElement
let url = decodeURI(el.href)
let name = url.replace(baseAvatarUrl, '')
let match = new RegExp(`${name[0]}.*${name[name.length - 1]}`)
el.innerHTML = el.innerHTML.replace(match, name)
let tScore = nowMatchDataMap[name].ELO
let tScoreEl = document.createElement('td')
tScoreEl.textContent = tScore
containerEl.appendChild(tScoreEl)
// 上一把数据
if (preMatchData && preMatchDataMap[name]) {
let roleData = preMatchDataMap[name]
let toAddEl = document.createElement('tr')
toAddEl.style = 'border:1px solid #0072ff;'
let innerHTML = GenMatchTemplate({
avatarName: roleData.Hero.Name,
avatarUrl: baseImgUrl + roleData.Hero.IconFile,
destory: roleData.TowerDestroy,
kill: roleData.KillUnitCount,
equips: roleData.Equip.map((eq) => baseImgUrl + eq.IconFile),
kd: `${roleData.KillCount}/${roleData.DeathCount}/${roleData.AssistCount}`,
money: roleData.TotalMoney,
score: roleData.KDA,
side: preMatch.isWin === roleData.isWin,
skill: roleData.Skill.map((eq) => baseImgUrl + eq.IconFile),
isWin: roleData.isWin,
scoreStatus: roleData.scoreStatus || '普通',
})
toAddEl.innerHTML = innerHTML
containerEl.insertAdjacentElement('afterend', toAddEl)
}
return {
name,
}
})
}
if (isUrl(baseAvatarUrl)) {
let list = $$('table:last-of-type tr[onclick]')
let midList = list.map((el) => {
let onclickScript = el.getAttribute('onclick')
let reg = /match\.html\?id=(.*?)'/
let mid = onclickScript.match(reg)[1],
isWin = el.children[2].textContent === '胜利'
return {
mid,
isWin,
}
})
GM_setValue('midList', JSON.stringify(midList))
}
})()