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 fs, { access, copyFile, mkdir, readFile, stat, unlink, writeFile } from "node:fs/promises";
5
- import fs$1, { existsSync } from "fs";
6
- import * as fs$6 from "node:fs";
7
- import fs$2, { appendFile, appendFileSync, createReadStream, existsSync as existsSync$1, mkdirSync, promises, stat as stat$1, statSync, watch } from "node: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$11 = __require("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$11.createWriteStream(path);
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["Normal"] = 1] = "Normal";
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$10 = __require("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$10.stat(path, function(er, stat) {
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$10.statSync(path), path, options);
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$9 = __require("fs");
6657
+ var fs$8 = __require("fs");
6656
6658
  function isexe(path, options, cb) {
6657
- fs$9.stat(path, function(er, stat) {
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$9.statSync(path), options);
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$8 = __require("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$8.exists(process.env.FFMPEG_PATH, function(exists) {
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$8.exists(process.env.FFPROBE_PATH, function(exists) {
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$8.exists(ffprobe, function(exists) {
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$8.exists(process.env.FLVMETA_PATH, function(exists) {
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$8.exists(process.env.FLVTOOL2_PATH, function(exists) {
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$7 = __require("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$7.exists(config.folder, function(exists) {
10023
- if (!exists) fs$7.mkdir(config.folder, function(err) {
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$2.existsSync(p)) {
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
- const operator = await ctx.ntGroupApi.getGroupMember(msg.peerUid, revokeElement.operatorUid);
11239
- let uin = msg.senderUin;
11240
- if (uin === "0" || !uin) uin = await ctx.ntUserApi.getUinByUid(revokeElement.origMsgSenderUid);
11241
- return new OB11GroupRecallNoticeEvent(Number(msg.peerUid), Number(uin), Number(operator.uin || msg.senderUin), shortId);
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.3";
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 事件上报", socket.url ?? "", eventName);
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 事件上报", socket.url ?? "", data.post_type);
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$6.promises.open(path$4.resolve(filePath), "r");
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$2.existsSync(uri)) return { type: FileUriType.Path };
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$2.existsSync(filePath)) return {
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 fs.writeFile(filePath, res.data);
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 fs.rename(filePath, newPath);
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 fs.writeFile(filePath, base64, "base64");
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 fs.rename(filePath, `${filePath}.${ext}`);
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 fs.writeFile(filePath, base64, "base64");
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 fs.rename(filePath, `${filePath}.${ext}`);
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$2.createReadStream(filePath);
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$2.createReadStream(filePath);
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$2.createReadStream(filePath);
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$2.createReadStream(filePath);
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$2.createReadStream(filePath);
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 fs.open(filePath, "r");
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$2.createReadStream(filePath);
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$2.statSync(filePath).size;
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 fs.readFile(filePath);
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 fs.writeFile(pttPath, result.data);
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 fs.readFile(inputFilePath), 24e3);
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 fs.writeFile(pcmFilePath, data);
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$1 = globalThis.CloseEvent ?? class extends Event {
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$1 = () => Symbol("connection");
21220
- var CONNECTION_SYMBOL_KEY$1 = Symbol("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$1]) {
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$1();
21293
- env[CONNECTION_SYMBOL_KEY$1] = connectionSymbol;
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$1("close", {
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.zigzagDecode32(reader.readFixed32()));
22285
- } else draft[key].push(Converter.zigzagDecode32(reader.readFixed32()));
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.zigzagDecode32(reader.readFixed32());
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.zigzagDecode64(reader.readFixed64()));
22293
- } else draft[key].push(Converter.zigzagDecode64(reader.readFixed64()));
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.zigzagDecode64(reader.readFixed64());
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.zigzagEncode32(value));
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.zigzagEncode32(value));
22487
+ writer.writeFixed32(Converter.toUnsigned32(value));
22479
22488
  }
22480
22489
  }) : defineSerializer((data, writer) => {
22481
22490
  writer.writeVarint(spec[kTag]);
22482
- writer.writeFixed32(Converter.zigzagEncode32(data));
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.zigzagEncode64(value));
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.zigzagEncode64(value));
22501
+ writer.writeFixed64(Converter.toUnsigned64(value));
22493
22502
  }
22494
22503
  }) : defineSerializer((data, writer) => {
22495
22504
  writer.writeVarint(spec[kTag]);
22496
- writer.writeFixed64(Converter.zigzagEncode64(data));
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 = this.compiledMessages.get(model);
22922
+ let message = ProtoMessage.compiledMessages.get(model);
22914
22923
  if (message === void 0) {
22915
22924
  message = new ProtoMessage(model);
22916
- this.compiledMessages.set(model, message);
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$1.existsSync(filePath)) {
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.ntGroupApi.publishGroupBulletin(groupCode, {
25393
- text: encodeURIComponent(payload.content),
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 operatorUid = input.elements[0].grayTipElement.revokeElement.operatorUid;
29177
- const user = await bot.ctx.ntUserApi.getUserSimpleInfo(operatorUid);
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(decodeUser(user.coreInfo), ["is_bot"])
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 fs.readFile(fileURLToPath(uri));
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/fast-xml-parser/node_modules/path-expression-matcher/src/Expression.js
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/fast-xml-parser/node_modules/path-expression-matcher/src/ExpressionSet.js
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/fast-xml-parser/node_modules/path-expression-matcher/src/Matcher.js
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) return {
47557
- data: String.fromCharCode(...chars),
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
- chars.push(code);
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(await ctx.ntUserApi.getUinByUid(revokeElement.operatorUid)),
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(await ctx.ntUserApi.getUinByUid(revokeElement.operatorUid)),
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
- const nick = (await this.ctx.pmhq.invoke("nodeIKernelBuddyService/getBuddyNick", [[uid]])).get(uid);
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) selfInfo.nick = await this.getBuddyNick(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 fs.readFile(filePath);
54299
+ const fileBuffer = await fsPromise.readFile(filePath);
54367
54300
  const fileSize = fileBuffer.length;
54368
- const checksum = await getMd5HexFromFile(filePath);
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 getSessionPostData = { "control_req": [{
54372
- "uin": selfInfo.uin,
54373
- "token": {
54374
- "type": 4,
54375
- "data": cookiesObject.p_skey,
54376
- "appid": 5
54377
- },
54378
- "appid": "qun",
54379
- "checksum": checksum,
54380
- "check_type": 0,
54381
- "file_len": fileSize,
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
- "stExtendInfo": { "mapParams": {
54409
- "photo_num": fileLen,
54410
- "video_num": "0",
54411
- "batch_num": fileLen
54412
- } },
54413
- "mutliPicInfo": {
54414
- "iBatUploadNum": fileLen,
54415
- "iCurUpload": i,
54416
- "iSuccNum": 0,
54417
- "iFailNum": 0
54418
- }
54419
- },
54420
- "session": "",
54421
- "asy_upload": 0,
54422
- "cmd": "FileUpload"
54423
- }] };
54424
- const resJson = await (await HttpUtil.post(getSessionUrl, getSessionPostData, this.cookieToString(cookiesObject))).json();
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
- const slices = [];
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 uploadUrl = `https://${domain}/webapp/json/sliceUpload/FileUpload?seq=${slice.seq}&retry=0&offset=${slice.offset}&end=${slice.end}&total=${fileSize}&type=form&g_tk=${gtk}`;
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", "FileUpload");
54462
- formData.append("slice_size", sliceSize.toString());
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$2.watchFile(this.configPath, {
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$2.readFileSync(this.defaultConfigPath, "utf-8");
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$2.existsSync(this.configPath)) {
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$2.readFileSync(this.configPath, "utf-8");
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$2.writeFileSync(this.configPath, JSON.stringify(config, null, 2), "utf-8");
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$2.existsSync(this.tokenPath)) this.token = fs$2.readFileSync(this.tokenPath, "utf-8").trim();
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$2.writeFileSync(this.tokenPath, token, "utf-8");
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.5";
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.1025.0",
58147
+ "@aws-sdk/client-sesv2": "3.1037.0",
58011
58148
  "bunyan": "1.8.15",
58012
58149
  "c8": "11.0.0",
58013
- "eslint": "10.2.0",
58150
+ "eslint": "10.2.1",
58014
58151
  "eslint-config-prettier": "10.1.8",
58015
- "globals": "17.4.0",
58152
+ "globals": "17.5.0",
58016
58153
  "libbase64": "1.3.0",
58017
- "libmime": "5.3.7",
58154
+ "libmime": "5.3.8",
58018
58155
  "libqp": "2.1.1",
58019
- "nodemailer-ntlm-auth": "1.0.4",
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.3"
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$5 = __require("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$5.createReadStream(content.path), callback);
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
- } else this._curLine = "";
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$4 = __require("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$4.createReadStream(content.path);
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.toASCII(domain.toLowerCase());
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$3 = __require("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$3.unlink(this.cachePath, () => false);
64280
+ fs$2.unlink(this.cachePath, () => false);
64143
64281
  }
64144
64282
  createReadCache() {
64145
- this.cache = fs$3.createReadStream(this.cachePath);
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$3.createWriteStream(this.cachePath);
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].toString(),
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],