feat: http与ws允许监听同一端口,快速登录允许自动选择QQ号,允许禁用webUI

This commit is contained in:
挂神 2024-07-22 18:41:31 +08:00
parent 0efdffd857
commit f7bdc35ed6
6 changed files with 69 additions and 18 deletions

View File

@ -9,7 +9,15 @@ type RegisterHandler = (res: Response, payload: any) => Promise<any>
export abstract class HttpServerBase {
name: string = 'NapCatQQ';
private readonly expressAPP: Express;
private server: http.Server | null = null;
private _server: http.Server | null = null;
public get server(): http.Server | null {
return this._server;
}
private set server(value: http.Server | null) {
this._server = value;
}
constructor() {
this.expressAPP = express();

View File

@ -1,4 +1,5 @@
import { WebSocket, WebSocketServer } from 'ws';
import http from 'http';
import urlParse from 'url';
import { IncomingMessage } from 'node:http';
import { log } from '@/common/utils/log';
@ -27,17 +28,36 @@ export class WebsocketServerBase {
constructor() {
}
start(port: number, host: string = '') {
try {
this.ws = new WebSocketServer({
port,
host: '',
maxPayload: 1024 * 1024 * 1024
}).on('error', () => {
});
log(`ws服务启动成功, ${host}:${port}`);
} catch (e: any) {
throw Error('ws服务启动失败, 请检查监听的ip和端口' + e.toString());
start(port: number | http.Server, host: string = '') {
if (port instanceof http.Server) {
try {
const wss = new WebSocketServer({
noServer: true,
maxPayload: 1024 * 1024 * 1024
}).on('error', () => {
});
this.ws = wss;
port.on('upgrade', function upgrade(request, socket, head) {
wss.handleUpgrade(request, socket, head, function done(ws) {
wss.emit('connection', ws, request);
});
});
log(`ws服务启动成功, 绑定到HTTP服务`);
} catch (e: any) {
throw Error('ws服务启动失败, 可能是绑定的HTTP服务异常' + e.toString());
}
} else {
try {
this.ws = new WebSocketServer({
port,
host: '',
maxPayload: 1024 * 1024 * 1024
}).on('error', () => {
});
log(`ws服务启动成功, ${host}:${port}`);
} catch (e: any) {
throw Error('ws服务启动失败, 请检查监听的ip和端口' + e.toString());
}
}
this.ws.on('connection', (wsClient, req) => {
const url: string = req.url!.split('?').shift() || '/';

View File

@ -21,7 +21,7 @@ const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const tagColor = chalk.cyan;
program
.option('-q, --qq <type>', 'QQ号')
.option('-q, --qq [type]', 'QQ号')
.parse(process.argv);
//deleteOldFiles(path.join(__dirname, 'logs'), 3).then().catch();
@ -69,7 +69,18 @@ const showQRCode = async (url: string, base64: string, buffer: Buffer) => {
});
});
};
const quickLoginQQ = cmdOptions.qq;
let quickLoginQQ = cmdOptions.qq;
const QuickLoginList = await napCatCore.getQuickLoginList();
if (quickLoginQQ == true) {
if (QuickLoginList.LocalLoginInfoList.length > 0) {
quickLoginQQ = QuickLoginList.LocalLoginInfoList[0].uin;
log('-q 指令指定使用最近的QQ进行快速登录');
} else {
quickLoginQQ = '';
}
}
// napCatCore.on('system.login.error', (result) => {
// console.error('登录失败', result);
// napCatCore.qrLogin().then().catch(console.error);
@ -107,11 +118,14 @@ if (quickLoginQQ) {
logError('快速登录错误:', res.loginErrorInfo.errMsg);
}
}).catch((e) => {
logError(e);
logError('快速登录错误:', e);
napCatCore.qrLogin(showQRCode);
});
} else {
log('没有 -q 参数指定快速登录的QQ将使用二维码登录方式');
log('没有 -q 指令指定快速登录,将使用二维码登录方式');
if (QuickLoginList.LocalLoginInfoList.length > 0) {
log(`可用于快速登录的QQ${QuickLoginList.LocalLoginInfoList.map((u, index) => `\n${index}: ${u.uin} ${u.nickName}`)}`);
}
napCatCore.qrLogin(showQRCode);
}

View File

@ -73,7 +73,11 @@ export class NapCatOnebot11 {
ob11HTTPServer.start(ob11Config.http.port, ob11Config.http.host);
}
if (ob11Config.ws.enable) {
ob11WebsocketServer.start(ob11Config.ws.port, ob11Config.ws.host);
if (ob11Config.http.port == ob11Config.ws.port && ob11Config.http.host == ob11Config.ws.host && ob11HTTPServer.server) {
ob11WebsocketServer.start(ob11HTTPServer.server);
} else {
ob11WebsocketServer.start(ob11Config.ws.port, ob11Config.ws.host);
}
}
if (ob11Config.reverseWs.enable) {
ob11ReverseWebsockets.start();

View File

@ -1,4 +1,5 @@
import { WebSocket } from 'ws';
import http from 'http';
import { actionMap } from '../../action';
import { OB11Response } from '../../action/OB11Response';
import { postWsEvent, registerWsEventSender, unregisterWsEventSender } from '../postOB11Event';
@ -18,7 +19,7 @@ const heartbeatRunning = false;
class OB11WebsocketServer extends WebsocketServerBase {
public start(port: number, host: string) {
public start(port: number | http.Server, host: string = '') {
this.token = ob11Config.token;
super.start(port, host);
}

View File

@ -21,6 +21,10 @@ const __dirname = dirname(__filename);
*/
export async function InitWebUi() {
const config = await WebUiConfig.GetWebUIConfig();
if (config.port == 0) {
log('[NapCat] [WebUi] Current WebUi is not run.');
return;
}
app.use(express.json());
// 初始服务
app.all('/', (_req, res) => {