refactor: 分离 QQ 和 TG bot 的数据库记录

This commit is contained in:
Clansty 2022-12-23 14:34:25 +08:00
parent 2e0bcf7aac
commit dfb0fb8ce7
13 changed files with 197 additions and 542 deletions

View File

@ -8,7 +8,7 @@
"prisma": "prisma",
"import": "ts-node tools/import"
},
"bin": "build/src/index.js",
"bin": "build/index.js",
"files": [
"build"
],

View File

@ -12,7 +12,6 @@ datasource db {
model Session {
id Int @id @default(autoincrement())
name String @unique
dcId Int?
port Int?
serverAddress String?
@ -35,16 +34,24 @@ model Entity {
}
model Instance {
id Int @id @default(autoincrement())
owner BigInt @default(0)
qqUin BigInt @default(0)
qqPassword String @default("")
qqPlatform Int @default(0)
workMode String @default("")
isSetup Boolean @default(false)
botToken String?
Message Message[]
ForwardPair ForwardPair[]
id Int @id @default(autoincrement())
owner BigInt @default(0)
workMode String @default("")
isSetup Boolean @default(false)
Message Message[]
ForwardPair ForwardPair[]
botSessionId Int?
userSessionId Int?
qqBotId Int?
qqBot QqBot? @relation(fields: [qqBotId], references: [id], onDelete: Cascade)
}
model QqBot {
id Int @id @default(autoincrement())
uin BigInt @default(0)
password String @default("")
platform Int @default(0)
Instance Instance[]
}
model Message {

View File

@ -21,6 +21,7 @@ const LOG_LEVEL: LogLevel = 'warn';
type MessageHandler = (event: PrivateMessageEvent | GroupMessageEvent) => Promise<boolean | void>
interface CreateOicqParams {
id: number;
uin: number;
password: string;
platform: Platform;
@ -36,16 +37,26 @@ interface CreateOicqParams {
export default class OicqClient extends Client {
private readonly onMessageHandlers: Array<MessageHandler> = [];
private constructor(uin: number, conf?: Config) {
private constructor(uin: number, public readonly id: number, conf?: Config) {
super(uin, conf);
}
private static existedBots = {} as { [id: number]: OicqClient };
public static create(params: CreateOicqParams) {
if (this.existedBots[params.id]) {
return Promise.resolve(this.existedBots[params.id]);
}
return new Promise<OicqClient>(async (resolve, reject) => {
async function loginDeviceHandler({ phone }: { url: string, phone: string }) {
client.sendSmsCode();
const code = await params.onVerifyDevice(phone);
client.submitSmsCode(code);
if (code === 'qrsubmit') {
client.login();
}
else {
client.submitSmsCode(code);
}
}
async function loginSliderHandler({ url }: { url: string }) {
@ -83,9 +94,9 @@ export default class OicqClient extends Client {
const device = {
product: 'Q2TG',
device: 'ANGELKAWAII2',
board: 'raincandy',
board: 'rainbowcat',
brand: random.pick('GOOGLE', 'XIAOMI', 'HUAWEI', 'SAMSUNG', 'SONY'),
model: 'raincandy',
model: 'rainbowcat',
wifi_ssid: random.pick('OpenWrt', `Redmi-${random.hex(4).toUpperCase()}`,
`MiWifi-${random.hex(4).toUpperCase()}`, `TP-LINK-${random.hex(6).toUpperCase()}`),
bootloader: random.pick('U-Boot', 'GRUB', 'gummiboot'),
@ -100,7 +111,7 @@ export default class OicqClient extends Client {
await fsP.writeFile(dataPath(`${params.uin}/device-${params.uin}.json`), JSON.stringify(device, null, 0), 'utf-8');
}
const client = new this(params.uin, {
const client = new this(params.uin, params.id, {
platform: params.platform,
data_dir: dataPath(),
log_level: LOG_LEVEL,
@ -112,6 +123,8 @@ export default class OicqClient extends Client {
.on('system.login.qrcode', loginQrCodeHandler)
.on('system.login.error', loginErrorHandler)
.on('system.online', successLoginHandler);
this.existedBots[params.id] = client;
client.login(params.password);
});
}

View File

@ -24,7 +24,13 @@ export default class Telegram {
private readonly onServiceMessageHandlers: Array<ServiceMessageHandler> = [];
public me: Api.User;
private constructor(sessionId: string, appName: string) {
private static existedBots = {} as { [id: number]: Telegram };
public get sessionId() {
return (this.client.session as TelegramSession).dbId;
}
private constructor(appName: string, sessionId?: number) {
this.client = new TelegramClient(
new TelegramSession(sessionId),
parseInt(process.env.TG_API_ID),
@ -33,7 +39,7 @@ export default class Telegram {
connectionRetries: 5,
langCode: 'zh',
deviceModel: `${appName} On ${os.hostname()}`,
appVersion: 'raincandy',
appVersion: 'rainbowcat',
proxy: process.env.PROXY_IP ? {
socksType: 5,
ip: process.env.PROXY_IP,
@ -41,18 +47,24 @@ export default class Telegram {
} : undefined,
},
);
this.client.logger.setLevel(LogLevel.WARN);
// this.client.logger.setLevel(LogLevel.WARN);
}
public static async create(startArgs: UserAuthParams | BotAuthParams, sessionId: string, appName = 'Q2TG') {
const bot = new this(sessionId, appName);
public static async create(startArgs: UserAuthParams | BotAuthParams, appName = 'Q2TG') {
const bot = new this(appName);
await bot.client.start(startArgs);
this.existedBots[bot.sessionId] = bot;
await bot.config();
return bot;
}
public static async connect(sessionId: string, appName = 'Q2TG') {
const bot = new this(sessionId, appName);
public static async connect(sessionId: number, appName = 'Q2TG') {
if (this.existedBots[sessionId]) {
// 已经创建过就不会再次创建,可用于两个 instance 共享 user bot
return this.existedBots[sessionId];
}
const bot = new this(appName, sessionId);
this.existedBots[sessionId] = bot;
await bot.client.connect();
await bot.config();
return bot;

View File

@ -9,6 +9,7 @@ import { WorkMode } from '../types/definitions';
import OicqClient from '../client/OicqClient';
import { md5Hex } from '../utils/hashing';
import Instance from '../models/Instance';
import db from '../models/db';
export default class SetupController {
private readonly setupService: SetupService;
@ -86,8 +87,8 @@ export default class SetupController {
let password = await this.setupService.waitForOwnerInput('请输入密码', undefined, true);
password = md5Hex(password);
this.oicq = await this.setupService.createOicq(uin, password, platform);
this.instance.qqBotId = this.oicq.id;
await this.setupService.informOwner(`登录成功`);
this.setupService.saveOicqLoginInfo(uin, password, platform);
}
catch (e) {
this.log.error('登录 OICQ 失败', e);
@ -95,17 +96,22 @@ export default class SetupController {
throw e;
}
// 登录 tg UserBot
try {
const phoneNumber = await this.setupService.waitForOwnerInput('创建 Telegram UserBot请输入你的手机号码需要带国家区号例如+86');
await this.setupService.informOwner('正在登录,请稍候…');
this.tgUser = await this.setupService.createUserBot(phoneNumber);
await this.setupService.informOwner(`登录成功`);
}
catch (e) {
this.log.error('创建 UserBot 失败', e);
this.isInProgress = false;
throw e;
if (this.instance.userSessionId) {
await this.setupService.informOwner('userSessionId 已经存在,跳过');
}
else
try {
const phoneNumber = await this.setupService.waitForOwnerInput('创建 Telegram UserBot请输入你的手机号码需要带国家区号例如+86');
await this.setupService.informOwner('正在登录,请稍候…');
this.tgUser = await this.setupService.createUserBot(phoneNumber);
this.instance.userSessionId = this.tgUser.sessionId;
await this.setupService.informOwner(`登录成功`);
}
catch (e) {
this.log.error('创建 UserBot 失败', e);
this.isInProgress = false;
throw e;
}
}
private async finishSetup() {

View File

@ -1,6 +1,5 @@
import { WorkMode } from '../types/definitions';
import db from './db';
import { Platform } from 'oicq';
import ConfigController from '../controllers/ConfigController';
import SetupController from '../controllers/SetupController';
import ForwardController from '../controllers/ForwardController';
@ -20,15 +19,15 @@ import OicqErrorNotifyController from '../controllers/OicqErrorNotifyController'
import { MarkupLike } from 'telegram/define';
import { Button } from 'telegram/tl/custom/button';
import { CustomFile } from 'telegram/client/uploads';
import { QqBot } from '@prisma/client';
export default class Instance {
private _owner = 0;
private _qqUin = 0;
private _qqPassword = '';
private _qqPlatform = 0;
private _isSetup = false;
private _workMode = '';
private _botToken = '';
private _botSessionId = 0;
private _userSessionId = 0;
private _qq: QqBot;
private readonly log: Logger;
@ -56,6 +55,7 @@ export default class Instance {
private async load() {
const dbEntry = await db.instance.findFirst({
where: { id: this.id },
include: { qqBot: true },
});
if (!dbEntry) {
@ -71,19 +71,28 @@ export default class Instance {
}
this._owner = Number(dbEntry.owner);
this._qqUin = Number(dbEntry.qqUin);
this._qqPassword = dbEntry.qqPassword;
this._qqPlatform = dbEntry.qqPlatform;
this._qq = dbEntry.qqBot;
this._botSessionId = dbEntry.botSessionId;
this._userSessionId = dbEntry.userSessionId;
this._isSetup = dbEntry.isSetup;
this._workMode = dbEntry.workMode;
this._botToken = dbEntry.botToken;
}
private async init() {
private async init(botToken?: string) {
this.log.debug('正在登录 TG Bot');
this.tgBot = await Telegram.create({
botAuthToken: this.botToken,
}, `bot:${this.id}`);
if (this.botSessionId) {
this.tgBot = await Telegram.connect(this._botSessionId);
}
else {
const token = this.id === 0 ? process.env.TG_BOT_TOKEN : botToken;
if (!token) {
throw new Error('botToken 未指定');
}
this.tgBot = await Telegram.create({
botAuthToken: token,
});
this.botSessionId = this.tgBot.sessionId;
}
this.log.info('TG Bot 登录完成');
(async () => {
if (!this.isSetup || !this._owner) {
@ -95,14 +104,15 @@ export default class Instance {
}
else {
this.log.debug('正在登录 TG UserBot');
this.tgUser = await Telegram.connect(`user:${this.id}`);
this.tgUser = await Telegram.connect(this._userSessionId);
this.log.info('TG UserBot 登录完成');
this._ownerChat = await this.tgBot.getChat(this.owner);
this.log.debug('正在登录 OICQ');
this.oicq = await OicqClient.create({
uin: this.qqUin,
password: this.qqPassword,
platform: this.qqPlatform,
id: this.qq.id,
uin: Number(this.qq.uin),
password: this.qq.password,
platform: this.qq.platform,
onQrCode: async (file) => {
await this.ownerChat.sendMessage({
message: '请使用已登录这个账号的手机 QQ 扫描这个二维码授权',
@ -115,10 +125,9 @@ export default class Instance {
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'
);
return res;
return await this.waitForOwnerInput(`收到滑块验证码 <code>${url}</code>\n` +
'请使用<a href="https://github.com/mzdluo123/TxCaptchaHelper/releases">此软件</a>验证并输入 Ticket',
);
},
});
this.log.info('OICQ 登录完成');
@ -141,22 +150,20 @@ export default class Instance {
.then(() => this.log.info('初始化已完成'));
}
public async login() {
public async login(botToken?: string) {
await this.load();
await this.init();
await this.init(botToken);
}
public static async start(instanceId: number) {
public static async start(instanceId: number, botToken?: string) {
const instance = new this(instanceId);
await instance.login();
await instance.login(botToken);
return instance;
}
public static async createNew(botToken: string) {
const dbEntry = await db.instance.create({
data: { botToken },
});
return await this.start(dbEntry.id);
const dbEntry = await db.instance.create({ data: {} });
return await this.start(dbEntry.id, botToken);
}
private async setupCommands() {
@ -200,16 +207,12 @@ export default class Instance {
return this._owner;
}
get qq() {
return this._qq;
}
get qqUin() {
return this._qqUin;
}
get qqPassword() {
return this._qqPassword;
}
get qqPlatform() {
return this._qqPlatform as Platform;
return this.oicq.uin;
}
get isSetup() {
@ -220,10 +223,6 @@ export default class Instance {
return this._workMode as WorkMode;
}
get botToken() {
return this.id === 0 ? process.env.TG_BOT_TOKEN : this._botToken;
}
get botMe() {
return this.tgBot.me;
}
@ -236,6 +235,14 @@ export default class Instance {
return this._ownerChat;
}
get botSessionId() {
return this._botSessionId;
}
get userSessionId() {
return this._userSessionId;
}
set owner(owner: number) {
this._owner = owner;
db.instance.update({
@ -245,33 +252,6 @@ export default class Instance {
.then(() => this.log.trace(owner));
}
set qqUin(qqUin: number) {
this._qqUin = qqUin;
db.instance.update({
data: { qqUin },
where: { id: this.id },
})
.then(() => this.log.trace(qqUin));
}
set qqPassword(qqPassword: string) {
this._qqPassword = qqPassword;
db.instance.update({
data: { qqPassword },
where: { id: this.id },
})
.then(() => this.log.trace(qqPassword));
}
set qqPlatform(qqPlatform: Platform) {
this._qqPlatform = qqPlatform;
db.instance.update({
data: { qqPlatform },
where: { id: this.id },
})
.then(() => this.log.trace(qqPlatform));
}
set isSetup(isSetup: boolean) {
this._isSetup = isSetup;
db.instance.update({
@ -289,4 +269,30 @@ export default class Instance {
})
.then(() => this.log.trace(workMode));
}
set botSessionId(sessionId: number) {
this._botSessionId = sessionId;
db.instance.update({
data: { botSessionId: sessionId },
where: { id: this.id },
})
.then(() => this.log.trace(sessionId));
}
set userSessionId(sessionId: number) {
this._userSessionId = sessionId;
db.instance.update({
data: { userSessionId: sessionId },
where: { id: this.id },
})
.then(() => this.log.trace(sessionId));
}
set qqBotId(id: number) {
db.instance.update({
data: { qqBotId: id },
where: { id: this.id },
})
.then(() => this.log.trace(id));
}
}

View File

@ -6,28 +6,31 @@ import { getLogger, Logger } from 'log4js';
const PASS = () => 0;
export default class TelegramSession extends MemorySession {
private dbId: number;
private readonly log: Logger;
private log: Logger;
constructor(private readonly sessionName: string) {
constructor(private _dbId?: number) {
super();
this.log = getLogger(`TelegramSession - ${sessionName}`);
this.log = getLogger(`TelegramSession - ${_dbId}`);
}
public get dbId() {
return this._dbId;
}
async load() {
this.log.trace('load');
const dbEntry = await db.session.findFirst({
where: { name: this.sessionName },
include: { entities: true },
});
if (!dbEntry) {
if (!this._dbId) {
this.log.debug('Session 不存在,创建');
// 创建并返回
const newDbEntry = await db.session.create({ data: { name: this.sessionName } });
this.dbId = newDbEntry.id;
const newDbEntry = await db.session.create({ data: {} });
this._dbId = newDbEntry.id;
this.log = getLogger(`TelegramSession - ${this._dbId}`);
return;
}
this.dbId = dbEntry.id;
const dbEntry = await db.session.findFirst({
where: { id: this._dbId },
include: { entities: true },
});
const { authKey, dcId, port, serverAddress } = dbEntry;
@ -54,7 +57,7 @@ export default class TelegramSession extends MemorySession {
this.log.trace('setDC', dcId, serverAddress, port);
super.setDC(dcId, serverAddress, port);
db.session.update({
where: { id: this.dbId },
where: { id: this._dbId },
data: { dcId, serverAddress, port },
})
.then(e => this.log.trace('DC update result', e))
@ -65,7 +68,7 @@ export default class TelegramSession extends MemorySession {
this.log.trace('authKey', value);
this._authKey = value;
db.session.update({
where: { id: this.dbId },
where: { id: this._dbId },
data: { authKey: value?.getKey() || null },
})
.then(e => this.log.trace('authKey update result', e))
@ -85,10 +88,10 @@ export default class TelegramSession extends MemorySession {
db.entity.upsert({
// id, hash, username, phone, name
where: {
entityId_sessionId: { sessionId: this.dbId, entityId: e[0].toString() },
entityId_sessionId: { sessionId: this._dbId, entityId: e[0].toString() },
},
create: {
sessionId: this.dbId,
sessionId: this._dbId,
entityId: e[0] && e[0].toString(),
hash: e[1] && e[1].toString(),
username: e[2] && e[2].toString(),

View File

@ -9,6 +9,7 @@ import { CustomFile } from 'telegram/client/uploads';
import { WorkMode } from '../types/definitions';
import TelegramChat from '../client/TelegramChat';
import Instance from '../models/Instance';
import db from '../models/db';
export default class SetupService {
private owner: TelegramChat;
@ -79,11 +80,13 @@ export default class SetupService {
return await this.owner.inlineDigitInput(5);
},
onError: (err) => this.log.error(err),
}, `user:${this.instance.id}`);
});
}
public async createOicq(uin: number, password: string, platform: Platform) {
const dbQQBot = await db.qqBot.create({ data: { uin, password, platform } });
return await OicqClient.create({
id: dbQQBot.id,
uin, password, platform,
onQrCode: async (file) => {
await this.owner.sendMessage({
@ -103,12 +106,6 @@ export default class SetupService {
});
}
public saveOicqLoginInfo(uin: number, password: string, platform: Platform) {
this.instance.qqUin = uin;
this.instance.qqPassword = password;
this.instance.qqPlatform = platform;
}
public async finishConfig() {
this.instance.isSetup = true;
}

View File

@ -1,254 +0,0 @@
import Telegram from '../../src/client/Telegram';
import OicqClient from '../../src/client/OicqClient';
import fsP from 'fs/promises';
import { Message } from './types';
import prompts from 'prompts';
import { dir } from 'tmp-promise';
import { Presets, SingleBar } from 'cli-progress';
import { fetchFile } from '../../src/utils/urls';
import { md5Hex } from '../../src/utils/hashing';
import path from 'path';
import { format } from 'date-and-time';
import axios from 'axios';
import { CustomFile } from 'telegram/client/uploads';
import { Api } from 'telegram';
import fs from 'fs';
import TelegramChat from '../../src/client/TelegramChat';
import lottie from '../../src/constants/lottie';
export default {
async doImport(filePath: string, telegram: Telegram, oicq: OicqClient, crvApi: string, crvKey: string) {
const { fileTypeFromFile } = await (Function('return import("file-type")')() as Promise<typeof import('file-type')>);
let selfId = Number(process.env.SELF_ID), selfName = process.env.SELF_NAME;
!(selfId && selfName) && ({ selfId, selfName } = await prompts([
{ type: 'number', name: 'selfId', message: '请输入自己的 ID映射消息' },
{ type: 'text', name: 'selfName', message: '请输入自己的 Telegram 名称(映射消息)' },
]));
let newChat: TelegramChat;
const { createNew } = await prompts({
type: 'confirm', name: 'createNew', message: '创建新的群组嘛',
});
if (createNew) {
const { chatName } = await prompts({
type: 'text', name: 'chatName', message: '请输入用于导入的群组名称(即将创建)',
});
newChat = await telegram.createChat(chatName);
}
else {
const { chatId } = await prompts({
type: 'number', name: 'chatId', message: '请输入用于导入的群组 ID数据库中必须有 accessHash',
});
newChat = await telegram.getChat(chatId);
}
console.log('正在读取记录…');
const content = JSON.parse(await fsP.readFile(filePath, 'utf-8')) as Message[];
content.sort((a, b) => a.time - b.time);
let output = '';
const tmpDir = await dir();
const outputPath = tmpDir.path;
const files = new Set<string>();
console.log('正在下载媒体…');
const fileCount = content.filter(it => it.file).length;
const fetchFilesBar = new SingleBar({
hideCursor: true,
format: '{bar} {percentage}% | {value}/{total}',
barsize: 120,
}, Presets.shades_grey);
fetchFilesBar.start(fileCount, 0);
for (const message of content) {
let sender = message.senderId === selfId ? selfName : message.username;
if (message.system) sender = '系统';
const date = new Date(message.time);
if (!message.files?.length && message.file) {
// 适配旧版数据库
message.files = [message.file];
}
if (message.files?.length) {
for (const messageFile of message.files) {
if (messageFile.type.startsWith('image/')) {
try {
let file: Buffer;
if (messageFile.url.startsWith('data:image')) {
const base64Data = messageFile.url.replace(/^data:image\/\w+;base64,/, '');
file = Buffer.from(base64Data, 'base64');
}
else {
file = await fetchFile(messageFile.url);
}
const md5 = md5Hex(file);
await fsP.writeFile(path.join(outputPath, `${md5}.file`), file);
output += `${format(date, 'DD/MM/YYYY, HH:mm')} - ${sender}: ${md5}.file (file attached)\n`;
files.add(md5);
}
catch (e) {
output += `${format(date, 'DD/MM/YYYY, HH:mm')} - ${sender}: ${messageFile.url}\n`;
}
}
else if (messageFile.type.startsWith('audio/') && messageFile.url.startsWith('data:audio')) {
try {
let file: Buffer;
const base64Data = messageFile.url.replace(/^data:audio\/\w+;base64,/, '');
file = Buffer.from(base64Data, 'base64');
const md5 = md5Hex(file);
await fsP.writeFile(path.join(outputPath, `${md5}.file`), file);
output += `${format(date, 'DD/MM/YYYY, HH:mm')} - ${sender}: ${md5}.file (file attached)\n`;
files.add(md5);
}
catch (e) {
output += `${format(date, 'DD/MM/YYYY, HH:mm')} - ${sender}: ${messageFile.url}\n`;
}
}
else {
output += `${format(date, 'DD/MM/YYYY, HH:mm')} - ${sender}: 文件: ${messageFile.name}\n` +
`${messageFile.type}\n`;
}
}
fetchFilesBar.increment();
}
if (message.content) {
const FORWARD_REGEX = /\[Forward: ([A-Za-z0-9\/+=]+)]/;
const tgsIndex = lottie.getTgsIndex(message.content);
if (tgsIndex > -1) {
output += `${format(date, 'DD/MM/YYYY, HH:mm')} - ${sender}: tgs${tgsIndex}.file (file attached)\n`;
files.add(`tgs${tgsIndex}`);
}
else if (FORWARD_REGEX.test(message.content) && oicq) {
try {
const resId = FORWARD_REGEX.exec(message.content)[1];
const record = await oicq.getForwardMsg(resId);
const hash = md5Hex(resId);
await axios.post(`${crvApi}/add`, {
auth: crvKey,
key: hash,
data: record,
});
output += `${format(date, 'DD/MM/YYYY, HH:mm')} - ${sender}: 转发的消息记录 ${crvApi}/?hash=${hash}\n`;
}
catch (e) {
}
output += `${format(date, 'DD/MM/YYYY, HH:mm')} - ${sender}: 转发的消息记录\n`;
}
else {
output += `${format(date, 'DD/MM/YYYY, HH:mm')} - ${sender}: ${message.content}\n`;
}
}
}
output += `${format(new Date, 'DD/MM/YYYY, HH:mm')} - 系统: 以上为导入的消息(你可以删除这条)\n`;
fetchFilesBar.stop();
// 转换好了,开始导入 TG
console.log('正在准备导入…');
const txtBuffer = Buffer.from(output, 'utf-8');
try {
const importSession = await newChat.startImportSession(
new CustomFile('record.txt', txtBuffer.length, '', txtBuffer),
files.size,
);
console.log('正在上传媒体…');
const uploadMediaBar = new SingleBar({
hideCursor: true,
format: '{bar} {percentage}% | {value}/{total}',
barsize: 120,
}, Presets.shades_grey);
uploadMediaBar.start(files.size, 0);
for (const md5 of files) {
const fileName = md5 + '.file';
const file = md5.startsWith('tgs') ? path.join('./assets/tgs', md5 + '.tgs') : path.join(outputPath, md5 + '.file');
const type = md5.startsWith('tgs') ? {
ext: 'tgs',
mime: 'application/x-tgsticker',
} : await fileTypeFromFile(file);
let media: Api.TypeInputMedia;
if (md5.startsWith('tgs') || type.ext === 'webp') {
// 贴纸
media = new Api.InputMediaUploadedDocument({
file: await importSession.uploadFile(new CustomFile(
`${fileName}.${type.ext}`,
fs.statSync(file).size,
file,
)),
mimeType: type.mime,
attributes: [],
});
}
else if (type.mime.startsWith('audio/')) {
// 语音
media = new Api.InputMediaUploadedDocument({
file: await importSession.uploadFile(new CustomFile(
`${fileName}.${type.ext}`,
fs.statSync(file).size,
file,
)),
mimeType: type.mime,
attributes: [
new Api.DocumentAttributeAudio({
duration: 0,
voice: true,
}),
],
});
}
else if (type.ext === 'gif') {
media = new Api.InputMediaUploadedDocument({
file: await importSession.uploadFile(new CustomFile(
`${fileName}.${type.ext}`,
fs.statSync(file).size,
file,
)),
mimeType: type.mime,
attributes: [new Api.DocumentAttributeAnimated()],
});
}
else if (type.mime.startsWith('image/')) {
media = new Api.InputMediaUploadedPhoto({
file: await importSession.uploadFile(new CustomFile(
`${fileName}.${type.ext}`,
fs.statSync(file).size,
file,
)),
});
}
else {
media = new Api.InputMediaUploadedDocument({
file: await importSession.uploadFile(new CustomFile(
`${fileName}.${type.ext}`,
fs.statSync(file).size,
file,
)),
mimeType: type.mime,
attributes: [],
});
}
await importSession.uploadMedia(fileName, media);
uploadMediaBar.increment();
}
await importSession.finish();
console.log('导入成功!');
}
catch (e) {
console.error('错误', e);
const dumpPath = path.join(outputPath, 'record');
await fsP.writeFile(dumpPath, txtBuffer);
console.log('临时文件位置', outputPath);
}
},
};

View File

@ -1,114 +0,0 @@
import prompts from 'prompts';
import db from '../../src/models/db';
import Telegram from '../../src/client/Telegram';
import OicqClient from '../../src/client/OicqClient';
import 'dotenv/config';
import importer from './importer';
(async () => {
if (!(process.env.TG_API_ID && process.env.TG_API_HASH)) {
const { apiId, apiHash } = await prompts([
{ type: 'text', name: 'apiId', message: 'Telegram API ID?' },
{ type: 'text', name: 'apiHash', message: 'Telegram API Hash?' },
]);
process.env.TG_API_ID = apiId;
process.env.TG_API_HASH = apiHash;
}
let sessionName = process.env.SESSION;
!sessionName && ({ sessionName } = await prompts({
type: 'text', name: 'sessionName', message: '输入数据库中的 Session 名称',
}));
let telegram: Telegram;
if (await db.session.findFirst({ where: { name: sessionName } })) {
// Session 存在
telegram = await Telegram.connect(sessionName, 'Chat Importer');
}
else {
const { phoneNumber } = await prompts({
type: 'text', name: 'phoneNumber', message: '请输入手机号码',
});
telegram = await Telegram.create({
phoneNumber,
password: async (hint?: string) => {
const { password } = await prompts({
type: 'password', name: 'password',
message: `请输入你的二步验证密码${hint ? ' 密码提示:' + hint : ''}`,
});
return password;
},
phoneCode: async (isCodeViaApp?: boolean) => {
const { code } = await prompts({
type: 'text', name: 'code',
message: `请输入你${isCodeViaApp ? ' Telegram APP 中' : '手机上'}收到的验证码`,
});
return code;
},
onError: (err) => console.error(err),
}, sessionName, 'Chat Importer');
}
let isLoginOicq = !!(process.env.Q_UIN && process.env.Q_PASSWORD && process.env.Q_PLATFORM);
!isLoginOicq && ({ isLoginOicq } = await prompts({
type: 'confirm', name: 'isLoginOicq', message: '要登录 OICQ 嘛,这样可以获取转发的消息记录',
}));
let oicq: OicqClient,
crvApi = process.env.CRV_API, crvKey = process.env.CRV_KEY;
if (isLoginOicq) {
let uin = Number(process.env.Q_UIN);
let password = process.env.Q_PASSWORD;
let platform = Number(process.env.Q_PLATFORM);
!(uin && password && platform) && ({ uin, password, platform } = await prompts([
{ type: 'number', name: 'uin', message: '请输入账号,可以是任意账号,和导入内容无关' },
{ type: 'password', name: 'password', message: '请输入密码' },
{
type: 'select', name: 'platform', message: '选择登录协议',
choices: [
{ title: '安卓手机', value: '1' },
{ title: '安卓手表', value: '3' },
{ title: 'macOS', value: '4' },
{ title: 'iPad', value: '5' },
],
},
]));
oicq = await OicqClient.create({
uin,
password,
platform,
onVerifyDevice: async (phone) => {
const { code } = await prompts({
type: 'text', name: 'code',
message: `请输入你的手机 ${phone} 收到的验证码`,
});
return code;
},
onVerifySlider: () => {
console.log('出滑块了,暂不支持');
process.exit(1);
},
onQrCode: () => process.exit(1),
});
!(crvApi && crvKey) && ({ crvApi, crvKey } = await prompts([
{ type: 'text', name: 'crvApi', message: 'Chat record viewer API 地址' },
{ type: 'text', name: 'crvKey', message: 'Chat record viewer API Key' },
]));
}
if (process.argv[2]) {
await importer.doImport(process.argv[2], telegram, oicq, crvApi, crvKey);
}
else {
while (true) {
const { filePath } = await prompts({
type: 'text', name: 'filePath', message: '请选择一个导出的 JSON 文件',
});
await importer.doImport(filePath.trim(), telegram, oicq, crvApi, crvKey);
const { isContinue } = await prompts({
type: 'confirm', name: 'isContinue', message: '要继续导入嘛',
});
if (!isContinue) break;
}
}
await oicq.logout(false);
})();

View File

@ -1,21 +0,0 @@
export interface Message {
senderId?: number;
username: string;
content: string;
system: boolean;
file?: {
type: string
url: string
size?: number
name?: string
fid?: string
};
files: {
type: string
url: string
size?: number
name?: string
fid?: string
}[];
time: number;
}

View File

@ -169,6 +169,7 @@ cacheEntries = {
"@prisma/engines-version@npm:4.2.0-33.2920a97877e12e055c1333079b8d19cee7f33826" = { filename = "@prisma-engines-version-npm-4.2.0-33.2920a97877e12e055c1333079b8d19cee7f33826-f8585cbfb8-65975c69a3.zip"; sha512 = "65975c69a361b56a85cf3652c8d7aec7549abe574158e423a64bc0be4bee83fe72ac2abd60133f776f3d410f97e7dc8c5dc516791ec963703cc6f914d378efc4"; };
"@types/node@npm:17.0.21" = { filename = "@types-node-npm-17.0.21-7d68eb6a13-89dcd2fe82.zip"; sha512 = "89dcd2fe82f21d3634266f8384e9c865cf8af49685639fbdbd799bdd1040480fb1e8eeda2d3b9fce41edbe704d2a4be9f427118c4ae872e8d9bb7cbeb3c41a94"; };
"log4js@npm:6.6.1" = { filename = "log4js-npm-6.6.1-00e7698906-68f29e7b8b.zip"; sha512 = "68f29e7b8b0efa2f987e65ee122fde0bc806dd7ad20f0a9f2da316696423e42381ba348bd6e2f6a2feba042a6ed33c14955210741f47ab897b3204aba8bcd84b"; };
"oicq@https://files.catbox.moe/a5tcyl.tgz" = { filename = "oicq-https-9b8f0fd4d4-73dc95fa12.zip"; sha512 = "73dc95fa12188ce074687cdb4b35c7a982cd677fac2f80fb56203ac0862918aa83a4e514ea892e2f4633a6d9e9086bd774a74fd02aebb17c7528f9e04524844b"; };
"follow-redirects@npm:1.15.1" = { filename = "follow-redirects-npm-1.15.1-6b191885cd-6aa4e3e3cd.zip"; sha512 = "6aa4e3e3cdfa3b9314801a1cd192ba756a53479d9d8cca65bf4db3a3e8834e62139245cd2f9566147c8dfe2efff1700d3e6aefd103de4004a7b99985e71dd533"; };
"async@npm:3.2.3" = { filename = "async-npm-3.2.3-e9d6b79c88-c4bee57ab2.zip"; sha512 = "c4bee57ab2249af3dc83ca3ef9acfa8e822c0d5e5aa41bae3eaf7f673648343cd64ecd7d26091ffd357f3f044428b17b5f00098494b6cf8b6b3e9681f0636ca1"; };
"kleur@npm:3.0.3" = { filename = "kleur-npm-3.0.3-f6f53649a4-df82cd1e17.zip"; sha512 = "df82cd1e172f957bae9c536286265a5cdbd5eeca487cb0a3b2a7b41ef959fc61f8e7c0e9aeea9c114ccf2c166b6a8dd45a46fd619c1c569d210ecd2765ad5169"; };
@ -185,6 +186,8 @@ cacheEntries = {
"date-format@npm:4.0.13" = { filename = "date-format-npm-4.0.13-64e384acc1-b4584fdd43.zip"; sha512 = "b4584fdd43d31e9c900da775cce4806903ba207e21f79d99959858141849d41ec919f941d1fb2e4efd2355ce1909ca1fe41a5184568c74cb540cf24c4f8bb39b"; };
"flatted@npm:3.2.6" = { filename = "flatted-npm-3.2.6-a309e17eb3-33b87aa88d.zip"; sha512 = "33b87aa88dfa40ca6ee31d7df61712bbbad3d3c05c132c23e59b9b61d34631b337a18ff2b8dc5553acdc871ec72b741e485f78969cf006124a3f57174de29a0e"; };
"rfdc@npm:1.3.0" = { filename = "rfdc-npm-1.3.0-272f288ad8-fb2ba8512e.zip"; sha512 = "fb2ba8512e43519983b4c61bd3fa77c0f410eff6bae68b08614437bc3f35f91362215f7b4a73cbda6f67330b5746ce07db5dd9850ad3edc91271ad6deea0df32"; };
"long@npm:4.0.0" = { filename = "long-npm-4.0.0-ecd96a31ed-16afbe8f74.zip"; sha512 = "16afbe8f749c7c849db1f4de4e2e6a31ac6e617cead3bdc4f9605cb703cd20e1e9fc1a7baba674ffcca57d660a6e5b53a9e236d7b25a295d3855cca79cc06744"; };
"pngjs@npm:6.0.0" = { filename = "pngjs-npm-6.0.0-31d8d85681-ab6c285086.zip"; sha512 = "ab6c285086060087097eab9fe6b5a528a24f9e79c03dea2b4fd6264ed4fdb5beff4a3257eeeaf2a9dc18249b539609c2a4e4013c567164a1f6b5ba2c974d5ecb"; };
"sharp@npm:0.30.7" = { filename = "sharp-npm-0.30.7-6db6fef43e-bbc63ca3c7.zip"; sha512 = "bbc63ca3c7ea8a5bff32cd77022cfea30e25a03f5bd031e935924bf6cf0e11e3388e8b0e22b3137bf8816aa73407f1e4fbeb190f3a35605c27ffca9f32b91601"; };
"debug@npm:4.3.4" = { filename = "debug-npm-4.3.4-4513954577-3dbad3f94e.zip"; sha512 = "3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708"; };
"typescript@patch:typescript@npm%3A4.7.4#~builtin<compat/typescript>::version=4.7.4&hash=493e53" = { filename = "typescript-patch-56cded6317-96d3030cb0.zip"; sha512 = "96d3030cb01143570567cb4f3a616b10df65f658f0e74e853e77a089a6a954e35c800be7db8b9bfe9a1ae05d9c2897e281359f65e4caa1caf266368e1c4febd3"; };
@ -194,6 +197,8 @@ cacheEntries = {
"is-fullwidth-code-point@npm:3.0.0" = { filename = "is-fullwidth-code-point-npm-3.0.0-1ecf4ebee5-44a30c2945.zip"; sha512 = "44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348"; };
"file-uri-to-path@npm:1.0.0" = { filename = "file-uri-to-path-npm-1.0.0-1043ac6206-b648580bdd.zip"; sha512 = "b648580bdd893a008c92c7ecc96c3ee57a5e7b6c4c18a9a09b44fb5d36d79146f8e442578bc0e173dc027adf3987e254ba1dfd6e3ec998b7c282873010502144"; };
"streamroller@npm:3.1.2" = { filename = "streamroller-npm-3.1.2-56c1517978-4215bf57fe.zip"; sha512 = "4215bf57fe80c583ba200075f9a62b9be9a3d7491201905bf7b5a09d7e87903a47f7c62b1ce0fd2161dbd497cac41068e8f48dda0f9bfceb084487de5798f043"; };
"axios@npm:1.2.1" = { filename = "axios-npm-1.2.1-4056ddcb4c-c4dc4e1190.zip"; sha512 = "c4dc4e119064c9aed09a3de309bedb797a139a6fb372223aafe3e0c10a7d4a14e4d3e9c9d309467fadb9d2b490b891ee3df96ef5b55716bb971910466ff9f0c5"; };
"probe-image-size@npm:7.2.3" = { filename = "probe-image-size-npm-7.2.3-2b6ee36e6f-1a5eeb8f5c.zip"; sha512 = "1a5eeb8f5cb979172144a5d7a017c70fcd664ccc8af9ad3a803903ee81864abea4036adae4fc6e66e9ae21bd3ce0febefaf1f32e65a77ff226b2eb61e9e4978c"; };
"asynckit@npm:0.4.0" = { filename = "asynckit-npm-0.4.0-c718858525-7b78c451df.zip"; sha512 = "7b78c451df768adba04e2d02e63e2d0bf3b07adcd6e42b4cf665cb7ce899bedd344c69a1dcbce355b5f972d597b25aaa1c1742b52cffd9caccb22f348114f6be"; };
"strip-ansi@npm:6.0.1" = { filename = "strip-ansi-npm-6.0.1-caddc7cb40-f3cd25890a.zip"; sha512 = "f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c"; };
"@tokenizer/token@npm:0.3.0" = { filename = "@tokenizer-token-npm-0.3.0-4441352cc5-1d575d02d2.zip"; sha512 = "1d575d02d2a9f0c5a4ca5180635ebd2ad59e0f18b42a65f3d04844148b49b3db35cf00b6012a1af2d59c2ab3caca59451c5689f747ba8667ee586ad717ee58e1"; };
@ -204,14 +209,19 @@ cacheEntries = {
"combined-stream@npm:1.0.8" = { filename = "combined-stream-npm-1.0.8-dc14d4a63a-49fa4aeb49.zip"; sha512 = "49fa4aeb4916567e33ea81d088f6584749fc90c7abec76fd516bf1c5aa5c79f3584b5ba3de6b86d26ddd64bae5329c4c7479343250cfe71c75bb366eae53bb7c"; };
"mime-types@npm:2.1.35" = { filename = "mime-types-npm-2.1.35-dd9ea9f3e2-89a5b7f1de.zip"; sha512 = "89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836"; };
"ms@npm:2.1.2" = { filename = "ms-npm-2.1.2-ec0c1512ff-673cdb2c31.zip"; sha512 = "673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f"; };
"log4js@npm:6.4.1" = { filename = "log4js-npm-6.4.1-b00dd7826e-0614949662.zip"; sha512 = "0614949662314573ec7dcd841769a4d23d8cb8268685458a40fcd94f2ae6ec628234cfb9a6bc17821fb6ea6ce3765e779b4966ba1cf918f393dc37155a3615cb"; };
"node-addon-api@npm:5.0.0" = { filename = "node-addon-api-npm-5.0.0-c0def7fecf-7c5e2043ac.zip"; sha512 = "7c5e2043ac37f6108784d94ed73a44ae6d3e68eb968de60680922fc6bc3d17fa69448c0feb4e0c9d3f4c74a0324822e566a8340a56916d9d6f23cb3e85620334"; };
"semver@npm:7.3.7" = { filename = "semver-npm-7.3.7-3bfe704194-2fa3e87756.zip"; sha512 = "2fa3e877568cd6ce769c75c211beaed1f9fce80b28338cadd9d0b6c40f2e2862bafd62c19a6cff42f3d54292b7c623277bcab8816a2b5521cf15210d43e75232"; };
"tunnel-agent@npm:0.6.0" = { filename = "tunnel-agent-npm-0.6.0-64345ab7eb-05f6510358.zip"; sha512 = "05f6510358f8afc62a057b8b692f05d70c1782b70db86d6a1e0d5e28a32389e52fa6e7707b6c5ecccacc031462e4bc35af85ecfe4bbc341767917b7cf6965711"; };
"readable-stream@npm:3.6.0" = { filename = "readable-stream-npm-3.6.0-23a4a5eb56-d4ea81502d.zip"; sha512 = "d4ea81502d3799439bb955a3a5d1d808592cf3133350ed352aeaa499647858b27b1c4013984900238b0873ec8d0d8defce72469fb7a83e61d53f5ad61cb80dc8"; };
"color@npm:4.2.3" = { filename = "color-npm-4.2.3-4a23227581-0579629c02.zip"; sha512 = "0579629c02c631b426780038da929cca8e8d80a40158b09811a0112a107c62e10e4aad719843b791b1e658ab4e800558f2e87ca4522c8b32349d497ecb6adeb4"; };
"telegram@npm:2.10.2" = { filename = "telegram-npm-2.10.2-56b0c222a6-46242e2eae.zip"; sha512 = "46242e2eaea03f2af71c6af43fcf6e4a23680a1d7183d9e064f39338185ff00a5f26110617b81610006710239fc8001f123ef7ccdc3999e766c80fe7f7ff6e87"; };
"follow-redirects@npm:1.15.2" = { filename = "follow-redirects-npm-1.15.2-1ec1dd82be-faa66059b6.zip"; sha512 = "faa66059b66358ba65c234c2f2a37fcec029dc22775f35d9ad6abac56003268baf41e55f9ee645957b32c7d9f62baf1f0b906e68267276f54ec4b4c597c2b190"; };
"proxy-from-env@npm:1.1.0" = { filename = "proxy-from-env-npm-1.1.0-c13d07f26b-ed7fcc2ba0.zip"; sha512 = "ed7fcc2ba0a33404958e34d95d18638249a68c430e30fcb6c478497d72739ba64ce9810a24f53a7d921d0c065e5b78e3822759800698167256b04659366ca4d4"; };
"lodash.merge@npm:4.6.2" = { filename = "lodash.merge-npm-4.6.2-77cb4416bf-ad580b4bdb.zip"; sha512 = "ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005"; };
"simple-get@npm:4.0.1" = { filename = "simple-get-npm-4.0.1-fa2a97645d-e4132fd27c.zip"; sha512 = "e4132fd27cf7af230d853fa45c1b8ce900cb430dd0a3c6d3829649fe4f2b26574c803698076c4006450efb0fad2ba8c5455fbb5755d4b0a5ec42d4f12b31d27e"; };
"ansi-regex@npm:5.0.1" = { filename = "ansi-regex-npm-5.0.1-c963a48615-2aa4bb54ca.zip"; sha512 = "2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b"; };
"stream-parser@npm:0.3.1" = { filename = "stream-parser-npm-0.3.1-0b70187c85-4d86ff8cff.zip"; sha512 = "4d86ff8cffe7c7587dc91433fff9dce38a93ea7e9f47560055addc81eae6b6befab22b75643ce539faf325fe2b17d371778242566bed086e75f6cffb1e76c06c"; };
"tar-fs@npm:2.1.1" = { filename = "tar-fs-npm-2.1.1-e374d3b7a2-f5b9a70059.zip"; sha512 = "f5b9a70059f5b2969e65f037b4e4da2daf0fa762d3d232ffd96e819e3f94665dbbbe62f76f084f1acb4dbdcce16c6e4dac08d12ffc6d24b8d76720f4d9cf032d"; };
"node-gyp@npm:8.4.1" = { filename = "node-gyp-npm-8.4.1-13c90a9c9b-341710b5da.zip"; sha512 = "341710b5da39d3660e6a886b37e210d33f8282047405c2e62c277bcc744c7552c5b8b972ebc3a7d5c2813794e60cc48c3ebd142c46d6e0321db4db6c92dd0355"; };
"@tsconfig/node10@npm:1.0.8" = { filename = "@tsconfig-node10-npm-1.0.8-90a8cce25d-b8d5fffbc6.zip"; sha512 = "b8d5fffbc6b17ef64ef74f7fdbccee02a809a063ade785c3648dae59406bc207f70ea2c4296f92749b33019fa36a5ae716e42e49cc7f1bbf0fd147be0d6b970a"; };
@ -228,11 +238,15 @@ cacheEntries = {
"yn@npm:3.1.1" = { filename = "yn-npm-3.1.1-8ad4259784-2c487b0e14.zip"; sha512 = "2c487b0e149e746ef48cda9f8bad10fc83693cd69d7f9dcd8be4214e985de33a29c9e24f3c0d6bcf2288427040a8947406ab27f7af67ee9456e6b84854f02dd6"; };
"delayed-stream@npm:1.0.0" = { filename = "delayed-stream-npm-1.0.0-c5a4c4cc02-46fe6e83e2.zip"; sha512 = "46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020"; };
"mime-db@npm:1.52.0" = { filename = "mime-db-npm-1.52.0-b5371d6fd2-0d99a03585.zip"; sha512 = "0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f"; };
"date-format@npm:4.0.3" = { filename = "date-format-npm-4.0.3-ce15085cfe-8ae4d9de35.zip"; sha512 = "8ae4d9de3532010169a89bc7b079342051ba3ec88552636aa677bfb53e8eb15113af8394679aea7d41367dc8bb6e9865da17f21ac2802202180b09d6e3f2339e"; };
"flatted@npm:3.2.5" = { filename = "flatted-npm-3.2.5-0ee5a8875f-3c436e9695.zip"; sha512 = "3c436e9695ccca29620b4be5671dd72e5dd0a7500e0856611b7ca9bd8169f177f408c3b9abfa78dfe1493ee2d873e2c119080a8a9bee4e1a186a9e60ca6c89f1"; };
"safe-buffer@npm:5.2.1" = { filename = "safe-buffer-npm-5.2.1-3481c8aa9b-b99c4b41fd.zip"; sha512 = "b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491"; };
"@cspotcode/source-map-support@npm:0.8.1" = { filename = "@cspotcode-source-map-support-npm-0.8.1-964f2de99d-5718f26708.zip"; sha512 = "5718f267085ed8edb3e7ef210137241775e607ee18b77d95aa5bd7514f47f5019aa2d82d96b3bf342ef7aa890a346fa1044532ff7cc3009e7d24fce3ce6200fa"; };
"inherits@npm:2.0.4" = { filename = "inherits-npm-2.0.4-c66b3957a0-4a48a73384.zip"; sha512 = "4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1"; };
"util-deprecate@npm:1.0.2" = { filename = "util-deprecate-npm-1.0.2-e3fe1a219c-474acf1146.zip"; sha512 = "474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2"; };
"fs-extra@npm:8.1.0" = { filename = "fs-extra-npm-8.1.0-197473387f-bf44f0e6ce.zip"; sha512 = "bf44f0e6cea59d5ce071bba4c43ca76d216f89e402dc6285c128abc0902e9b8525135aa808adad72c9d5d218e9f4bcc63962815529ff2f684ad532172a284880"; };
"debug@npm:4.3.3" = { filename = "debug-npm-4.3.3-710fd4cc7f-14472d56fe.zip"; sha512 = "14472d56fe4a94dbcfaa6dbed2dd3849f1d72ba78104a1a328047bb564643ca49df0224c3a17fa63533fd11dd3d4c8636cd861191232a2c6735af00cc2d4de16"; };
"needle@npm:2.9.1" = { filename = "needle-npm-2.9.1-f40e591726-746ae3a378.zip"; sha512 = "746ae3a3782f0a057ff304a98843cc6f2009f978a0fad0c3e641a9d46d0b5702bb3e197ba08aecd48678067874a991c4f5fc320c7e51a4c041d9dd3441146cf0"; };
"lru-cache@npm:6.0.0" = { filename = "lru-cache-npm-6.0.0-b4c8668fe1-f97f499f89.zip"; sha512 = "f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297"; };
"@cryptography/aes@npm:0.1.1" = { filename = "@cryptography-aes-npm-0.1.1-0bf958ef1c-81a6b93d6d.zip"; sha512 = "81a6b93d6d16413c7dda5f160b845add49bb6df6c314b7260312627fcbb7130b7ed7f51b063de0f712439b0c30b1c3eac56cb78ed180abaab3fd682322b4ed80"; };
"big-integer@npm:1.6.51" = { filename = "big-integer-npm-1.6.51-1a244d8e1f-3d444173d1.zip"; sha512 = "3d444173d1b2e20747e2c175568bedeebd8315b0637ea95d75fd27830d3b8e8ba36c6af40374f36bdaea7b5de376dcada1b07587cb2a79a928fccdb6e6e3c518"; };
@ -247,6 +261,7 @@ cacheEntries = {
"async-mutex@npm:0.3.2" = { filename = "async-mutex-npm-0.3.2-600f6c46a1-620b771dfd.zip"; sha512 = "620b771dfdea1cad0a6b712915c31a1e3ca880a8cf1eae92b4590f435995e0260929c6ebaae0b9126b1456790ea498064b5bb9a506948cda760f48d3d0dcc4c8"; };
"node-localstorage@npm:2.2.1" = { filename = "node-localstorage-npm-2.2.1-bc01536b9e-c6b2637e1c.zip"; sha512 = "c6b2637e1c0957dcd78581de104530be57600c8b9fd13af50a61203e6ffa1f75ddd931162b2afd85d45c599f4e153811e27f1039748da89226edcc951f250fb8"; };
"glob@npm:7.2.0" = { filename = "glob-npm-7.2.0-bb4644d239-78a8ea9423.zip"; sha512 = "78a8ea942331f08ed2e055cb5b9e40fe6f46f579d7fd3d694f3412fe5db23223d29b7fee1575440202e9a7ff9a72ab106a39fee39934c7bedafe5e5f8ae20134"; };
"streamroller@npm:3.0.2" = { filename = "streamroller-npm-3.0.2-6d7ba8035a-1f323824f0.zip"; sha512 = "1f323824f0e81cc085c24f33addfd8ef00d0c15aafee520a8cf207ca6e2dc674fd852528c7b4450cc87f4335d1269ed18b3f0188853d45d7f0912c9a205d1fc1"; };
"color-string@npm:1.9.0" = { filename = "color-string-npm-1.9.0-75382c0441-93c6678b84.zip"; sha512 = "93c6678b847f8cfa47d19677fd19e1d4b19d7a33f100644400357c298266080b5bca64e5f874fa8ac8cc0aa0606ad44f7a838b4e6fd05e6affea190a68555bb4"; };
"decompress-response@npm:6.0.0" = { filename = "decompress-response-npm-6.0.0-359de2878c-d377cf47e0.zip"; sha512 = "d377cf47e02d805e283866c3f50d3d21578b779731e8c5072d6ce8c13cc31493db1c2f6784da9d1d5250822120cefa44f1deab112d5981015f2e17444b763812"; };
"once@npm:1.4.0" = { filename = "once-npm-1.4.0-ccf03ef07a-cd0a885013.zip"; sha512 = "cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68"; };
@ -258,14 +273,18 @@ cacheEntries = {
"bufferutil@npm:4.0.6" = { filename = "bufferutil-npm-4.0.6-b93c8a5e05-dd10756094.zip"; sha512 = "dd107560947445280af7820c3d0534127b911577d85d537e1d7e0aa30fd634853cef8a994d6e8aed3d81388ab1a20257de776164afe6a6af8e78f5f17968ebd6"; };
"socks@npm:2.7.0" = { filename = "socks-npm-2.7.0-cc1cb019db-0b5d94e2b3.zip"; sha512 = "0b5d94e2b3c11e7937b40fc5dac1e80d8b92a330e68c51f1d271ce6980c70adca42a3f8cd47c4a5769956bada074823b53374f2dc5f2ea5c2121b222dec6eadf"; };
"utf-8-validate@npm:5.0.8" = { filename = "utf-8-validate-npm-5.0.8-a36435e0ec-cb1be3fa4e.zip"; sha512 = "cb1be3fa4eb896be17945a2e46c25f47ef9344d5955703a09d9d831efef681ce120bddfe02a8ebf3a96580ffa8f70edda55623e4d021adff70cb81cd0c8a885e"; };
"debug@npm:2.6.9" = { filename = "debug-npm-2.6.9-7d4cb597dc-d2f51589ca.zip"; sha512 = "d2f51589ca66df60bf36e1fa6e4386b318c3f1e06772280eea5b1ae9fd3d05e9c2b7fd8a7d862457d00853c75b00451aa2d7459b924629ee385287a650f58fe6"; };
"nopt@npm:5.0.0" = { filename = "nopt-npm-5.0.0-304b40fbfe-d35fdec187.zip"; sha512 = "d35fdec187269503843924e0114c0c6533fb54bbf1620d0f28b4b60ba01712d6687f62565c55cc20a504eff0fbe5c63e22340c3fad549ad40469ffb611b04f2f"; };
"semver@npm:7.3.5" = { filename = "semver-npm-7.3.5-618cf5db6a-5eafe6102b.zip"; sha512 = "5eafe6102bea2a7439897c1856362e31cc348ccf96efd455c8b5bc2c61e6f7e7b8250dc26b8828c1d76a56f818a7ee907a36ae9fb37a599d3d24609207001d60"; };
"which@npm:2.0.2" = { filename = "which-npm-2.0.2-320ddf72f7-1a5c563d3c.zip"; sha512 = "1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1"; };
"universalify@npm:0.1.2" = { filename = "universalify-npm-0.1.2-9b22d31d2d-40cdc60f6e.zip"; sha512 = "40cdc60f6e61070fe658ca36016a8f4ec216b29bf04a55dce14e3710cc84c7448538ef4dad3728d0bfe29975ccd7bfb5f414c45e7b78883567fb31b246f02dff"; };
"sax@npm:1.2.4" = { filename = "sax-npm-1.2.4-178f05f12f-d3df7d32b8.zip"; sha512 = "d3df7d32b897a2c2f28e941f732c71ba90e27c24f62ee918bd4d9a8cfb3553f2f81e5493c7f0be94a11c1911b643a9108f231dd6f60df3fa9586b5d2e3e9e1fe"; };
"yallist@npm:4.0.0" = { filename = "yallist-npm-4.0.0-b493d9e907-343617202a.zip"; sha512 = "343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5"; };
"pump@npm:3.0.0" = { filename = "pump-npm-3.0.0-0080bf6a7a-e42e9229fb.zip"; sha512 = "e42e9229fba14732593a718b04cb5e1cfef8254544870997e0ecd9732b189a48e1256e4e5478148ecb47c8511dca2b09eae56b4d0aad8009e6fac8072923cfc9"; };
"htmlparser2@npm:6.1.0" = { filename = "htmlparser2-npm-6.1.0-4ef89ab31e-81a7b3d9c3.zip"; sha512 = "81a7b3d9c3bb9acb568a02fc9b1b81ffbfa55eae7f1c41ae0bf840006d1dbf54cb3aa245b2553e2c94db674840a9f0fdad7027c9a9d01a062065314039058c4e"; };
"jsonfile@npm:4.0.0" = { filename = "jsonfile-npm-4.0.0-10ce3aea15-6447d6224f.zip"; sha512 = "6447d6224f0d31623eef9b51185af03ac328a7553efcee30fa423d98a9e276ca08db87d71e17f2310b0263fd3ffa6c2a90a6308367f661dc21580f9469897c9e"; };
"debug@npm:3.2.7" = { filename = "debug-npm-3.2.7-754e818c7a-b3d8c59407.zip"; sha512 = "b3d8c5940799914d30314b7c3304a43305fd0715581a919dacb8b3176d024a782062368405b47491516d2091d6462d4d11f2f4974a405048094f8bfebfa3071c"; };
"iconv-lite@npm:0.4.24" = { filename = "iconv-lite-npm-0.4.24-c5c4ac6695-bd9f120f5a.zip"; sha512 = "bd9f120f5a5b306f0bc0b9ae1edeb1577161503f5f8252a20f1a9e56ef8775c9959fd01c55f2d3a39d9a8abaf3e30c1abeb1895f367dcbbe0a8fd1c9ca01c4f6"; };
"color-name@npm:1.1.4" = { filename = "color-name-npm-1.1.4-025792b0ea-b044585952.zip"; sha512 = "b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610"; };
"tslib@npm:2.3.1" = { filename = "tslib-npm-2.3.1-0e21e18015-de17a98d46.zip"; sha512 = "de17a98d4614481f7fcb5cd53ffc1aaf8654313be0291e1bfaee4b4bb31a20494b7d218ff2e15017883e8ea9626599b3b0e0229c18383ba9dce89da2adf15cb9"; };
"@jridgewell/trace-mapping@npm:0.3.9" = { filename = "@jridgewell-trace-mapping-npm-0.3.9-91625cd7fb-d89597752f.zip"; sha512 = "d89597752fd88d3f3480845691a05a44bd21faac18e2185b6f436c3b0fd0c5a859fbbd9aaa92050c4052caf325ad3e10e2e1d1b64327517471b7d51babc0ddef"; };
@ -278,6 +297,7 @@ cacheEntries = {
"node-gyp-build@npm:4.3.0" = { filename = "node-gyp-build-npm-4.3.0-87bdf5216f-1ecab16d9f.zip"; sha512 = "1ecab16d9f275174d516e223f60f65ebe07540347d5c04a6a7d6921060b7f2e3af4f19463d9d1dcedc452e275c2ae71354a99405e55ebd5b655bb2f38025c728"; };
"ip@npm:2.0.0" = { filename = "ip-npm-2.0.0-204facb3cc-cfcfac6b87.zip"; sha512 = "cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349"; };
"smart-buffer@npm:4.2.0" = { filename = "smart-buffer-npm-4.2.0-5ac3f668bb-b5167a7142.zip"; sha512 = "b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b"; };
"ms@npm:2.0.0" = { filename = "ms-npm-2.0.0-9e1101a471-0e6a22b8b7.zip"; sha512 = "0e6a22b8b746d2e0b65a430519934fefd41b6db0682e3477c10f60c76e947c4c0ad06f63ffdf1d78d335f83edee8c0aa928aa66a36c7cd95b69b26f468d527f4"; };
"prebuild-install@npm:7.1.1" = { filename = "prebuild-install-npm-7.1.1-cb9fc9d341-dbf96d0146.zip"; sha512 = "dbf96d0146b6b5827fc8f67f72074d2e19c69628b9a7a0a17d0fad1bf37e9f06922896972e074197fc00a52eae912993e6ef5a0d471652f561df5cb516f3f467"; };
"websocket@npm:1.0.34" = { filename = "websocket-npm-1.0.34-3aaa6c5dc0-8a0ce6d79c.zip"; sha512 = "8a0ce6d79cc1334bb6ea0d607f0092f3d32700b4dd19e4d5540f2a85f3b50e1f8110da0e4716737056584dde70bbebcb40bbd94bbb437d7468c71abfbfa077d8"; };
"minimatch@npm:3.1.1" = { filename = "minimatch-npm-3.1.1-38a381be52-e9e3772e4e.zip"; sha512 = "e9e3772e4ea06ea3a888d39bc7690d3c812ee7e5a70c2d2f568ccadac0249a027f865589d19ad03ed937e6ca3b4ad35f85411db9670f7877d8fc2ed452f1cd37"; };
@ -289,6 +309,9 @@ cacheEntries = {
"domelementtype@npm:2.2.0" = { filename = "domelementtype-npm-2.2.0-c37b3b15bf-24cb386198.zip"; sha512 = "24cb386198640cd58aa36f8c987f2ea61859929106d06ffcc8f547e70cb2ed82a6dc56dcb8252b21fba1f1ea07df6e4356d60bfe57f77114ca1aed6828362629"; };
"entities@npm:2.2.0" = { filename = "entities-npm-2.2.0-0fc8d5b2f7-19010dacaf.zip"; sha512 = "19010dacaf0912c895ea262b4f6128574f9ccf8d4b3b65c7e8334ad0079b3706376360e28d8843ff50a78aabcb8f08f0a32dbfacdc77e47ed77ca08b713669b3"; };
"write-file-atomic@npm:1.3.4" = { filename = "write-file-atomic-npm-1.3.4-485bffebbc-ed5a1fc812.zip"; sha512 = "ed5a1fc812abe99dd03cd42be145a5e13af42609e19873244510c71b2e261a169db6d06cb9a92b6b0489dd05f045e53bf464d9ad7713e443934af9b81a9cc65d"; };
"ms@npm:2.1.3" = { filename = "ms-npm-2.1.3-81ff3cfac1-aa92de6080.zip"; sha512 = "aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d"; };
"safer-buffer@npm:2.1.2" = { filename = "safer-buffer-npm-2.1.2-8d5c0b705e-cab8f25ae6.zip"; sha512 = "cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0"; };
"fs-extra@npm:10.0.0" = { filename = "fs-extra-npm-10.0.0-4f8c704115-5285a3d8f3.zip"; sha512 = "5285a3d8f34b917cf2b66af8c231a40c1623626e9d701a20051d3337be16c6d7cac94441c8b3732d47a92a2a027886ca93c69b6a4ae6aee3c89650d2a8880c0a"; };
"end-of-stream@npm:1.4.4" = { filename = "end-of-stream-npm-1.4.4-497fc6dee1-530a5a5a1e.zip"; sha512 = "530a5a5a1e517e962854a31693dbb5c0b2fc40b46dad2a56a2deec656ca040631124f4795823acc68238147805f8b021abbe221f4afed5ef3c8e8efc2024908b"; };
"@jridgewell/resolve-uri@npm:3.1.0" = { filename = "@jridgewell-resolve-uri-npm-3.1.0-6ff2351e61-b5ceaaf9a1.zip"; sha512 = "b5ceaaf9a110fcb2780d1d8f8d4a0bfd216702f31c988d8042e5f8fbe353c55d9b0f55a1733afdc64806f8e79c485d2464680ac48a0d9fcadb9548ee6b81d267"; };
"@jridgewell/sourcemap-codec@npm:1.4.14" = { filename = "@jridgewell-sourcemap-codec-npm-1.4.14-f5f0630788-61100637b6.zip"; sha512 = "61100637b6d173d3ba786a5dff019e1a74b1f394f323c1fee337ff390239f053b87266c7a948777f4b1ee68c01a8ad0ab61e5ff4abb5a012a0b091bec391ab97"; };
@ -304,7 +327,6 @@ cacheEntries = {
"fs-constants@npm:1.0.0" = { filename = "fs-constants-npm-1.0.0-59576b2177-18f5b71837.zip"; sha512 = "18f5b718371816155849475ac36c7d0b24d39a11d91348cfcb308b4494824413e03572c403c86d3a260e049465518c4f0d5bd00f0371cdfcad6d4f30a85b350d"; };
"node-abi@npm:3.8.0" = { filename = "node-abi-npm-3.8.0-bba572a0b8-3644dd51f4.zip"; sha512 = "3644dd51f4f189358ef56055407501aa698632d67448585b38c46c81a482a0c3bfb06da513ac4060a12ce5f607f208ba9d9c8280f1c38329670b709bd735fcae"; };
"domutils@npm:2.8.0" = { filename = "domutils-npm-2.8.0-0325139e5c-abf7434315.zip"; sha512 = "abf7434315283e9aadc2a24bac0e00eab07ae4313b40cc239f89d84d7315ebdfd2fb1b5bf750a96bc1b4403d7237c7b2ebf60459be394d625ead4ca89b934391"; };
"debug@npm:2.6.9" = { filename = "debug-npm-2.6.9-7d4cb597dc-d2f51589ca.zip"; sha512 = "d2f51589ca66df60bf36e1fa6e4386b318c3f1e06772280eea5b1ae9fd3d05e9c2b7fd8a7d862457d00853c75b00451aa2d7459b924629ee385287a650f58fe6"; };
"typedarray-to-buffer@npm:3.1.5" = { filename = "typedarray-to-buffer-npm-3.1.5-aadc11995e-99c11aaa8f.zip"; sha512 = "99c11aaa8f45189fcfba6b8a4825fd684a321caa9bd7a76a27cf0c7732c174d198b99f449c52c3818107430b5f41c0ccbbfb75cb2ee3ca4a9451710986d61a60"; };
"are-we-there-yet@npm:3.0.0" = { filename = "are-we-there-yet-npm-3.0.0-1391430190-348edfdd93.zip"; sha512 = "348edfdd931b0b50868b55402c01c3f64df1d4c229ab6f063539a5025fd6c5f5bb8a0cab409bbed8d75d34762d22aa91b7c20b4204eb8177063158d9ba792981"; };
"chownr@npm:2.0.0" = { filename = "chownr-npm-2.0.0-638f1c9c61-c57cf9dd07.zip"; sha512 = "c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f"; };
@ -312,13 +334,14 @@ cacheEntries = {
"imurmurhash@npm:0.1.4" = { filename = "imurmurhash-npm-0.1.4-610c5068a0-7cae75c8cd.zip"; sha512 = "7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7"; };
"slide@npm:1.1.6" = { filename = "slide-npm-1.1.6-14e4650dea-5768635d22.zip"; sha512 = "5768635d227172e215b7a1a91d32f8781f5783b4961feaaf3d536bbf83cc51878928c137508cde7659fea6d7c04074927cab982731302771ee0051518ff24896"; };
"brace-expansion@npm:1.1.11" = { filename = "brace-expansion-npm-1.1.11-fb95eb05ad-faf34a7bb0.zip"; sha512 = "faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07"; };
"universalify@npm:2.0.0" = { filename = "universalify-npm-2.0.0-03b8b418a8-2406a4edf4.zip"; sha512 = "2406a4edf4a8830aa6813278bab1f953a8e40f2f63a37873ffa9a3bc8f9745d06cc8e88f3572cb899b7e509013f7f6fcc3e37e8a6d914167a5381d8440518c44"; };
"fs-minipass@npm:2.1.0" = { filename = "fs-minipass-npm-2.1.0-501ef87306-1b8d128dae.zip"; sha512 = "1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1"; };
"minipass@npm:3.1.6" = { filename = "minipass-npm-3.1.6-f032df1661-57a0404141.zip"; sha512 = "57a04041413a3531a65062452cb5175f93383ef245d6f4a2961d34386eb9aa8ac11ac7f16f791f5e8bbaf1dfb1ef01596870c88e8822215db57aa591a5bb0a77"; };
"es5-ext@npm:0.10.53" = { filename = "es5-ext-npm-0.10.53-18c0039c41-24ec223692.zip"; sha512 = "24ec22369260cf98605cb2f51eae9d7df5dc621bc5d3b311f6f5c3d0fcdb7bafae888270f3083ee6e9af27350a5ea49f1fe2dd6406a9017247ca40f091f529b2"; };
"bl@npm:4.1.0" = { filename = "bl-npm-4.1.0-7f94cdcf3f-9e8521fa7e.zip"; sha512 = "9e8521fa7e83aa9427c6f8ccdcba6e8167ef30cc9a22df26effcc5ab682ef91d2cbc23a239f945d099289e4bbcfae7a192e9c28c84c6202e710a0dfec3722662"; };
"minizlib@npm:2.1.2" = { filename = "minizlib-npm-2.1.2-ea89cd0cfb-f1fdeac0b0.zip"; sha512 = "f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3"; };
"rc@npm:1.2.8" = { filename = "rc-npm-1.2.8-d6768ac936-2e26e052f8.zip"; sha512 = "2e26e052f8be2abd64e6d1dabfbd7be03f80ec18ccbc49562d31f617d0015fbdbcf0f9eed30346ea6ab789e0fdfe4337f033f8016efdbee0df5354751842080e"; };
"ms@npm:2.0.0" = { filename = "ms-npm-2.0.0-9e1101a471-0e6a22b8b7.zip"; sha512 = "0e6a22b8b746d2e0b65a430519934fefd41b6db0682e3477c10f60c76e947c4c0ad06f63ffdf1d78d335f83edee8c0aa928aa66a36c7cd95b69b26f468d527f4"; };
"jsonfile@npm:6.1.0" = { filename = "jsonfile-npm-6.1.0-20a4796cee-7af3b8e1ac.zip"; sha512 = "7af3b8e1ac8fe7f1eccc6263c6ca14e1966fcbc74b618d3c78a0a2075579487547b94f72b7a1114e844a1e15bb00d440e5d1720bfc4612d790a6f285d5ea8354"; };
"is-typedarray@npm:1.0.0" = { filename = "is-typedarray-npm-1.0.0-bbd99de5b6-3508c6cd0a.zip"; sha512 = "3508c6cd0a9ee2e0df2fa2e9baabcdc89e911c7bd5cf64604586697212feec525aa21050e48affb5ffc3df20f0f5d2e2cf79b08caa64e1ccc9578e251763aef7"; };
"delegates@npm:1.0.0" = { filename = "delegates-npm-1.0.0-9b1942d75f-a51744d9b5.zip"; sha512 = "a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd"; };
"balanced-match@npm:1.0.2" = { filename = "balanced-match-npm-1.0.2-a53c126459-9706c088a2.zip"; sha512 = "9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65"; };
@ -360,15 +383,12 @@ cacheEntries = {
"depd@npm:1.1.2" = { filename = "depd-npm-1.1.2-b0c8414da7-6b406620d2.zip"; sha512 = "6b406620d269619852885ce15965272b829df6f409724415e0002c8632ab6a8c0a08ec1f0bd2add05dc7bd7507606f7e2cc034fa24224ab829580040b835ecd9"; };
"@tootallnate/once@npm:1.1.2" = { filename = "@tootallnate-once-npm-1.1.2-0517220057-e1fb1bbbc1.zip"; sha512 = "e1fb1bbbc12089a0cb9433dc290f97bddd062deadb6178ce9bcb93bb7c1aecde5e60184bc7065aec42fe1663622a213493c48bbd4972d931aae48315f18e1be9"; };
"agent-base@npm:6.0.2" = { filename = "agent-base-npm-6.0.2-428f325a93-f52b6872cc.zip"; sha512 = "f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d"; };
"debug@npm:4.3.3" = { filename = "debug-npm-4.3.3-710fd4cc7f-14472d56fe.zip"; sha512 = "14472d56fe4a94dbcfaa6dbed2dd3849f1d72ba78104a1a328047bb564643ca49df0224c3a17fa63533fd11dd3d4c8636cd861191232a2c6735af00cc2d4de16"; };
"humanize-ms@npm:1.2.1" = { filename = "humanize-ms-npm-1.2.1-e942bd7329-9c7a74a282.zip"; sha512 = "9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16"; };
"encoding@npm:0.1.13" = { filename = "encoding-npm-0.1.13-82a1837d30-bb98632f8f.zip"; sha512 = "bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f"; };
"minipass-sized@npm:1.0.3" = { filename = "minipass-sized-npm-1.0.3-306d86f432-79076749fc.zip"; sha512 = "79076749fcacf21b5d16dd596d32c3b6bf4d6e62abb43868fac21674078505c8b15eaca4e47ed844985a4514854f917d78f588fcd029693709417d8f98b2bd60"; };
"socks@npm:2.6.2" = { filename = "socks-npm-2.6.2-94c1dcb8b8-dd91942930.zip"; sha512 = "dd9194293059d737759d5c69273850ad4149f448426249325c4bea0e340d1cf3d266c3b022694b0dcf5d31f759de23657244c481fc1e8322add80b7985c36b5e"; };
"ms@npm:2.1.3" = { filename = "ms-npm-2.1.3-81ff3cfac1-aa92de6080.zip"; sha512 = "aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d"; };
"ip@npm:1.1.5" = { filename = "ip-npm-1.1.5-af36318aa6-30133981f0.zip"; sha512 = "30133981f082a060a32644f6a7746e9ba7ac9e2bc07ecc8bbdda3ee8ca9bec1190724c390e45a1ee7695e7edfd2a8f7dda2c104ec5f7ac5068c00648504c7e5a"; };
"iconv-lite@npm:0.6.3" = { filename = "iconv-lite-npm-0.6.3-24b8aae27e-3f60d47a5c.zip"; sha512 = "3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf"; };
"safer-buffer@npm:2.1.2" = { filename = "safer-buffer-npm-2.1.2-8d5c0b705e-cab8f25ae6.zip"; sha512 = "cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0"; };
"cacache@npm:15.3.0" = { filename = "cacache-npm-15.3.0-a7e5239c6a-a07327c27a.zip"; sha512 = "a07327c27a4152c04eb0a831c63c00390d90f94d51bb80624a66f4e14a6b6360bbf02a84421267bd4d00ca73ac9773287d8d7169e8d2eafe378d2ce140579db8"; };
"infer-owner@npm:1.0.4" = { filename = "infer-owner-npm-1.0.4-685ac3d2af-181e732764.zip"; sha512 = "181e732764e4a0611576466b4b87dac338972b839920b2a8cde43642e4ed6bd54dc1fb0b40874728f2a2df9a1b097b8ff83b56d5f8f8e3927f837fdcb47d8a89"; };
"promise-inflight@npm:1.0.1" = { filename = "promise-inflight-npm-1.0.1-5bb925afac-2274948309.zip"; sha512 = "22749483091d2c594261517f4f80e05226d4d5ecc1fc917e1886929da56e22b5718b7f2a75f3807e7a7d471bc3be2907fe92e6e8f373ddf5c64bae35b5af3981"; };
@ -381,26 +401,6 @@ cacheEntries = {
"aggregate-error@npm:3.1.0" = { filename = "aggregate-error-npm-3.1.0-415a406f4e-1101a33f21.zip"; sha512 = "1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79"; };
"clean-stack@npm:2.2.0" = { filename = "clean-stack-npm-2.2.0-a8ce435a5c-2ac8cd2b2f.zip"; sha512 = "2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68"; };
"indent-string@npm:4.0.0" = { filename = "indent-string-npm-4.0.0-7b717435b2-824cfb9929.zip"; sha512 = "824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612"; };
"oicq@https://files.catbox.moe/a5tcyl.tgz" = { filename = "oicq-https-9b8f0fd4d4-73dc95fa12.zip"; sha512 = "73dc95fa12188ce074687cdb4b35c7a982cd677fac2f80fb56203ac0862918aa83a4e514ea892e2f4633a6d9e9086bd774a74fd02aebb17c7528f9e04524844b"; };
"long@npm:4.0.0" = { filename = "long-npm-4.0.0-ecd96a31ed-16afbe8f74.zip"; sha512 = "16afbe8f749c7c849db1f4de4e2e6a31ac6e617cead3bdc4f9605cb703cd20e1e9fc1a7baba674ffcca57d660a6e5b53a9e236d7b25a295d3855cca79cc06744"; };
"pngjs@npm:6.0.0" = { filename = "pngjs-npm-6.0.0-31d8d85681-ab6c285086.zip"; sha512 = "ab6c285086060087097eab9fe6b5a528a24f9e79c03dea2b4fd6264ed4fdb5beff4a3257eeeaf2a9dc18249b539609c2a4e4013c567164a1f6b5ba2c974d5ecb"; };
"probe-image-size@npm:7.2.3" = { filename = "probe-image-size-npm-7.2.3-2b6ee36e6f-1a5eeb8f5c.zip"; sha512 = "1a5eeb8f5cb979172144a5d7a017c70fcd664ccc8af9ad3a803903ee81864abea4036adae4fc6e66e9ae21bd3ce0febefaf1f32e65a77ff226b2eb61e9e4978c"; };
"log4js@npm:6.4.1" = { filename = "log4js-npm-6.4.1-b00dd7826e-0614949662.zip"; sha512 = "0614949662314573ec7dcd841769a4d23d8cb8268685458a40fcd94f2ae6ec628234cfb9a6bc17821fb6ea6ce3765e779b4966ba1cf918f393dc37155a3615cb"; };
"lodash.merge@npm:4.6.2" = { filename = "lodash.merge-npm-4.6.2-77cb4416bf-ad580b4bdb.zip"; sha512 = "ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005"; };
"stream-parser@npm:0.3.1" = { filename = "stream-parser-npm-0.3.1-0b70187c85-4d86ff8cff.zip"; sha512 = "4d86ff8cffe7c7587dc91433fff9dce38a93ea7e9f47560055addc81eae6b6befab22b75643ce539faf325fe2b17d371778242566bed086e75f6cffb1e76c06c"; };
"date-format@npm:4.0.3" = { filename = "date-format-npm-4.0.3-ce15085cfe-8ae4d9de35.zip"; sha512 = "8ae4d9de3532010169a89bc7b079342051ba3ec88552636aa677bfb53e8eb15113af8394679aea7d41367dc8bb6e9865da17f21ac2802202180b09d6e3f2339e"; };
"flatted@npm:3.2.5" = { filename = "flatted-npm-3.2.5-0ee5a8875f-3c436e9695.zip"; sha512 = "3c436e9695ccca29620b4be5671dd72e5dd0a7500e0856611b7ca9bd8169f177f408c3b9abfa78dfe1493ee2d873e2c119080a8a9bee4e1a186a9e60ca6c89f1"; };
"needle@npm:2.9.1" = { filename = "needle-npm-2.9.1-f40e591726-746ae3a378.zip"; sha512 = "746ae3a3782f0a057ff304a98843cc6f2009f978a0fad0c3e641a9d46d0b5702bb3e197ba08aecd48678067874a991c4f5fc320c7e51a4c041d9dd3441146cf0"; };
"streamroller@npm:3.0.2" = { filename = "streamroller-npm-3.0.2-6d7ba8035a-1f323824f0.zip"; sha512 = "1f323824f0e81cc085c24f33addfd8ef00d0c15aafee520a8cf207ca6e2dc674fd852528c7b4450cc87f4335d1269ed18b3f0188853d45d7f0912c9a205d1fc1"; };
"sax@npm:1.2.4" = { filename = "sax-npm-1.2.4-178f05f12f-d3df7d32b8.zip"; sha512 = "d3df7d32b897a2c2f28e941f732c71ba90e27c24f62ee918bd4d9a8cfb3553f2f81e5493c7f0be94a11c1911b643a9108f231dd6f60df3fa9586b5d2e3e9e1fe"; };
"debug@npm:3.2.7" = { filename = "debug-npm-3.2.7-754e818c7a-b3d8c59407.zip"; sha512 = "b3d8c5940799914d30314b7c3304a43305fd0715581a919dacb8b3176d024a782062368405b47491516d2091d6462d4d11f2f4974a405048094f8bfebfa3071c"; };
"iconv-lite@npm:0.4.24" = { filename = "iconv-lite-npm-0.4.24-c5c4ac6695-bd9f120f5a.zip"; sha512 = "bd9f120f5a5b306f0bc0b9ae1edeb1577161503f5f8252a20f1a9e56ef8775c9959fd01c55f2d3a39d9a8abaf3e30c1abeb1895f367dcbbe0a8fd1c9ca01c4f6"; };
"fs-extra@npm:10.0.0" = { filename = "fs-extra-npm-10.0.0-4f8c704115-5285a3d8f3.zip"; sha512 = "5285a3d8f34b917cf2b66af8c231a40c1623626e9d701a20051d3337be16c6d7cac94441c8b3732d47a92a2a027886ca93c69b6a4ae6aee3c89650d2a8880c0a"; };
"universalify@npm:2.0.0" = { filename = "universalify-npm-2.0.0-03b8b418a8-2406a4edf4.zip"; sha512 = "2406a4edf4a8830aa6813278bab1f953a8e40f2f63a37873ffa9a3bc8f9745d06cc8e88f3572cb899b7e509013f7f6fcc3e37e8a6d914167a5381d8440518c44"; };
"jsonfile@npm:6.1.0" = { filename = "jsonfile-npm-6.1.0-20a4796cee-7af3b8e1ac.zip"; sha512 = "7af3b8e1ac8fe7f1eccc6263c6ca14e1966fcbc74b618d3c78a0a2075579487547b94f72b7a1114e844a1e15bb00d440e5d1720bfc4612d790a6f285d5ea8354"; };
"axios@npm:1.2.1" = { filename = "axios-npm-1.2.1-4056ddcb4c-c4dc4e1190.zip"; sha512 = "c4dc4e119064c9aed09a3de309bedb797a139a6fb372223aafe3e0c10a7d4a14e4d3e9c9d309467fadb9d2b490b891ee3df96ef5b55716bb971910466ff9f0c5"; };
"follow-redirects@npm:1.15.2" = { filename = "follow-redirects-npm-1.15.2-1ec1dd82be-faa66059b6.zip"; sha512 = "faa66059b66358ba65c234c2f2a37fcec029dc22775f35d9ad6abac56003268baf41e55f9ee645957b32c7d9f62baf1f0b906e68267276f54ec4b4c597c2b190"; };
"proxy-from-env@npm:1.1.0" = { filename = "proxy-from-env-npm-1.1.0-c13d07f26b-ed7fcc2ba0.zip"; sha512 = "ed7fcc2ba0a33404958e34d95d18638249a68c430e30fcb6c478497d72739ba64ce9810a24f53a7d921d0c065e5b78e3822759800698167256b04659366ca4d4"; };
};
in optionalOverride overrideAttrs project

View File

@ -1723,7 +1723,7 @@ __metadata:
tsc: ^2.0.4
typescript: ^4.7.4
bin:
q2tg: build/src/index.js
q2tg: build/index.js
languageName: unknown
linkType: soft