179 lines
7.0 KiB
TypeScript
179 lines
7.0 KiB
TypeScript
import InfoUtils from "../utils/InfoUtils";
|
|
import MathUtils from "../utils/MathUtils";
|
|
import CommonUtils from "../utils/CommonUtils";
|
|
import TornStyleBlock from "../utils/TornStyleBlock";
|
|
import Timer from "../utils/Timer";
|
|
import FetchUtils from "../utils/FetchUtils";
|
|
import { Injectable } from "../../container/Injectable";
|
|
import ClassName from "../../container/ClassName";
|
|
import Logger from "../Logger";
|
|
|
|
/**
|
|
* 彩票助手
|
|
*/
|
|
@Injectable()
|
|
@ClassName('LotteryHelper')
|
|
export default class LotteryHelper {
|
|
private loopFlag = true;
|
|
|
|
private radioDaily: HTMLInputElement = null;
|
|
private radioWeekly: HTMLInputElement = null;
|
|
private radioMonthly: HTMLInputElement = null;
|
|
private time: HTMLInputElement = null;
|
|
private startBtn: HTMLButtonElement = null;
|
|
private stopBtn: HTMLButtonElement = null;
|
|
private progressBar: HTMLElement = null;
|
|
private status: HTMLElement = null;
|
|
private desc: HTMLElement = null;
|
|
|
|
constructor(
|
|
private readonly mathUtils: MathUtils,
|
|
private readonly commonUtils: CommonUtils,
|
|
private readonly fetchUtils: FetchUtils,
|
|
private readonly infoUtils: InfoUtils,
|
|
private readonly logger: Logger,
|
|
) {
|
|
}
|
|
|
|
public init() {
|
|
let startTime = new Timer();
|
|
this.logger.info('彩票助手初始化开始');
|
|
|
|
let radioLabelDaily = document.createElement('label');
|
|
let radioLabelWeekly = document.createElement('label');
|
|
let radioLabelMonthly = document.createElement('label');
|
|
this.radioDaily = document.createElement('input');
|
|
this.radioWeekly = document.createElement('input');
|
|
this.radioMonthly = document.createElement('input');
|
|
this.time = document.createElement('input');
|
|
this.startBtn = document.createElement('button');
|
|
this.stopBtn = document.createElement('button');
|
|
this.progressBar = document.createElement('div');
|
|
this.status = document.createElement('div');
|
|
this.desc = document.createElement('p');
|
|
let {
|
|
radioDaily,
|
|
radioWeekly,
|
|
radioMonthly,
|
|
time,
|
|
startBtn,
|
|
stopBtn,
|
|
progressBar,
|
|
status,
|
|
desc
|
|
} = this;
|
|
let progressBarBg = document.createElement('div');
|
|
|
|
radioDaily.type = 'radio';
|
|
radioDaily.name = 'lottery_type';
|
|
radioDaily.checked = true;
|
|
radioWeekly.type = 'radio';
|
|
radioWeekly.name = 'lottery_type';
|
|
radioMonthly.type = 'radio';
|
|
radioMonthly.name = 'lottery_type';
|
|
time.type = 'number';
|
|
time.placeholder = '填入购买数量';
|
|
time.style.padding = '0.5em';
|
|
time.style.margin = '0 0 0.5em 0.5em';
|
|
startBtn.innerHTML = '开始';
|
|
startBtn.addEventListener('click', () => this.start());
|
|
startBtn.classList.add('torn-btn');
|
|
stopBtn.innerHTML = '终止';
|
|
stopBtn.disabled = true;
|
|
stopBtn.addEventListener('click', () => this.stop());
|
|
stopBtn.classList.add('torn-btn');
|
|
progressBarBg.style.width = '100%';
|
|
progressBarBg.style.height = '1em';
|
|
progressBarBg.style.backgroundColor = '#cecece';
|
|
progressBarBg.style.marginTop = '1em';
|
|
progressBar.style.width = '0';
|
|
progressBar.style.height = '1em';
|
|
progressBar.style.backgroundColor = '#00ff00';
|
|
progressBar.style.marginTop = '-1em';
|
|
progressBar.style.marginBottom = '1em';
|
|
status.innerHTML = '0/0';
|
|
status.style.marginTop = '-2em';
|
|
status.style.textAlign = 'center';
|
|
desc.style.marginTop = '1em';
|
|
desc.innerHTML = '批量买彩票';
|
|
|
|
radioLabelDaily.append(radioDaily);
|
|
radioLabelDaily.append(' 日彩 $100');
|
|
radioLabelDaily.style.marginLeft = '0.5em';
|
|
radioLabelWeekly.append(radioWeekly);
|
|
radioLabelWeekly.append(' 周彩 $10k');
|
|
radioLabelMonthly.append(radioMonthly);
|
|
radioLabelMonthly.append(' 月彩 $1m');
|
|
|
|
// container.append(title,
|
|
new TornStyleBlock('彩票助手').append(
|
|
radioLabelDaily, radioLabelWeekly, radioLabelMonthly, document.createElement('br'),
|
|
time, document.createElement('br'),
|
|
startBtn, stopBtn,
|
|
progressBarBg, progressBar, status, desc).insert2Dom();
|
|
// document.querySelector('#websocketConnectionData').after(container);
|
|
|
|
this.logger.info('彩票助手初始化结束,耗时:' + startTime.getTimeMs());
|
|
}
|
|
|
|
private async start() {
|
|
let startTime = new Timer();
|
|
this.loopFlag = true;
|
|
this.stopBtn.disabled = false;
|
|
this.startBtn.disabled = true;
|
|
let rsMsg = null;
|
|
|
|
let inputNumber = parseInt(this.time.value);
|
|
if (inputNumber > 0) {
|
|
let msg = document.querySelector('.info-msg-wrap .msg').innerText.trim().split(' ');
|
|
let current = {
|
|
money: (await this.infoUtils.getSessionData()).user.money.value,
|
|
token: parseInt(msg[4])
|
|
};
|
|
let lotteryType = 1;
|
|
if (this.radioWeekly.checked) lotteryType = 2;
|
|
else if (this.radioMonthly.checked) lotteryType = 3;
|
|
// 共计花费
|
|
let totalCost = [null, 100, 10000, 1000000][lotteryType] * inputNumber;
|
|
if (totalCost <= current.money && inputNumber <= current.token) {
|
|
this.desc.innerHTML = '正在开始';
|
|
this.status.innerHTML = `0/${ inputNumber }`;
|
|
this.progressBar.style.width = '0';
|
|
let i = 0;
|
|
while (i < inputNumber) {
|
|
if (!this.loopFlag) {
|
|
rsMsg = `终止操作,已完成${ i }/${ inputNumber }`;
|
|
break;
|
|
}
|
|
await this.fetchUtils.ajaxFetch({
|
|
url: window.addRFC('https://www.torn.com/loader.php?sid=lotteryPlay&step=buyTicket&lotteryID=' + lotteryType),
|
|
method: 'GET',
|
|
referrer: '/loader.php?sid=lottery',
|
|
});
|
|
await this.commonUtils.sleep(this.mathUtils.getRandomInt(20, 50));
|
|
i++;
|
|
this.desc.innerHTML = `已买${ i }张彩票`;
|
|
this.status.innerHTML = `${ i }/${ inputNumber }`;
|
|
this.progressBar.style.width = ((i / inputNumber * 100) | 0) + '%';
|
|
}
|
|
if (this.loopFlag) rsMsg = '批量购买完成';
|
|
} else {
|
|
rsMsg = '代币或现金不足';
|
|
this.logger.warn({ totalCost, inputNumber });
|
|
}
|
|
} else {
|
|
rsMsg = '输入有误';
|
|
}
|
|
|
|
this.desc.innerHTML = '结束: ' + (rsMsg ? rsMsg + '<br/>耗时:' + startTime.getTimeMs() : '出错了');
|
|
|
|
this.stopBtn.disabled = true;
|
|
this.startBtn.disabled = false;
|
|
}
|
|
|
|
private stop() {
|
|
this.loopFlag = false;
|
|
this.stopBtn.disabled = true;
|
|
this.startBtn.disabled = false;
|
|
}
|
|
} |