Q2TG/src/services/SetupService.ts

118 lines
3.9 KiB
TypeScript
Raw Normal View History

2022-02-17 13:09:12 +00:00
import { Telegram, TelegramChat } from '../client/Telegram';
import { config, saveConfig } from '../providers/userConfig';
import { getLogger } from 'log4js';
import { BigInteger } from 'big-integer';
import { Platform } from 'oicq';
2022-02-18 06:22:29 +00:00
import { MarkupLike } from 'telegram/define';
import createOicq from '../client/oicq';
import { Button } from 'telegram/tl/custom/button';
import { CustomFile } from 'telegram/client/uploads';
import { WorkMode } from '../types/definitions';
2022-02-17 13:09:12 +00:00
export default class SetupService {
private owner: TelegramChat;
private log = getLogger('SetupService');
constructor(private readonly tgBot: Telegram) {
}
public setWorkMode(mode: WorkMode) {
2022-02-19 04:06:43 +00:00
config.workMode = mode;
}
2022-02-17 13:09:12 +00:00
/**
* start bot bot
* @param userId ID
* @return {boolean} false
*/
public async claimOwner(userId: number | BigInteger) {
userId = Number(userId);
if (!this.owner) {
config.owner = userId;
await this.setupOwner();
this.log.info(`用户 ID: ${userId} 成为了 Bot 主人`);
return true;
}
return false;
}
private async setupOwner() {
if (!this.owner && config.owner) {
this.owner = await this.tgBot.getChat(config.owner);
}
}
public async informOwner(message: string) {
if (!this.owner) {
throw new Error('应该不会运行到这里');
}
await this.owner.sendMessage({ message });
}
2022-02-18 06:22:29 +00:00
public async waitForOwnerInput(message?: string, buttons?: MarkupLike) {
2022-02-17 13:09:12 +00:00
if (!this.owner) {
throw new Error('应该不会运行到这里');
}
message && await this.owner.sendMessage({ message, buttons: buttons || Button.clear(), linkPreview: false });
const { message: reply } = await this.owner.waitForInput();
return reply;
2022-02-17 13:09:12 +00:00
}
public async createUserBot(phoneNumber: string) {
if (!this.owner) {
throw new Error('应该不会运行到这里');
}
2022-02-17 13:40:09 +00:00
return await Telegram.create({
2022-02-17 13:09:12 +00:00
phoneNumber,
password: async (hint?: string) => {
return await this.waitForOwnerInput(`请输入你的二步验证密码${hint ? '\n密码提示' + hint : ''}`);
2022-02-17 13:09:12 +00:00
},
phoneCode: async (isCodeViaApp?: boolean) => {
return await this.waitForOwnerInput(`请输入你${isCodeViaApp ? ' Telegram APP 中' : '手机上'}收到的验证码`);
2022-02-17 13:09:12 +00:00
},
onError: (err) => this.log.error(err),
});
2022-02-17 13:40:09 +00:00
}
2022-02-18 06:22:29 +00:00
public saveUserBotSession(session: string) {
2022-02-17 13:40:09 +00:00
config.userBotSession = session;
}
public async createOicq(uin: number, password: string, platform: Platform) {
2022-02-18 06:22:29 +00:00
return await createOicq({
uin, password, platform,
onQrCode: async (file) => {
await this.owner.sendMessage({
message: '请使用已登录这个账号的手机 QQ 扫描这个二维码授权',
file: new CustomFile('qrcode.png', file.length, '', file),
2022-02-18 06:22:29 +00:00
buttons: Button.text('我已扫码', true, true),
});
await this.waitForOwnerInput();
},
onVerifyDevice: async (phone) => {
return await this.waitForOwnerInput(`请输入手机 ${phone} 收到的验证码`);
},
onVerifySlider: async (url) => {
const res = await this.waitForOwnerInput(`收到滑块验证码 <code>${url}</code>\n` +
'请使用<a href="https://github.com/mzdluo123/TxCaptchaHelper/releases">此软件</a>验证并输入 Ticket\n' +
2022-02-18 06:22:29 +00:00
'或者点击下方的按钮切换到扫码登录', [
Button.text('切换到扫码登录', true, true),
]);
if (res === '切换到扫码登录') return '';
return res;
},
});
}
2022-02-18 06:22:29 +00:00
public saveOicqLoginInfo(uin: number, password: string, platform: Platform) {
config.qqUin = uin;
config.qqPassword = password;
config.qqPlatform = platform;
}
2022-02-17 15:26:48 +00:00
public async finishConfig() {
config.isSetup = true;
2022-02-17 13:40:09 +00:00
await saveConfig();
2022-02-17 13:09:12 +00:00
}
}