llonebot-dist 7.12.3 → 7.12.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/llbot.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { createRequire } from "node:module";
|
|
2
2
|
import * as path$4 from "node:path";
|
|
3
3
|
import path, { dirname, join } from "node:path";
|
|
4
|
-
import
|
|
5
|
-
import fs
|
|
6
|
-
import * as fs$
|
|
7
|
-
import fs$
|
|
4
|
+
import fsPromise, { access, copyFile, mkdir, readFile, stat, unlink, writeFile } from "node:fs/promises";
|
|
5
|
+
import fs, { existsSync } from "fs";
|
|
6
|
+
import * as fs$5 from "node:fs";
|
|
7
|
+
import fs$1, { appendFile, appendFileSync, createReadStream, existsSync as existsSync$1, mkdirSync, promises, stat as stat$1, statSync, watch } from "node:fs";
|
|
8
8
|
import os from "node:os";
|
|
9
9
|
import { Binary, Time, camelize, clone, deduplicate, deepEqual, defineProperty, difference, filterKeys, hyphenate, is, isNonNullable, isNullable, isPlainObject, makeArray, mapValues, noop, omit, pick, remove, valueMap } from "cosmokit";
|
|
10
10
|
import { Exporter, Factory } from "reggol";
|
|
@@ -15,12 +15,13 @@ import { WebSocket as WebSocket$1, WebSocketServer } from "ws";
|
|
|
15
15
|
import { constants } from "node:buffer";
|
|
16
16
|
import crypto$1, { createHash, randomBytes, randomInt, randomUUID } from "node:crypto";
|
|
17
17
|
import * as fileType from "file-type";
|
|
18
|
+
import { fileTypeFromBuffer } from "file-type";
|
|
18
19
|
import { decode, encode, getDuration, getWavFileInfo, isSilk, isWav } from "silk-wasm";
|
|
19
20
|
import http, { STATUS_CODES, createServer, request } from "node:http";
|
|
20
21
|
import { Http2ServerRequest, constants as constants$1 } from "node:http2";
|
|
21
22
|
import { Readable, Transform } from "node:stream";
|
|
22
23
|
import { deflateSync, gunzipSync, gzipSync, inflateSync } from "node:zlib";
|
|
23
|
-
import fsPromise, { stat as stat$2, unlink as unlink$1 } from "fs/promises";
|
|
24
|
+
import fsPromise$1, { stat as stat$2, unlink as unlink$1 } from "fs/promises";
|
|
24
25
|
import { inspect, isDeepStrictEqual } from "node:util";
|
|
25
26
|
import net, { connect } from "node:net";
|
|
26
27
|
import https from "node:https";
|
|
@@ -3972,7 +3973,7 @@ var require_utils$1 = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
|
3972
3973
|
//#endregion
|
|
3973
3974
|
//#region node_modules/qrcode/lib/renderer/png.js
|
|
3974
3975
|
var require_png = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
3975
|
-
var fs$
|
|
3976
|
+
var fs$10 = __require("fs");
|
|
3976
3977
|
var PNG = require_png$1().PNG;
|
|
3977
3978
|
var Utils = require_utils$1();
|
|
3978
3979
|
exports.render = function render(qrData, options) {
|
|
@@ -4024,7 +4025,7 @@ var require_png = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
|
4024
4025
|
called = true;
|
|
4025
4026
|
cb.apply(null, args);
|
|
4026
4027
|
};
|
|
4027
|
-
const stream = fs$
|
|
4028
|
+
const stream = fs$10.createWriteStream(path);
|
|
4028
4029
|
stream.on("error", done);
|
|
4029
4030
|
stream.on("close", done);
|
|
4030
4031
|
exports.renderToFileStream(stream, qrData, options);
|
|
@@ -6462,7 +6463,8 @@ var FaceIndex = /* @__PURE__ */ function(FaceIndex) {
|
|
|
6462
6463
|
return FaceIndex;
|
|
6463
6464
|
}({});
|
|
6464
6465
|
var FaceType = /* @__PURE__ */ function(FaceType) {
|
|
6465
|
-
FaceType[FaceType["
|
|
6466
|
+
FaceType[FaceType["Old"] = 1] = "Old";
|
|
6467
|
+
FaceType[FaceType["Normal"] = 2] = "Normal";
|
|
6466
6468
|
FaceType[FaceType["Super"] = 3] = "Super";
|
|
6467
6469
|
FaceType[FaceType["Poke"] = 5] = "Poke";
|
|
6468
6470
|
return FaceType;
|
|
@@ -6622,7 +6624,7 @@ async function logSummaryMessage(ctx, message) {
|
|
|
6622
6624
|
var require_windows = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
6623
6625
|
module.exports = isexe;
|
|
6624
6626
|
isexe.sync = sync;
|
|
6625
|
-
var fs$
|
|
6627
|
+
var fs$9 = __require("fs");
|
|
6626
6628
|
function checkPathExt(path, options) {
|
|
6627
6629
|
var pathext = options.pathExt !== void 0 ? options.pathExt : process.env.PATHEXT;
|
|
6628
6630
|
if (!pathext) return true;
|
|
@@ -6639,12 +6641,12 @@ var require_windows = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
6639
6641
|
return checkPathExt(path, options);
|
|
6640
6642
|
}
|
|
6641
6643
|
function isexe(path, options, cb) {
|
|
6642
|
-
fs$
|
|
6644
|
+
fs$9.stat(path, function(er, stat) {
|
|
6643
6645
|
cb(er, er ? false : checkStat(stat, path, options));
|
|
6644
6646
|
});
|
|
6645
6647
|
}
|
|
6646
6648
|
function sync(path, options) {
|
|
6647
|
-
return checkStat(fs$
|
|
6649
|
+
return checkStat(fs$9.statSync(path), path, options);
|
|
6648
6650
|
}
|
|
6649
6651
|
}));
|
|
6650
6652
|
//#endregion
|
|
@@ -6652,14 +6654,14 @@ var require_windows = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
6652
6654
|
var require_mode = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
6653
6655
|
module.exports = isexe;
|
|
6654
6656
|
isexe.sync = sync;
|
|
6655
|
-
var fs$
|
|
6657
|
+
var fs$8 = __require("fs");
|
|
6656
6658
|
function isexe(path, options, cb) {
|
|
6657
|
-
fs$
|
|
6659
|
+
fs$8.stat(path, function(er, stat) {
|
|
6658
6660
|
cb(er, er ? false : checkStat(stat, options));
|
|
6659
6661
|
});
|
|
6660
6662
|
}
|
|
6661
6663
|
function sync(path, options) {
|
|
6662
|
-
return checkStat(fs$
|
|
6664
|
+
return checkStat(fs$8.statSync(path), options);
|
|
6663
6665
|
}
|
|
6664
6666
|
function checkStat(stat, options) {
|
|
6665
6667
|
return stat.isFile() && checkMode(stat, options);
|
|
@@ -9151,7 +9153,7 @@ var require_processor = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
9151
9153
|
//#endregion
|
|
9152
9154
|
//#region node_modules/fluent-ffmpeg/lib/capabilities.js
|
|
9153
9155
|
var require_capabilities = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
9154
|
-
var fs$
|
|
9156
|
+
var fs$7 = __require("fs");
|
|
9155
9157
|
var path$7 = __require("path");
|
|
9156
9158
|
var async = require_async();
|
|
9157
9159
|
var utils = require_utils();
|
|
@@ -9227,7 +9229,7 @@ var require_capabilities = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
9227
9229
|
proto._getFfmpegPath = function(callback) {
|
|
9228
9230
|
if ("ffmpegPath" in cache) return callback(null, cache.ffmpegPath);
|
|
9229
9231
|
async.waterfall([function(cb) {
|
|
9230
|
-
if (process.env.FFMPEG_PATH) fs$
|
|
9232
|
+
if (process.env.FFMPEG_PATH) fs$7.exists(process.env.FFMPEG_PATH, function(exists) {
|
|
9231
9233
|
if (exists) cb(null, process.env.FFMPEG_PATH);
|
|
9232
9234
|
else cb(null, "");
|
|
9233
9235
|
});
|
|
@@ -9258,7 +9260,7 @@ var require_capabilities = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
9258
9260
|
if ("ffprobePath" in cache) return callback(null, cache.ffprobePath);
|
|
9259
9261
|
async.waterfall([
|
|
9260
9262
|
function(cb) {
|
|
9261
|
-
if (process.env.FFPROBE_PATH) fs$
|
|
9263
|
+
if (process.env.FFPROBE_PATH) fs$7.exists(process.env.FFPROBE_PATH, function(exists) {
|
|
9262
9264
|
cb(null, exists ? process.env.FFPROBE_PATH : "");
|
|
9263
9265
|
});
|
|
9264
9266
|
else cb(null, "");
|
|
@@ -9276,7 +9278,7 @@ var require_capabilities = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
9276
9278
|
else if (ffmpeg.length) {
|
|
9277
9279
|
var name = utils.isWindows ? "ffprobe.exe" : "ffprobe";
|
|
9278
9280
|
var ffprobe = path$7.join(path$7.dirname(ffmpeg), name);
|
|
9279
|
-
fs$
|
|
9281
|
+
fs$7.exists(ffprobe, function(exists) {
|
|
9280
9282
|
cb(null, exists ? ffprobe : "");
|
|
9281
9283
|
});
|
|
9282
9284
|
} else cb(null, "");
|
|
@@ -9301,14 +9303,14 @@ var require_capabilities = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
9301
9303
|
if ("flvtoolPath" in cache) return callback(null, cache.flvtoolPath);
|
|
9302
9304
|
async.waterfall([
|
|
9303
9305
|
function(cb) {
|
|
9304
|
-
if (process.env.FLVMETA_PATH) fs$
|
|
9306
|
+
if (process.env.FLVMETA_PATH) fs$7.exists(process.env.FLVMETA_PATH, function(exists) {
|
|
9305
9307
|
cb(null, exists ? process.env.FLVMETA_PATH : "");
|
|
9306
9308
|
});
|
|
9307
9309
|
else cb(null, "");
|
|
9308
9310
|
},
|
|
9309
9311
|
function(flvtool, cb) {
|
|
9310
9312
|
if (flvtool.length) return cb(null, flvtool);
|
|
9311
|
-
if (process.env.FLVTOOL2_PATH) fs$
|
|
9313
|
+
if (process.env.FLVTOOL2_PATH) fs$7.exists(process.env.FLVTOOL2_PATH, function(exists) {
|
|
9312
9314
|
cb(null, exists ? process.env.FLVTOOL2_PATH : "");
|
|
9313
9315
|
});
|
|
9314
9316
|
else cb(null, "");
|
|
@@ -9813,7 +9815,7 @@ var require_ffprobe = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
9813
9815
|
//#endregion
|
|
9814
9816
|
//#region node_modules/fluent-ffmpeg/lib/recipes.js
|
|
9815
9817
|
var require_recipes = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
9816
|
-
var fs$
|
|
9818
|
+
var fs$6 = __require("fs");
|
|
9817
9819
|
var path$6 = __require("path");
|
|
9818
9820
|
var PassThrough$4 = __require("stream").PassThrough;
|
|
9819
9821
|
var async = require_async();
|
|
@@ -10019,8 +10021,8 @@ var require_recipes = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
10019
10021
|
next(null, filenames);
|
|
10020
10022
|
},
|
|
10021
10023
|
function createDirectory(filenames, next) {
|
|
10022
|
-
fs$
|
|
10023
|
-
if (!exists) fs$
|
|
10024
|
+
fs$6.exists(config.folder, function(exists) {
|
|
10025
|
+
if (!exists) fs$6.mkdir(config.folder, function(err) {
|
|
10024
10026
|
if (err) next(err);
|
|
10025
10027
|
else next(null, filenames);
|
|
10026
10028
|
});
|
|
@@ -10268,7 +10270,7 @@ function setFFMpegPath(ffmpegPath) {
|
|
|
10268
10270
|
path.join(import.meta.dirname, "ffmpeg.exe"),
|
|
10269
10271
|
process.env["FFMPEG_PATH"] || ""
|
|
10270
10272
|
];
|
|
10271
|
-
for (const p of paths) if (fs$
|
|
10273
|
+
for (const p of paths) if (fs$1.existsSync(p)) {
|
|
10272
10274
|
import_fluent_ffmpeg.default.setFfmpegPath(p);
|
|
10273
10275
|
console.log("set ffmpeg successfully", p);
|
|
10274
10276
|
break;
|
|
@@ -11235,10 +11237,11 @@ var OB11Entities;
|
|
|
11235
11237
|
async function recallEvent(ctx, msg, shortId) {
|
|
11236
11238
|
const revokeElement = msg.elements[0].grayTipElement.revokeElement;
|
|
11237
11239
|
if (msg.chatType === ChatType.Group) {
|
|
11238
|
-
|
|
11239
|
-
|
|
11240
|
-
|
|
11241
|
-
|
|
11240
|
+
let operatorUin;
|
|
11241
|
+
if (revokeElement.operatorUid === revokeElement.origMsgSenderUid) operatorUin = msg.senderUin;
|
|
11242
|
+
else operatorUin = await ctx.ntUserApi.getUinByUid(revokeElement.operatorUid);
|
|
11243
|
+
if (msg.senderUin === "0" || !msg.senderUin) ctx.logger.warn(`发生异常 senderUin: ${msg.senderUin}`);
|
|
11244
|
+
return new OB11GroupRecallNoticeEvent(Number(msg.peerUid), Number(msg.senderUin), Number(operatorUin), shortId);
|
|
11242
11245
|
} else return new OB11FriendRecallNoticeEvent(+msg.senderUin, shortId);
|
|
11243
11246
|
}
|
|
11244
11247
|
_OB11Entities.recallEvent = recallEvent;
|
|
@@ -11382,7 +11385,7 @@ var OB11HeartbeatEvent = class extends OB11BaseMetaEvent {
|
|
|
11382
11385
|
};
|
|
11383
11386
|
//#endregion
|
|
11384
11387
|
//#region src/version.ts
|
|
11385
|
-
var version$2 = "7.12.
|
|
11388
|
+
var version$2 = "7.12.5";
|
|
11386
11389
|
//#endregion
|
|
11387
11390
|
//#region node_modules/sift/es5m/index.js
|
|
11388
11391
|
/******************************************************************************
|
|
@@ -12126,7 +12129,7 @@ var OB11WebSocket = class {
|
|
|
12126
12129
|
if (emitEvent && socket.readyState === WebSocket$1.OPEN) {
|
|
12127
12130
|
socket.send(JSON.stringify(event));
|
|
12128
12131
|
const eventName = event.getSummaryEventName();
|
|
12129
|
-
this.ctx.logger.info("WebSocket 事件上报",
|
|
12132
|
+
this.ctx.logger.info("WebSocket 事件上报", eventName);
|
|
12130
12133
|
}
|
|
12131
12134
|
});
|
|
12132
12135
|
}
|
|
@@ -12150,7 +12153,7 @@ var OB11WebSocket = class {
|
|
|
12150
12153
|
reply(socket, data) {
|
|
12151
12154
|
if (socket.readyState !== WebSocket$1.OPEN) return;
|
|
12152
12155
|
socket.send(JSON.stringify(data));
|
|
12153
|
-
if ("post_type" in data) this.ctx.logger.info("WebSocket 事件上报",
|
|
12156
|
+
if ("post_type" in data) this.ctx.logger.info("WebSocket 事件上报", data.post_type);
|
|
12154
12157
|
}
|
|
12155
12158
|
authorize(socket, req) {
|
|
12156
12159
|
const url = req.url?.split("?").shift();
|
|
@@ -17042,7 +17045,7 @@ var processQueue = async () => {
|
|
|
17042
17045
|
const promises = queue.splice(0, concurrency).map(async ({ filePath, resolve, reject }) => {
|
|
17043
17046
|
let handle;
|
|
17044
17047
|
try {
|
|
17045
|
-
handle = await fs$
|
|
17048
|
+
handle = await fs$5.promises.open(path$4.resolve(filePath), "r");
|
|
17046
17049
|
} catch (err) {
|
|
17047
17050
|
return reject(err);
|
|
17048
17051
|
}
|
|
@@ -17089,7 +17092,7 @@ function checkUriType(uri) {
|
|
|
17089
17092
|
if (uri.startsWith("data:")) return { type: FileUriType.DataURL };
|
|
17090
17093
|
if (uri.startsWith("http://") || uri.startsWith("https://")) return { type: FileUriType.RemoteURL };
|
|
17091
17094
|
if (uri.startsWith("file://")) return { type: FileUriType.FileURL };
|
|
17092
|
-
if (fs$
|
|
17095
|
+
if (fs$1.existsSync(uri)) return { type: FileUriType.Path };
|
|
17093
17096
|
return { type: FileUriType.Unknown };
|
|
17094
17097
|
}
|
|
17095
17098
|
async function fetchFile(url, headersInit) {
|
|
@@ -17119,7 +17122,7 @@ async function uri2local(ctx, uri, needExt) {
|
|
|
17119
17122
|
const { type } = checkUriType(uri);
|
|
17120
17123
|
if (type === FileUriType.FileURL) {
|
|
17121
17124
|
const filePath = fileURLToPath(uri);
|
|
17122
|
-
if (!fs$
|
|
17125
|
+
if (!fs$1.existsSync(filePath)) return {
|
|
17123
17126
|
success: false,
|
|
17124
17127
|
errMsg: "路径不存在",
|
|
17125
17128
|
fileName: "",
|
|
@@ -17145,12 +17148,12 @@ async function uri2local(ctx, uri, needExt) {
|
|
|
17145
17148
|
const res = await fetchFile(uri);
|
|
17146
17149
|
let fileName = randomUUID();
|
|
17147
17150
|
let filePath = path.join(TEMP_DIR, fileName);
|
|
17148
|
-
await
|
|
17151
|
+
await fsPromise.writeFile(filePath, res.data);
|
|
17149
17152
|
if (needExt) {
|
|
17150
17153
|
const ext = (await ctx.ntFileApi.getFileType(filePath)).ext;
|
|
17151
17154
|
fileName += `.${ext}`;
|
|
17152
17155
|
const newPath = `${filePath}.${ext}`;
|
|
17153
|
-
await
|
|
17156
|
+
await fsPromise.rename(filePath, newPath);
|
|
17154
17157
|
filePath = newPath;
|
|
17155
17158
|
}
|
|
17156
17159
|
return {
|
|
@@ -17173,11 +17176,11 @@ async function uri2local(ctx, uri, needExt) {
|
|
|
17173
17176
|
let filename = randomUUID();
|
|
17174
17177
|
let filePath = path.join(TEMP_DIR, filename);
|
|
17175
17178
|
const base64 = uri.replace(/^base64:\/\//, "");
|
|
17176
|
-
await
|
|
17179
|
+
await fsPromise.writeFile(filePath, base64, "base64");
|
|
17177
17180
|
if (needExt) {
|
|
17178
17181
|
const ext = (await ctx.ntFileApi.getFileType(filePath)).ext;
|
|
17179
17182
|
filename += `.${ext}`;
|
|
17180
|
-
await
|
|
17183
|
+
await fsPromise.rename(filePath, `${filePath}.${ext}`);
|
|
17181
17184
|
filePath = `${filePath}.${ext}`;
|
|
17182
17185
|
}
|
|
17183
17186
|
return {
|
|
@@ -17194,11 +17197,11 @@ async function uri2local(ctx, uri, needExt) {
|
|
|
17194
17197
|
let filename = randomUUID();
|
|
17195
17198
|
const [, _type, base64] = capture;
|
|
17196
17199
|
let filePath = path.join(TEMP_DIR, filename);
|
|
17197
|
-
await
|
|
17200
|
+
await fsPromise.writeFile(filePath, base64, "base64");
|
|
17198
17201
|
if (needExt) {
|
|
17199
17202
|
const ext = (await ctx.ntFileApi.getFileType(filePath)).ext;
|
|
17200
17203
|
filename += `.${ext}`;
|
|
17201
|
-
await
|
|
17204
|
+
await fsPromise.rename(filePath, `${filePath}.${ext}`);
|
|
17202
17205
|
filePath = `${filePath}.${ext}`;
|
|
17203
17206
|
}
|
|
17204
17207
|
return {
|
|
@@ -17254,15 +17257,21 @@ async function getFileType(filePath) {
|
|
|
17254
17257
|
async function getImageSize(path) {
|
|
17255
17258
|
return await imageSizeFromFile(path);
|
|
17256
17259
|
}
|
|
17260
|
+
function getMd5HexFromBuffer(buf) {
|
|
17261
|
+
return createHash("md5").update(buf).digest("hex");
|
|
17262
|
+
}
|
|
17263
|
+
function getSha1HexFromBuffer(buf) {
|
|
17264
|
+
return createHash("sha1").update(buf).digest("hex");
|
|
17265
|
+
}
|
|
17257
17266
|
async function getMd5HexFromFile(filePath) {
|
|
17258
17267
|
const hash = createHash("md5");
|
|
17259
|
-
const stream = fs$
|
|
17268
|
+
const stream = fs$1.createReadStream(filePath);
|
|
17260
17269
|
for await (const chunk of stream) hash.update(chunk);
|
|
17261
17270
|
return hash.digest("hex");
|
|
17262
17271
|
}
|
|
17263
17272
|
async function getSha1HexFromFile(filePath) {
|
|
17264
17273
|
const hash = createHash("sha1");
|
|
17265
|
-
const stream = fs$
|
|
17274
|
+
const stream = fs$1.createReadStream(filePath);
|
|
17266
17275
|
for await (const chunk of stream) hash.update(chunk);
|
|
17267
17276
|
return hash.digest("hex");
|
|
17268
17277
|
}
|
|
@@ -17271,13 +17280,13 @@ function getMd5BufferFromBuffer(buf) {
|
|
|
17271
17280
|
}
|
|
17272
17281
|
async function getMd5BufferFromFile(filePath) {
|
|
17273
17282
|
const hash = createHash("md5");
|
|
17274
|
-
const stream = fs$
|
|
17283
|
+
const stream = fs$1.createReadStream(filePath);
|
|
17275
17284
|
for await (const chunk of stream) hash.update(chunk);
|
|
17276
17285
|
return hash.digest();
|
|
17277
17286
|
}
|
|
17278
17287
|
async function getSha1BufferFromFile(filePath) {
|
|
17279
17288
|
const hash = createHash("sha1");
|
|
17280
|
-
const stream = fs$
|
|
17289
|
+
const stream = fs$1.createReadStream(filePath);
|
|
17281
17290
|
for await (const chunk of stream) hash.update(chunk);
|
|
17282
17291
|
return hash.digest();
|
|
17283
17292
|
}
|
|
@@ -17513,7 +17522,7 @@ async function calculateSha1StreamBytes(filePath) {
|
|
|
17513
17522
|
let bytesRead = 0;
|
|
17514
17523
|
let nextBlockBoundary = blockSize;
|
|
17515
17524
|
const byteArrayList = [];
|
|
17516
|
-
const readable = fs$
|
|
17525
|
+
const readable = fs$1.createReadStream(filePath);
|
|
17517
17526
|
for await (const chunk of readable) {
|
|
17518
17527
|
let buf;
|
|
17519
17528
|
if (tail.length > 0) {
|
|
@@ -17538,7 +17547,7 @@ async function calculateSha1StreamBytes(filePath) {
|
|
|
17538
17547
|
}
|
|
17539
17548
|
async function readAndHash10M(filePath) {
|
|
17540
17549
|
const maxSize = 10002432;
|
|
17541
|
-
const fd = await
|
|
17550
|
+
const fd = await fsPromise.open(filePath, "r");
|
|
17542
17551
|
const buffer = Buffer.allocUnsafe(maxSize);
|
|
17543
17552
|
const { bytesRead } = await fd.read(buffer, 0, maxSize, 0);
|
|
17544
17553
|
await fd.close();
|
|
@@ -17580,13 +17589,13 @@ var TriSha1 = class {
|
|
|
17580
17589
|
};
|
|
17581
17590
|
async function calculateTriSha1(filePath, fileSize) {
|
|
17582
17591
|
const hash = new TriSha1(fileSize);
|
|
17583
|
-
const stream = fs$
|
|
17592
|
+
const stream = fs$1.createReadStream(filePath);
|
|
17584
17593
|
for await (const chunk of stream) hash.update(chunk);
|
|
17585
17594
|
return hash.finalize();
|
|
17586
17595
|
}
|
|
17587
17596
|
var defaultVideoThumb = Buffer.from("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", "base64");
|
|
17588
17597
|
async function getVideoInfo(filePath) {
|
|
17589
|
-
const size = fs$
|
|
17598
|
+
const size = fs$1.statSync(filePath).size;
|
|
17590
17599
|
return new Promise((resolve, reject) => {
|
|
17591
17600
|
(0, import_fluent_ffmpeg.default)(filePath).ffprobe((err, metadata) => {
|
|
17592
17601
|
if (err) reject(err);
|
|
@@ -17663,7 +17672,7 @@ function convert(ctx, input, options, outputPath) {
|
|
|
17663
17672
|
});
|
|
17664
17673
|
}
|
|
17665
17674
|
async function encodeSilk(ctx, filePath) {
|
|
17666
|
-
const file = await
|
|
17675
|
+
const file = await fsPromise.readFile(filePath);
|
|
17667
17676
|
if (!isSilk(file)) {
|
|
17668
17677
|
ctx.logger.info(`语音文件${filePath}需要转换成silk`);
|
|
17669
17678
|
let result;
|
|
@@ -17682,7 +17691,7 @@ async function encodeSilk(ctx, filePath) {
|
|
|
17682
17691
|
"-f s16le"
|
|
17683
17692
|
] }), 24e3);
|
|
17684
17693
|
const pttPath = path.join(TEMP_DIR, randomUUID());
|
|
17685
|
-
await
|
|
17694
|
+
await fsPromise.writeFile(pttPath, result.data);
|
|
17686
17695
|
ctx.logger.info(`语音文件${filePath}转换成功!`, pttPath, `时长:`, result.duration);
|
|
17687
17696
|
return {
|
|
17688
17697
|
converted: true,
|
|
@@ -17705,11 +17714,11 @@ async function encodeSilk(ctx, filePath) {
|
|
|
17705
17714
|
}
|
|
17706
17715
|
}
|
|
17707
17716
|
async function decodeSilk(ctx, inputFilePath, outFormat) {
|
|
17708
|
-
const { data } = await decode(await
|
|
17717
|
+
const { data } = await decode(await fsPromise.readFile(inputFilePath), 24e3);
|
|
17709
17718
|
const tmpPath = path.join(TEMP_DIR, path.basename(inputFilePath));
|
|
17710
17719
|
const outFilePath = tmpPath + `.${outFormat}`;
|
|
17711
17720
|
const pcmFilePath = tmpPath + ".pcm";
|
|
17712
|
-
await
|
|
17721
|
+
await fsPromise.writeFile(pcmFilePath, data);
|
|
17713
17722
|
return convert(ctx, pcmFilePath, { input: [
|
|
17714
17723
|
"-f s16le",
|
|
17715
17724
|
"-ar 24000",
|
|
@@ -21200,7 +21209,7 @@ var getRequestListener = (fetchCallback, options = {}) => {
|
|
|
21200
21209
|
/**
|
|
21201
21210
|
* @link https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent
|
|
21202
21211
|
*/
|
|
21203
|
-
var CloseEvent
|
|
21212
|
+
var CloseEvent = globalThis.CloseEvent ?? class extends Event {
|
|
21204
21213
|
#eventInitDict;
|
|
21205
21214
|
constructor(type, eventInitDict = {}) {
|
|
21206
21215
|
super(type, eventInitDict);
|
|
@@ -21216,8 +21225,8 @@ var CloseEvent$1 = globalThis.CloseEvent ?? class extends Event {
|
|
|
21216
21225
|
return this.#eventInitDict.reason ?? "";
|
|
21217
21226
|
}
|
|
21218
21227
|
};
|
|
21219
|
-
var generateConnectionSymbol
|
|
21220
|
-
var CONNECTION_SYMBOL_KEY
|
|
21228
|
+
var generateConnectionSymbol = () => Symbol("connection");
|
|
21229
|
+
var CONNECTION_SYMBOL_KEY = Symbol("CONNECTION_SYMBOL_KEY");
|
|
21221
21230
|
var WAIT_FOR_WEBSOCKET_SYMBOL = Symbol("WAIT_FOR_WEBSOCKET_SYMBOL");
|
|
21222
21231
|
var rejectUpgradeRequest = (socket, status) => {
|
|
21223
21232
|
socket.end(`HTTP/1.1 ${status.toString()} ${STATUS_CODES[status] ?? ""}\r\nConnection: close\r
|
|
@@ -21271,7 +21280,7 @@ var setupWebSocket = (options) => {
|
|
|
21271
21280
|
return;
|
|
21272
21281
|
}
|
|
21273
21282
|
const waiter = waiterMap.get(request);
|
|
21274
|
-
if (!waiter || waiter.connectionSymbol !== env[CONNECTION_SYMBOL_KEY
|
|
21283
|
+
if (!waiter || waiter.connectionSymbol !== env[CONNECTION_SYMBOL_KEY]) {
|
|
21275
21284
|
waiterMap.delete(request);
|
|
21276
21285
|
if (server.listenerCount("upgrade") === 1) rejectUpgradeRequest(socket, status);
|
|
21277
21286
|
return;
|
|
@@ -21284,13 +21293,13 @@ var setupWebSocket = (options) => {
|
|
|
21284
21293
|
wss.close();
|
|
21285
21294
|
});
|
|
21286
21295
|
};
|
|
21287
|
-
defineWebSocketHelper(async (c, events, options) => {
|
|
21296
|
+
var upgradeWebSocket = defineWebSocketHelper(async (c, events, options) => {
|
|
21288
21297
|
if (c.req.header("upgrade")?.toLowerCase() !== "websocket") return;
|
|
21289
21298
|
const env = c.env;
|
|
21290
21299
|
const waitForWebSocket = env[WAIT_FOR_WEBSOCKET_SYMBOL];
|
|
21291
21300
|
if (!waitForWebSocket || !env.incoming) return new Response(null, { status: 500 });
|
|
21292
|
-
const connectionSymbol = generateConnectionSymbol
|
|
21293
|
-
env[CONNECTION_SYMBOL_KEY
|
|
21301
|
+
const connectionSymbol = generateConnectionSymbol();
|
|
21302
|
+
env[CONNECTION_SYMBOL_KEY] = connectionSymbol;
|
|
21294
21303
|
(async () => {
|
|
21295
21304
|
const ws = await waitForWebSocket(env.incoming, connectionSymbol);
|
|
21296
21305
|
const messagesReceivedInStarting = [];
|
|
@@ -21333,7 +21342,7 @@ defineWebSocketHelper(async (c, events, options) => {
|
|
|
21333
21342
|
});
|
|
21334
21343
|
ws.on("close", (code, reason) => {
|
|
21335
21344
|
try {
|
|
21336
|
-
events?.onClose?.(new CloseEvent
|
|
21345
|
+
events?.onClose?.(new CloseEvent("close", {
|
|
21337
21346
|
code,
|
|
21338
21347
|
reason: reason.toString()
|
|
21339
21348
|
}), ctx);
|
|
@@ -22281,18 +22290,18 @@ var ScalarDeserializerCompiler = {
|
|
|
22281
22290
|
sfixed32: (key, spec) => spec.repeated ? (draft, reader, wireType) => {
|
|
22282
22291
|
if (wireType === WireType$2.LengthDelimited) {
|
|
22283
22292
|
const count = reader.readVarint() / Fixed32Size;
|
|
22284
|
-
for (let i = 0; i < count; i++) draft[key].push(Converter.
|
|
22285
|
-
} else draft[key].push(Converter.
|
|
22293
|
+
for (let i = 0; i < count; i++) draft[key].push(Converter.toSigned32(reader.readFixed32()));
|
|
22294
|
+
} else draft[key].push(Converter.toSigned32(reader.readFixed32()));
|
|
22286
22295
|
} : (draft, reader) => {
|
|
22287
|
-
draft[key] = Converter.
|
|
22296
|
+
draft[key] = Converter.toSigned32(reader.readFixed32());
|
|
22288
22297
|
},
|
|
22289
22298
|
sfixed64: (key, spec) => spec.repeated ? (draft, reader, wireType) => {
|
|
22290
22299
|
if (wireType === WireType$2.LengthDelimited) {
|
|
22291
22300
|
const count = reader.readVarint() / Fixed64Size;
|
|
22292
|
-
for (let i = 0; i < count; i++) draft[key].push(Converter.
|
|
22293
|
-
} else draft[key].push(Converter.
|
|
22301
|
+
for (let i = 0; i < count; i++) draft[key].push(Converter.toSigned64(reader.readFixed64()));
|
|
22302
|
+
} else draft[key].push(Converter.toSigned64(reader.readFixed64()));
|
|
22294
22303
|
} : (draft, reader) => {
|
|
22295
|
-
draft[key] = Converter.
|
|
22304
|
+
draft[key] = Converter.toSigned64(reader.readFixed64());
|
|
22296
22305
|
},
|
|
22297
22306
|
sint32: (key, spec) => spec.repeated ? (draft, reader, wireType) => {
|
|
22298
22307
|
if (wireType === WireType$2.LengthDelimited) {
|
|
@@ -22471,29 +22480,29 @@ var ScalarSerializerCompiler = {
|
|
|
22471
22480
|
const length = data.length * Fixed32Size;
|
|
22472
22481
|
writer.writeVarint(spec[kTag]);
|
|
22473
22482
|
writer.writeVarint(length);
|
|
22474
|
-
for (const value of data) writer.writeFixed32(Converter.
|
|
22483
|
+
for (const value of data) writer.writeFixed32(Converter.toUnsigned32(value));
|
|
22475
22484
|
}) : defineSerializer((data, writer) => {
|
|
22476
22485
|
for (const value of data) {
|
|
22477
22486
|
writer.writeVarint(spec[kTag]);
|
|
22478
|
-
writer.writeFixed32(Converter.
|
|
22487
|
+
writer.writeFixed32(Converter.toUnsigned32(value));
|
|
22479
22488
|
}
|
|
22480
22489
|
}) : defineSerializer((data, writer) => {
|
|
22481
22490
|
writer.writeVarint(spec[kTag]);
|
|
22482
|
-
writer.writeFixed32(Converter.
|
|
22491
|
+
writer.writeFixed32(Converter.toUnsigned32(data));
|
|
22483
22492
|
}),
|
|
22484
22493
|
sfixed64: (spec) => spec.repeated ? spec.packed ? defineSerializer((data, writer) => {
|
|
22485
22494
|
const length = data.length * Fixed64Size;
|
|
22486
22495
|
writer.writeVarint(spec[kTag]);
|
|
22487
22496
|
writer.writeVarint(length);
|
|
22488
|
-
for (const value of data) writer.writeFixed64(Converter.
|
|
22497
|
+
for (const value of data) writer.writeFixed64(Converter.toUnsigned64(value));
|
|
22489
22498
|
}) : defineSerializer((data, writer) => {
|
|
22490
22499
|
for (const value of data) {
|
|
22491
22500
|
writer.writeVarint(spec[kTag]);
|
|
22492
|
-
writer.writeFixed64(Converter.
|
|
22501
|
+
writer.writeFixed64(Converter.toUnsigned64(value));
|
|
22493
22502
|
}
|
|
22494
22503
|
}) : defineSerializer((data, writer) => {
|
|
22495
22504
|
writer.writeVarint(spec[kTag]);
|
|
22496
|
-
writer.writeFixed64(Converter.
|
|
22505
|
+
writer.writeFixed64(Converter.toUnsigned64(data));
|
|
22497
22506
|
}),
|
|
22498
22507
|
sint32: (spec) => spec.repeated ? spec.packed ? defineSerializer((data, writer) => {
|
|
22499
22508
|
const length = data.length * Fixed32Size;
|
|
@@ -22524,23 +22533,6 @@ var ScalarSerializerCompiler = {
|
|
|
22524
22533
|
writer.writeBigVarint(Converter.zigzagEncode64(data));
|
|
22525
22534
|
})
|
|
22526
22535
|
};
|
|
22527
|
-
var ScalarTypeDefaultValue = {
|
|
22528
|
-
double: 0,
|
|
22529
|
-
float: 0,
|
|
22530
|
-
int64: BigInt(0),
|
|
22531
|
-
uint64: BigInt(0),
|
|
22532
|
-
int32: 0,
|
|
22533
|
-
fixed64: BigInt(0),
|
|
22534
|
-
fixed32: 0,
|
|
22535
|
-
bool: false,
|
|
22536
|
-
string: "",
|
|
22537
|
-
bytes: Buffer.alloc(0),
|
|
22538
|
-
uint32: 0,
|
|
22539
|
-
sfixed32: 0,
|
|
22540
|
-
sfixed64: BigInt(0),
|
|
22541
|
-
sint32: 0,
|
|
22542
|
-
sint64: BigInt(0)
|
|
22543
|
-
};
|
|
22544
22536
|
var VARINT32_BYTE_2 = 128;
|
|
22545
22537
|
var VARINT32_BYTE_3 = 16384;
|
|
22546
22538
|
var VARINT32_BYTE_4 = 2097152;
|
|
@@ -22671,6 +22663,23 @@ var ScalarSizeCalculatorCompiler = {
|
|
|
22671
22663
|
return spec[kTagLength] + SizeOf.varint32(bodySize) + bodySize;
|
|
22672
22664
|
} : (data) => sumVarint64Array(data, Converter.zigzagEncode64) + spec[kTagLength] * data.length : (data) => spec[kTagLength] + SizeOf.varint64(Converter.zigzagEncode64(data))
|
|
22673
22665
|
};
|
|
22666
|
+
var ScalarTypeDefaultValue = {
|
|
22667
|
+
double: 0,
|
|
22668
|
+
float: 0,
|
|
22669
|
+
int64: BigInt(0),
|
|
22670
|
+
uint64: BigInt(0),
|
|
22671
|
+
int32: 0,
|
|
22672
|
+
fixed64: BigInt(0),
|
|
22673
|
+
fixed32: 0,
|
|
22674
|
+
bool: false,
|
|
22675
|
+
string: "",
|
|
22676
|
+
bytes: Buffer.alloc(0),
|
|
22677
|
+
uint32: 0,
|
|
22678
|
+
sfixed32: 0,
|
|
22679
|
+
sfixed64: BigInt(0),
|
|
22680
|
+
sint32: 0,
|
|
22681
|
+
sint64: BigInt(0)
|
|
22682
|
+
};
|
|
22674
22683
|
function isMapFieldType(type) {
|
|
22675
22684
|
return Array.isArray(type);
|
|
22676
22685
|
}
|
|
@@ -22910,10 +22919,10 @@ var ProtoMessage = class ProtoMessage {
|
|
|
22910
22919
|
return draft;
|
|
22911
22920
|
}
|
|
22912
22921
|
static of(model) {
|
|
22913
|
-
let message =
|
|
22922
|
+
let message = ProtoMessage.compiledMessages.get(model);
|
|
22914
22923
|
if (message === void 0) {
|
|
22915
22924
|
message = new ProtoMessage(model);
|
|
22916
|
-
|
|
22925
|
+
ProtoMessage.compiledMessages.set(model, message);
|
|
22917
22926
|
}
|
|
22918
22927
|
return message;
|
|
22919
22928
|
}
|
|
@@ -23855,7 +23864,8 @@ var MessageEncoder$1 = class MessageEncoder$1 {
|
|
|
23855
23864
|
"node",
|
|
23856
23865
|
"video",
|
|
23857
23866
|
"file",
|
|
23858
|
-
"at"
|
|
23867
|
+
"at",
|
|
23868
|
+
"reply"
|
|
23859
23869
|
];
|
|
23860
23870
|
results;
|
|
23861
23871
|
children;
|
|
@@ -24162,6 +24172,28 @@ var MessageEncoder$1 = class MessageEncoder$1 {
|
|
|
24162
24172
|
}
|
|
24163
24173
|
this.children.push({ text: { str } });
|
|
24164
24174
|
this.preview += str;
|
|
24175
|
+
} else if (type === OB11MessageDataType.Reply) {
|
|
24176
|
+
const msgInfo = await this.ctx.store.getMsgInfoByShortId(+data.id);
|
|
24177
|
+
if (!msgInfo) throw new Error(`消息 ${data.id} 不存在`);
|
|
24178
|
+
const res = await this.ctx.ntMsgApi.getMsgsByMsgId(msgInfo.peer, [msgInfo.msgId]);
|
|
24179
|
+
if (res.msgList.length === 0) throw new Error(`无法获取消息 ${data.id} 的内容`);
|
|
24180
|
+
const msg = res.msgList[0];
|
|
24181
|
+
const elems = [];
|
|
24182
|
+
for (const element of msg.elements) if (element.elementType === ElementType.Text) elems.push({ text: { str: element.textElement.content } });
|
|
24183
|
+
else if (element.elementType === ElementType.Pic) elems.push({ text: { str: element.picElement.summary } });
|
|
24184
|
+
else if (element.elementType === ElementType.Video) elems.push({ text: { str: "[视频]" } });
|
|
24185
|
+
else if (element.elementType === ElementType.Face) {
|
|
24186
|
+
const { faceType, faceIndex, faceText } = element.faceElement;
|
|
24187
|
+
if (faceType === FaceType.Old || faceType === FaceType.Normal) elems.push({ face: { index: faceIndex } });
|
|
24188
|
+
else elems.push({ text: { str: faceText } });
|
|
24189
|
+
} else if (element.elementType === ElementType.File) elems.push({ text: { str: "[文件]" } });
|
|
24190
|
+
this.children.push({ srcMsg: {
|
|
24191
|
+
origSeqs: [+msg.msgSeq],
|
|
24192
|
+
senderUin: +msg.senderUin,
|
|
24193
|
+
time: +msg.msgTime,
|
|
24194
|
+
elems: elems.map((e) => Msg.Elem.encode(e)),
|
|
24195
|
+
toUin: 0
|
|
24196
|
+
} });
|
|
24165
24197
|
}
|
|
24166
24198
|
}
|
|
24167
24199
|
async render(segments) {
|
|
@@ -24849,17 +24881,17 @@ var DownloadFile = class extends BaseAction {
|
|
|
24849
24881
|
const isRandomName = !payload.name;
|
|
24850
24882
|
const name = payload.name ? path.basename(payload.name) : randomUUID();
|
|
24851
24883
|
const filePath = path.join(TEMP_DIR, name);
|
|
24852
|
-
if (payload.base64) await fsPromise.writeFile(filePath, payload.base64, "base64");
|
|
24884
|
+
if (payload.base64) await fsPromise$1.writeFile(filePath, payload.base64, "base64");
|
|
24853
24885
|
else if (payload.url) {
|
|
24854
24886
|
const headers = this.getHeaders(payload.headers);
|
|
24855
24887
|
const res = await fetchFile(payload.url, headers);
|
|
24856
|
-
await fsPromise.writeFile(filePath, res.data);
|
|
24888
|
+
await fsPromise$1.writeFile(filePath, res.data);
|
|
24857
24889
|
} else throw new Error("不存在任何文件, 无法下载");
|
|
24858
|
-
if (fs
|
|
24890
|
+
if (fs.existsSync(filePath)) {
|
|
24859
24891
|
if (isRandomName) {
|
|
24860
24892
|
const md5 = await getMd5HexFromFile(filePath);
|
|
24861
24893
|
const newPath = path.join(TEMP_DIR, md5);
|
|
24862
|
-
await fsPromise.rename(filePath, newPath);
|
|
24894
|
+
await fsPromise$1.rename(filePath, newPath);
|
|
24863
24895
|
return { file: newPath };
|
|
24864
24896
|
}
|
|
24865
24897
|
return { file: filePath };
|
|
@@ -25374,12 +25406,16 @@ var SendGroupNotice = class extends BaseAction {
|
|
|
25374
25406
|
content: lib_default$1.string().required(),
|
|
25375
25407
|
image: lib_default$1.string(),
|
|
25376
25408
|
pinned: lib_default$1.union([Boolean, lib_default$1.transform(String, parseBool)]).default(false),
|
|
25377
|
-
confirm_required: lib_default$1.union([Boolean, lib_default$1.transform(String, parseBool)]).default(true)
|
|
25409
|
+
confirm_required: lib_default$1.union([Boolean, lib_default$1.transform(String, parseBool)]).default(true),
|
|
25410
|
+
is_show_edit_card: lib_default$1.union([Boolean, lib_default$1.transform(String, parseBool)]).default(false),
|
|
25411
|
+
tip_window: lib_default$1.union([Boolean, lib_default$1.transform(String, parseBool)]).default(false)
|
|
25378
25412
|
});
|
|
25379
25413
|
async _handle(payload) {
|
|
25380
25414
|
const groupCode = payload.group_id.toString();
|
|
25381
25415
|
const pinned = +payload.pinned;
|
|
25382
25416
|
const confirmRequired = +payload.confirm_required;
|
|
25417
|
+
const isShowEditCard = +payload.is_show_edit_card;
|
|
25418
|
+
const tipWindowType = +!payload.tip_window;
|
|
25383
25419
|
let picInfo;
|
|
25384
25420
|
if (payload.image) {
|
|
25385
25421
|
const { path, isLocal, success, errMsg } = await uri2local(this.ctx, payload.image, true);
|
|
@@ -25389,14 +25425,8 @@ var SendGroupNotice = class extends BaseAction {
|
|
|
25389
25425
|
if (!isLocal) unlink$1(path).catch(noop);
|
|
25390
25426
|
picInfo = result.picInfo;
|
|
25391
25427
|
}
|
|
25392
|
-
const res = await this.ctx.
|
|
25393
|
-
|
|
25394
|
-
oldFeedsId: "",
|
|
25395
|
-
pinned,
|
|
25396
|
-
confirmRequired,
|
|
25397
|
-
picInfo
|
|
25398
|
-
});
|
|
25399
|
-
if (res.result !== 0) throw new Error(`设置群公告失败, 错误信息: ${res.errMsg}`);
|
|
25428
|
+
const res = await this.ctx.ntWebApi.publishGroupBulletin(groupCode, payload.content, pinned, 1, isShowEditCard, tipWindowType, confirmRequired, picInfo?.id, picInfo?.width, picInfo?.height);
|
|
25429
|
+
if (res.ec !== 0) throw new Error(`设置群公告失败, 错误信息: ${res.em}`);
|
|
25400
25430
|
return null;
|
|
25401
25431
|
}
|
|
25402
25432
|
};
|
|
@@ -25680,6 +25710,11 @@ var GetGroupNotice = class extends BaseAction {
|
|
|
25680
25710
|
id: image.id
|
|
25681
25711
|
};
|
|
25682
25712
|
})
|
|
25713
|
+
},
|
|
25714
|
+
settings: {
|
|
25715
|
+
is_show_edit_card: !!feed.settings.isShowEditCard,
|
|
25716
|
+
tip_window: !feed.settings.tipWindowType,
|
|
25717
|
+
confirm_required: !!feed.settings.confirmRequired
|
|
25683
25718
|
}
|
|
25684
25719
|
});
|
|
25685
25720
|
return result;
|
|
@@ -28867,149 +28902,6 @@ var handlers = {
|
|
|
28867
28902
|
deleteFriend
|
|
28868
28903
|
};
|
|
28869
28904
|
//#endregion
|
|
28870
|
-
//#region node_modules/@hono/node-ws/dist/index.js
|
|
28871
|
-
/**
|
|
28872
|
-
* @link https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent
|
|
28873
|
-
*/
|
|
28874
|
-
var CloseEvent = globalThis.CloseEvent ?? class extends Event {
|
|
28875
|
-
#eventInitDict;
|
|
28876
|
-
constructor(type, eventInitDict = {}) {
|
|
28877
|
-
super(type, eventInitDict);
|
|
28878
|
-
this.#eventInitDict = eventInitDict;
|
|
28879
|
-
}
|
|
28880
|
-
get wasClean() {
|
|
28881
|
-
return this.#eventInitDict.wasClean ?? false;
|
|
28882
|
-
}
|
|
28883
|
-
get code() {
|
|
28884
|
-
return this.#eventInitDict.code ?? 0;
|
|
28885
|
-
}
|
|
28886
|
-
get reason() {
|
|
28887
|
-
return this.#eventInitDict.reason ?? "";
|
|
28888
|
-
}
|
|
28889
|
-
};
|
|
28890
|
-
var generateConnectionSymbol = () => Symbol("connection");
|
|
28891
|
-
/** @example `c.env[CONNECTION_SYMBOL_KEY]` */
|
|
28892
|
-
var CONNECTION_SYMBOL_KEY = Symbol("CONNECTION_SYMBOL_KEY");
|
|
28893
|
-
/**
|
|
28894
|
-
* Create WebSockets for Node.js
|
|
28895
|
-
* @param init Options
|
|
28896
|
-
* @returns NodeWebSocket
|
|
28897
|
-
*/
|
|
28898
|
-
var createNodeWebSocket = (init) => {
|
|
28899
|
-
const wss = new WebSocketServer({ noServer: true });
|
|
28900
|
-
const waiterMap = /* @__PURE__ */ new Map();
|
|
28901
|
-
wss.on("connection", (ws, request) => {
|
|
28902
|
-
const waiter = waiterMap.get(request);
|
|
28903
|
-
if (waiter) {
|
|
28904
|
-
waiter.resolve(ws);
|
|
28905
|
-
waiterMap.delete(request);
|
|
28906
|
-
}
|
|
28907
|
-
});
|
|
28908
|
-
const nodeUpgradeWebSocket = (request, connectionSymbol) => {
|
|
28909
|
-
return new Promise((resolve) => {
|
|
28910
|
-
waiterMap.set(request, {
|
|
28911
|
-
resolve,
|
|
28912
|
-
connectionSymbol
|
|
28913
|
-
});
|
|
28914
|
-
});
|
|
28915
|
-
};
|
|
28916
|
-
return {
|
|
28917
|
-
wss,
|
|
28918
|
-
injectWebSocket(server) {
|
|
28919
|
-
server.on("upgrade", async (request, socket, head) => {
|
|
28920
|
-
const url = new URL(request.url ?? "/", init.baseUrl ?? "http://localhost");
|
|
28921
|
-
const headers = new Headers();
|
|
28922
|
-
for (const key in request.headers) {
|
|
28923
|
-
const value = request.headers[key];
|
|
28924
|
-
if (!value) continue;
|
|
28925
|
-
headers.append(key, Array.isArray(value) ? value[0] : value);
|
|
28926
|
-
}
|
|
28927
|
-
const env = {
|
|
28928
|
-
incoming: request,
|
|
28929
|
-
outgoing: void 0
|
|
28930
|
-
};
|
|
28931
|
-
const response = await init.app.request(url, { headers }, env);
|
|
28932
|
-
const waiter = waiterMap.get(request);
|
|
28933
|
-
if (!waiter || waiter.connectionSymbol !== env[CONNECTION_SYMBOL_KEY]) {
|
|
28934
|
-
socket.end(`HTTP/1.1 ${response.status.toString()} ${STATUS_CODES[response.status] ?? ""}\r\nConnection: close\r
|
|
28935
|
-
Content-Length: 0\r
|
|
28936
|
-
\r
|
|
28937
|
-
`);
|
|
28938
|
-
waiterMap.delete(request);
|
|
28939
|
-
return;
|
|
28940
|
-
}
|
|
28941
|
-
wss.handleUpgrade(request, socket, head, (ws) => {
|
|
28942
|
-
wss.emit("connection", ws, request);
|
|
28943
|
-
});
|
|
28944
|
-
});
|
|
28945
|
-
},
|
|
28946
|
-
upgradeWebSocket: defineWebSocketHelper(async (c, events, options) => {
|
|
28947
|
-
if (c.req.header("upgrade")?.toLowerCase() !== "websocket") return;
|
|
28948
|
-
const connectionSymbol = generateConnectionSymbol();
|
|
28949
|
-
c.env[CONNECTION_SYMBOL_KEY] = connectionSymbol;
|
|
28950
|
-
(async () => {
|
|
28951
|
-
const ws = await nodeUpgradeWebSocket(c.env.incoming, connectionSymbol);
|
|
28952
|
-
const messagesReceivedInStarting = [];
|
|
28953
|
-
const bufferMessage = (data, isBinary) => {
|
|
28954
|
-
messagesReceivedInStarting.push([data, isBinary]);
|
|
28955
|
-
};
|
|
28956
|
-
ws.on("message", bufferMessage);
|
|
28957
|
-
const ctx = {
|
|
28958
|
-
binaryType: "arraybuffer",
|
|
28959
|
-
close(code, reason) {
|
|
28960
|
-
ws.close(code, reason);
|
|
28961
|
-
},
|
|
28962
|
-
protocol: ws.protocol,
|
|
28963
|
-
raw: ws,
|
|
28964
|
-
get readyState() {
|
|
28965
|
-
return ws.readyState;
|
|
28966
|
-
},
|
|
28967
|
-
send(source, opts) {
|
|
28968
|
-
ws.send(source, { compress: opts?.compress });
|
|
28969
|
-
},
|
|
28970
|
-
url: new URL(c.req.url)
|
|
28971
|
-
};
|
|
28972
|
-
try {
|
|
28973
|
-
events?.onOpen?.(new Event("open"), ctx);
|
|
28974
|
-
} catch (e) {
|
|
28975
|
-
(options?.onError ?? console.error)(e);
|
|
28976
|
-
}
|
|
28977
|
-
const handleMessage = (data, isBinary) => {
|
|
28978
|
-
const datas = Array.isArray(data) ? data : [data];
|
|
28979
|
-
for (const data$1 of datas) try {
|
|
28980
|
-
events?.onMessage?.(new MessageEvent("message", { data: isBinary ? data$1 instanceof ArrayBuffer ? data$1 : data$1.buffer.slice(data$1.byteOffset, data$1.byteOffset + data$1.byteLength) : data$1.toString("utf-8") }), ctx);
|
|
28981
|
-
} catch (e) {
|
|
28982
|
-
(options?.onError ?? console.error)(e);
|
|
28983
|
-
}
|
|
28984
|
-
};
|
|
28985
|
-
ws.off("message", bufferMessage);
|
|
28986
|
-
for (const message of messagesReceivedInStarting) handleMessage(...message);
|
|
28987
|
-
ws.on("message", (data, isBinary) => {
|
|
28988
|
-
handleMessage(data, isBinary);
|
|
28989
|
-
});
|
|
28990
|
-
ws.on("close", (code, reason) => {
|
|
28991
|
-
try {
|
|
28992
|
-
events?.onClose?.(new CloseEvent("close", {
|
|
28993
|
-
code,
|
|
28994
|
-
reason: reason.toString()
|
|
28995
|
-
}), ctx);
|
|
28996
|
-
} catch (e) {
|
|
28997
|
-
(options?.onError ?? console.error)(e);
|
|
28998
|
-
}
|
|
28999
|
-
});
|
|
29000
|
-
ws.on("error", (error) => {
|
|
29001
|
-
try {
|
|
29002
|
-
events?.onError?.(new ErrorEvent("error", { error }), ctx);
|
|
29003
|
-
} catch (e) {
|
|
29004
|
-
(options?.onError ?? console.error)(e);
|
|
29005
|
-
}
|
|
29006
|
-
});
|
|
29007
|
-
})();
|
|
29008
|
-
return new Response();
|
|
29009
|
-
})
|
|
29010
|
-
};
|
|
29011
|
-
};
|
|
29012
|
-
//#endregion
|
|
29013
28905
|
//#region src/satori/server.ts
|
|
29014
28906
|
var SatoriServer = class {
|
|
29015
28907
|
app;
|
|
@@ -29018,7 +28910,6 @@ var SatoriServer = class {
|
|
|
29018
28910
|
wsClients = [];
|
|
29019
28911
|
actionMap;
|
|
29020
28912
|
routesRegistered = false;
|
|
29021
|
-
injectWebSocket;
|
|
29022
28913
|
constructor(ctx, config) {
|
|
29023
28914
|
this.ctx = ctx;
|
|
29024
28915
|
this.config = config;
|
|
@@ -29052,18 +28943,20 @@ var SatoriServer = class {
|
|
|
29052
28943
|
this.routesRegistered = true;
|
|
29053
28944
|
}
|
|
29054
28945
|
const { host, port } = this.config;
|
|
28946
|
+
const wss = new WebSocketServer({
|
|
28947
|
+
noServer: true,
|
|
28948
|
+
maxPayload: constants.MAX_STRING_LENGTH
|
|
28949
|
+
});
|
|
29055
28950
|
this.httpServer = serve({
|
|
29056
28951
|
fetch: this.app.fetch,
|
|
28952
|
+
websocket: { server: wss },
|
|
29057
28953
|
port,
|
|
29058
28954
|
hostname: host
|
|
29059
28955
|
}, () => {
|
|
29060
28956
|
this.ctx.logger.info(`Satori server started ${host || "0.0.0.0"}:${port}`);
|
|
29061
28957
|
});
|
|
29062
|
-
this.injectWebSocket?.(this.httpServer);
|
|
29063
28958
|
}
|
|
29064
28959
|
registerRoutes() {
|
|
29065
|
-
const { injectWebSocket, upgradeWebSocket } = createNodeWebSocket({ app: this.app });
|
|
29066
|
-
this.injectWebSocket = injectWebSocket;
|
|
29067
28960
|
this.app.get("/v1/events", upgradeWebSocket((c) => {
|
|
29068
28961
|
return { onMessage: async (event, ws) => {
|
|
29069
28962
|
let payload;
|
|
@@ -29173,8 +29066,10 @@ async function parseMessageDeleted(bot, input) {
|
|
|
29173
29066
|
if (!origin) return;
|
|
29174
29067
|
const message = await decodeMessage(bot.ctx, origin);
|
|
29175
29068
|
if (!message) return;
|
|
29176
|
-
const
|
|
29177
|
-
|
|
29069
|
+
const revokeElement = input.elements[0].grayTipElement.revokeElement;
|
|
29070
|
+
let operator;
|
|
29071
|
+
if (revokeElement.operatorUid === revokeElement.origMsgSenderUid) operator = message.user;
|
|
29072
|
+
else operator = decodeUser((await bot.ctx.ntUserApi.getUserSimpleInfo(revokeElement.operatorUid)).coreInfo);
|
|
29178
29073
|
return bot.event("message-deleted", {
|
|
29179
29074
|
message: omit(message, [
|
|
29180
29075
|
"member",
|
|
@@ -29186,7 +29081,7 @@ async function parseMessageDeleted(bot, input) {
|
|
|
29186
29081
|
user: message.user,
|
|
29187
29082
|
channel: message.channel,
|
|
29188
29083
|
guild: message.guild,
|
|
29189
|
-
operator: omit(
|
|
29084
|
+
operator: omit(operator, ["is_bot"])
|
|
29190
29085
|
});
|
|
29191
29086
|
}
|
|
29192
29087
|
//#endregion
|
|
@@ -42339,7 +42234,6 @@ var MilkyHttpHandler = class {
|
|
|
42339
42234
|
this.ctx.logger.info("MilkyHttp", `${c.env.incoming.socket.remoteAddress} -> ${c.req.path} (${response.retcode === 0 ? "OK" : response.retcode} ${end - start}ms)`, payload);
|
|
42340
42235
|
return c.json(response);
|
|
42341
42236
|
});
|
|
42342
|
-
const { injectWebSocket, upgradeWebSocket } = createNodeWebSocket({ app: this.app });
|
|
42343
42237
|
this.app.get(`${this.config.prefix}/event`, upgradeWebSocket((c) => {
|
|
42344
42238
|
return {
|
|
42345
42239
|
onOpen: (event, ws) => {
|
|
@@ -42380,15 +42274,19 @@ var MilkyHttpHandler = class {
|
|
|
42380
42274
|
});
|
|
42381
42275
|
});
|
|
42382
42276
|
});
|
|
42277
|
+
const wss = new WebSocketServer({
|
|
42278
|
+
noServer: true,
|
|
42279
|
+
maxPayload: constants.MAX_STRING_LENGTH
|
|
42280
|
+
});
|
|
42383
42281
|
this.httpServer = serve({
|
|
42384
42282
|
fetch: this.app.fetch,
|
|
42283
|
+
websocket: { server: wss },
|
|
42385
42284
|
port: this.config.port,
|
|
42386
42285
|
hostname: this.config.host
|
|
42387
42286
|
}, () => {
|
|
42388
42287
|
const displayHost = this.config.host || "0.0.0.0";
|
|
42389
42288
|
this.ctx.logger.info("MilkyHttp", `HTTP server started at ${displayHost}:${this.config.port}${this.config.prefix}`);
|
|
42390
42289
|
});
|
|
42391
|
-
injectWebSocket(this.httpServer);
|
|
42392
42290
|
}
|
|
42393
42291
|
stop() {
|
|
42394
42292
|
for (const stream of this.sseClients) stream.abort();
|
|
@@ -43532,7 +43430,7 @@ async function download(url, headers) {
|
|
|
43532
43430
|
return Buffer.from(bytes);
|
|
43533
43431
|
}
|
|
43534
43432
|
async function resolveMilkyUri(uri) {
|
|
43535
|
-
if (uri.startsWith("file://")) return await
|
|
43433
|
+
if (uri.startsWith("file://")) return await fsPromise.readFile(fileURLToPath(uri));
|
|
43536
43434
|
if (uri.startsWith("http://") || uri.startsWith("https://")) return await download(uri);
|
|
43537
43435
|
if (uri.startsWith("base64://")) return Buffer.from(uri.slice(9), "base64");
|
|
43538
43436
|
throw new Error(`Unsupported URI scheme: ${uri}`);
|
|
@@ -46407,7 +46305,7 @@ function getIgnoreAttributesFn(ignoreAttributes) {
|
|
|
46407
46305
|
return () => false;
|
|
46408
46306
|
}
|
|
46409
46307
|
//#endregion
|
|
46410
|
-
//#region node_modules/
|
|
46308
|
+
//#region node_modules/path-expression-matcher/src/Expression.js
|
|
46411
46309
|
/**
|
|
46412
46310
|
* Expression - Parses and stores a tag pattern expression
|
|
46413
46311
|
*
|
|
@@ -46559,7 +46457,7 @@ var Expression = class {
|
|
|
46559
46457
|
}
|
|
46560
46458
|
};
|
|
46561
46459
|
//#endregion
|
|
46562
|
-
//#region node_modules/
|
|
46460
|
+
//#region node_modules/path-expression-matcher/src/ExpressionSet.js
|
|
46563
46461
|
/**
|
|
46564
46462
|
* ExpressionSet - An indexed collection of Expressions for efficient bulk matching
|
|
46565
46463
|
*
|
|
@@ -46732,7 +46630,7 @@ var ExpressionSet = class {
|
|
|
46732
46630
|
}
|
|
46733
46631
|
};
|
|
46734
46632
|
//#endregion
|
|
46735
|
-
//#region node_modules/
|
|
46633
|
+
//#region node_modules/path-expression-matcher/src/Matcher.js
|
|
46736
46634
|
/**
|
|
46737
46635
|
* MatcherView - A lightweight read-only view over a Matcher's internal state.
|
|
46738
46636
|
*
|
|
@@ -47196,7 +47094,7 @@ function extractNamespace(rawTagName) {
|
|
|
47196
47094
|
}
|
|
47197
47095
|
}
|
|
47198
47096
|
var OrderedObjParser = class {
|
|
47199
|
-
constructor(options) {
|
|
47097
|
+
constructor(options, externalEntities) {
|
|
47200
47098
|
this.options = options;
|
|
47201
47099
|
this.currentNode = null;
|
|
47202
47100
|
this.tagsNodeStack = [];
|
|
@@ -47221,7 +47119,10 @@ var OrderedObjParser = class {
|
|
|
47221
47119
|
...CURRENCY
|
|
47222
47120
|
};
|
|
47223
47121
|
this.entityDecoder = new EntityDecoder({
|
|
47224
|
-
namedEntities
|
|
47122
|
+
namedEntities: {
|
|
47123
|
+
...namedEntities,
|
|
47124
|
+
...externalEntities
|
|
47125
|
+
},
|
|
47225
47126
|
numericAllowed: this.options.htmlEntities,
|
|
47226
47127
|
limit: {
|
|
47227
47128
|
maxTotalExpansions: this.options.processEntities.maxTotalExpansions,
|
|
@@ -47325,7 +47226,7 @@ function buildAttributesMap(attrStr, jPath, tagName, force = false) {
|
|
|
47325
47226
|
}
|
|
47326
47227
|
}
|
|
47327
47228
|
if (!hasAttrs) return;
|
|
47328
|
-
if (options.attributesGroupName) {
|
|
47229
|
+
if (options.attributesGroupName && !options.preserveOrder) {
|
|
47329
47230
|
const attrCollection = {};
|
|
47330
47231
|
attrCollection[options.attributesGroupName] = attrs;
|
|
47331
47232
|
return attrCollection;
|
|
@@ -47543,29 +47444,35 @@ function isItStopNode() {
|
|
|
47543
47444
|
*/
|
|
47544
47445
|
function tagExpWithClosingIndex(xmlData, i, closingChar = ">") {
|
|
47545
47446
|
let attrBoundary = 0;
|
|
47546
|
-
const chars = [];
|
|
47547
47447
|
const len = xmlData.length;
|
|
47548
47448
|
const closeCode0 = closingChar.charCodeAt(0);
|
|
47549
47449
|
const closeCode1 = closingChar.length > 1 ? closingChar.charCodeAt(1) : -1;
|
|
47450
|
+
let result = "";
|
|
47451
|
+
let segmentStart = i;
|
|
47550
47452
|
for (let index = i; index < len; index++) {
|
|
47551
47453
|
const code = xmlData.charCodeAt(index);
|
|
47552
47454
|
if (attrBoundary) {
|
|
47553
47455
|
if (code === attrBoundary) attrBoundary = 0;
|
|
47554
47456
|
} else if (code === 34 || code === 39) attrBoundary = code;
|
|
47555
47457
|
else if (code === closeCode0) if (closeCode1 !== -1) {
|
|
47556
|
-
if (xmlData.charCodeAt(index + 1) === closeCode1)
|
|
47557
|
-
|
|
47458
|
+
if (xmlData.charCodeAt(index + 1) === closeCode1) {
|
|
47459
|
+
result += xmlData.substring(segmentStart, index);
|
|
47460
|
+
return {
|
|
47461
|
+
data: result,
|
|
47462
|
+
index
|
|
47463
|
+
};
|
|
47464
|
+
}
|
|
47465
|
+
} else {
|
|
47466
|
+
result += xmlData.substring(segmentStart, index);
|
|
47467
|
+
return {
|
|
47468
|
+
data: result,
|
|
47558
47469
|
index
|
|
47559
47470
|
};
|
|
47560
|
-
} else return {
|
|
47561
|
-
data: String.fromCharCode(...chars),
|
|
47562
|
-
index
|
|
47563
|
-
};
|
|
47564
|
-
else if (code === 9) {
|
|
47565
|
-
chars.push(32);
|
|
47566
|
-
continue;
|
|
47567
47471
|
}
|
|
47568
|
-
|
|
47472
|
+
else if (code === 9 && !attrBoundary) {
|
|
47473
|
+
result += xmlData.substring(segmentStart, index) + " ";
|
|
47474
|
+
segmentStart = index + 1;
|
|
47475
|
+
}
|
|
47569
47476
|
}
|
|
47570
47477
|
}
|
|
47571
47478
|
function findClosingIndex(xmlData, str, i, errMsg) {
|
|
@@ -47785,8 +47692,7 @@ var XMLParser = class {
|
|
|
47785
47692
|
const result = validate(xmlData, validationOption);
|
|
47786
47693
|
if (result !== true) throw Error(`${result.err.msg}:${result.err.line}:${result.err.col}`);
|
|
47787
47694
|
}
|
|
47788
|
-
const orderedObjParser = new OrderedObjParser(this.options);
|
|
47789
|
-
orderedObjParser.entityDecoder.setExternalEntities(this.externalEntities);
|
|
47695
|
+
const orderedObjParser = new OrderedObjParser(this.options, this.externalEntities);
|
|
47790
47696
|
const orderedResult = orderedObjParser.parseXml(xmlData);
|
|
47791
47697
|
if (this.options.preserveOrder || orderedResult === void 0) return orderedResult;
|
|
47792
47698
|
else return prettify(orderedResult, this.options, orderedObjParser.matcher, orderedObjParser.readonlyMatcher);
|
|
@@ -48768,6 +48674,25 @@ async function transformTempMessageCreated(ctx, message) {
|
|
|
48768
48674
|
}
|
|
48769
48675
|
}
|
|
48770
48676
|
/**
|
|
48677
|
+
* Transform NTQQ message-deleted event to Milky message_recall event (temp)
|
|
48678
|
+
*/
|
|
48679
|
+
async function transformTempMessageDeleted(ctx, message) {
|
|
48680
|
+
try {
|
|
48681
|
+
const revokeElement = message.elements[0].grayTipElement.revokeElement;
|
|
48682
|
+
return {
|
|
48683
|
+
message_scene: "temp",
|
|
48684
|
+
peer_id: Number(message.peerUin),
|
|
48685
|
+
message_seq: Number(message.msgSeq),
|
|
48686
|
+
sender_id: Number(message.senderUin),
|
|
48687
|
+
operator_id: Number(message.senderUin),
|
|
48688
|
+
display_suffix: revokeElement.wording
|
|
48689
|
+
};
|
|
48690
|
+
} catch (error) {
|
|
48691
|
+
ctx.logger.error("Failed to transform temp message deleted event:", error);
|
|
48692
|
+
return null;
|
|
48693
|
+
}
|
|
48694
|
+
}
|
|
48695
|
+
/**
|
|
48771
48696
|
* Transform NTQQ message-deleted event to Milky message_recall event (private)
|
|
48772
48697
|
*/
|
|
48773
48698
|
async function transformPrivateMessageDeleted(ctx, message) {
|
|
@@ -48778,7 +48703,7 @@ async function transformPrivateMessageDeleted(ctx, message) {
|
|
|
48778
48703
|
peer_id: Number(message.peerUin),
|
|
48779
48704
|
message_seq: Number(message.msgSeq),
|
|
48780
48705
|
sender_id: Number(message.senderUin),
|
|
48781
|
-
operator_id: Number(
|
|
48706
|
+
operator_id: Number(message.senderUin),
|
|
48782
48707
|
display_suffix: revokeElement.wording
|
|
48783
48708
|
};
|
|
48784
48709
|
} catch (error) {
|
|
@@ -48792,12 +48717,15 @@ async function transformPrivateMessageDeleted(ctx, message) {
|
|
|
48792
48717
|
async function transformGroupMessageDeleted(ctx, message) {
|
|
48793
48718
|
try {
|
|
48794
48719
|
const revokeElement = message.elements[0].grayTipElement.revokeElement;
|
|
48720
|
+
let operatorUin;
|
|
48721
|
+
if (revokeElement.operatorUid === revokeElement.origMsgSenderUid) operatorUin = message.senderUin;
|
|
48722
|
+
else operatorUin = await ctx.ntUserApi.getUinByUid(revokeElement.operatorUid);
|
|
48795
48723
|
return {
|
|
48796
48724
|
message_scene: "group",
|
|
48797
48725
|
peer_id: Number(message.peerUin),
|
|
48798
48726
|
message_seq: Number(message.msgSeq),
|
|
48799
48727
|
sender_id: Number(message.senderUin),
|
|
48800
|
-
operator_id: Number(
|
|
48728
|
+
operator_id: Number(operatorUin),
|
|
48801
48729
|
display_suffix: revokeElement.wording
|
|
48802
48730
|
};
|
|
48803
48731
|
} catch (error) {
|
|
@@ -49209,6 +49137,9 @@ var MilkyAdapter = class extends Service {
|
|
|
49209
49137
|
} else if (message.chatType === ChatType.Group) {
|
|
49210
49138
|
const eventData = await transformGroupMessageDeleted(this.ctx, message);
|
|
49211
49139
|
if (eventData) this.emitEvent("message_recall", eventData);
|
|
49140
|
+
} else if (message.chatType === ChatType.TempC2CFromGroup) {
|
|
49141
|
+
const eventData = await transformTempMessageDeleted(this.ctx, message);
|
|
49142
|
+
if (eventData) this.emitEvent("message_recall", eventData);
|
|
49212
49143
|
}
|
|
49213
49144
|
});
|
|
49214
49145
|
this.ctx.on("nt/message-sent", async (message) => {
|
|
@@ -54126,9 +54057,7 @@ var NTQQUserApi = class extends Service {
|
|
|
54126
54057
|
return await this.ctx.pmhq.invoke("nodeIKernelProfileService/getCoreAndBaseInfo", ["nodeStore", uids]);
|
|
54127
54058
|
}
|
|
54128
54059
|
async getBuddyNick(uid) {
|
|
54129
|
-
|
|
54130
|
-
if (nick === void 0) this.ctx.logger.warn(`获取昵称失败, uid: ${uid}`);
|
|
54131
|
-
return nick ?? "";
|
|
54060
|
+
return (await this.ctx.pmhq.invoke("nodeIKernelBuddyService/getBuddyNick", [[uid]])).get(uid);
|
|
54132
54061
|
}
|
|
54133
54062
|
async getCookies(domain) {
|
|
54134
54063
|
const clientKeyData = await this.forceFetchClientKey();
|
|
@@ -54152,7 +54081,11 @@ var NTQQUserApi = class extends Service {
|
|
|
54152
54081
|
return await this.ctx.pmhq.invoke("nodeIKernelTicketService/forceFetchClientKey", [""]);
|
|
54153
54082
|
}
|
|
54154
54083
|
async getSelfNick(refresh = true) {
|
|
54155
|
-
if ((refresh || !selfInfo.nick) && selfInfo.uid)
|
|
54084
|
+
if ((refresh || !selfInfo.nick) && selfInfo.uid) {
|
|
54085
|
+
let nick = await this.getBuddyNick(selfInfo.uid);
|
|
54086
|
+
if (nick === void 0) nick = (await this.getUserSimpleInfo(selfInfo.uid, refresh)).coreInfo.nick;
|
|
54087
|
+
selfInfo.nick = nick;
|
|
54088
|
+
}
|
|
54156
54089
|
return selfInfo.nick;
|
|
54157
54090
|
}
|
|
54158
54091
|
async setSelfStatus(status, extStatus, batteryStatus) {
|
|
@@ -54363,103 +54296,154 @@ var NTQQWebApi = class extends Service {
|
|
|
54363
54296
|
const iBatchID = Math.floor(Date.now() / 1e3);
|
|
54364
54297
|
for (let i = 0; i < filePathList.length; i++) {
|
|
54365
54298
|
const filePath = filePathList[i];
|
|
54366
|
-
const fileBuffer = await
|
|
54299
|
+
const fileBuffer = await fsPromise.readFile(filePath);
|
|
54367
54300
|
const fileSize = fileBuffer.length;
|
|
54368
|
-
const
|
|
54369
|
-
const getSessionUrl = `https://${domain}/webapp/json/sliceUpload/FileBatchControl/${checksum}?g_tk=${gtk}`;
|
|
54301
|
+
const fileType = await fileTypeFromBuffer(fileBuffer);
|
|
54370
54302
|
const timestamp = Math.floor(Date.now() / 1e3);
|
|
54371
|
-
const
|
|
54372
|
-
|
|
54373
|
-
|
|
54374
|
-
|
|
54375
|
-
|
|
54376
|
-
|
|
54377
|
-
|
|
54378
|
-
|
|
54379
|
-
|
|
54380
|
-
|
|
54381
|
-
|
|
54382
|
-
"env": {
|
|
54383
|
-
"refer": "qzone",
|
|
54384
|
-
"deviceInfo": "h5"
|
|
54385
|
-
},
|
|
54386
|
-
"model": 0,
|
|
54387
|
-
"biz_req": {
|
|
54388
|
-
"sPicTitle": "",
|
|
54389
|
-
"sPicDesc": "",
|
|
54390
|
-
"sAlbumName": "",
|
|
54391
|
-
"sAlbumID": albumID,
|
|
54392
|
-
"iAlbumTypeID": 0,
|
|
54393
|
-
"iBitmap": 0,
|
|
54394
|
-
"iUploadType": 0,
|
|
54395
|
-
"iUpPicType": 0,
|
|
54396
|
-
"iBatchID": iBatchID,
|
|
54397
|
-
"sPicPath": "",
|
|
54398
|
-
"iPicWidth": 0,
|
|
54399
|
-
"iPicHight": 0,
|
|
54400
|
-
"iWaterType": 0,
|
|
54401
|
-
"iDistinctUse": 0,
|
|
54402
|
-
"iNeedFeeds": 1,
|
|
54403
|
-
"iUploadTime": timestamp,
|
|
54404
|
-
"mapExt": {
|
|
54405
|
-
"appid": "qun",
|
|
54406
|
-
"userid": groupCode
|
|
54303
|
+
const isVideo = fileType?.mime.startsWith("video");
|
|
54304
|
+
let res;
|
|
54305
|
+
if (isVideo) {
|
|
54306
|
+
const checksum = getSha1HexFromBuffer(fileBuffer);
|
|
54307
|
+
const getSessionUrl = `https://${domain}/webapp/json/sliceUpload/FileBatchControl/${checksum}?g_tk=${gtk}`;
|
|
54308
|
+
const getSessionPostData = { "control_req": [{
|
|
54309
|
+
"uin": selfInfo.uin,
|
|
54310
|
+
"token": {
|
|
54311
|
+
"type": 4,
|
|
54312
|
+
"data": cookiesObject.p_skey,
|
|
54313
|
+
"appid": 5
|
|
54407
54314
|
},
|
|
54408
|
-
"
|
|
54409
|
-
|
|
54410
|
-
|
|
54411
|
-
|
|
54412
|
-
|
|
54413
|
-
|
|
54414
|
-
"
|
|
54415
|
-
|
|
54416
|
-
|
|
54417
|
-
|
|
54418
|
-
|
|
54419
|
-
|
|
54420
|
-
|
|
54421
|
-
|
|
54422
|
-
|
|
54423
|
-
|
|
54424
|
-
|
|
54315
|
+
"appid": "video_qun",
|
|
54316
|
+
"checksum": checksum,
|
|
54317
|
+
"check_type": 1,
|
|
54318
|
+
"file_len": fileSize,
|
|
54319
|
+
"env": {
|
|
54320
|
+
"refer": "qzone",
|
|
54321
|
+
"deviceInfo": "h5"
|
|
54322
|
+
},
|
|
54323
|
+
"model": 0,
|
|
54324
|
+
"biz_req": {
|
|
54325
|
+
"sPicTitle": "",
|
|
54326
|
+
"sPicDesc": "",
|
|
54327
|
+
"sAlbumName": "",
|
|
54328
|
+
"sAlbumID": "",
|
|
54329
|
+
"iAlbumTypeID": 0,
|
|
54330
|
+
"iBitmap": 0,
|
|
54331
|
+
"iUploadType": 3,
|
|
54332
|
+
"iUpPicType": 0,
|
|
54333
|
+
"iBatchID": 0,
|
|
54334
|
+
"sPicPath": "",
|
|
54335
|
+
"iPicWidth": 0,
|
|
54336
|
+
"iPicHight": 0,
|
|
54337
|
+
"iWaterType": 0,
|
|
54338
|
+
"iDistinctUse": 0,
|
|
54339
|
+
"sTitle": "",
|
|
54340
|
+
"sDesc": "",
|
|
54341
|
+
"iFlag": 0,
|
|
54342
|
+
"iUploadTime": timestamp,
|
|
54343
|
+
"iPlayTime": 0,
|
|
54344
|
+
"sCoverUrl": "",
|
|
54345
|
+
"iIsNew": 111,
|
|
54346
|
+
"iIsOriginalVideo": 0,
|
|
54347
|
+
"iIsFormatF20": 0,
|
|
54348
|
+
"extend_info": {
|
|
54349
|
+
"video_type": "3",
|
|
54350
|
+
"domainid": "5",
|
|
54351
|
+
"photo_num": "0",
|
|
54352
|
+
"video_num": fileLen,
|
|
54353
|
+
"batch_num": fileLen,
|
|
54354
|
+
"qun_id": groupCode
|
|
54355
|
+
}
|
|
54356
|
+
},
|
|
54357
|
+
"session": "",
|
|
54358
|
+
"asy_upload": 0,
|
|
54359
|
+
"cmd": "FileUploadVideo"
|
|
54360
|
+
}] };
|
|
54361
|
+
res = await HttpUtil.post(getSessionUrl, getSessionPostData, this.cookieToString(cookiesObject));
|
|
54362
|
+
} else {
|
|
54363
|
+
const checksum = getMd5HexFromBuffer(fileBuffer);
|
|
54364
|
+
const getSessionUrl = `https://${domain}/webapp/json/sliceUpload/FileBatchControl/${checksum}?g_tk=${gtk}`;
|
|
54365
|
+
const getSessionPostData = { "control_req": [{
|
|
54366
|
+
"uin": selfInfo.uin,
|
|
54367
|
+
"token": {
|
|
54368
|
+
"type": 4,
|
|
54369
|
+
"data": cookiesObject.p_skey,
|
|
54370
|
+
"appid": 5
|
|
54371
|
+
},
|
|
54372
|
+
"appid": "qun",
|
|
54373
|
+
"checksum": checksum,
|
|
54374
|
+
"check_type": 0,
|
|
54375
|
+
"file_len": fileSize,
|
|
54376
|
+
"env": {
|
|
54377
|
+
"refer": "qzone",
|
|
54378
|
+
"deviceInfo": "h5"
|
|
54379
|
+
},
|
|
54380
|
+
"model": 0,
|
|
54381
|
+
"biz_req": {
|
|
54382
|
+
"sPicTitle": "",
|
|
54383
|
+
"sPicDesc": "",
|
|
54384
|
+
"sAlbumName": "",
|
|
54385
|
+
"sAlbumID": albumID,
|
|
54386
|
+
"iAlbumTypeID": 0,
|
|
54387
|
+
"iBitmap": 0,
|
|
54388
|
+
"iUploadType": 0,
|
|
54389
|
+
"iUpPicType": 0,
|
|
54390
|
+
"iBatchID": iBatchID,
|
|
54391
|
+
"sPicPath": "",
|
|
54392
|
+
"iPicWidth": 0,
|
|
54393
|
+
"iPicHight": 0,
|
|
54394
|
+
"iWaterType": 0,
|
|
54395
|
+
"iDistinctUse": 0,
|
|
54396
|
+
"iNeedFeeds": 1,
|
|
54397
|
+
"iUploadTime": timestamp,
|
|
54398
|
+
"mapExt": {
|
|
54399
|
+
"appid": "qun",
|
|
54400
|
+
"userid": groupCode
|
|
54401
|
+
},
|
|
54402
|
+
"stExtendInfo": { "mapParams": {
|
|
54403
|
+
"photo_num": fileLen,
|
|
54404
|
+
"video_num": "0",
|
|
54405
|
+
"batch_num": fileLen
|
|
54406
|
+
} },
|
|
54407
|
+
"mutliPicInfo": {
|
|
54408
|
+
"iBatUploadNum": fileLen,
|
|
54409
|
+
"iCurUpload": i,
|
|
54410
|
+
"iSuccNum": 0,
|
|
54411
|
+
"iFailNum": 0
|
|
54412
|
+
}
|
|
54413
|
+
},
|
|
54414
|
+
"session": "",
|
|
54415
|
+
"asy_upload": 0,
|
|
54416
|
+
"cmd": "FileUpload"
|
|
54417
|
+
}] };
|
|
54418
|
+
res = await HttpUtil.post(getSessionUrl, getSessionPostData, this.cookieToString(cookiesObject));
|
|
54419
|
+
}
|
|
54420
|
+
const resJson = await res.json();
|
|
54425
54421
|
if (resJson.ret !== 0) {
|
|
54426
54422
|
this.ctx.logger.error(`获取群相册上传 session 失败: ${resJson.msg}`);
|
|
54427
54423
|
errIndexList.push(i);
|
|
54428
54424
|
continue;
|
|
54429
54425
|
}
|
|
54430
|
-
const sessionId = resJson.data.session;
|
|
54431
54426
|
const sliceSize = resJson.data.slice_size;
|
|
54432
54427
|
let offset = 0;
|
|
54433
54428
|
let seq = 1;
|
|
54434
54429
|
const concurrency = 10;
|
|
54435
|
-
|
|
54436
|
-
while (offset < fileSize) {
|
|
54437
|
-
const end = Math.min(offset + sliceSize, fileSize);
|
|
54438
|
-
const chunk = fileBuffer.subarray(offset, end);
|
|
54439
|
-
slices.push({
|
|
54440
|
-
offset,
|
|
54441
|
-
end,
|
|
54442
|
-
seq,
|
|
54443
|
-
chunk
|
|
54444
|
-
});
|
|
54445
|
-
offset = end;
|
|
54446
|
-
seq++;
|
|
54447
|
-
}
|
|
54430
|
+
let sVid;
|
|
54448
54431
|
const uploadSlice = async (slice) => {
|
|
54449
|
-
const
|
|
54432
|
+
const cmd = slice.isVideo ? "FileUploadVideo" : "FileUpload";
|
|
54433
|
+
const uploadUrl = `https://${domain}/webapp/json/sliceUpload/${cmd}?seq=${slice.seq}&retry=0&offset=${slice.offset}&end=${slice.end}&total=${fileSize}&type=form&g_tk=${gtk}`;
|
|
54450
54434
|
const formData = new FormData();
|
|
54451
54435
|
formData.append("uin", selfInfo.uin);
|
|
54452
|
-
formData.append("appid", "qun");
|
|
54436
|
+
formData.append("appid", slice.isVideo ? "video_qun" : "qun");
|
|
54453
54437
|
formData.append("data", new Blob([Uint8Array.from(slice.chunk)]));
|
|
54454
|
-
formData.append("session", sessionId);
|
|
54438
|
+
formData.append("session", slice.sessionId);
|
|
54455
54439
|
formData.append("offset", slice.offset.toString());
|
|
54456
54440
|
formData.append("checksum", "");
|
|
54457
54441
|
formData.append("check_type", "0");
|
|
54458
54442
|
formData.append("retry", "0");
|
|
54459
54443
|
formData.append("seq", slice.seq.toString());
|
|
54460
54444
|
formData.append("end", slice.end.toString());
|
|
54461
|
-
formData.append("cmd",
|
|
54462
|
-
formData.append("slice_size", sliceSize
|
|
54445
|
+
formData.append("cmd", cmd);
|
|
54446
|
+
formData.append("slice_size", slice.sliceSize);
|
|
54463
54447
|
formData.append("biz_req.iUploadType", "0");
|
|
54464
54448
|
const uploadResJson = await (await fetch(uploadUrl, {
|
|
54465
54449
|
method: "POST",
|
|
@@ -54469,8 +54453,24 @@ var NTQQWebApi = class extends Service {
|
|
|
54469
54453
|
if (uploadResJson.ret !== 0) {
|
|
54470
54454
|
if (!errIndexList.includes(i)) errIndexList.push(i);
|
|
54471
54455
|
throw new Error(`群相册分片上传失败 (seq: ${slice.seq}): ${uploadResJson.msg}, file: ${filePath}`);
|
|
54472
|
-
}
|
|
54456
|
+
} else if (uploadResJson.data.biz.sVid) sVid = uploadResJson.data.biz.sVid;
|
|
54473
54457
|
};
|
|
54458
|
+
const slices = [];
|
|
54459
|
+
while (offset < fileSize) {
|
|
54460
|
+
const end = Math.min(offset + sliceSize, fileSize);
|
|
54461
|
+
const chunk = fileBuffer.subarray(offset, end);
|
|
54462
|
+
slices.push({
|
|
54463
|
+
offset,
|
|
54464
|
+
end,
|
|
54465
|
+
seq,
|
|
54466
|
+
chunk,
|
|
54467
|
+
isVideo: !!isVideo,
|
|
54468
|
+
sessionId: resJson.data.session,
|
|
54469
|
+
sliceSize: sliceSize.toString()
|
|
54470
|
+
});
|
|
54471
|
+
offset = end;
|
|
54472
|
+
seq++;
|
|
54473
|
+
}
|
|
54474
54474
|
for (let i = 0; i < slices.length; i += concurrency) {
|
|
54475
54475
|
const batch = slices.slice(i, i + concurrency);
|
|
54476
54476
|
try {
|
|
@@ -54479,6 +54479,112 @@ var NTQQWebApi = class extends Service {
|
|
|
54479
54479
|
this.ctx.logger.error(e);
|
|
54480
54480
|
}
|
|
54481
54481
|
}
|
|
54482
|
+
if (sVid) {
|
|
54483
|
+
const filePath = await createThumb(this.ctx, filePathList[i]);
|
|
54484
|
+
const fileBuffer = await fsPromise.readFile(filePath);
|
|
54485
|
+
const fileSize = fileBuffer.length;
|
|
54486
|
+
const timestamp = Math.floor(Date.now() / 1e3);
|
|
54487
|
+
const checksum = getMd5HexFromBuffer(fileBuffer);
|
|
54488
|
+
const getSessionUrl = `https://${domain}/webapp/json/sliceUpload/FileBatchControl/${checksum}?g_tk=${gtk}`;
|
|
54489
|
+
const getSessionPostData = { "control_req": [{
|
|
54490
|
+
"uin": selfInfo.uin,
|
|
54491
|
+
"token": {
|
|
54492
|
+
"type": 4,
|
|
54493
|
+
"data": cookiesObject.p_skey,
|
|
54494
|
+
"appid": 5
|
|
54495
|
+
},
|
|
54496
|
+
"appid": "qun",
|
|
54497
|
+
"checksum": checksum,
|
|
54498
|
+
"check_type": 0,
|
|
54499
|
+
"file_len": fileSize,
|
|
54500
|
+
"env": {
|
|
54501
|
+
"refer": "huodong",
|
|
54502
|
+
"deviceInfo": "h5"
|
|
54503
|
+
},
|
|
54504
|
+
"model": 0,
|
|
54505
|
+
"biz_req": {
|
|
54506
|
+
"sPicTitle": "",
|
|
54507
|
+
"sPicDesc": "",
|
|
54508
|
+
"sAlbumName": "",
|
|
54509
|
+
"sAlbumID": albumID,
|
|
54510
|
+
"iAlbumTypeID": 0,
|
|
54511
|
+
"iBitmap": 0,
|
|
54512
|
+
"iUploadType": 2,
|
|
54513
|
+
"iUpPicType": 0,
|
|
54514
|
+
"iBatchID": iBatchID,
|
|
54515
|
+
"sPicPath": "",
|
|
54516
|
+
"iPicWidth": 0,
|
|
54517
|
+
"iPicHight": 0,
|
|
54518
|
+
"iWaterType": 0,
|
|
54519
|
+
"iDistinctUse": 0,
|
|
54520
|
+
"mutliPicInfo": {
|
|
54521
|
+
"iBatUploadNum": fileLen,
|
|
54522
|
+
"iCurUpload": i,
|
|
54523
|
+
"iSuccNum": 0,
|
|
54524
|
+
"iFailNum": 0
|
|
54525
|
+
},
|
|
54526
|
+
"iNeedFeeds": 1,
|
|
54527
|
+
"iUploadTime": timestamp,
|
|
54528
|
+
"stExtendInfo": { "mapParams": {
|
|
54529
|
+
"vid": sVid,
|
|
54530
|
+
"photo_num": "0",
|
|
54531
|
+
"video_num": fileLen,
|
|
54532
|
+
"batch_num": fileLen
|
|
54533
|
+
} },
|
|
54534
|
+
"stExternalMapExt": {
|
|
54535
|
+
"is_client_upload_cover": "1",
|
|
54536
|
+
"is_pic_video_mix_feeds": "1"
|
|
54537
|
+
},
|
|
54538
|
+
"mapExt": {
|
|
54539
|
+
"appid": "qun",
|
|
54540
|
+
"userid": groupCode
|
|
54541
|
+
},
|
|
54542
|
+
"sExif_CameraMaker": "",
|
|
54543
|
+
"sExif_CameraModel": "",
|
|
54544
|
+
"sExif_Time": "",
|
|
54545
|
+
"sExif_LatitudeRef": "",
|
|
54546
|
+
"sExif_Latitude": "",
|
|
54547
|
+
"sExif_LongitudeRef": "",
|
|
54548
|
+
"sExif_Longitude": ""
|
|
54549
|
+
},
|
|
54550
|
+
"session": "",
|
|
54551
|
+
"asy_upload": 0
|
|
54552
|
+
}] };
|
|
54553
|
+
const resJson = await (await HttpUtil.post(getSessionUrl, getSessionPostData, this.cookieToString(cookiesObject))).json();
|
|
54554
|
+
if (resJson.ret !== 0) {
|
|
54555
|
+
this.ctx.logger.error(`获取群相册上传 session 失败: ${resJson.msg}`);
|
|
54556
|
+
errIndexList.push(i);
|
|
54557
|
+
continue;
|
|
54558
|
+
}
|
|
54559
|
+
const sliceSize = resJson.data.slice_size;
|
|
54560
|
+
let offset = 0;
|
|
54561
|
+
let seq = 1;
|
|
54562
|
+
const concurrency = 10;
|
|
54563
|
+
const slices = [];
|
|
54564
|
+
while (offset < fileSize) {
|
|
54565
|
+
const end = Math.min(offset + sliceSize, fileSize);
|
|
54566
|
+
const chunk = fileBuffer.subarray(offset, end);
|
|
54567
|
+
slices.push({
|
|
54568
|
+
offset,
|
|
54569
|
+
end,
|
|
54570
|
+
seq,
|
|
54571
|
+
chunk,
|
|
54572
|
+
isVideo: false,
|
|
54573
|
+
sessionId: resJson.data.session,
|
|
54574
|
+
sliceSize: sliceSize.toString()
|
|
54575
|
+
});
|
|
54576
|
+
offset = end;
|
|
54577
|
+
seq++;
|
|
54578
|
+
}
|
|
54579
|
+
for (let i = 0; i < slices.length; i += concurrency) {
|
|
54580
|
+
const batch = slices.slice(i, i + concurrency);
|
|
54581
|
+
try {
|
|
54582
|
+
await Promise.all(batch.map((slice) => uploadSlice(slice)));
|
|
54583
|
+
} catch (e) {
|
|
54584
|
+
this.ctx.logger.error(e);
|
|
54585
|
+
}
|
|
54586
|
+
}
|
|
54587
|
+
}
|
|
54482
54588
|
}
|
|
54483
54589
|
this.ctx.logger.info("群相册上传完成");
|
|
54484
54590
|
return {
|
|
@@ -54487,6 +54593,37 @@ var NTQQWebApi = class extends Service {
|
|
|
54487
54593
|
fail_indexes: errIndexList
|
|
54488
54594
|
};
|
|
54489
54595
|
}
|
|
54596
|
+
async publishGroupBulletin(groupCode, text, pinned, type, isShowEditCard, tipWindowType, confirmRequired, picId, imgWidth, imgHeight) {
|
|
54597
|
+
const cookieObject = await this.ctx.ntUserApi.getCookies("qun.qq.com");
|
|
54598
|
+
const bkn = this.genBkn(cookieObject.skey);
|
|
54599
|
+
const picInfo = {
|
|
54600
|
+
pic: picId,
|
|
54601
|
+
imgWidth: imgWidth?.toString(),
|
|
54602
|
+
imgHeight: imgHeight?.toString()
|
|
54603
|
+
};
|
|
54604
|
+
const res = await fetch("https://web.qun.qq.com/cgi-bin/announce/add_qun_notice", {
|
|
54605
|
+
method: "POST",
|
|
54606
|
+
headers: {
|
|
54607
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
54608
|
+
"Cookie": this.cookieToString(cookieObject)
|
|
54609
|
+
},
|
|
54610
|
+
body: new URLSearchParams({
|
|
54611
|
+
qid: groupCode,
|
|
54612
|
+
bkn,
|
|
54613
|
+
text,
|
|
54614
|
+
pinned: pinned.toString(),
|
|
54615
|
+
type: type.toString(),
|
|
54616
|
+
settings: JSON.stringify({
|
|
54617
|
+
is_show_edit_card: isShowEditCard,
|
|
54618
|
+
tip_window_type: tipWindowType,
|
|
54619
|
+
confirm_required: confirmRequired
|
|
54620
|
+
}),
|
|
54621
|
+
...picId ? picInfo : {}
|
|
54622
|
+
})
|
|
54623
|
+
});
|
|
54624
|
+
if (!res.ok) throw new Error(`HTTP error! Status: ${res.status}`);
|
|
54625
|
+
return await res.json();
|
|
54626
|
+
}
|
|
54490
54627
|
};
|
|
54491
54628
|
//#endregion
|
|
54492
54629
|
//#region src/ntqqapi/api/system.ts
|
|
@@ -55836,7 +55973,7 @@ var Config = class extends Service {
|
|
|
55836
55973
|
this.logger.info("配置文件位于", this.configPath);
|
|
55837
55974
|
this.config = this.get();
|
|
55838
55975
|
if (this.configPath) {
|
|
55839
|
-
fs$
|
|
55976
|
+
fs$1.watchFile(this.configPath, {
|
|
55840
55977
|
persistent: true,
|
|
55841
55978
|
interval: 1e3
|
|
55842
55979
|
}, () => {
|
|
@@ -55854,7 +55991,7 @@ var Config = class extends Service {
|
|
|
55854
55991
|
}
|
|
55855
55992
|
getDefaultConfig() {
|
|
55856
55993
|
const _defaultConfig = { ...defaultConfig };
|
|
55857
|
-
const defaultConfigFromFile = fs$
|
|
55994
|
+
const defaultConfigFromFile = fs$1.readFileSync(this.defaultConfigPath, "utf-8");
|
|
55858
55995
|
try {
|
|
55859
55996
|
const parsedDefaultConfig = import_dist.default.parse(defaultConfigFromFile);
|
|
55860
55997
|
Object.assign(_defaultConfig, parsedDefaultConfig);
|
|
@@ -55865,12 +56002,12 @@ var Config = class extends Service {
|
|
|
55865
56002
|
}
|
|
55866
56003
|
reloadConfig() {
|
|
55867
56004
|
if (!this.configPath) return this.getDefaultConfig();
|
|
55868
|
-
if (!fs$
|
|
56005
|
+
if (!fs$1.existsSync(this.configPath)) {
|
|
55869
56006
|
this.config = this.getDefaultConfig();
|
|
55870
56007
|
this.set(this.config);
|
|
55871
56008
|
return this.config;
|
|
55872
56009
|
} else {
|
|
55873
|
-
const data = fs$
|
|
56010
|
+
const data = fs$1.readFileSync(this.configPath, "utf-8");
|
|
55874
56011
|
let jsonData = defaultConfig;
|
|
55875
56012
|
try {
|
|
55876
56013
|
jsonData = import_dist.default.parse(data);
|
|
@@ -55896,7 +56033,7 @@ var Config = class extends Service {
|
|
|
55896
56033
|
writeConfig(config) {
|
|
55897
56034
|
if (!this.configPath) return;
|
|
55898
56035
|
this.watch = false;
|
|
55899
|
-
fs$
|
|
56036
|
+
fs$1.writeFileSync(this.configPath, JSON.stringify(config, null, 2), "utf-8");
|
|
55900
56037
|
setTimeout(() => {
|
|
55901
56038
|
this.watch = true;
|
|
55902
56039
|
}, 1500);
|
|
@@ -56002,13 +56139,13 @@ var WebUITokenUtil = class {
|
|
|
56002
56139
|
}
|
|
56003
56140
|
getToken() {
|
|
56004
56141
|
if (!this.token) {
|
|
56005
|
-
if (fs$
|
|
56142
|
+
if (fs$1.existsSync(this.tokenPath)) this.token = fs$1.readFileSync(this.tokenPath, "utf-8").trim();
|
|
56006
56143
|
}
|
|
56007
56144
|
return this.token;
|
|
56008
56145
|
}
|
|
56009
56146
|
setToken(token) {
|
|
56010
56147
|
this.token = token.trim();
|
|
56011
|
-
fs$
|
|
56148
|
+
fs$1.writeFileSync(this.tokenPath, token, "utf-8");
|
|
56012
56149
|
}
|
|
56013
56150
|
};
|
|
56014
56151
|
var webuiTokenUtil = new WebUITokenUtil(path.join(DATA_DIR, "webui_token.txt"));
|
|
@@ -57984,7 +58121,7 @@ var package_exports = /* @__PURE__ */ __exportAll({
|
|
|
57984
58121
|
var name, version, description, main, scripts, repository, keywords, author, license, bugs, homepage, devDependencies, engines, package_default;
|
|
57985
58122
|
var init_package = __esmMin((() => {
|
|
57986
58123
|
name = "nodemailer";
|
|
57987
|
-
version = "8.0.
|
|
58124
|
+
version = "8.0.7";
|
|
57988
58125
|
description = "Easy as cake e-mail sending from your Node.js applications";
|
|
57989
58126
|
main = "lib/nodemailer.js";
|
|
57990
58127
|
scripts = {
|
|
@@ -58007,20 +58144,19 @@ var init_package = __esmMin((() => {
|
|
|
58007
58144
|
bugs = { "url": "https://github.com/nodemailer/nodemailer/issues" };
|
|
58008
58145
|
homepage = "https://nodemailer.com/";
|
|
58009
58146
|
devDependencies = {
|
|
58010
|
-
"@aws-sdk/client-sesv2": "3.
|
|
58147
|
+
"@aws-sdk/client-sesv2": "3.1037.0",
|
|
58011
58148
|
"bunyan": "1.8.15",
|
|
58012
58149
|
"c8": "11.0.0",
|
|
58013
|
-
"eslint": "10.2.
|
|
58150
|
+
"eslint": "10.2.1",
|
|
58014
58151
|
"eslint-config-prettier": "10.1.8",
|
|
58015
|
-
"globals": "17.
|
|
58152
|
+
"globals": "17.5.0",
|
|
58016
58153
|
"libbase64": "1.3.0",
|
|
58017
|
-
"libmime": "5.3.
|
|
58154
|
+
"libmime": "5.3.8",
|
|
58018
58155
|
"libqp": "2.1.1",
|
|
58019
|
-
"
|
|
58020
|
-
"prettier": "3.8.1",
|
|
58156
|
+
"prettier": "3.8.3",
|
|
58021
58157
|
"proxy": "1.0.2",
|
|
58022
58158
|
"proxy-test-server": "1.0.0",
|
|
58023
|
-
"smtp-server": "3.18.
|
|
58159
|
+
"smtp-server": "3.18.4"
|
|
58024
58160
|
};
|
|
58025
58161
|
engines = { "node": ">=6.0.0" };
|
|
58026
58162
|
package_default = {
|
|
@@ -58284,7 +58420,7 @@ var require_fetch = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
58284
58420
|
var require_shared = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
58285
58421
|
var urllib$2 = __require("url");
|
|
58286
58422
|
var util$1 = __require("util");
|
|
58287
|
-
var fs$
|
|
58423
|
+
var fs$4 = __require("fs");
|
|
58288
58424
|
var nmfetch = require_fetch();
|
|
58289
58425
|
var dns$1 = __require("dns");
|
|
58290
58426
|
var net$4 = __require("net");
|
|
@@ -58620,7 +58756,7 @@ var require_shared = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
58620
58756
|
const parsedDataUri = module.exports.parseDataURI(content.path || content.href);
|
|
58621
58757
|
if (!parsedDataUri || !parsedDataUri.data) return callback(null, Buffer.from(0));
|
|
58622
58758
|
return callback(null, parsedDataUri.data);
|
|
58623
|
-
} else if (content.path) return resolveStream(fs$
|
|
58759
|
+
} else if (content.path) return resolveStream(fs$4.createReadStream(content.path), callback);
|
|
58624
58760
|
}
|
|
58625
58761
|
if (typeof data[key].content === "string" && ![
|
|
58626
58762
|
"utf8",
|
|
@@ -61568,11 +61704,11 @@ var require_base64 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
61568
61704
|
const chunkLength = lineLength * 1024;
|
|
61569
61705
|
const wrapRegex = new RegExp(".{" + lineLength + "}", "g");
|
|
61570
61706
|
while (pos < str.length) {
|
|
61571
|
-
const wrappedLines = str.substr(pos, chunkLength).replace(wrapRegex, "$&\r\n");
|
|
61707
|
+
const wrappedLines = str.substr(pos, chunkLength).replace(wrapRegex, "$&\r\n").trim();
|
|
61572
61708
|
result.push(wrappedLines);
|
|
61573
61709
|
pos += chunkLength;
|
|
61574
61710
|
}
|
|
61575
|
-
return result.join("");
|
|
61711
|
+
return result.join("\r\n").trim();
|
|
61576
61712
|
}
|
|
61577
61713
|
/**
|
|
61578
61714
|
* Creates a transform stream for encoding data to base64 encoding
|
|
@@ -61610,12 +61746,12 @@ var require_base64 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
61610
61746
|
if (lastLF < 0) {
|
|
61611
61747
|
this._curLine = b64;
|
|
61612
61748
|
b64 = "";
|
|
61613
|
-
} else
|
|
61749
|
+
} else if (lastLF === b64.length - 1) this._curLine = "";
|
|
61750
|
+
else {
|
|
61614
61751
|
this._curLine = b64.substring(lastLF + 1);
|
|
61615
61752
|
b64 = b64.substring(0, lastLF + 1);
|
|
61616
|
-
if (b64 && !b64.endsWith("\r\n")) b64 += "\r\n";
|
|
61617
61753
|
}
|
|
61618
|
-
}
|
|
61754
|
+
}
|
|
61619
61755
|
if (b64) {
|
|
61620
61756
|
this.outputBytes += b64.length;
|
|
61621
61757
|
this.push(Buffer.from(b64, "ascii"));
|
|
@@ -61625,6 +61761,7 @@ var require_base64 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
61625
61761
|
_flush(done) {
|
|
61626
61762
|
if (this._remainingBytes && this._remainingBytes.length) this._curLine += encode(this._remainingBytes);
|
|
61627
61763
|
if (this._curLine) {
|
|
61764
|
+
this._curLine = wrap(this._curLine, this.options.lineLength);
|
|
61628
61765
|
this.outputBytes += this._curLine.length;
|
|
61629
61766
|
this.push(Buffer.from(this._curLine, "ascii"));
|
|
61630
61767
|
this._curLine = "";
|
|
@@ -62559,7 +62696,7 @@ var require_le_unix = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
62559
62696
|
//#region node_modules/nodemailer/lib/mime-node/index.js
|
|
62560
62697
|
var require_mime_node = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
62561
62698
|
var crypto$8 = __require("crypto");
|
|
62562
|
-
var fs$
|
|
62699
|
+
var fs$3 = __require("fs");
|
|
62563
62700
|
var punycode = require_punycode();
|
|
62564
62701
|
var { PassThrough: PassThrough$2 } = __require("stream");
|
|
62565
62702
|
var shared = require_shared();
|
|
@@ -63268,7 +63405,7 @@ var require_mime_node = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
63268
63405
|
});
|
|
63269
63406
|
return contentStream;
|
|
63270
63407
|
}
|
|
63271
|
-
return fs$
|
|
63408
|
+
return fs$3.createReadStream(content.path);
|
|
63272
63409
|
}
|
|
63273
63410
|
if (content && typeof content.href === "string") {
|
|
63274
63411
|
if (this.disableUrlAccess) {
|
|
@@ -63417,9 +63554,10 @@ var require_mime_node = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
63417
63554
|
if (lastAt < 0) return address;
|
|
63418
63555
|
let user = address.substr(0, lastAt);
|
|
63419
63556
|
const domain = address.substr(lastAt + 1);
|
|
63420
|
-
let encodedDomain;
|
|
63557
|
+
let encodedDomain = domain;
|
|
63421
63558
|
try {
|
|
63422
|
-
encodedDomain = punycode.
|
|
63559
|
+
if (/[\x80-\uFFFF]/.test(user)) encodedDomain = punycode.toUnicode(domain.toLowerCase());
|
|
63560
|
+
else encodedDomain = punycode.toASCII(domain.toLowerCase());
|
|
63423
63561
|
} catch (_err) {}
|
|
63424
63562
|
if (user.indexOf(" ") >= 0) {
|
|
63425
63563
|
if (user.charAt(0) !== "\"") user = "\"" + user;
|
|
@@ -64106,7 +64244,7 @@ var require_dkim = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
64106
64244
|
var RelaxedBody = require_relaxed_body();
|
|
64107
64245
|
var sign = require_sign();
|
|
64108
64246
|
var { PassThrough: PassThrough$1 } = __require("stream");
|
|
64109
|
-
var fs$
|
|
64247
|
+
var fs$2 = __require("fs");
|
|
64110
64248
|
var path$2 = __require("path");
|
|
64111
64249
|
var crypto$5 = __require("crypto");
|
|
64112
64250
|
var DKIM_ALGO = "sha256";
|
|
@@ -64139,10 +64277,10 @@ var require_dkim = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
64139
64277
|
}
|
|
64140
64278
|
cleanup() {
|
|
64141
64279
|
if (!this.cache || !this.cachePath) return;
|
|
64142
|
-
fs$
|
|
64280
|
+
fs$2.unlink(this.cachePath, () => false);
|
|
64143
64281
|
}
|
|
64144
64282
|
createReadCache() {
|
|
64145
|
-
this.cache = fs$
|
|
64283
|
+
this.cache = fs$2.createReadStream(this.cachePath);
|
|
64146
64284
|
this.cache.once("error", (err) => {
|
|
64147
64285
|
this.cleanup();
|
|
64148
64286
|
this.output.emit("error", err);
|
|
@@ -64188,7 +64326,7 @@ var require_dkim = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
64188
64326
|
}
|
|
64189
64327
|
createWriteCache() {
|
|
64190
64328
|
this.output.usingCache = true;
|
|
64191
|
-
this.cache = fs$
|
|
64329
|
+
this.cache = fs$2.createWriteStream(this.cachePath);
|
|
64192
64330
|
this.cache.once("error", (err) => {
|
|
64193
64331
|
this.cleanup();
|
|
64194
64332
|
this.relaxedBody.unpipe(this.cache);
|
|
@@ -70227,7 +70365,7 @@ function UserMixin(Base) {
|
|
|
70227
70365
|
qid: bytes[27394]?.toString() ?? "",
|
|
70228
70366
|
level: numbers[105],
|
|
70229
70367
|
regTime: numbers[20026] ?? 0,
|
|
70230
|
-
longNick: bytes[102]
|
|
70368
|
+
longNick: bytes[102]?.toString() ?? "",
|
|
70231
70369
|
city: bytes[20020]?.toString() ?? "",
|
|
70232
70370
|
country: bytes[20003]?.toString() ?? "",
|
|
70233
70371
|
birthdayYear: bytes[20031]?.[0] << 8 | bytes[20031]?.[1],
|