Files
SnowCatQQ/packages/snowcat-qrcode/lib/main.ts
T
天天的鸟蛋蛋 b9655a5ab1 SnowCat 雪猫底层全源码:NapCat 4.18.28 底座 + SnowLuma 能力移植 + V8 通道适配 9.9.37
26 包 monorepo(TS 全源码):
- snowcat-core: NT 内核 API 封装 + listener(含 9.9.37 六回调适配)+ Packet 发包
- snowcat-onebot: OneBot v11 全动作 + MCP Streamable HTTP 适配器 + 稳定线
- snowcat-webui-frontend/backend: 雪猫控制台(React+HeroUI)
- snowcat-shell: 单文件 bundle 出口(vite inlineDynamicImports)
- snowcat-native: napi2native / MoeHoo / ffmpeg / pty 运行时
- 56 项 SnowLuma 独门动作移植(qzone 全家桶/群相册/装扮/闪照/收藏)
- 工具件: 解包器/启动器/便携制作器/doctor

GitHub 关联已全量指向 DandanLLab/SnowCatQQ
2026-11-12 06:27:36 +08:00

111 lines
3.0 KiB
TypeScript

import QRCode from '../vendor/QRCode';
import { QRErrorCorrectLevel } from '../vendor/QRCode/QRErrorCorrectLevel';
const black = '\x1b[40m \x1b[0m';
const white = '\x1b[47m \x1b[0m';
const toCell = (value: boolean | null): string => {
return value ? black : white;
};
const repeat = (color: string) => {
return {
times: (count: number): string => {
return new Array(count + 1).join(color);
},
};
};
const fill = (length: number, value: boolean): boolean[] => {
const arr = new Array(length);
for (let i = 0; i < length; i++) {
arr[i] = value;
}
return arr;
};
interface GenerateOptions {
small?: boolean;
}
type Callback = (output: string) => void;
export default {
error: QRErrorCorrectLevel.L,
generate (input: string, opts: GenerateOptions | Callback, cb?: Callback): void {
if (typeof opts === 'function') {
cb = opts;
opts = {};
}
const qrcode = new QRCode(-1, this.error);
qrcode.addData(input);
qrcode.make();
let output = '';
if (opts && (opts as GenerateOptions).small) {
const BLACK = true; const WHITE = false;
const moduleCount = qrcode.getModuleCount();
const moduleData = qrcode.modules ? qrcode.modules.slice() : [];
const oddRow = moduleCount % 2 === 1;
if (oddRow) {
moduleData.push(fill(moduleCount, WHITE));
}
const platte = {
WHITE_ALL: '\u2588',
WHITE_BLACK: '\u2580',
BLACK_WHITE: '\u2584',
BLACK_ALL: ' ',
};
const borderTop = repeat(platte.BLACK_WHITE).times(moduleCount + 2); // 修改这里
const borderBottom = repeat(platte.WHITE_BLACK).times(moduleCount + 2); // 修改这里
output += borderTop + '\n';
for (let row = 0; row < moduleCount; row += 2) {
output += platte.WHITE_ALL;
for (let col = 0; col < moduleCount; col++) {
if (moduleData[row]?.[col] === WHITE && moduleData[row + 1]?.[col] === WHITE) {
output += platte.WHITE_ALL;
} else if (moduleData[row]?.[col] === WHITE && moduleData[row + 1]?.[col] === BLACK) {
output += platte.WHITE_BLACK;
} else if (moduleData[row]?.[col] === BLACK && moduleData[row + 1]?.[col] === WHITE) {
output += platte.BLACK_WHITE;
} else {
output += platte.BLACK_ALL;
}
}
output += platte.WHITE_ALL + '\n';
}
if (!oddRow) {
output += borderBottom;
}
} else {
const border = repeat(white).times(qrcode.getModuleCount() + 2); // 修改这里
output += border + '\n';
if (qrcode.modules) {
qrcode.modules.forEach((row: (boolean | null)[]) => {
output += white;
output += row.map(toCell).join('');
output += white + '\n';
});
}
output += border;
}
if (cb) cb(output);
else console.log(output);
},
setErrorLevel (error: keyof typeof QRErrorCorrectLevel): void {
this.error = QRErrorCorrectLevel[error] || this.error;
},
};