2023-04-03 18:00:41 +08:00

126 lines
5.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import Alert from "../../class/utils/Alert";
import InfoUtils from "../../class/utils/InfoUtils";
import Log from "../../class/Log";
import Popup from "../../class/utils/Popup";
import { Container } from "../../container/Container";
// 守望者
export default function safeKeeper() {
let infoUtils = Container.factory(InfoUtils);
let url = `https://www.torn.com/loader.php?sid=attackData&mode=json&step=poll&user2ID=`;
let popup = new Popup('<p>监测目标ID玩家的防御状态找出隐身攻击者</p>', '守望者 (测试中)');
let p = document.createElement('p');
let uid: HTMLInputElement = document.createElement('input');
let start = document.createElement('button');
let stop = document.createElement('button');
let self_target = document.createElement('button');
let attackers: MyHTMLElement = document.createElement('div');
attackers.obj = {};
let records: MyHTMLElement = document.createElement('div');
records.list = [];
records.details = {};
// interval loop_id
let loop_id = null;
let updateAttackersDOM = function () {
let html = '进攻者:<br/>';
Object.keys(attackers.obj).forEach(id => html += `[${ id }]<br/>`);
attackers.innerHTML = html;
};
let updateRecordsDOM = function () {
let html = '战斗记录:<br/>';
records.list.forEach(rid => {
let { TimeCreated, attackID, attackerID, attackerItemID, result, text } = records.details[rid];
html += `[${ TimeCreated }] [${ attackerID }] [${ attackerItemID }] ${ result } ${ text }<br/>`;
});
records.innerHTML = html;
};
uid.type = 'text';
uid.placeholder = '目标ID';
start.innerHTML = '开启';
stop.innerHTML = '关闭';
stop.disabled = true;
self_target.innerHTML = '填入自己';
// 弹出窗口关闭时结束
let popup_close = popup.close;
popup.close = () => {
if (loop_id === null) {
popup.close = popup_close;
popup.close();
} else new Alert('守望者运行中,请先停止', { timeout: 2 });
}
popup.getElement().appendChild(p);
popup.getElement().appendChild(uid);
popup.getElement().appendChild(start);
popup.getElement().appendChild(stop);
popup.getElement().appendChild(self_target);
popup.getElement().appendChild(attackers);
popup.getElement().appendChild(records);
start.addEventListener('click', () => {
if (loop_id !== null || !uid.value) return;
start.disabled = true;
stop.disabled = false;
uid.readOnly = true;
p.innerHTML = '状态:已开 ✅';
let count = 0;
loop_id = window.setInterval(async () => {
// 记录当前循环的id
let that_id = loop_id;
let res = await (await window.fetch(url + uid.value, {
headers: { 'X-Requested-With': 'XMLHttpRequest' },
referrer: "loader.php?sid=attack&user2ID=" + uid.value
})).text();
if (loop_id !== that_id) return;
let data = JSON.parse(res.split('<div')[0]);
Log.info(count++, data);
let { DB, currentFightStatistics, histLog } = data;
// 攻击人
// 格式currentFightStatistics = {uid: {...}, uid2: {...}}
Object.keys(currentFightStatistics || {}).forEach(id => {
if (id === uid.value) return;
if (!attackers.obj[id]) {
attackers.obj[id] = true;
updateAttackersDOM();
}
});
// 攻击历史
(DB['currentFightHistory'] || []).forEach(record => {
if (records.list.includes(record['ID'])) return;
let { ID, TimeCreated, attackID, attackerID, attackerItemID, result, text } = record;
records.list.push(ID);
records.details[ID] = { TimeCreated, attackID, attackerID, attackerItemID, result, text };
updateRecordsDOM();
});
// 攻击历史日志
if (histLog && histLog[uid.value]) histLog[uid.value].forEach(log => {
if (records.list.includes(log['ID'])) return;
let { ID, TimeCreated, attackID, attackResult, userID } = log;
records.list.push(ID);
records.details[ID] = {
TimeCreated,
attackID,
attackerID: userID,
attackerItemID: 0,
result: attackResult,
text: ''
};
updateRecordsDOM();
});
}, 900);
});
stop.addEventListener('click', () => {
if (loop_id === null) return;
start.disabled = false;
stop.disabled = true;
uid.readOnly = false;
window.clearInterval(loop_id);
loop_id = null;
p.innerHTML = '状态:已关 ❎';
});
self_target.addEventListener('click', () => uid.value = (infoUtils.getPlayerInfo()['userID']) + '');
}