wuhu-torn-helper/src/ts/class/action/LotteryHelper.ts
2023-04-17 16:53:44 +08:00

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;
}
}