diff --git a/.editorconfig b/.editorconfig index c90a6350..52bb929d 100644 --- a/.editorconfig +++ b/.editorconfig @@ -15,10 +15,10 @@ charset = utf-8 # 4 space indentation [*.{cjs,mjs,js,jsx,ts,tsx,css,scss,sass,html,json}] indent_style = space -indent_size = 4 +indent_size = 2 [*.bat] charset = latin1 # Unfortunately, EditorConfig doesn't support space configuration inside import braces directly. -# You'll need to rely on your linter/formatter like ESLint or Prettier for that. \ No newline at end of file +# You'll need to rely on your linter/formatter like ESLint or Prettier for that. diff --git a/.prettierrc.json b/.prettierrc.json deleted file mode 100644 index 8c30a652..00000000 --- a/.prettierrc.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "trailingComma": "es5", - "tabWidth": 4, - "semi": true, - "singleQuote": true, - "bracketSpacing": true, - "arrowParens": "always", - "printWidth": 120, - "endOfLine": "auto" -} diff --git a/.vscode/settings.json b/.vscode/settings.json index de49d5e8..3860d57f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,15 +3,35 @@ "explorer.fileNesting.expand": false, "explorer.fileNesting.patterns": { ".env.universal": ".env.*", - "tsconfig.json": "tsconfig.*.json, env.d.ts, vite.config.ts", + "vite.config.ts": "vite*.ts", + "README.md": "CODE_OF_CONDUCT.md, RELEASES.md, CONTRIBUTING.md, CHANGELOG.md, SECURITY.md", + "tsconfig.json": "tsconfig.*.json, env.d.ts", "package.json": "package-lock.json, eslint*, .prettier*, .editorconfig, manifest.json, logo.png, .gitignore, LICENSE" }, "css.customData": [ ".vscode/tailwindcss.json" ], - "editor.formatOnPaste": false, - "editor.formatOnSave": false, + "editor.detectIndentation": false, + "editor.tabSize": 2, + "editor.formatOnSave": true, + "editor.formatOnType": false, + "editor.formatOnPaste": true, + "editor.formatOnSaveMode": "file", "editor.codeActionsOnSave": { - "source.fixAll.eslint": "never" + "source.fixAll.eslint": "always" }, -} + "files.autoSave": "onFocusChange", + "javascript.preferences.quoteStyle": "single", + "typescript.preferences.quoteStyle": "single", + "javascript.format.semicolons": "insert", + "typescript.format.semicolons": "insert", + "javascript.format.insertSpaceBeforeFunctionParenthesis": true, + "typescript.format.insertSpaceBeforeFunctionParenthesis": true, + "typescript.format.insertSpaceAfterConstructor": true, + "javascript.format.insertSpaceAfterConstructor": true, + "typescript.preferences.importModuleSpecifier": "non-relative", + "typescript.preferences.importModuleSpecifierEnding": "minimal", + "javascript.preferences.importModuleSpecifier": "non-relative", + "javascript.preferences.importModuleSpecifierEnding": "minimal", + "typescript.disableAutomaticTypeAcquisition": true, +} \ No newline at end of file diff --git a/eslint.config.mjs b/eslint.config.mjs index ae25a7a3..e930b6ef 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,32 +1,43 @@ -import eslint from '@eslint/js'; -import tsEslintPlugin from '@typescript-eslint/eslint-plugin'; -import tsEslintParser from '@typescript-eslint/parser'; -import globals from "globals"; +import neostandard from 'neostandard'; -const customTsFlatConfig = [ - { - name: 'typescript-eslint/base', - languageOptions: { - parser: tsEslintParser, - sourceType: 'module', - globals: { - ...globals.browser, - ...globals.node, - NodeJS: 'readonly', // 添加 NodeJS 全局变量 - }, - }, - files: ['**/*.{ts,tsx}'], - rules: { - ...tsEslintPlugin.configs.recommended.rules, - 'quotes': ['error', 'single'], // 使用单引号 - 'semi': ['error', 'always'], // 强制使用分号 - 'indent': ['error', 4], // 使用 4 空格缩进 - }, - plugins: { - '@typescript-eslint': tsEslintPlugin, - }, - ignores: ['src/webui/**'], // 忽略 src/webui/ 目录所有文件 - }, +/** 尾随逗号 */ +const commaDangle = val => { + if (val?.rules?.['@stylistic/comma-dangle']?.[0] === 'warn') { + const rule = val?.rules?.['@stylistic/comma-dangle']?.[1]; + Object.keys(rule).forEach(key => { + rule[key] = 'always-multiline'; + }); + val.rules['@stylistic/comma-dangle'][1] = rule; + } + + /** 三元表达式 */ + if (val?.rules?.['@stylistic/indent']) { + val.rules['@stylistic/indent'][2] = { + ...val.rules?.['@stylistic/indent']?.[2], + flatTernaryExpressions: true, + offsetTernaryExpressions: false, + }; + } + + /** 支持下划线 - 禁用 camelcase 规则 */ + if (val?.rules?.camelcase) { + val.rules.camelcase = 'off'; + } + + return val; +}; + +/** 忽略的文件 */ +const ignores = [ + 'node_modules', + '**/dist/**', + 'launcher', ]; -export default [eslint.configs.recommended, ...customTsFlatConfig]; \ No newline at end of file +const options = neostandard({ + ts: true, + ignores, + semi: true, // 强制使用分号 +}).map(commaDangle); + +export default options; diff --git a/napcat.webui/.prettierignore b/napcat.webui/.prettierignore deleted file mode 100644 index d44692da..00000000 --- a/napcat.webui/.prettierignore +++ /dev/null @@ -1,7 +0,0 @@ -dist -*.md -*.html -yarn.lock -package-lock.json -node_modules -pnpm-lock.yaml \ No newline at end of file diff --git a/napcat.webui/.prettierrc b/napcat.webui/.prettierrc deleted file mode 100644 index f890346c..00000000 --- a/napcat.webui/.prettierrc +++ /dev/null @@ -1,23 +0,0 @@ -{ - "printWidth": 80, - "tabWidth": 2, - "useTabs": false, - "singleQuote": true, - "semi": false, - "trailingComma": "none", - "bracketSpacing": true, - "importOrder": [ - "", - "^@/const/(.*)$", - "^@/store/(.*)$", - "^@/components/(.*)$", - "^@/contexts/(.*)$", - "^@/hooks/(.*)$", - "^@/utils/(.*)$", - "^@/(.*)$", - "^[./]" - ], - "importOrderSeparation": true, - "importOrderSortSpecifiers": true, - "plugins": ["@trivago/prettier-plugin-sort-imports"] -} diff --git a/napcat.webui/eslint.config.mjs b/napcat.webui/eslint.config.mjs deleted file mode 100644 index 0d405ad7..00000000 --- a/napcat.webui/eslint.config.mjs +++ /dev/null @@ -1,91 +0,0 @@ -import eslint_js from '@eslint/js' -import tsEslintPlugin from '@typescript-eslint/eslint-plugin' -import tsEslintParser from '@typescript-eslint/parser' -import eslintConfigPrettier from 'eslint-config-prettier' -import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended' -import reactPlugin from 'eslint-plugin-react' -import reactHooksPlugin from 'eslint-plugin-react-hooks' -import globals from 'globals' - -const customTsFlatConfig = [ - { - name: 'typescript-eslint/base', - languageOptions: { - parser: tsEslintParser, - sourceType: 'module' - }, - files: ['**/*.{js,jsx,mjs,cjs,ts,tsx}'], - rules: { - ...tsEslintPlugin.configs.recommended.rules - }, - plugins: { - '@typescript-eslint': tsEslintPlugin - } - } -] - -export default [ - eslint_js.configs.recommended, - - eslintPluginPrettierRecommended, - - ...customTsFlatConfig, - { - name: 'global config', - languageOptions: { - globals: { - ...globals.es2022, - ...globals.browser, - ...globals.node - }, - parserOptions: { - warnOnUnsupportedTypeScriptVersion: false - } - }, - rules: { - 'prettier/prettier': 'error', - 'no-unused-vars': 'off', - 'no-undef': 'off', - //关闭不能再promise中使用ansyc - 'no-async-promise-executor': 'off', - //关闭不能再常量中使用?? - 'no-constant-binary-expression': 'off', - '@typescript-eslint/ban-types': 'off', - '@typescript-eslint/no-unused-vars': 'off', - - //禁止失去精度的字面数字 - '@typescript-eslint/no-loss-of-precision': 'off', - //禁止使用any - '@typescript-eslint/no-explicit-any': 'error' - } - }, - { - ignores: ['**/node_modules', '**/dist', '**/output'] - }, - { - name: 'react-eslint', - files: ['src/*.{js,jsx,mjs,cjs,ts,tsx}'], - plugins: { - react: reactPlugin, - 'react-hooks': reactHooksPlugin - }, - languageOptions: { - ...reactPlugin.configs.recommended.languageOptions - }, - rules: { - ...reactPlugin.configs.recommended.rules, - - 'react/react-in-jsx-scope': 'off' - }, - settings: { - react: { - // 需要显示安装 react - version: 'detect' - } - } - }, - { - languageOptions: { globals: { ...globals.browser, ...globals.node } } - }, - eslintConfigPrettier -] diff --git a/napcat.webui/package.json b/napcat.webui/package.json index abe025ed..48ec4ab0 100644 --- a/napcat.webui/package.json +++ b/napcat.webui/package.json @@ -86,7 +86,6 @@ "zod": "^3.24.1" }, "devDependencies": { - "@eslint/js": "^9.19.0", "@react-types/shared": "^3.26.0", "@trivago/prettier-plugin-sort-imports": "^5.2.2", "@types/crypto-js": "^4.2.2", @@ -97,20 +96,14 @@ "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", "@types/react-window": "^1.8.8", - "@typescript-eslint/eslint-plugin": "^8.22.0", - "@typescript-eslint/parser": "^8.22.0", "@vitejs/plugin-react": "^4.3.4", "autoprefixer": "^10.4.20", "eslint": "^9.19.0", - "eslint-config-prettier": "^10.0.1", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "5.2.3", - "eslint-plugin-react": "^7.37.2", - "eslint-plugin-react-hooks": "^5.1.0", "eslint-plugin-unused-imports": "^4.1.4", - "globals": "^15.14.0", "postcss": "^8.5.1", "prettier": "^3.4.2", "typescript": "^5.7.3", diff --git a/napcat.webui/src/hooks/use-preload-images.ts b/napcat.webui/src/hooks/use-preload-images.ts index 8df3dc97..45849b8d 100644 --- a/napcat.webui/src/hooks/use-preload-images.ts +++ b/napcat.webui/src/hooks/use-preload-images.ts @@ -1,69 +1,69 @@ -import { useEffect, useRef, useState } from 'react' +import { useEffect, useRef, useState } from 'react'; // 全局图片缓存 -const imageCache = new Map() +const imageCache = new Map(); -export function usePreloadImages(urls: string[]) { - const [loadedUrls, setLoadedUrls] = useState>({}) - const [isLoading, setIsLoading] = useState(true) - const isMounted = useRef(true) +export function usePreloadImages (urls: string[]) { + const [loadedUrls, setLoadedUrls] = useState>({}); + const [isLoading, setIsLoading] = useState(true); + const isMounted = useRef(true); useEffect(() => { - isMounted.current = true + isMounted.current = true; // 检查是否所有图片都已缓存 - const allCached = urls.every((url) => imageCache.has(url)) + const allCached = urls.every((url) => imageCache.has(url)); if (allCached) { - setLoadedUrls(urls.reduce((acc, url) => ({ ...acc, [url]: true }), {})) - setIsLoading(false) - return + setLoadedUrls(urls.reduce((acc, url) => ({ ...acc, [url]: true }), {})); + setIsLoading(false); + return; } - setIsLoading(true) - const loadedImages: Record = {} - let pendingCount = urls.length + setIsLoading(true); + const loadedImages: Record = {}; + let pendingCount = urls.length; urls.forEach((url) => { // 如果已经缓存,直接标记为已加载 if (imageCache.has(url)) { - loadedImages[url] = true - pendingCount-- + loadedImages[url] = true; + pendingCount--; if (pendingCount === 0) { - setLoadedUrls(loadedImages) - setIsLoading(false) + setLoadedUrls(loadedImages); + setIsLoading(false); } - return + return; } - const img = new Image() + const img = new Image(); img.onload = () => { - if (!isMounted.current) return - loadedImages[url] = true - imageCache.set(url, img) - pendingCount-- + if (!isMounted.current) return; + loadedImages[url] = true; + imageCache.set(url, img); + pendingCount--; if (pendingCount === 0) { - setLoadedUrls(loadedImages) - setIsLoading(false) + setLoadedUrls(loadedImages); + setIsLoading(false); } - } + }; img.onerror = () => { - if (!isMounted.current) return - loadedImages[url] = false - pendingCount-- + if (!isMounted.current) return; + loadedImages[url] = false; + pendingCount--; if (pendingCount === 0) { - setLoadedUrls(loadedImages) - setIsLoading(false) + setLoadedUrls(loadedImages); + setIsLoading(false); } - } - img.src = url - }) + }; + img.src = url; + }); return () => { - isMounted.current = false - } - }, [urls]) + isMounted.current = false; + }; + }, [urls]); - return { loadedUrls, isLoading } + return { loadedUrls, isLoading }; } diff --git a/napcat.webui/src/hooks/use_show_strcuted_message.tsx b/napcat.webui/src/hooks/use_show_strcuted_message.tsx index affc55cd..21add073 100644 --- a/napcat.webui/src/hooks/use_show_strcuted_message.tsx +++ b/napcat.webui/src/hooks/use_show_strcuted_message.tsx @@ -1,25 +1,25 @@ -import { createElement } from 'react' +import { createElement } from 'react'; -import ShowStructedMessage from '@/components/chat_input/components/show_structed_message' +import ShowStructedMessage from '@/components/chat_input/components/show_structed_message'; -import { OB11Segment } from '@/types/onebot' +import { OB11Segment } from '@/types/onebot'; -import useDialog from './use-dialog' +import useDialog from './use-dialog'; const useShowStructuredMessage = () => { - const dialog = useDialog() + const dialog = useDialog(); const showStructuredMessage = (messages: OB11Segment[]) => { dialog.alert({ title: '消息内容', size: '3xl', content: createElement(ShowStructedMessage, { - messages: messages - }) - }) - } + messages, + }), + }); + }; - return showStructuredMessage -} + return showStructuredMessage; +}; -export default useShowStructuredMessage +export default useShowStructuredMessage; diff --git a/package-lock.json b/package-lock.json index 39c76197..983a8d0c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "napcat", - "version": "4.8.98", + "version": "4.9.21", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "napcat", - "version": "4.8.98", + "version": "4.9.21", "dependencies": { "express": "^5.0.0", "silk-wasm": "^3.6.1", @@ -19,9 +19,6 @@ "@babel/preset-typescript": "^7.24.7", "@babel/traverse": "^7.28.0", "@babel/types": "^7.28.2", - "@eslint/compat": "^1.3.1", - "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "^9.33.0", "@homebridge/node-pty-prebuilt-multiarch": "^0.12.0-beta.5", "@log4js-node/log4js-api": "^1.0.2", "@napneko/nap-proto-core": "^0.0.4", @@ -37,8 +34,6 @@ "@types/react-color": "^3.0.13", "@types/type-is": "^1.6.7", "@types/ws": "^8.5.12", - "@typescript-eslint/eslint-plugin": "^8.3.0", - "@typescript-eslint/parser": "^8.39.0", "ajv": "^8.13.0", "async-mutex": "^0.5.0", "commander": "^13.0.0", @@ -46,15 +41,13 @@ "cors": "^2.8.5", "esbuild": "0.25.8", "eslint": "^9.14.0", - "eslint-import-resolver-typescript": "^4.4.4", - "eslint-plugin-import": "^2.32.0", "express-rate-limit": "^7.5.0", "fast-xml-parser": "^4.3.6", "file-type": "^21.0.0", - "globals": "^16.0.0", "json5": "^2.2.3", "multer": "^2.0.1", "napcat.protobuf": "^1.1.4", + "neostandard": "^0.12.2", "typescript": "^5.3.3", "typescript-eslint": "^8.35.1", "vite": "^7.1.1", @@ -544,21 +537,21 @@ } }, "node_modules/@emnapi/core": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.3.tgz", - "integrity": "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.6.0.tgz", + "integrity": "sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.0.2", + "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", - "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.6.0.tgz", + "integrity": "sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==", "dev": true, "license": "MIT", "optional": true, @@ -567,9 +560,9 @@ } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.2.tgz", - "integrity": "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", "dev": true, "license": "MIT", "optional": true, @@ -1048,23 +1041,6 @@ "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@eslint/compat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.3.1.tgz", - "integrity": "sha512-k8MHony59I5EPic6EQTCNOuPoVBnoYXkP+20xvwFjN7t0qI3ImyvyBgg+hIVPwC8JaxVjjUZld+cLfBLFDLucg==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": "^8.40 || 9" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, "node_modules/@eslint/config-array": { "version": "0.20.1", "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.1.tgz", @@ -1164,19 +1140,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@eslint/js": { - "version": "9.33.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.33.0.tgz", - "integrity": "sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, "node_modules/@eslint/object-schema": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", @@ -1264,6 +1227,17 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "dev": true, + "license": "Apache-2.0", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -1292,6 +1266,29 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.12", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", @@ -1339,16 +1336,16 @@ "license": "Apache-2.0" }, "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.11.tgz", - "integrity": "sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==", + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", "dev": true, "license": "MIT", "optional": true, "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", - "@tybys/wasm-util": "^0.9.0" + "@tybys/wasm-util": "^0.10.0" } }, "node_modules/@napneko/nap-proto-core": { @@ -1395,6 +1392,16 @@ "node": ">= 8" } }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, "node_modules/@protobuf-ts/runtime": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/@protobuf-ts/runtime/-/runtime-2.11.0.tgz", @@ -1761,7 +1768,9 @@ "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@sinclair/typebox": { "version": "0.34.38", @@ -1770,6 +1779,39 @@ "dev": true, "license": "MIT" }, + "node_modules/@stylistic/eslint-plugin": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.11.0.tgz", + "integrity": "sha512-PNRHbydNG5EH8NK4c+izdJlxajIR6GxcUhzsYNRsn6Myep4dsZt0qFCz3rCPnkvgO5FYibDcMqgNHUT+zvjYZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^8.13.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/@stylistic/eslint-plugin/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@tokenizer/inflate": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.2.7.tgz", @@ -1797,9 +1839,9 @@ "license": "MIT" }, "node_modules/@tybys/wasm-util": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", - "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", "dev": true, "license": "MIT", "optional": true, @@ -1910,7 +1952,9 @@ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@types/jsonfile": { "version": "6.1.4", @@ -2123,6 +2167,7 @@ "integrity": "sha512-g3WpVQHngx0aLXn6kfIYCZxM6rRJlWzEkVpqEFLT3SgEDsp9cpCbxxgwnE504q4H+ruSDh/VGS6nqZIDynP+vg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.39.0", "@typescript-eslint/types": "8.39.0", @@ -2148,6 +2193,7 @@ "integrity": "sha512-CTzJqaSq30V/Z2Og9jogzZt8lJRR5TKlAdXmWgdu4hgcC9Kww5flQ+xFvMxIBWVNdxJO7OifgdOK4PokMIWPew==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.39.0", "@typescript-eslint/types": "^8.39.0", @@ -2170,6 +2216,7 @@ "integrity": "sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/types": "8.39.0", "@typescript-eslint/visitor-keys": "8.39.0" @@ -2188,6 +2235,7 @@ "integrity": "sha512-Fd3/QjmFV2sKmvv3Mrj8r6N8CryYiCS8Wdb/6/rgOXAWGcFuc+VkQuG28uk/4kVNVZBQuuDHEDUpo/pQ32zsIQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -2205,6 +2253,7 @@ "integrity": "sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -2219,6 +2268,7 @@ "integrity": "sha512-ndWdiflRMvfIgQRpckQQLiB5qAKQ7w++V4LlCHwp62eym1HLB/kw7D9f2e8ytONls/jt89TEasgvb+VwnRprsw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/project-service": "8.39.0", "@typescript-eslint/tsconfig-utils": "8.39.0", @@ -2248,6 +2298,7 @@ "integrity": "sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/types": "8.39.0", "eslint-visitor-keys": "^4.2.1" @@ -2266,6 +2317,7 @@ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -2276,6 +2328,7 @@ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -2289,6 +2342,7 @@ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -2305,6 +2359,7 @@ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, "license": "ISC", + "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -2519,9 +2574,9 @@ } }, "node_modules/@unrs/resolver-binding-android-arm-eabi": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.9.0.tgz", - "integrity": "sha512-h1T2c2Di49ekF2TE8ZCoJkb+jwETKUIPDJ/nO3tJBKlLFPu+fyd93f0rGP/BvArKx2k2HlRM4kqkNarj3dvZlg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", "cpu": [ "arm" ], @@ -2533,9 +2588,9 @@ ] }, "node_modules/@unrs/resolver-binding-android-arm64": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.9.0.tgz", - "integrity": "sha512-sG1NHtgXtX8owEkJ11yn34vt0Xqzi3k9TJ8zppDmyG8GZV4kVWw44FHwKwHeEFl07uKPeC4ZoyuQaGh5ruJYPA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", "cpu": [ "arm64" ], @@ -2547,9 +2602,9 @@ ] }, "node_modules/@unrs/resolver-binding-darwin-arm64": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.9.0.tgz", - "integrity": "sha512-nJ9z47kfFnCxN1z/oYZS7HSNsFh43y2asePzTEZpEvK7kGyuShSl3RRXnm/1QaqFL+iP+BjMwuB+DYUymOkA5A==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", "cpu": [ "arm64" ], @@ -2561,9 +2616,9 @@ ] }, "node_modules/@unrs/resolver-binding-darwin-x64": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.9.0.tgz", - "integrity": "sha512-TK+UA1TTa0qS53rjWn7cVlEKVGz2B6JYe0C++TdQjvWYIyx83ruwh0wd4LRxYBM5HeuAzXcylA9BH2trARXJTw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", "cpu": [ "x64" ], @@ -2575,9 +2630,9 @@ ] }, "node_modules/@unrs/resolver-binding-freebsd-x64": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.9.0.tgz", - "integrity": "sha512-6uZwzMRFcD7CcCd0vz3Hp+9qIL2jseE/bx3ZjaLwn8t714nYGwiE84WpaMCYjU+IQET8Vu/+BNAGtYD7BG/0yA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", "cpu": [ "x64" ], @@ -2589,9 +2644,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.9.0.tgz", - "integrity": "sha512-bPUBksQfrgcfv2+mm+AZinaKq8LCFvt5PThYqRotqSuuZK1TVKkhbVMS/jvSRfYl7jr3AoZLYbDkItxgqMKRkg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", "cpu": [ "arm" ], @@ -2603,9 +2658,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.9.0.tgz", - "integrity": "sha512-uT6E7UBIrTdCsFQ+y0tQd3g5oudmrS/hds5pbU3h4s2t/1vsGWbbSKhBSCD9mcqaqkBwoqlECpUrRJCmldl8PA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", "cpu": [ "arm" ], @@ -2617,9 +2672,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.9.0.tgz", - "integrity": "sha512-vdqBh911wc5awE2bX2zx3eflbyv8U9xbE/jVKAm425eRoOVv/VseGZsqi3A3SykckSpF4wSROkbQPvbQFn8EsA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", "cpu": [ "arm64" ], @@ -2631,9 +2686,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm64-musl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.9.0.tgz", - "integrity": "sha512-/8JFZ/SnuDr1lLEVsxsuVwrsGquTvT51RZGvyDB/dOK3oYK2UqeXzgeyq6Otp8FZXQcEYqJwxb9v+gtdXn03eQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", "cpu": [ "arm64" ], @@ -2645,9 +2700,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.9.0.tgz", - "integrity": "sha512-FkJjybtrl+rajTw4loI3L6YqSOpeZfDls4SstL/5lsP2bka9TiHUjgMBjygeZEis1oC8LfJTS8FSgpKPaQx2tQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", "cpu": [ "ppc64" ], @@ -2659,9 +2714,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.9.0.tgz", - "integrity": "sha512-w/NZfHNeDusbqSZ8r/hp8iL4S39h4+vQMc9/vvzuIKMWKppyUGKm3IST0Qv0aOZ1rzIbl9SrDeIqK86ZpUK37w==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", "cpu": [ "riscv64" ], @@ -2673,9 +2728,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.9.0.tgz", - "integrity": "sha512-bEPBosut8/8KQbUixPry8zg/fOzVOWyvwzOfz0C0Rw6dp+wIBseyiHKjkcSyZKv/98edrbMknBaMNJfA/UEdqw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", "cpu": [ "riscv64" ], @@ -2687,9 +2742,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.9.0.tgz", - "integrity": "sha512-LDtMT7moE3gK753gG4pc31AAqGUC86j3AplaFusc717EUGF9ZFJ356sdQzzZzkBk1XzMdxFyZ4f/i35NKM/lFA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", "cpu": [ "s390x" ], @@ -2701,9 +2756,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-x64-gnu": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.9.0.tgz", - "integrity": "sha512-WmFd5KINHIXj8o1mPaT8QRjA9HgSXhN1gl9Da4IZihARihEnOylu4co7i/yeaIpcfsI6sYs33cNZKyHYDh0lrA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", "cpu": [ "x64" ], @@ -2715,9 +2770,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-x64-musl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.9.0.tgz", - "integrity": "sha512-CYuXbANW+WgzVRIl8/QvZmDaZxrqvOldOwlbUjIM4pQ46FJ0W5cinJ/Ghwa/Ng1ZPMJMk1VFdsD/XwmCGIXBWg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", "cpu": [ "x64" ], @@ -2729,9 +2784,9 @@ ] }, "node_modules/@unrs/resolver-binding-wasm32-wasi": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.9.0.tgz", - "integrity": "sha512-6Rp2WH0OoitMYR57Z6VE8Y6corX8C6QEMWLgOV6qXiJIeZ1F9WGXY/yQ8yDC4iTraotyLOeJ2Asea0urWj2fKQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", "cpu": [ "wasm32" ], @@ -2746,9 +2801,9 @@ } }, "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.9.0.tgz", - "integrity": "sha512-rknkrTRuvujprrbPmGeHi8wYWxmNVlBoNW8+4XF2hXUnASOjmuC9FNF1tGbDiRQWn264q9U/oGtixyO3BT8adQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", "cpu": [ "arm64" ], @@ -2760,9 +2815,9 @@ ] }, "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.9.0.tgz", - "integrity": "sha512-Ceymm+iBl+bgAICtgiHyMLz6hjxmLJKqBim8tDzpX61wpZOx2bPK6Gjuor7I2RiUynVjvvkoRIkrPyMwzBzF3A==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", "cpu": [ "ia32" ], @@ -2774,9 +2829,9 @@ ] }, "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.9.0.tgz", - "integrity": "sha512-k59o9ZyeyS0hAlcaKFezYSH2agQeRFEB7KoQLXl3Nb3rgkqT1NY9Vwy+SqODiLmYnEjxWJVRE/yq2jFVqdIxZw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", "cpu": [ "x64" ], @@ -2910,12 +2965,35 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.findlastindex": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", @@ -2970,6 +3048,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", @@ -3509,6 +3604,16 @@ "node": ">=18" } }, + "node_modules/comment-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/compressing": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/compressing/-/compressing-1.10.3.tgz", @@ -3885,6 +3990,20 @@ "once": "^1.4.0" } }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/es-abstract": { "version": "1.24.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", @@ -3972,6 +4091,34 @@ "node": ">= 0.4" } }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-object-atoms": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", @@ -4163,15 +4310,44 @@ } } }, + "node_modules/eslint-compat-utils": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", + "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-compat-utils/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-import-context": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.8.tgz", - "integrity": "sha512-bq+F7nyc65sKpZGT09dY0S0QrOnQtuDVIfyTGQ8uuvtMIF7oHp6CEP3mouN0rrnYF3Jqo6Ke0BfU/5wASZue1w==", + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.9.tgz", + "integrity": "sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==", "dev": true, "license": "MIT", "dependencies": { "get-tsconfig": "^4.10.1", - "stable-hash-x": "^0.1.1" + "stable-hash-x": "^0.2.0" }, "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" @@ -4194,6 +4370,8 @@ "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", @@ -4206,61 +4384,20 @@ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ms": "^2.1.1" } }, - "node_modules/eslint-import-resolver-typescript": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.4.4.tgz", - "integrity": "sha512-1iM2zeBvrYmUNTj2vSC/90JTHDth+dfOfiNKkxApWRsTJYNrc8rOdxxIf5vazX+BiAXTeOT0UvWpGI/7qIWQOw==", - "dev": true, - "license": "ISC", - "dependencies": { - "debug": "^4.4.1", - "eslint-import-context": "^0.1.8", - "get-tsconfig": "^4.10.1", - "is-bun-module": "^2.0.0", - "stable-hash-x": "^0.2.0", - "tinyglobby": "^0.2.14", - "unrs-resolver": "^1.7.11" - }, - "engines": { - "node": "^16.17.0 || >=18.6.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-import-resolver-typescript" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*", - "eslint-plugin-import-x": "*" - }, - "peerDependenciesMeta": { - "eslint-plugin-import": { - "optional": true - }, - "eslint-plugin-import-x": { - "optional": true - } - } - }, - "node_modules/eslint-import-resolver-typescript/node_modules/stable-hash-x": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/stable-hash-x/-/stable-hash-x-0.2.0.tgz", - "integrity": "sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/eslint-module-utils": { "version": "2.12.1", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^3.2.7" }, @@ -4279,16 +4416,42 @@ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ms": "^2.1.1" } }, + "node_modules/eslint-plugin-es-x": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", + "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/ota-meshi", + "https://opencollective.com/eslint" + ], + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.11.0", + "eslint-compat-utils": "^0.5.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": ">=8" + } + }, "node_modules/eslint-plugin-import": { "version": "2.32.0", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -4317,16 +4480,207 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, + "node_modules/eslint-plugin-import-x": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.16.1.tgz", + "integrity": "sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "^8.35.0", + "comment-parser": "^1.4.1", + "debug": "^4.4.1", + "eslint-import-context": "^0.1.9", + "is-glob": "^4.0.3", + "minimatch": "^9.0.3 || ^10.0.1", + "semver": "^7.7.2", + "stable-hash-x": "^0.2.0", + "unrs-resolver": "^1.9.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-import-x" + }, + "peerDependencies": { + "@typescript-eslint/utils": "^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "eslint-import-resolver-node": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/utils": { + "optional": true + }, + "eslint-import-resolver-node": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-import-x/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-plugin-import-x/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ms": "^2.1.1" } }, + "node_modules/eslint-plugin-n": { + "version": "17.23.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.23.1.tgz", + "integrity": "sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.5.0", + "enhanced-resolve": "^5.17.1", + "eslint-plugin-es-x": "^7.8.0", + "get-tsconfig": "^4.8.1", + "globals": "^15.11.0", + "globrex": "^0.1.2", + "ignore": "^5.3.2", + "semver": "^7.6.3", + "ts-declaration-location": "^1.0.6" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": ">=8.23.0" + } + }, + "node_modules/eslint-plugin-n/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-n/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-promise": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-7.2.1.tgz", + "integrity": "sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/eslint-scope": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", @@ -5042,19 +5396,6 @@ "node": ">=10.13.0" } }, - "node_modules/globals": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.2.0.tgz", - "integrity": "sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/globalthis": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", @@ -5797,6 +6138,24 @@ "dev": true, "license": "ISC" }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -5877,6 +6236,22 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -5949,6 +6324,19 @@ "node": ">= 12.0.0" } }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -6208,9 +6596,9 @@ "license": "MIT" }, "node_modules/napi-postinstall": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.2.4.tgz", - "integrity": "sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", "dev": true, "license": "MIT", "bin": { @@ -6239,6 +6627,83 @@ "node": ">= 0.6" } }, + "node_modules/neostandard": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/neostandard/-/neostandard-0.12.2.tgz", + "integrity": "sha512-VZU8EZpSaNadp3rKEwBhVD1Kw8jE3AftQLkCyOaM7bWemL1LwsYRsBnAmXy2LjG9zO8t66qJdqB7ccwwORyrAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@stylistic/eslint-plugin": "2.11.0", + "eslint-import-resolver-typescript": "^3.10.1", + "eslint-plugin-import-x": "^4.16.1", + "eslint-plugin-n": "^17.20.0", + "eslint-plugin-promise": "^7.2.1", + "eslint-plugin-react": "^7.37.5", + "find-up": "^5.0.0", + "globals": "^15.15.0", + "peowly": "^1.3.2", + "typescript-eslint": "^8.35.1" + }, + "bin": { + "neostandard": "cli.mjs" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^9.0.0" + } + }, + "node_modules/neostandard/node_modules/eslint-import-resolver-typescript": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/neostandard/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/node-abi": { "version": "3.75.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.75.0.tgz", @@ -6332,6 +6797,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/object.fromentries": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", @@ -6357,6 +6838,8 @@ "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -6549,6 +7032,16 @@ "dev": true, "license": "MIT" }, + "node_modules/peowly": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/peowly/-/peowly-1.3.2.tgz", + "integrity": "sha512-BYIrwr8JCXY49jUZscgw311w9oGEKo7ux/s+BxrhKTQbiQ0iYNdZNJ5LgagaeercQdFHwnR7Z5IxxFWVQ+BasQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.6.0" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -6652,6 +7145,18 @@ "dev": true, "license": "MIT" }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -6783,6 +7288,13 @@ "node": ">=0.10.0" } }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -7353,10 +7865,17 @@ "node": ">=0.10.0" } }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, "node_modules/stable-hash-x": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/stable-hash-x/-/stable-hash-x-0.1.1.tgz", - "integrity": "sha512-l0x1D6vhnsNUGPFVDx45eif0y6eedVC8nm5uACTrVFJFtl2mLRW17aWtVyxFCpn5t94VUPkjU8vSLwIuwwqtJQ==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/stable-hash-x/-/stable-hash-x-0.2.0.tgz", + "integrity": "sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==", "dev": true, "license": "MIT", "engines": { @@ -7425,6 +7944,45 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "node_modules/string.prototype.trim": { "version": "1.2.10", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", @@ -7490,6 +8048,8 @@ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=4" } @@ -7563,6 +8123,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/tar-fs": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", @@ -7757,6 +8331,29 @@ "typescript": ">=4.8.4" } }, + "node_modules/ts-declaration-location": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/ts-declaration-location/-/ts-declaration-location-1.0.7.tgz", + "integrity": "sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==", + "dev": true, + "funding": [ + { + "type": "ko-fi", + "url": "https://ko-fi.com/rebeccastevens" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/ts-declaration-location" + } + ], + "license": "BSD-3-Clause", + "dependencies": { + "picomatch": "^4.0.2" + }, + "peerDependencies": { + "typescript": ">=4.0.0" + } + }, "node_modules/tsconfck": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", @@ -7784,6 +8381,8 @@ "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -7797,6 +8396,8 @@ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "minimist": "^1.2.0" }, @@ -8056,38 +8657,38 @@ } }, "node_modules/unrs-resolver": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.9.0.tgz", - "integrity": "sha512-wqaRu4UnzBD2ABTC1kLfBjAqIDZ5YUTr/MLGa7By47JV1bJDSW7jq/ZSLigB7enLe7ubNaJhtnBXgrc/50cEhg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", "dev": true, "hasInstallScript": true, "license": "MIT", "dependencies": { - "napi-postinstall": "^0.2.2" + "napi-postinstall": "^0.3.0" }, "funding": { "url": "https://opencollective.com/unrs-resolver" }, "optionalDependencies": { - "@unrs/resolver-binding-android-arm-eabi": "1.9.0", - "@unrs/resolver-binding-android-arm64": "1.9.0", - "@unrs/resolver-binding-darwin-arm64": "1.9.0", - "@unrs/resolver-binding-darwin-x64": "1.9.0", - "@unrs/resolver-binding-freebsd-x64": "1.9.0", - "@unrs/resolver-binding-linux-arm-gnueabihf": "1.9.0", - "@unrs/resolver-binding-linux-arm-musleabihf": "1.9.0", - "@unrs/resolver-binding-linux-arm64-gnu": "1.9.0", - "@unrs/resolver-binding-linux-arm64-musl": "1.9.0", - "@unrs/resolver-binding-linux-ppc64-gnu": "1.9.0", - "@unrs/resolver-binding-linux-riscv64-gnu": "1.9.0", - "@unrs/resolver-binding-linux-riscv64-musl": "1.9.0", - "@unrs/resolver-binding-linux-s390x-gnu": "1.9.0", - "@unrs/resolver-binding-linux-x64-gnu": "1.9.0", - "@unrs/resolver-binding-linux-x64-musl": "1.9.0", - "@unrs/resolver-binding-wasm32-wasi": "1.9.0", - "@unrs/resolver-binding-win32-arm64-msvc": "1.9.0", - "@unrs/resolver-binding-win32-ia32-msvc": "1.9.0", - "@unrs/resolver-binding-win32-x64-msvc": "1.9.0" + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" } }, "node_modules/update-browserslist-db": { diff --git a/package.json b/package.json index 07647ea9..34200d7b 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,12 @@ "dev:shell": "vite build --mode shell", "dev:shell-analysis": "vite build --mode shell-analysis", "dev:webui": "cd napcat.webui && npm run dev", - "lint": "eslint --fix src/**/*.{js,ts,vue}", + "lint": "npm run lint:core && npm run lint:webui", + "lint:fix": "npm run lint:fix:core && npm run lint:fix:webui", + "lint:core": "eslint src/**/*.{js,ts}", + "lint:fix:core": "eslint --fix src/**/*.{js,ts,vue}", + "lint:webui": "cd napcat.webui && eslint src/**/*.{js,ts}", + "lint:fix:webui": "cd napcat.webui && eslint --fix src/**/*.{js,ts,tsx}", "depend": "cd dist && npm install --omit=dev", "dev:depend": "npm i && cd napcat.webui && npm i" }, @@ -24,9 +29,6 @@ "@babel/preset-typescript": "^7.24.7", "@babel/traverse": "^7.28.0", "@babel/types": "^7.28.2", - "@eslint/compat": "^1.3.1", - "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "^9.33.0", "@homebridge/node-pty-prebuilt-multiarch": "^0.12.0-beta.5", "@log4js-node/log4js-api": "^1.0.2", "@napneko/nap-proto-core": "^0.0.4", @@ -42,8 +44,6 @@ "@types/react-color": "^3.0.13", "@types/type-is": "^1.6.7", "@types/ws": "^8.5.12", - "@typescript-eslint/eslint-plugin": "^8.3.0", - "@typescript-eslint/parser": "^8.39.0", "ajv": "^8.13.0", "async-mutex": "^0.5.0", "commander": "^13.0.0", @@ -51,15 +51,13 @@ "cors": "^2.8.5", "esbuild": "0.25.8", "eslint": "^9.14.0", - "eslint-import-resolver-typescript": "^4.4.4", - "eslint-plugin-import": "^2.32.0", "express-rate-limit": "^7.5.0", "fast-xml-parser": "^4.3.6", "file-type": "^21.0.0", - "globals": "^16.0.0", "json5": "^2.2.3", "multer": "^2.0.1", "napcat.protobuf": "^1.1.4", + "neostandard": "^0.12.2", "typescript": "^5.3.3", "typescript-eslint": "^8.35.1", "vite": "^7.1.1", @@ -72,4 +70,4 @@ "silk-wasm": "^3.6.1", "ws": "^8.18.3" } -} +} \ No newline at end of file diff --git a/src/core/packet/highway/highwayContext.ts b/src/core/packet/highway/highwayContext.ts index 21413dae..7adfc1d4 100644 --- a/src/core/packet/highway/highwayContext.ts +++ b/src/core/packet/highway/highwayContext.ts @@ -3,10 +3,10 @@ import { PacketLogger } from '@/core/packet/context/loggerContext'; import FetchSessionKey from '@/core/packet/transformer/highway/FetchSessionKey'; import { int32ip2str, oidbIpv4s2HighwayIpv4s } from '@/core/packet/highway/utils'; import { - PacketMsgFileElement, - PacketMsgPicElement, - PacketMsgPttElement, - PacketMsgVideoElement + PacketMsgFileElement, + PacketMsgPicElement, + PacketMsgPttElement, + PacketMsgVideoElement, } from '@/core/packet/message/element'; import { ChatType, Peer } from '@/core'; import { calculateSha1, calculateSha1StreamBytes, computeMd5AndLengthWithLimit } from '@/core/packet/utils/crypto/hash'; @@ -21,522 +21,522 @@ import { PacketClientContext } from '@/core/packet/context/clientContext'; export const BlockSize = 1024 * 1024; interface HighwayServerAddr { - ip: string - port: number + ip: string + port: number } export interface PacketHighwaySig { - uin: string; - uid: string; - sigSession: Uint8Array | null - sessionKey: Uint8Array | null - serverAddr: HighwayServerAddr[] + uin: string; + uid: string; + sigSession: Uint8Array | null + sessionKey: Uint8Array | null + serverAddr: HighwayServerAddr[] } export class PacketHighwayContext { - private readonly napcore: NapCoreContext; - private readonly client: PacketClientContext; - protected sig: PacketHighwaySig; - protected logger: PacketLogger; - protected hwClient: PacketHighwayClient; - private cachedPrepareReq: Promise | null = null; + private readonly napcore: NapCoreContext; + private readonly client: PacketClientContext; + protected sig: PacketHighwaySig; + protected logger: PacketLogger; + protected hwClient: PacketHighwayClient; + private cachedPrepareReq: Promise | null = null; - constructor(napcore: NapCoreContext, logger: PacketLogger, client: PacketClientContext) { - this.napcore = napcore; - this.client = client; - this.sig = { - uin: String(this.napcore.basicInfo.uin), - uid: this.napcore.basicInfo.uid, - sigSession: null, - sessionKey: null, - serverAddr: [], - }; - this.logger = logger; - this.hwClient = new PacketHighwayClient(this.sig, this.logger); + constructor (napcore: NapCoreContext, logger: PacketLogger, client: PacketClientContext) { + this.napcore = napcore; + this.client = client; + this.sig = { + uin: String(this.napcore.basicInfo.uin), + uid: this.napcore.basicInfo.uid, + sigSession: null, + sessionKey: null, + serverAddr: [], + }; + this.logger = logger; + this.hwClient = new PacketHighwayClient(this.sig, this.logger); + } + + private async checkAvailable () { + if (this.sig.sigSession === null || this.sig.sessionKey === null) { + if (this.cachedPrepareReq === null) { + this.cachedPrepareReq = this.prepareUpload().finally(() => { + this.cachedPrepareReq = null; + }); + } + await this.cachedPrepareReq; } + } - private async checkAvailable() { - if (this.sig.sigSession === null || this.sig.sessionKey === null) { - if (this.cachedPrepareReq === null) { - this.cachedPrepareReq = this.prepareUpload().finally(() => { - this.cachedPrepareReq = null; - }); - } - await this.cachedPrepareReq; - } + private async prepareUpload (): Promise { + this.logger.debug('[Highway] on prepareUpload!'); + const packet = FetchSessionKey.build(); + const req = await this.client.sendOidbPacket(packet, true); + const rsp = FetchSessionKey.parse(req); + this.sig.sigSession = rsp.httpConn.sigSession; + this.sig.sessionKey = rsp.httpConn.sessionKey; + for (const info of rsp.httpConn.serverInfos) { + if (info.serviceType !== 1) continue; + for (const addr of info.serverAddrs) { + this.logger.debug(`[Highway PrepareUpload] server addr add: ${int32ip2str(addr.ip)}:${addr.port}`); + this.sig.serverAddr.push({ + ip: int32ip2str(addr.ip), + port: addr.port, + }); + this.hwClient.changeServer(int32ip2str(addr.ip), addr.port); + } } - - private async prepareUpload(): Promise { - this.logger.debug('[Highway] on prepareUpload!'); - const packet = FetchSessionKey.build(); - const req = await this.client.sendOidbPacket(packet, true); - const rsp = FetchSessionKey.parse(req); - this.sig.sigSession = rsp.httpConn.sigSession; - this.sig.sessionKey = rsp.httpConn.sessionKey; - for (const info of rsp.httpConn.serverInfos) { - if (info.serviceType !== 1) continue; - for (const addr of info.serverAddrs) { - this.logger.debug(`[Highway PrepareUpload] server addr add: ${int32ip2str(addr.ip)}:${addr.port}`); - this.sig.serverAddr.push({ - ip: int32ip2str(addr.ip), - port: addr.port - }); - this.hwClient.changeServer(int32ip2str(addr.ip), addr.port); - } - } - if (this.sig.serverAddr.length === 0) { - this.logger.warn('[Highway PrepareUpload] server addr is empty!'); - } + if (this.sig.serverAddr.length === 0) { + this.logger.warn('[Highway PrepareUpload] server addr is empty!'); } + } - async uploadImage(peer: Peer, img: PacketMsgPicElement): Promise { - await this.checkAvailable(); - if (peer.chatType === ChatType.KCHATTYPEGROUP) { - await this.uploadGroupImage(+peer.peerUid, img); - } else if (peer.chatType === ChatType.KCHATTYPEC2C) { - await this.uploadC2CImage(peer.peerUid, img); - } else { - throw new Error(`[Highway] unsupported chatType: ${peer.chatType}`); - } + async uploadImage (peer: Peer, img: PacketMsgPicElement): Promise { + await this.checkAvailable(); + if (peer.chatType === ChatType.KCHATTYPEGROUP) { + await this.uploadGroupImage(+peer.peerUid, img); + } else if (peer.chatType === ChatType.KCHATTYPEC2C) { + await this.uploadC2CImage(peer.peerUid, img); + } else { + throw new Error(`[Highway] unsupported chatType: ${peer.chatType}`); } + } - async uploadVideo(peer: Peer, video: PacketMsgVideoElement): Promise { - await this.checkAvailable(); - if (+(video.fileSize ?? 0) > 1024 * 1024 * 100) { - throw new Error(`[Highway] 视频文件过大: ${(+(video.fileSize ?? 0) / (1024 * 1024)).toFixed(2)} MB > 100 MB,请使用文件上传!`); - } - if (peer.chatType === ChatType.KCHATTYPEGROUP) { - await this.uploadGroupVideo(+peer.peerUid, video); - } else if (peer.chatType === ChatType.KCHATTYPEC2C) { - await this.uploadC2CVideo(peer.peerUid, video); - } else { - throw new Error(`[Highway] unsupported chatType: ${peer.chatType}`); - } + async uploadVideo (peer: Peer, video: PacketMsgVideoElement): Promise { + await this.checkAvailable(); + if (+(video.fileSize ?? 0) > 1024 * 1024 * 100) { + throw new Error(`[Highway] 视频文件过大: ${(+(video.fileSize ?? 0) / (1024 * 1024)).toFixed(2)} MB > 100 MB,请使用文件上传!`); } - - async uploadPtt(peer: Peer, ptt: PacketMsgPttElement): Promise { - await this.checkAvailable(); - if (peer.chatType === ChatType.KCHATTYPEGROUP) { - await this.uploadGroupPtt(+peer.peerUid, ptt); - } else if (peer.chatType === ChatType.KCHATTYPEC2C) { - await this.uploadC2CPtt(peer.peerUid, ptt); - } else { - throw new Error(`[Highway] unsupported chatType: ${peer.chatType}`); - } + if (peer.chatType === ChatType.KCHATTYPEGROUP) { + await this.uploadGroupVideo(+peer.peerUid, video); + } else if (peer.chatType === ChatType.KCHATTYPEC2C) { + await this.uploadC2CVideo(peer.peerUid, video); + } else { + throw new Error(`[Highway] unsupported chatType: ${peer.chatType}`); } + } - async uploadFile(peer: Peer, file: PacketMsgFileElement): Promise { - await this.checkAvailable(); - if (peer.chatType === ChatType.KCHATTYPEGROUP) { - await this.uploadGroupFile(+peer.peerUid, file); - } else if (peer.chatType === ChatType.KCHATTYPEC2C) { - await this.uploadC2CFile(peer.peerUid, file); - } else { - throw new Error(`[Highway] unsupported chatType: ${peer.chatType}`); - } + async uploadPtt (peer: Peer, ptt: PacketMsgPttElement): Promise { + await this.checkAvailable(); + if (peer.chatType === ChatType.KCHATTYPEGROUP) { + await this.uploadGroupPtt(+peer.peerUid, ptt); + } else if (peer.chatType === ChatType.KCHATTYPEC2C) { + await this.uploadC2CPtt(peer.peerUid, ptt); + } else { + throw new Error(`[Highway] unsupported chatType: ${peer.chatType}`); } + } - private async uploadGroupImage(groupUin: number, img: PacketMsgPicElement): Promise { - img.sha1 = Buffer.from(await calculateSha1(img.path)).toString('hex'); - const req = UploadGroupImage.build(groupUin, img); - const resp = await this.client.sendOidbPacket(req, true); - const preRespData = UploadGroupImage.parse(resp); - const ukey = preRespData.upload.uKey; - if (ukey && ukey != '') { - this.logger.debug(`[Highway] uploadGroupImageReq get upload ukey: ${ukey}, need upload!`); - const index = preRespData.upload.msgInfo.msgInfoBody[0]!.index; - const sha1 = Buffer.from(index.info.fileSha1, 'hex'); - const md5 = Buffer.from(index.info.fileHash, 'hex'); - const extend = new NapProtoMsg(proto.NTV2RichMediaHighwayExt).encode({ - fileUuid: index.fileUuid, - uKey: ukey, - network: { - ipv4S: oidbIpv4s2HighwayIpv4s(preRespData.upload.ipv4S) + async uploadFile (peer: Peer, file: PacketMsgFileElement): Promise { + await this.checkAvailable(); + if (peer.chatType === ChatType.KCHATTYPEGROUP) { + await this.uploadGroupFile(+peer.peerUid, file); + } else if (peer.chatType === ChatType.KCHATTYPEC2C) { + await this.uploadC2CFile(peer.peerUid, file); + } else { + throw new Error(`[Highway] unsupported chatType: ${peer.chatType}`); + } + } + + private async uploadGroupImage (groupUin: number, img: PacketMsgPicElement): Promise { + img.sha1 = Buffer.from(await calculateSha1(img.path)).toString('hex'); + const req = UploadGroupImage.build(groupUin, img); + const resp = await this.client.sendOidbPacket(req, true); + const preRespData = UploadGroupImage.parse(resp); + const ukey = preRespData.upload.uKey; + if (ukey && ukey != '') { + this.logger.debug(`[Highway] uploadGroupImageReq get upload ukey: ${ukey}, need upload!`); + const index = preRespData.upload.msgInfo.msgInfoBody[0]!.index; + const sha1 = Buffer.from(index.info.fileSha1, 'hex'); + const md5 = Buffer.from(index.info.fileHash, 'hex'); + const extend = new NapProtoMsg(proto.NTV2RichMediaHighwayExt).encode({ + fileUuid: index.fileUuid, + uKey: ukey, + network: { + ipv4S: oidbIpv4s2HighwayIpv4s(preRespData.upload.ipv4S), + }, + msgInfoBody: preRespData.upload.msgInfo.msgInfoBody, + blockSize: BlockSize, + hash: { + fileSha1: [sha1], + }, + }); + await this.hwClient.upload( + 1004, + fs.createReadStream(img.path, { highWaterMark: BlockSize }), + img.size, + md5, + extend + ); + } else { + this.logger.debug(`[Highway] uploadGroupImageReq get upload invalid ukey ${ukey}, don't need upload!`); + } + img.msgInfo = preRespData.upload.msgInfo; + // img.groupPicExt = new NapProtoMsg(CustomFace).decode(preRespData.tcpUpload.compatQMsg) + } + + private async uploadC2CImage (peerUid: string, img: PacketMsgPicElement): Promise { + img.sha1 = Buffer.from(await calculateSha1(img.path)).toString('hex'); + const req = trans.UploadPrivateImage.build(peerUid, img); + const resp = await this.client.sendOidbPacket(req, true); + const preRespData = trans.UploadPrivateImage.parse(resp); + const ukey = preRespData.upload.uKey; + if (ukey && ukey != '') { + this.logger.debug(`[Highway] uploadC2CImageReq get upload ukey: ${ukey}, need upload!`); + const index = preRespData.upload.msgInfo.msgInfoBody[0]!.index; + const sha1 = Buffer.from(index.info.fileSha1, 'hex'); + const md5 = Buffer.from(index.info.fileHash, 'hex'); + const extend = new NapProtoMsg(proto.NTV2RichMediaHighwayExt).encode({ + fileUuid: index.fileUuid, + uKey: ukey, + network: { + ipv4S: oidbIpv4s2HighwayIpv4s(preRespData.upload.ipv4S), + }, + msgInfoBody: preRespData.upload.msgInfo.msgInfoBody, + blockSize: BlockSize, + hash: { + fileSha1: [sha1], + }, + }); + await this.hwClient.upload( + 1003, + fs.createReadStream(img.path, { highWaterMark: BlockSize }), + img.size, + md5, + extend + ); + } else { + this.logger.debug(`[Highway] uploadC2CImageReq get upload invalid ukey ${ukey}, don't need upload!`); + } + img.msgInfo = preRespData.upload.msgInfo; + } + + private async uploadGroupVideo (groupUin: number, video: PacketMsgVideoElement): Promise { + if (!video.filePath || !video.thumbPath) throw new Error('video.filePath or video.thumbPath is empty'); + video.fileSha1 = Buffer.from(await calculateSha1(video.filePath)).toString('hex'); + video.thumbSha1 = Buffer.from(await calculateSha1(video.thumbPath)).toString('hex'); + const req = trans.UploadGroupVideo.build(groupUin, video); + const resp = await this.client.sendOidbPacket(req, true); + const preRespData = trans.UploadGroupVideo.parse(resp); + const ukey = preRespData.upload.uKey; + if (ukey && ukey != '') { + this.logger.debug(`[Highway] uploadGroupVideoReq get upload video ukey: ${ukey}, need upload!`); + const index = preRespData.upload.msgInfo.msgInfoBody[0]!.index; + const md5 = Buffer.from(index.info.fileHash, 'hex'); + const extend = new NapProtoMsg(proto.NTV2RichMediaHighwayExt).encode({ + fileUuid: index.fileUuid, + uKey: ukey, + network: { + ipv4S: oidbIpv4s2HighwayIpv4s(preRespData.upload.ipv4S), + }, + msgInfoBody: preRespData.upload.msgInfo.msgInfoBody, + blockSize: BlockSize, + hash: { + fileSha1: await calculateSha1StreamBytes(video.filePath), + }, + }); + await this.hwClient.upload( + 1005, + fs.createReadStream(video.filePath, { highWaterMark: BlockSize }), + +video.fileSize!, + md5, + extend + ); + } else { + this.logger.debug(`[Highway] uploadGroupVideoReq get upload invalid ukey ${ukey}, don't need upload!`); + } + const subFile = preRespData.upload.subFileInfos[0]; + if (subFile!.uKey && subFile!.uKey != '') { + this.logger.debug(`[Highway] uploadGroupVideoReq get upload video thumb ukey: ${subFile!.uKey}, need upload!`); + const index = preRespData.upload.msgInfo.msgInfoBody[1]!.index; + const md5 = Buffer.from(index.info.fileHash, 'hex'); + const sha1 = Buffer.from(index.info.fileSha1, 'hex'); + const extend = new NapProtoMsg(proto.NTV2RichMediaHighwayExt).encode({ + fileUuid: index.fileUuid, + uKey: subFile!.uKey, + network: { + ipv4S: oidbIpv4s2HighwayIpv4s(subFile!.ipv4S), + }, + msgInfoBody: preRespData.upload.msgInfo.msgInfoBody, + blockSize: BlockSize, + hash: { + fileSha1: [sha1], + }, + }); + await this.hwClient.upload( + 1006, + fs.createReadStream(video.thumbPath, { highWaterMark: BlockSize }), + +video.thumbSize!, + md5, + extend + ); + } else { + this.logger.debug(`[Highway] uploadGroupVideoReq get upload invalid thumb ukey ${subFile!.uKey}, don't need upload!`); + } + video.msgInfo = preRespData.upload.msgInfo; + } + + private async uploadC2CVideo (peerUid: string, video: PacketMsgVideoElement): Promise { + if (!video.filePath || !video.thumbPath) throw new Error('video.filePath or video.thumbPath is empty'); + video.fileSha1 = Buffer.from(await calculateSha1(video.filePath)).toString('hex'); + video.thumbSha1 = Buffer.from(await calculateSha1(video.thumbPath)).toString('hex'); + const req = trans.UploadPrivateVideo.build(peerUid, video); + const resp = await this.client.sendOidbPacket(req, true); + const preRespData = trans.UploadPrivateVideo.parse(resp); + const ukey = preRespData.upload.uKey; + if (ukey && ukey != '') { + this.logger.debug(`[Highway] uploadC2CVideoReq get upload video ukey: ${ukey}, need upload!`); + const index = preRespData.upload.msgInfo.msgInfoBody[0]!.index; + const md5 = Buffer.from(index.info.fileHash, 'hex'); + const extend = new NapProtoMsg(proto.NTV2RichMediaHighwayExt).encode({ + fileUuid: index.fileUuid, + uKey: ukey, + network: { + ipv4S: oidbIpv4s2HighwayIpv4s(preRespData.upload.ipv4S), + }, + msgInfoBody: preRespData.upload.msgInfo.msgInfoBody, + blockSize: BlockSize, + hash: { + fileSha1: await calculateSha1StreamBytes(video.filePath), + }, + }); + await this.hwClient.upload( + 1001, + fs.createReadStream(video.filePath, { highWaterMark: BlockSize }), + +video.fileSize!, + md5, + extend + ); + } else { + this.logger.debug(`[Highway] uploadC2CVideoReq get upload invalid ukey ${ukey}, don't need upload!`); + } + const subFile = preRespData.upload.subFileInfos[0]; + if (subFile!.uKey && subFile!.uKey != '') { + this.logger.debug(`[Highway] uploadC2CVideoReq get upload video thumb ukey: ${subFile!.uKey}, need upload!`); + const index = preRespData.upload.msgInfo.msgInfoBody[1]!.index; + const md5 = Buffer.from(index.info.fileHash, 'hex'); + const sha1 = Buffer.from(index.info.fileSha1, 'hex'); + const extend = new NapProtoMsg(proto.NTV2RichMediaHighwayExt).encode({ + fileUuid: index.fileUuid, + uKey: subFile!.uKey, + network: { + ipv4S: oidbIpv4s2HighwayIpv4s(subFile!.ipv4S), + }, + msgInfoBody: preRespData.upload.msgInfo.msgInfoBody, + blockSize: BlockSize, + hash: { + fileSha1: [sha1], + }, + }); + await this.hwClient.upload( + 1002, + fs.createReadStream(video.thumbPath, { highWaterMark: BlockSize }), + +video.thumbSize!, + md5, + extend + ); + } else { + this.logger.debug(`[Highway] uploadC2CVideoReq get upload invalid thumb ukey ${subFile!.uKey}, don't need upload!`); + } + video.msgInfo = preRespData.upload.msgInfo; + } + + private async uploadGroupPtt (groupUin: number, ptt: PacketMsgPttElement): Promise { + ptt.fileSha1 = Buffer.from(await calculateSha1(ptt.filePath)).toString('hex'); + const req = trans.UploadGroupPtt.build(groupUin, ptt); + const resp = await this.client.sendOidbPacket(req, true); + const preRespData = trans.UploadGroupPtt.parse(resp); + const ukey = preRespData.upload.uKey; + if (ukey && ukey != '') { + this.logger.debug(`[Highway] uploadGroupPttReq get upload ptt ukey: ${ukey}, need upload!`); + const index = preRespData.upload.msgInfo.msgInfoBody[0]!.index; + const md5 = Buffer.from(index.info.fileHash, 'hex'); + const sha1 = Buffer.from(index.info.fileSha1, 'hex'); + const extend = new NapProtoMsg(proto.NTV2RichMediaHighwayExt).encode({ + fileUuid: index.fileUuid, + uKey: ukey, + network: { + ipv4S: oidbIpv4s2HighwayIpv4s(preRespData.upload.ipv4S), + }, + msgInfoBody: preRespData.upload.msgInfo.msgInfoBody, + blockSize: BlockSize, + hash: { + fileSha1: [sha1], + }, + }); + await this.hwClient.upload( + 1008, + fs.createReadStream(ptt.filePath, { highWaterMark: BlockSize }), + ptt.fileSize, + md5, + extend + ); + } else { + this.logger.debug(`[Highway] uploadGroupPttReq get upload invalid ukey ${ukey}, don't need upload!`); + } + ptt.msgInfo = preRespData.upload.msgInfo; + } + + private async uploadC2CPtt (peerUid: string, ptt: PacketMsgPttElement): Promise { + ptt.fileSha1 = Buffer.from(await calculateSha1(ptt.filePath)).toString('hex'); + const req = trans.UploadPrivatePtt.build(peerUid, ptt); + const resp = await this.client.sendOidbPacket(req, true); + const preRespData = trans.UploadPrivatePtt.parse(resp); + const ukey = preRespData.upload.uKey; + if (ukey && ukey != '') { + this.logger.debug(`[Highway] uploadC2CPttReq get upload ptt ukey: ${ukey}, need upload!`); + const index = preRespData.upload.msgInfo.msgInfoBody[0]!.index; + const md5 = Buffer.from(index.info.fileHash, 'hex'); + const sha1 = Buffer.from(index.info.fileSha1, 'hex'); + const extend = new NapProtoMsg(proto.NTV2RichMediaHighwayExt).encode({ + fileUuid: index.fileUuid, + uKey: ukey, + network: { + ipv4S: oidbIpv4s2HighwayIpv4s(preRespData.upload.ipv4S), + }, + msgInfoBody: preRespData.upload.msgInfo.msgInfoBody, + blockSize: BlockSize, + hash: { + fileSha1: [sha1], + }, + }); + await this.hwClient.upload( + 1007, + fs.createReadStream(ptt.filePath, { highWaterMark: BlockSize }), + ptt.fileSize, + md5, + extend + ); + } else { + this.logger.debug(`[Highway] uploadC2CPttReq get upload invalid ukey ${ukey}, don't need upload!`); + } + ptt.msgInfo = preRespData.upload.msgInfo; + } + + private async uploadGroupFile (groupUin: number, file: PacketMsgFileElement): Promise { + file.isGroupFile = true; + file.fileMd5 = await computeMd5AndLengthWithLimit(file.filePath); + file.fileSha1 = await calculateSha1(file.filePath); + const req = trans.UploadGroupFile.build(groupUin, file); + const resp = await this.client.sendOidbPacket(req, true); + const preRespData = trans.UploadGroupFile.parse(resp); + if (!preRespData?.upload?.boolFileExist) { + this.logger.debug('[Highway] uploadGroupFileReq file not exist, need upload!'); + const ext = new NapProtoMsg(proto.FileUploadExt).encode({ + unknown1: 100, + unknown2: 1, + entry: { + busiBuff: { + senderUin: BigInt(this.sig.uin), + receiverUin: BigInt(groupUin), + groupCode: BigInt(groupUin), + }, + fileEntry: { + fileSize: BigInt(file.fileSize), + md5: file.fileMd5, + md5S2: file.fileMd5, + checkKey: preRespData.upload.checkKey, + fileId: preRespData.upload.fileId, + uploadKey: preRespData.upload.fileKey, + }, + clientInfo: { + clientType: 3, + appId: '100', + terminalType: 3, + clientVer: '1.1.1', + unknown: 4, + }, + fileNameInfo: { + fileName: file.fileName, + }, + host: { + hosts: [ + { + url: { + host: preRespData.upload.uploadIp, + unknown: 1, }, - msgInfoBody: preRespData.upload.msgInfo.msgInfoBody, - blockSize: BlockSize, - hash: { - fileSha1: [sha1] - } - }); - await this.hwClient.upload( - 1004, - fs.createReadStream(img.path, { highWaterMark: BlockSize }), - img.size, - md5, - extend - ); - } else { - this.logger.debug(`[Highway] uploadGroupImageReq get upload invalid ukey ${ukey}, don't need upload!`); - } - img.msgInfo = preRespData.upload.msgInfo; - // img.groupPicExt = new NapProtoMsg(CustomFace).decode(preRespData.tcpUpload.compatQMsg) + port: preRespData.upload.uploadPort, + }, + ], + }, + }, + unknown200: 0, + }); + await this.hwClient.upload( + 71, + fs.createReadStream(file.filePath, { highWaterMark: BlockSize }), + file.fileSize, + file.fileMd5, + ext + ); + } else { + this.logger.debug('[Highway] uploadGroupFileReq file exist, don\'t need upload!'); } + file.fileUuid = preRespData.upload.fileId; + } - private async uploadC2CImage(peerUid: string, img: PacketMsgPicElement): Promise { - img.sha1 = Buffer.from(await calculateSha1(img.path)).toString('hex'); - const req = trans.UploadPrivateImage.build(peerUid, img); - const resp = await this.client.sendOidbPacket(req, true); - const preRespData = trans.UploadPrivateImage.parse(resp); - const ukey = preRespData.upload.uKey; - if (ukey && ukey != '') { - this.logger.debug(`[Highway] uploadC2CImageReq get upload ukey: ${ukey}, need upload!`); - const index = preRespData.upload.msgInfo.msgInfoBody[0]!.index; - const sha1 = Buffer.from(index.info.fileSha1, 'hex'); - const md5 = Buffer.from(index.info.fileHash, 'hex'); - const extend = new NapProtoMsg(proto.NTV2RichMediaHighwayExt).encode({ - fileUuid: index.fileUuid, - uKey: ukey, - network: { - ipv4S: oidbIpv4s2HighwayIpv4s(preRespData.upload.ipv4S) + private async uploadC2CFile (peerUid: string, file: PacketMsgFileElement): Promise { + file.isGroupFile = false; + file.fileMd5 = await computeMd5AndLengthWithLimit(file.filePath); + file.fileSha1 = await calculateSha1(file.filePath); + const req = await trans.UploadPrivateFile.build(this.sig.uid, peerUid, file); + const res = await this.client.sendOidbPacket(req, true); + const preRespData = trans.UploadPrivateFile.parse(res); + if (!preRespData.upload?.boolFileExist) { + this.logger.debug('[Highway] uploadC2CFileReq file not exist, need upload!'); + const ext = new NapProtoMsg(proto.FileUploadExt).encode({ + unknown1: 100, + unknown2: 1, + entry: { + busiBuff: { + senderUin: BigInt(this.sig.uin), + }, + fileEntry: { + fileSize: BigInt(file.fileSize), + md5: file.fileMd5, + md5S2: file.fileMd5, + checkKey: file.fileSha1, + fileId: preRespData.upload?.uuid, + uploadKey: preRespData.upload?.mediaPlatformUploadKey, + }, + clientInfo: { + clientType: 3, + appId: '100', + terminalType: 3, + clientVer: '1.1.1', + unknown: 4, + }, + fileNameInfo: { + fileName: file.fileName, + }, + host: { + hosts: [ + { + url: { + host: preRespData.upload?.uploadIp, + unknown: 1, }, - msgInfoBody: preRespData.upload.msgInfo.msgInfoBody, - blockSize: BlockSize, - hash: { - fileSha1: [sha1] - } - }); - await this.hwClient.upload( - 1003, - fs.createReadStream(img.path, { highWaterMark: BlockSize }), - img.size, - md5, - extend - ); - } else { - this.logger.debug(`[Highway] uploadC2CImageReq get upload invalid ukey ${ukey}, don't need upload!`); - } - img.msgInfo = preRespData.upload.msgInfo; - } - - private async uploadGroupVideo(groupUin: number, video: PacketMsgVideoElement): Promise { - if (!video.filePath || !video.thumbPath) throw new Error('video.filePath or video.thumbPath is empty'); - video.fileSha1 = Buffer.from(await calculateSha1(video.filePath)).toString('hex'); - video.thumbSha1 = Buffer.from(await calculateSha1(video.thumbPath)).toString('hex'); - const req = trans.UploadGroupVideo.build(groupUin, video); - const resp = await this.client.sendOidbPacket(req, true); - const preRespData = trans.UploadGroupVideo.parse(resp); - const ukey = preRespData.upload.uKey; - if (ukey && ukey != '') { - this.logger.debug(`[Highway] uploadGroupVideoReq get upload video ukey: ${ukey}, need upload!`); - const index = preRespData.upload.msgInfo.msgInfoBody[0]!.index; - const md5 = Buffer.from(index.info.fileHash, 'hex'); - const extend = new NapProtoMsg(proto.NTV2RichMediaHighwayExt).encode({ - fileUuid: index.fileUuid, - uKey: ukey, - network: { - ipv4S: oidbIpv4s2HighwayIpv4s(preRespData.upload.ipv4S) - }, - msgInfoBody: preRespData.upload.msgInfo.msgInfoBody, - blockSize: BlockSize, - hash: { - fileSha1: await calculateSha1StreamBytes(video.filePath) - } - }); - await this.hwClient.upload( - 1005, - fs.createReadStream(video.filePath, { highWaterMark: BlockSize }), - +video.fileSize!, - md5, - extend - ); - } else { - this.logger.debug(`[Highway] uploadGroupVideoReq get upload invalid ukey ${ukey}, don't need upload!`); - } - const subFile = preRespData.upload.subFileInfos[0]; - if (subFile!.uKey && subFile!.uKey != '') { - this.logger.debug(`[Highway] uploadGroupVideoReq get upload video thumb ukey: ${subFile!.uKey}, need upload!`); - const index = preRespData.upload.msgInfo.msgInfoBody[1]!.index; - const md5 = Buffer.from(index.info.fileHash, 'hex'); - const sha1 = Buffer.from(index.info.fileSha1, 'hex'); - const extend = new NapProtoMsg(proto.NTV2RichMediaHighwayExt).encode({ - fileUuid: index.fileUuid, - uKey: subFile!.uKey, - network: { - ipv4S: oidbIpv4s2HighwayIpv4s(subFile!.ipv4S) - }, - msgInfoBody: preRespData.upload.msgInfo.msgInfoBody, - blockSize: BlockSize, - hash: { - fileSha1: [sha1] - } - }); - await this.hwClient.upload( - 1006, - fs.createReadStream(video.thumbPath, { highWaterMark: BlockSize }), - +video.thumbSize!, - md5, - extend - ); - } else { - this.logger.debug(`[Highway] uploadGroupVideoReq get upload invalid thumb ukey ${subFile!.uKey}, don't need upload!`); - } - video.msgInfo = preRespData.upload.msgInfo; - } - - private async uploadC2CVideo(peerUid: string, video: PacketMsgVideoElement): Promise { - if (!video.filePath || !video.thumbPath) throw new Error('video.filePath or video.thumbPath is empty'); - video.fileSha1 = Buffer.from(await calculateSha1(video.filePath)).toString('hex'); - video.thumbSha1 = Buffer.from(await calculateSha1(video.thumbPath)).toString('hex'); - const req = trans.UploadPrivateVideo.build(peerUid, video); - const resp = await this.client.sendOidbPacket(req, true); - const preRespData = trans.UploadPrivateVideo.parse(resp); - const ukey = preRespData.upload.uKey; - if (ukey && ukey != '') { - this.logger.debug(`[Highway] uploadC2CVideoReq get upload video ukey: ${ukey}, need upload!`); - const index = preRespData.upload.msgInfo.msgInfoBody[0]!.index; - const md5 = Buffer.from(index.info.fileHash, 'hex'); - const extend = new NapProtoMsg(proto.NTV2RichMediaHighwayExt).encode({ - fileUuid: index.fileUuid, - uKey: ukey, - network: { - ipv4S: oidbIpv4s2HighwayIpv4s(preRespData.upload.ipv4S) - }, - msgInfoBody: preRespData.upload.msgInfo.msgInfoBody, - blockSize: BlockSize, - hash: { - fileSha1: await calculateSha1StreamBytes(video.filePath) - } - }); - await this.hwClient.upload( - 1001, - fs.createReadStream(video.filePath, { highWaterMark: BlockSize }), - +video.fileSize!, - md5, - extend - ); - } else { - this.logger.debug(`[Highway] uploadC2CVideoReq get upload invalid ukey ${ukey}, don't need upload!`); - } - const subFile = preRespData.upload.subFileInfos[0]; - if (subFile!.uKey && subFile!.uKey != '') { - this.logger.debug(`[Highway] uploadC2CVideoReq get upload video thumb ukey: ${subFile!.uKey}, need upload!`); - const index = preRespData.upload.msgInfo.msgInfoBody[1]!.index; - const md5 = Buffer.from(index.info.fileHash, 'hex'); - const sha1 = Buffer.from(index.info.fileSha1, 'hex'); - const extend = new NapProtoMsg(proto.NTV2RichMediaHighwayExt).encode({ - fileUuid: index.fileUuid, - uKey: subFile!.uKey, - network: { - ipv4S: oidbIpv4s2HighwayIpv4s(subFile!.ipv4S) - }, - msgInfoBody: preRespData.upload.msgInfo.msgInfoBody, - blockSize: BlockSize, - hash: { - fileSha1: [sha1] - } - }); - await this.hwClient.upload( - 1002, - fs.createReadStream(video.thumbPath, { highWaterMark: BlockSize }), - +video.thumbSize!, - md5, - extend - ); - } else { - this.logger.debug(`[Highway] uploadC2CVideoReq get upload invalid thumb ukey ${subFile!.uKey}, don't need upload!`); - } - video.msgInfo = preRespData.upload.msgInfo; - } - - private async uploadGroupPtt(groupUin: number, ptt: PacketMsgPttElement): Promise { - ptt.fileSha1 = Buffer.from(await calculateSha1(ptt.filePath)).toString('hex'); - const req = trans.UploadGroupPtt.build(groupUin, ptt); - const resp = await this.client.sendOidbPacket(req, true); - const preRespData = trans.UploadGroupPtt.parse(resp); - const ukey = preRespData.upload.uKey; - if (ukey && ukey != '') { - this.logger.debug(`[Highway] uploadGroupPttReq get upload ptt ukey: ${ukey}, need upload!`); - const index = preRespData.upload.msgInfo.msgInfoBody[0]!.index; - const md5 = Buffer.from(index.info.fileHash, 'hex'); - const sha1 = Buffer.from(index.info.fileSha1, 'hex'); - const extend = new NapProtoMsg(proto.NTV2RichMediaHighwayExt).encode({ - fileUuid: index.fileUuid, - uKey: ukey, - network: { - ipv4S: oidbIpv4s2HighwayIpv4s(preRespData.upload.ipv4S) - }, - msgInfoBody: preRespData.upload.msgInfo.msgInfoBody, - blockSize: BlockSize, - hash: { - fileSha1: [sha1] - } - }); - await this.hwClient.upload( - 1008, - fs.createReadStream(ptt.filePath, { highWaterMark: BlockSize }), - ptt.fileSize, - md5, - extend - ); - } else { - this.logger.debug(`[Highway] uploadGroupPttReq get upload invalid ukey ${ukey}, don't need upload!`); - } - ptt.msgInfo = preRespData.upload.msgInfo; - } - - private async uploadC2CPtt(peerUid: string, ptt: PacketMsgPttElement): Promise { - ptt.fileSha1 = Buffer.from(await calculateSha1(ptt.filePath)).toString('hex'); - const req = trans.UploadPrivatePtt.build(peerUid, ptt); - const resp = await this.client.sendOidbPacket(req, true); - const preRespData = trans.UploadPrivatePtt.parse(resp); - const ukey = preRespData.upload.uKey; - if (ukey && ukey != '') { - this.logger.debug(`[Highway] uploadC2CPttReq get upload ptt ukey: ${ukey}, need upload!`); - const index = preRespData.upload.msgInfo.msgInfoBody[0]!.index; - const md5 = Buffer.from(index.info.fileHash, 'hex'); - const sha1 = Buffer.from(index.info.fileSha1, 'hex'); - const extend = new NapProtoMsg(proto.NTV2RichMediaHighwayExt).encode({ - fileUuid: index.fileUuid, - uKey: ukey, - network: { - ipv4S: oidbIpv4s2HighwayIpv4s(preRespData.upload.ipv4S) - }, - msgInfoBody: preRespData.upload.msgInfo.msgInfoBody, - blockSize: BlockSize, - hash: { - fileSha1: [sha1] - } - }); - await this.hwClient.upload( - 1007, - fs.createReadStream(ptt.filePath, { highWaterMark: BlockSize }), - ptt.fileSize, - md5, - extend - ); - } else { - this.logger.debug(`[Highway] uploadC2CPttReq get upload invalid ukey ${ukey}, don't need upload!`); - } - ptt.msgInfo = preRespData.upload.msgInfo; - } - - private async uploadGroupFile(groupUin: number, file: PacketMsgFileElement): Promise { - file.isGroupFile = true; - file.fileMd5 = await computeMd5AndLengthWithLimit(file.filePath); - file.fileSha1 = await calculateSha1(file.filePath); - const req = trans.UploadGroupFile.build(groupUin, file); - const resp = await this.client.sendOidbPacket(req, true); - const preRespData = trans.UploadGroupFile.parse(resp); - if (!preRespData?.upload?.boolFileExist) { - this.logger.debug('[Highway] uploadGroupFileReq file not exist, need upload!'); - const ext = new NapProtoMsg(proto.FileUploadExt).encode({ - unknown1: 100, - unknown2: 1, - entry: { - busiBuff: { - senderUin: BigInt(this.sig.uin), - receiverUin: BigInt(groupUin), - groupCode: BigInt(groupUin), - }, - fileEntry: { - fileSize: BigInt(file.fileSize), - md5: file.fileMd5, - md5S2: file.fileMd5, - checkKey: preRespData.upload.checkKey, - fileId: preRespData.upload.fileId, - uploadKey: preRespData.upload.fileKey, - }, - clientInfo: { - clientType: 3, - appId: '100', - terminalType: 3, - clientVer: '1.1.1', - unknown: 4 - }, - fileNameInfo: { - fileName: file.fileName - }, - host: { - hosts: [ - { - url: { - host: preRespData.upload.uploadIp, - unknown: 1, - }, - port: preRespData.upload.uploadPort, - } - ] - } - }, - unknown200: 0, - }); - await this.hwClient.upload( - 71, - fs.createReadStream(file.filePath, { highWaterMark: BlockSize }), - file.fileSize, - file.fileMd5, - ext - ); - } else { - this.logger.debug('[Highway] uploadGroupFileReq file exist, don\'t need upload!'); - } - file.fileUuid = preRespData.upload.fileId; - } - - private async uploadC2CFile(peerUid: string, file: PacketMsgFileElement): Promise { - file.isGroupFile = false; - file.fileMd5 = await computeMd5AndLengthWithLimit(file.filePath); - file.fileSha1 = await calculateSha1(file.filePath); - const req = await trans.UploadPrivateFile.build(this.sig.uid, peerUid, file); - const res = await this.client.sendOidbPacket(req, true); - const preRespData = trans.UploadPrivateFile.parse(res); - if (!preRespData.upload?.boolFileExist) { - this.logger.debug('[Highway] uploadC2CFileReq file not exist, need upload!'); - const ext = new NapProtoMsg(proto.FileUploadExt).encode({ - unknown1: 100, - unknown2: 1, - entry: { - busiBuff: { - senderUin: BigInt(this.sig.uin), - }, - fileEntry: { - fileSize: BigInt(file.fileSize), - md5: file.fileMd5, - md5S2: file.fileMd5, - checkKey: file.fileSha1, - fileId: preRespData.upload?.uuid, - uploadKey: preRespData.upload?.mediaPlatformUploadKey, - }, - clientInfo: { - clientType: 3, - appId: '100', - terminalType: 3, - clientVer: '1.1.1', - unknown: 4 - }, - fileNameInfo: { - fileName: file.fileName - }, - host: { - hosts: [ - { - url: { - host: preRespData.upload?.uploadIp, - unknown: 1, - }, - port: preRespData.upload?.uploadPort, - } - ] - } - }, - unknown200: 1, - unknown3: 0 - }); - await this.hwClient.upload( - 95, - fs.createReadStream(file.filePath, { highWaterMark: BlockSize }), - file.fileSize, - file.fileMd5, - ext - ); - } - file.fileUuid = preRespData.upload?.uuid; - file.fileHash = preRespData.upload?.fileAddon; - const fileExistReq = trans.DownloadOfflineFile.build(file.fileUuid!, file.fileHash!, this.sig.uid, peerUid); - const fileExistRes = await this.client.sendOidbPacket(fileExistReq, true); - file._e37_800_rsp = trans.DownloadOfflineFile.parse(fileExistRes); - file._private_send_uid = this.sig.uid; - file._private_recv_uid = peerUid; + port: preRespData.upload?.uploadPort, + }, + ], + }, + }, + unknown200: 1, + unknown3: 0, + }); + await this.hwClient.upload( + 95, + fs.createReadStream(file.filePath, { highWaterMark: BlockSize }), + file.fileSize, + file.fileMd5, + ext + ); } + file.fileUuid = preRespData.upload?.uuid; + file.fileHash = preRespData.upload?.fileAddon; + const fileExistReq = trans.DownloadOfflineFile.build(file.fileUuid!, file.fileHash!, this.sig.uid, peerUid); + const fileExistRes = await this.client.sendOidbPacket(fileExistReq, true); + file._e37_800_rsp = trans.DownloadOfflineFile.parse(fileExistRes); + file._private_send_uid = this.sig.uid; + file._private_recv_uid = peerUid; + } } diff --git a/src/core/packet/highway/uploader/highwayHttpUploader.ts b/src/core/packet/highway/uploader/highwayHttpUploader.ts index 4c14ce87..27dbba1a 100644 --- a/src/core/packet/highway/uploader/highwayHttpUploader.ts +++ b/src/core/packet/highway/uploader/highwayHttpUploader.ts @@ -6,70 +6,70 @@ import { Frame } from '@/core/packet/highway/frame'; import * as proto from '@/core/packet/transformer/proto'; export class HighwayHttpUploader extends IHighwayUploader { - async upload(): Promise { - const controller = new AbortController(); - const { signal } = controller; - const upload = (async () => { - let offset = 0; - for await (const chunk of this.trans.data) { - if (signal.aborted) { - throw new Error('Upload aborted due to timeout'); - } - const block = chunk as Buffer; - try { - await this.uploadBlock(block, offset); - } catch (err) { - throw new Error(`[Highway] httpUpload Error uploading block at offset ${offset}: ${err}`); - } - offset += block.length; - } - })(); - const timeout = this.timeout().catch((err) => { - controller.abort(); - throw new Error(err.message); - }); - await Promise.race([upload, timeout]); - } + async upload (): Promise { + const controller = new AbortController(); + const { signal } = controller; + const upload = (async () => { + let offset = 0; + for await (const chunk of this.trans.data) { + if (signal.aborted) { + throw new Error('Upload aborted due to timeout'); + } + const block = chunk as Buffer; + try { + await this.uploadBlock(block, offset); + } catch (err) { + throw new Error(`[Highway] httpUpload Error uploading block at offset ${offset}: ${err}`); + } + offset += block.length; + } + })(); + const timeout = this.timeout().catch((err) => { + controller.abort(); + throw new Error(err.message); + }); + await Promise.race([upload, timeout]); + } - private async uploadBlock(block: Buffer, offset: number): Promise { - const chunkMD5 = crypto.createHash('md5').update(block).digest(); - const payload = this.buildPicUpHead(offset, block.length, chunkMD5); - const frame = Frame.pack(Buffer.from(payload), block); - const resp = await this.httpPostHighwayContent(frame, `http://${this.trans.server}:${this.trans.port}/cgi-bin/httpconn?htcmd=0x6FF0087&uin=${this.trans.uin}`); - const [head, body] = Frame.unpack(resp); - const headData = new NapProtoMsg(proto.RespDataHighwayHead).decode(head); - this.logger.debug(`[Highway] httpUploadBlock: ${headData.errorCode} | ${headData.msgSegHead?.retCode} | ${headData.bytesRspExtendInfo} | ${head.toString('hex')} | ${body.toString('hex')}`); - if (headData.errorCode !== 0) throw new Error(`[Highway] httpUploadBlock failed (code=${headData.errorCode})`); - } + private async uploadBlock (block: Buffer, offset: number): Promise { + const chunkMD5 = crypto.createHash('md5').update(block).digest(); + const payload = this.buildPicUpHead(offset, block.length, chunkMD5); + const frame = Frame.pack(Buffer.from(payload), block); + const resp = await this.httpPostHighwayContent(frame, `http://${this.trans.server}:${this.trans.port}/cgi-bin/httpconn?htcmd=0x6FF0087&uin=${this.trans.uin}`); + const [head, body] = Frame.unpack(resp); + const headData = new NapProtoMsg(proto.RespDataHighwayHead).decode(head); + this.logger.debug(`[Highway] httpUploadBlock: ${headData.errorCode} | ${headData.msgSegHead?.retCode} | ${headData.bytesRspExtendInfo} | ${head.toString('hex')} | ${body.toString('hex')}`); + if (headData.errorCode !== 0) throw new Error(`[Highway] httpUploadBlock failed (code=${headData.errorCode})`); + } - private async httpPostHighwayContent(frame: Buffer, serverURL: string): Promise { - return new Promise((resolve, reject) => { - try { - const options: http.RequestOptions = { - method: 'POST', - headers: { - 'Connection': 'keep-alive', - 'Accept-Encoding': 'identity', - 'User-Agent': 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2)', - 'Content-Length': frame.length.toString(), - }, - }; - const req = http.request(serverURL, options, (res) => { - const data: Buffer[] = []; - res.on('data', (chunk) => { - data.push(chunk); - }); - res.on('end', () => { - resolve(Buffer.concat(data)); - }); - }); - req.write(frame); - req.on('error', (error: Error) => { - reject(error); - }); - } catch (error: unknown) { - reject(new Error((error as Error).message)); - } + private async httpPostHighwayContent (frame: Buffer, serverURL: string): Promise { + return new Promise((resolve, reject) => { + try { + const options: http.RequestOptions = { + method: 'POST', + headers: { + Connection: 'keep-alive', + 'Accept-Encoding': 'identity', + 'User-Agent': 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2)', + 'Content-Length': frame.length.toString(), + }, + }; + const req = http.request(serverURL, options, (res) => { + const data: Buffer[] = []; + res.on('data', (chunk) => { + data.push(chunk); + }); + res.on('end', () => { + resolve(Buffer.concat(data)); + }); }); - } + req.write(frame); + req.on('error', (error: Error) => { + reject(error); + }); + } catch (error: unknown) { + reject(new Error((error as Error).message)); + } + }); + } } diff --git a/src/core/packet/highway/uploader/highwayTcpUploader.ts b/src/core/packet/highway/uploader/highwayTcpUploader.ts index 9b98bddc..c32a59aa 100644 --- a/src/core/packet/highway/uploader/highwayTcpUploader.ts +++ b/src/core/packet/highway/uploader/highwayTcpUploader.ts @@ -8,80 +8,79 @@ import { IHighwayUploader } from '@/core/packet/highway/uploader/highwayUploader import * as proto from '@/core/packet/transformer/proto'; class HighwayTcpUploaderTransform extends stream.Transform { - uploader: HighwayTcpUploader; - offset: number; + uploader: HighwayTcpUploader; + offset: number; - constructor(uploader: HighwayTcpUploader) { - super(); - this.uploader = uploader; - this.offset = 0; - } + constructor (uploader: HighwayTcpUploader) { + super(); + this.uploader = uploader; + this.offset = 0; + } - // eslint-disable-next-line no-undef - override _transform(data: Buffer, _: BufferEncoding, callback: stream.TransformCallback) { - let chunkOffset = 0; - while (chunkOffset < data.length) { - const chunkSize = Math.min(BlockSize, data.length - chunkOffset); - const chunk = data.subarray(chunkOffset, chunkOffset + chunkSize); - const chunkMd5 = crypto.createHash('md5').update(chunk).digest(); - const head = this.uploader.buildPicUpHead(this.offset, chunk.length, chunkMd5); - chunkOffset += chunk.length; - this.offset += chunk.length; - this.push(Frame.pack(Buffer.from(head), chunk)); - } - callback(null); + override _transform (data: Buffer, _: BufferEncoding, callback: stream.TransformCallback) { + let chunkOffset = 0; + while (chunkOffset < data.length) { + const chunkSize = Math.min(BlockSize, data.length - chunkOffset); + const chunk = data.subarray(chunkOffset, chunkOffset + chunkSize); + const chunkMd5 = crypto.createHash('md5').update(chunk).digest(); + const head = this.uploader.buildPicUpHead(this.offset, chunk.length, chunkMd5); + chunkOffset += chunk.length; + this.offset += chunk.length; + this.push(Frame.pack(Buffer.from(head), chunk)); } + callback(null); + } } export class HighwayTcpUploader extends IHighwayUploader { - async upload(): Promise { - const controller = new AbortController(); - const { signal } = controller; - const upload = new Promise((resolve, reject) => { - const highwayTransForm = new HighwayTcpUploaderTransform(this); - const socket = net.connect(this.trans.port, this.trans.server, () => { - this.trans.data.pipe(highwayTransForm).pipe(socket, { end: false }); - }); - const handleRspHeader = (header: Buffer) => { - const rsp = new NapProtoMsg(proto.RespDataHighwayHead).decode(header); - if (rsp.errorCode !== 0) { - socket.end(); - reject(new Error(`[Highway] tcpUpload failed (code=${rsp.errorCode})`)); - } - const percent = ((Number(rsp.msgSegHead?.dataOffset) + Number(rsp.msgSegHead?.dataLength)) / Number(rsp.msgSegHead?.filesize)).toFixed(2); - this.logger.debug(`[Highway] tcpUpload ${rsp.errorCode} | ${percent} | ${Buffer.from(header).toString('hex')}`); - if (Number(rsp.msgSegHead?.dataOffset) + Number(rsp.msgSegHead?.dataLength) >= Number(rsp.msgSegHead?.filesize)) { - this.logger.debug('[Highway] tcpUpload finished.'); - socket.end(); - resolve(); - } - }; - socket.on('data', (chunk: Buffer) => { - if (signal.aborted) { - socket.end(); - reject(new Error('Upload aborted due to timeout')); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const [head, _] = Frame.unpack(chunk); - handleRspHeader(head); - }); - socket.on('close', () => { - this.logger.debug('[Highway] tcpUpload socket closed.'); - resolve(); - }); - socket.on('error', (err) => { - socket.end(); - reject(new Error(`[Highway] tcpUpload socket.on error: ${err}`)); - }); - this.trans.data.on('error', (err) => { - socket.end(); - reject(new Error(`[Highway] tcpUpload readable error: ${err}`)); - }); - }); - const timeout = this.timeout().catch((err) => { - controller.abort(); - throw new Error(err.message); - }); - await Promise.race([upload, timeout]); - } + async upload (): Promise { + const controller = new AbortController(); + const { signal } = controller; + const upload = new Promise((resolve, reject) => { + const highwayTransForm = new HighwayTcpUploaderTransform(this); + const socket = net.connect(this.trans.port, this.trans.server, () => { + this.trans.data.pipe(highwayTransForm).pipe(socket, { end: false }); + }); + const handleRspHeader = (header: Buffer) => { + const rsp = new NapProtoMsg(proto.RespDataHighwayHead).decode(header); + if (rsp.errorCode !== 0) { + socket.end(); + reject(new Error(`[Highway] tcpUpload failed (code=${rsp.errorCode})`)); + } + const percent = ((Number(rsp.msgSegHead?.dataOffset) + Number(rsp.msgSegHead?.dataLength)) / Number(rsp.msgSegHead?.filesize)).toFixed(2); + this.logger.debug(`[Highway] tcpUpload ${rsp.errorCode} | ${percent} | ${Buffer.from(header).toString('hex')}`); + if (Number(rsp.msgSegHead?.dataOffset) + Number(rsp.msgSegHead?.dataLength) >= Number(rsp.msgSegHead?.filesize)) { + this.logger.debug('[Highway] tcpUpload finished.'); + socket.end(); + resolve(); + } + }; + socket.on('data', (chunk: Buffer) => { + if (signal.aborted) { + socket.end(); + reject(new Error('Upload aborted due to timeout')); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const [head, _] = Frame.unpack(chunk); + handleRspHeader(head); + }); + socket.on('close', () => { + this.logger.debug('[Highway] tcpUpload socket closed.'); + resolve(); + }); + socket.on('error', (err) => { + socket.end(); + reject(new Error(`[Highway] tcpUpload socket.on error: ${err}`)); + }); + this.trans.data.on('error', (err) => { + socket.end(); + reject(new Error(`[Highway] tcpUpload readable error: ${err}`)); + }); + }); + const timeout = this.timeout().catch((err) => { + controller.abort(); + throw new Error(err.message); + }); + await Promise.race([upload, timeout]); + } } diff --git a/src/core/packet/highway/uploader/highwayUploader.ts b/src/core/packet/highway/uploader/highwayUploader.ts index 57d71409..a2ccbfe5 100644 --- a/src/core/packet/highway/uploader/highwayUploader.ts +++ b/src/core/packet/highway/uploader/highwayUploader.ts @@ -5,59 +5,59 @@ import { PacketLogger } from '@/core/packet/context/loggerContext'; import * as proto from '@/core/packet/transformer/proto'; export abstract class IHighwayUploader { - readonly trans: PacketHighwayTrans; - readonly logger: PacketLogger; + readonly trans: PacketHighwayTrans; + readonly logger: PacketLogger; - constructor(trans: PacketHighwayTrans, logger: PacketLogger) { - this.trans = trans; - this.logger = logger; - } + constructor (trans: PacketHighwayTrans, logger: PacketLogger) { + this.trans = trans; + this.logger = logger; + } - private encryptTransExt(key: Uint8Array) { - if (!this.trans.encrypt) return; - this.trans.ext = tea.encrypt(Buffer.from(this.trans.ext), Buffer.from(key)); - } + private encryptTransExt (key: Uint8Array) { + if (!this.trans.encrypt) return; + this.trans.ext = tea.encrypt(Buffer.from(this.trans.ext), Buffer.from(key)); + } - protected timeout(): Promise { - return new Promise((_, reject) => { - setTimeout(() => { - reject(new Error(`[Highway] timeout after ${this.trans.timeout}s`)); - }, (this.trans.timeout ?? Infinity) * 1000 - ); - }); - } + protected timeout (): Promise { + return new Promise((_, reject) => { + setTimeout(() => { + reject(new Error(`[Highway] timeout after ${this.trans.timeout}s`)); + }, (this.trans.timeout ?? Infinity) * 1000 + ); + }); + } - buildPicUpHead(offset: number, bodyLength: number, bodyMd5: Uint8Array): Uint8Array { - return new NapProtoMsg(proto.ReqDataHighwayHead).encode({ - msgBaseHead: { - version: 1, - uin: this.trans.uin, - command: 'PicUp.DataUp', - seq: 0, - retryTimes: 0, - appId: 1600001604, - dataFlag: 16, - commandId: this.trans.cmd, - }, - msgSegHead: { - serviceId: 0, - filesize: BigInt(this.trans.size), - dataOffset: BigInt(offset), - dataLength: bodyLength, - serviceTicket: this.trans.ticket, - md5: bodyMd5, - fileMd5: this.trans.sum, - cacheAddr: 0, - cachePort: 0, - }, - bytesReqExtendInfo: this.trans.ext, - timestamp: BigInt(0), - msgLoginSigHead: { - uint32LoginSigType: 8, - appId: 1600001604, - } - }); - } + buildPicUpHead (offset: number, bodyLength: number, bodyMd5: Uint8Array): Uint8Array { + return new NapProtoMsg(proto.ReqDataHighwayHead).encode({ + msgBaseHead: { + version: 1, + uin: this.trans.uin, + command: 'PicUp.DataUp', + seq: 0, + retryTimes: 0, + appId: 1600001604, + dataFlag: 16, + commandId: this.trans.cmd, + }, + msgSegHead: { + serviceId: 0, + filesize: BigInt(this.trans.size), + dataOffset: BigInt(offset), + dataLength: bodyLength, + serviceTicket: this.trans.ticket, + md5: bodyMd5, + fileMd5: this.trans.sum, + cacheAddr: 0, + cachePort: 0, + }, + bytesReqExtendInfo: this.trans.ext, + timestamp: BigInt(0), + msgLoginSigHead: { + uint32LoginSigType: 8, + appId: 1600001604, + }, + }); + } - abstract upload(): Promise; + abstract upload (): Promise; } diff --git a/src/core/packet/message/builder.ts b/src/core/packet/message/builder.ts index 8080cd48..bd2826c0 100644 --- a/src/core/packet/message/builder.ts +++ b/src/core/packet/message/builder.ts @@ -6,61 +6,65 @@ import { IPacketMsgElement, PacketMsgTextElement } from '@/core/packet/message/e import { SendTextElement } from '@/core'; export class PacketMsgBuilder { - protected static failBackText = new PacketMsgTextElement( - { - textElement: { content: '[该消息类型暂不支持查看]' } - } as SendTextElement - ); + protected static failBackText = new PacketMsgTextElement( + { + textElement: { content: '[该消息类型暂不支持查看]' }, + } as SendTextElement + ); - buildFakeMsg(selfUid: string, element: PacketMsg[]): NapProtoEncodeStructType[] { - return element.map((node): NapProtoEncodeStructType => { - const avatar = `https://q.qlogo.cn/headimg_dl?dst_uin=${node.senderUin}&spec=640&img_type=jpg`; - const msgContent = node.msg.reduceRight((acc: undefined | Uint8Array, msg: IPacketMsgElement) => { - return acc ?? msg.buildContent(); - }, undefined); - const msgElement = node.msg.flatMap(msg => msg.buildElement() ?? []); - if (!msgContent && !msgElement.length) { - msgElement.push(PacketMsgBuilder.failBackText.buildElement()); + buildFakeMsg (selfUid: string, element: PacketMsg[]): NapProtoEncodeStructType[] { + return element.map((node): NapProtoEncodeStructType => { + const avatar = `https://q.qlogo.cn/headimg_dl?dst_uin=${node.senderUin}&spec=640&img_type=jpg`; + const msgContent = node.msg.reduceRight((acc: undefined | Uint8Array, msg: IPacketMsgElement) => { + return acc ?? msg.buildContent(); + }, undefined); + const msgElement = node.msg.flatMap(msg => msg.buildElement() ?? []); + if (!msgContent && !msgElement.length) { + msgElement.push(PacketMsgBuilder.failBackText.buildElement()); + } + return { + responseHead: { + fromUin: node.senderUin, + type: 0, + sigMap: 0, + toUin: 0, + fromUid: '', + forward: node.groupId + ? undefined + : { + friendName: node.senderName, + }, + toUid: node.groupId ? undefined : selfUid, + grp: node.groupId + ? { + groupUin: node.groupId, + memberName: node.senderName, + unknown5: 2, } - return { - responseHead: { - fromUin: node.senderUin, - type: 0, - sigMap: 0, - toUin: 0, - fromUid: '', - forward: node.groupId ? undefined : { - friendName: node.senderName, - }, - toUid: node.groupId ? undefined : selfUid, - grp: node.groupId ? { - groupUin: node.groupId, - memberName: node.senderName, - unknown5: 2 - } : undefined, - }, - contentHead: { - type: node.groupId ? 82 : 9, - subType: node.groupId ? undefined : 4, - divSeq: node.groupId ? undefined : 4, - autoReply: 0, - sequence: crypto.randomBytes(4).readUInt32LE(0), - timeStamp: +node.time.toString().substring(0, 10), - forward: { - field1: 0, - field2: 0, - field3: node.groupId ? 1 : 2, - unknownBase64: avatar, - avatar: avatar - } - }, - body: { - richText: { - elems: msgElement - }, - msgContent: msgContent, - } - }; - }); - } + : undefined, + }, + contentHead: { + type: node.groupId ? 82 : 9, + subType: node.groupId ? undefined : 4, + divSeq: node.groupId ? undefined : 4, + autoReply: 0, + sequence: crypto.randomBytes(4).readUInt32LE(0), + timeStamp: +node.time.toString().substring(0, 10), + forward: { + field1: 0, + field2: 0, + field3: node.groupId ? 1 : 2, + unknownBase64: avatar, + avatar, + }, + }, + body: { + richText: { + elems: msgElement, + }, + msgContent, + }, + }; + }); + } } diff --git a/src/core/packet/message/converter.ts b/src/core/packet/message/converter.ts index 653677cc..4acb3ac8 100644 --- a/src/core/packet/message/converter.ts +++ b/src/core/packet/message/converter.ts @@ -1,170 +1,170 @@ import { - ChatType, - ElementType, - MessageElement, - Peer, - RawMessage, - SendArkElement, - SendFaceElement, - SendFileElement, - SendMarkdownElement, - SendMarketFaceElement, - SendMultiForwardMsgElement, - SendPicElement, - SendPttElement, - SendReplyElement, - SendTextElement, - SendVideoElement + ChatType, + ElementType, + MessageElement, + Peer, + RawMessage, + SendArkElement, + SendFaceElement, + SendFileElement, + SendMarkdownElement, + SendMarketFaceElement, + SendMultiForwardMsgElement, + SendPicElement, + SendPttElement, + SendReplyElement, + SendTextElement, + SendVideoElement, } from '@/core'; import { - IPacketMsgElement, - PacketMsgAtElement, - PacketMsgFaceElement, - PacketMsgFileElement, - PacketMsgLightAppElement, - PacketMsgMarkDownElement, - PacketMsgMarkFaceElement, - PacketMsgPicElement, - PacketMsgPttElement, - PacketMsgReplyElement, - PacketMsgTextElement, - PacketMsgVideoElement, - PacketMultiMsgElement + IPacketMsgElement, + PacketMsgAtElement, + PacketMsgFaceElement, + PacketMsgFileElement, + PacketMsgLightAppElement, + PacketMsgMarkDownElement, + PacketMsgMarkFaceElement, + PacketMsgPicElement, + PacketMsgPttElement, + PacketMsgReplyElement, + PacketMsgTextElement, + PacketMsgVideoElement, + PacketMultiMsgElement, } from '@/core/packet/message/element'; -import {PacketMsg, PacketSendMsgElement} from '@/core/packet/message/message'; -import {NapProtoDecodeStructType} from '@napneko/nap-proto-core'; -import {Elem} from '@/core/packet/transformer/proto'; +import { PacketMsg, PacketSendMsgElement } from '@/core/packet/message/message'; +import { NapProtoDecodeStructType } from '@napneko/nap-proto-core'; +import { Elem } from '@/core/packet/transformer/proto'; const SupportedElementTypes = [ - ElementType.TEXT, - ElementType.PIC, - ElementType.REPLY, - ElementType.FACE, - ElementType.MFACE, - ElementType.VIDEO, - ElementType.FILE, - ElementType.PTT, - ElementType.ARK, - ElementType.MARKDOWN, - ElementType.MULTIFORWARD + ElementType.TEXT, + ElementType.PIC, + ElementType.REPLY, + ElementType.FACE, + ElementType.MFACE, + ElementType.VIDEO, + ElementType.FILE, + ElementType.PTT, + ElementType.ARK, + ElementType.MARKDOWN, + ElementType.MULTIFORWARD, ]; type SendMessageTypeElementMap = { - [ElementType.TEXT]: SendTextElement, - [ElementType.PIC]: SendPicElement, - [ElementType.FILE]: SendFileElement, - [ElementType.PTT]: SendPttElement, - [ElementType.VIDEO]: SendVideoElement, - [ElementType.FACE]: SendFaceElement, - [ElementType.REPLY]: SendReplyElement, - [ElementType.ARK]: SendArkElement, - [ElementType.MFACE]: SendMarketFaceElement, - [ElementType.MULTIFORWARD]: SendMultiForwardMsgElement, - [ElementType.MARKDOWN]: SendMarkdownElement, + [ElementType.TEXT]: SendTextElement, + [ElementType.PIC]: SendPicElement, + [ElementType.FILE]: SendFileElement, + [ElementType.PTT]: SendPttElement, + [ElementType.VIDEO]: SendVideoElement, + [ElementType.FACE]: SendFaceElement, + [ElementType.REPLY]: SendReplyElement, + [ElementType.ARK]: SendArkElement, + [ElementType.MFACE]: SendMarketFaceElement, + [ElementType.MULTIFORWARD]: SendMultiForwardMsgElement, + [ElementType.MARKDOWN]: SendMarkdownElement, }; type ElementToPacketMsgConverters = { - [K in keyof SendMessageTypeElementMap]: ( - sendElement: MessageElement - ) => IPacketMsgElement; -} + [K in keyof SendMessageTypeElementMap]: ( + sendElement: MessageElement + ) => IPacketMsgElement; +}; export type rawMsgWithSendMsg = { - senderUin: number; - senderUid?: string; - senderName: string; - groupId?: number; - time: number; - msg: PacketSendMsgElement[] -} + senderUin: number; + senderUid?: string; + senderName: string; + groupId?: number; + time: number; + msg: PacketSendMsgElement[] +}; // TODO: make it become adapter? export class PacketMsgConverter { - private isValidElementType(type: ElementType): type is keyof ElementToPacketMsgConverters { - return SupportedElementTypes.includes(type); - } + private isValidElementType (type: ElementType): type is keyof ElementToPacketMsgConverters { + return SupportedElementTypes.includes(type); + } - private readonly rawToPacketMsgConverters: ElementToPacketMsgConverters = { - [ElementType.TEXT]: (element) => { - if (element.textElement?.atType) { - return new PacketMsgAtElement(element as SendTextElement); - } - return new PacketMsgTextElement(element as SendTextElement); - }, - [ElementType.PIC]: (element) => { - return new PacketMsgPicElement(element as SendPicElement); - }, - [ElementType.REPLY]: (element) => { - return new PacketMsgReplyElement(element as SendReplyElement); - }, - [ElementType.FACE]: (element) => { - return new PacketMsgFaceElement(element as SendFaceElement); - }, - [ElementType.MFACE]: (element) => { - return new PacketMsgMarkFaceElement(element as SendMarketFaceElement); - }, - [ElementType.VIDEO]: (element) => { - return new PacketMsgVideoElement(element as SendVideoElement); - }, - [ElementType.FILE]: (element) => { - return new PacketMsgFileElement(element as SendFileElement); - }, - [ElementType.PTT]: (element) => { - return new PacketMsgPttElement(element as SendPttElement); - }, - [ElementType.ARK]: (element) => { - return new PacketMsgLightAppElement(element as SendArkElement); - }, - [ElementType.MARKDOWN]: (element) => { - return new PacketMsgMarkDownElement(element as SendMarkdownElement); - }, - [ElementType.MULTIFORWARD]: (element) => { - return new PacketMultiMsgElement(element as SendMultiForwardMsgElement); - } + private readonly rawToPacketMsgConverters: ElementToPacketMsgConverters = { + [ElementType.TEXT]: (element) => { + if (element.textElement?.atType) { + return new PacketMsgAtElement(element as SendTextElement); + } + return new PacketMsgTextElement(element as SendTextElement); + }, + [ElementType.PIC]: (element) => { + return new PacketMsgPicElement(element as SendPicElement); + }, + [ElementType.REPLY]: (element) => { + return new PacketMsgReplyElement(element as SendReplyElement); + }, + [ElementType.FACE]: (element) => { + return new PacketMsgFaceElement(element as SendFaceElement); + }, + [ElementType.MFACE]: (element) => { + return new PacketMsgMarkFaceElement(element as SendMarketFaceElement); + }, + [ElementType.VIDEO]: (element) => { + return new PacketMsgVideoElement(element as SendVideoElement); + }, + [ElementType.FILE]: (element) => { + return new PacketMsgFileElement(element as SendFileElement); + }, + [ElementType.PTT]: (element) => { + return new PacketMsgPttElement(element as SendPttElement); + }, + [ElementType.ARK]: (element) => { + return new PacketMsgLightAppElement(element as SendArkElement); + }, + [ElementType.MARKDOWN]: (element) => { + return new PacketMsgMarkDownElement(element as SendMarkdownElement); + }, + [ElementType.MULTIFORWARD]: (element) => { + return new PacketMultiMsgElement(element as SendMultiForwardMsgElement); + }, + }; + + rawMsgWithSendMsgToPacketMsg (msg: rawMsgWithSendMsg): PacketMsg { + return { + senderUid: msg.senderUid ?? '', + senderUin: msg.senderUin, + senderName: msg.senderName, + groupId: msg.groupId, + time: msg.time, + msg: msg.msg.map((element) => { + if (!this.isValidElementType(element.elementType)) return null; + return this.rawToPacketMsgConverters[element.elementType](element as MessageElement); + }).filter((e) => e !== null), }; + } - rawMsgWithSendMsgToPacketMsg(msg: rawMsgWithSendMsg): PacketMsg { - return { - senderUid: msg.senderUid ?? '', - senderUin: msg.senderUin, - senderName: msg.senderName, - groupId: msg.groupId, - time: msg.time, - msg: msg.msg.map((element) => { - if (!this.isValidElementType(element.elementType)) return null; - return this.rawToPacketMsgConverters[element.elementType](element as MessageElement); - }).filter((e) => e !== null) - }; - } + rawMsgToPacketMsg (msg: RawMessage, ctxPeer: Peer): PacketMsg { + return { + seq: +msg.msgSeq, + groupId: ctxPeer.chatType === ChatType.KCHATTYPEGROUP ? +msg.peerUid : undefined, + senderUid: msg.senderUid, + senderUin: +msg.senderUin, + senderName: msg.sendMemberName && msg.sendMemberName !== '' + ? msg.sendMemberName + : msg.sendNickName && msg.sendNickName !== '' + ? msg.sendNickName + : 'QQ用户', + time: +msg.msgTime, + msg: msg.elements.map((element) => { + if (!this.isValidElementType(element.elementType)) return null; + return this.rawToPacketMsgConverters[element.elementType](element); + }).filter((e) => e !== null), + }; + } - rawMsgToPacketMsg(msg: RawMessage, ctxPeer: Peer): PacketMsg { - return { - seq: +msg.msgSeq, - groupId: ctxPeer.chatType === ChatType.KCHATTYPEGROUP ? +msg.peerUid : undefined, - senderUid: msg.senderUid, - senderUin: +msg.senderUin, - senderName: msg.sendMemberName && msg.sendMemberName !== '' - ? msg.sendMemberName - : msg.sendNickName && msg.sendNickName !== '' - ? msg.sendNickName - : 'QQ用户', - time: +msg.msgTime, - msg: msg.elements.map((element) => { - if (!this.isValidElementType(element.elementType)) return null; - return this.rawToPacketMsgConverters[element.elementType](element); - }).filter((e) => e !== null) - }; - } - - packetMsgToRaw(msg: NapProtoDecodeStructType[]): [MessageElement, NapProtoDecodeStructType | null][] { - const converters = [PacketMsgTextElement.parseElement, - PacketMsgAtElement.parseElement, PacketMsgReplyElement.parseElement, PacketMsgPicElement.parseElement]; - return msg.map((element) => { - for (const converter of converters) { - const result = converter(element); - if (result) return result; - } - return null; - }).filter((e) => e !== null); - } + packetMsgToRaw (msg: NapProtoDecodeStructType[]): [MessageElement, NapProtoDecodeStructType | null][] { + const converters = [PacketMsgTextElement.parseElement, + PacketMsgAtElement.parseElement, PacketMsgReplyElement.parseElement, PacketMsgPicElement.parseElement]; + return msg.map((element) => { + for (const converter of converters) { + const result = converter(element); + if (result) return result; + } + return null; + }).filter((e) => e !== null); + } } diff --git a/src/core/packet/message/element.ts b/src/core/packet/message/element.ts index 7ed98fc1..dccfc8db 100644 --- a/src/core/packet/message/element.ts +++ b/src/core/packet/message/element.ts @@ -1,40 +1,40 @@ import * as zlib from 'node:zlib'; -import {NapProtoDecodeStructType, NapProtoEncodeStructType, NapProtoMsg} from '@napneko/nap-proto-core'; +import { NapProtoDecodeStructType, NapProtoEncodeStructType, NapProtoMsg } from '@napneko/nap-proto-core'; import { - CustomFace, - Elem, - FileExtra, - GroupFileExtra, - MarkdownData, - MentionExtra, - MsgInfo, - NotOnlineImage, - OidbSvcTrpcTcp0XE37_800Response, - PushMsgBody, - QBigFaceExtra, - QSmallFaceExtra, + CustomFace, + Elem, + FileExtra, + GroupFileExtra, + MarkdownData, + MentionExtra, + MsgInfo, + NotOnlineImage, + OidbSvcTrpcTcp0XE37_800Response, + PushMsgBody, + QBigFaceExtra, + QSmallFaceExtra, } from '@/core/packet/transformer/proto'; import { - ElementType, - FaceType, - MessageElement, - NTMsgAtType, - PicType, - SendArkElement, - SendFaceElement, - SendFileElement, - SendMarkdownElement, - SendMarketFaceElement, - SendPicElement, - SendPttElement, - SendReplyElement, - SendMultiForwardMsgElement, - SendTextElement, - SendVideoElement, - Peer + ElementType, + FaceType, + MessageElement, + NTMsgAtType, + PicType, + SendArkElement, + SendFaceElement, + SendFileElement, + SendMarkdownElement, + SendMarketFaceElement, + SendPicElement, + SendPttElement, + SendReplyElement, + SendMultiForwardMsgElement, + SendTextElement, + SendVideoElement, + Peer, } from '@/core'; -import {ForwardMsgBuilder} from '@/common/forward-msg-builder'; -import {PacketMsg, PacketSendMsgElement} from '@/core/packet/message/message'; +import { ForwardMsgBuilder } from '@/common/forward-msg-builder'; +import { PacketMsg, PacketSendMsgElement } from '@/core/packet/message/message'; export type ParseElementFnR = [MessageElement, NapProtoDecodeStructType | null] | undefined; type ParseElementFn = (elem: NapProtoDecodeStructType) => ParseElementFnR; @@ -42,648 +42,648 @@ type ParseElementFn = (elem: NapProtoDecodeStructType) => ParseElem // raw <-> packet // TODO: SendStructLongMsgElement export abstract class IPacketMsgElement { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - protected constructor(_rawElement: T) { - } + protected constructor (_rawElement: T) { + } - get valid(): boolean { - return true; - } + get valid (): boolean { + return true; + } - buildContent(): Uint8Array | undefined { - return undefined; - } + buildContent (): Uint8Array | undefined { + return undefined; + } - buildElement(): NapProtoEncodeStructType[] { - return []; - } + buildElement (): NapProtoEncodeStructType[] { + return []; + } - static parseElement: ParseElementFn; + static parseElement: ParseElementFn; - toPreview(): string { - return '[暂不支持该消息类型喵~]'; - } + toPreview (): string { + return '[暂不支持该消息类型喵~]'; + } } export class PacketMsgTextElement extends IPacketMsgElement { - text: string; + text: string; - constructor(element: SendTextElement) { - super(element); - this.text = element.textElement.content; + constructor (element: SendTextElement) { + super(element); + this.text = element.textElement.content; + } + + override buildElement (): NapProtoEncodeStructType[] { + return [{ + text: { + str: this.text, + }, + }]; + } + + static override parseElement = (elem: NapProtoDecodeStructType): ParseElementFnR => { + if (elem.text?.str && (elem.text?.attr6Buf === undefined || elem.text?.attr6Buf?.length === 0)) { + return [{ + textElement: { + content: elem.text?.str, + atType: NTMsgAtType.ATTYPEUNKNOWN, + atUid: '', + atTinyId: '', + atNtUid: '', + }, + elementType: ElementType.UNKNOWN, + elementId: '', + }, null]; } + return undefined; + }; - override buildElement(): NapProtoEncodeStructType[] { - return [{ - text: { - str: this.text - } - }]; - } - - static override parseElement = (elem: NapProtoDecodeStructType): ParseElementFnR => { - if (elem.text?.str && (elem.text?.attr6Buf === undefined || elem.text?.attr6Buf?.length === 0)) { - return [{ - textElement: { - content: elem.text?.str, - atType: NTMsgAtType.ATTYPEUNKNOWN, - atUid: '', - atTinyId: '', - atNtUid: '', - }, - elementType: ElementType.UNKNOWN, - elementId: '', - }, null]; - } - return undefined; - }; - - override toPreview(): string { - return this.text; - }; + override toPreview (): string { + return this.text; + } } - - export class PacketMsgAtElement extends PacketMsgTextElement { - targetUid: string; - atAll: boolean; + targetUid: string; + atAll: boolean; - constructor(element: SendTextElement) { - super(element); - this.targetUid = element.textElement.atNtUid; - this.atAll = element.textElement.atType === NTMsgAtType.ATTYPEALL; - } + constructor (element: SendTextElement) { + super(element); + this.targetUid = element.textElement.atNtUid; + this.atAll = element.textElement.atType === NTMsgAtType.ATTYPEALL; + } - override buildElement(): NapProtoEncodeStructType[] { - return [{ - text: { - str: this.text, - pbReserve: new NapProtoMsg(MentionExtra).encode({ - type: this.atAll ? 1 : 2, - uin: 0, - field5: 0, - uid: this.targetUid, - } - ) - } - }]; - } - static override parseElement = (elem: NapProtoDecodeStructType): ParseElementFnR => { - if (elem.text?.str && (elem.text?.attr6Buf?.length ?? 100) >= 11) { - return [{ - textElement: { - content: elem.text?.str, - atType: NTMsgAtType.ATTYPEONE, - atUid: String(Buffer.from(elem.text!.attr6Buf!).readUInt32BE(7)), // FIXME: hack - atTinyId: '', - atNtUid: '', - }, - elementType: ElementType.UNKNOWN, - elementId: '', - }, null]; + override buildElement (): NapProtoEncodeStructType[] { + return [{ + text: { + str: this.text, + pbReserve: new NapProtoMsg(MentionExtra).encode({ + type: this.atAll ? 1 : 2, + uin: 0, + field5: 0, + uid: this.targetUid, } - return undefined; - }; + ), + }, + }]; + } + + static override parseElement = (elem: NapProtoDecodeStructType): ParseElementFnR => { + if (elem.text?.str && (elem.text?.attr6Buf?.length ?? 100) >= 11) { + return [{ + textElement: { + content: elem.text?.str, + atType: NTMsgAtType.ATTYPEONE, + atUid: String(Buffer.from(elem.text!.attr6Buf!).readUInt32BE(7)), // FIXME: hack + atTinyId: '', + atNtUid: '', + }, + elementType: ElementType.UNKNOWN, + elementId: '', + }, null]; + } + return undefined; + }; } export class PacketMsgReplyElement extends IPacketMsgElement { - time: number; - targetMessageId: bigint; - targetMessageSeq: number; - targetMessageClientSeq: number; - targetUin: number; - targetUid: string; - targetElems?: NapProtoEncodeStructType[]; - targetSourceMsg?: NapProtoEncodeStructType; - targetPeer?: Peer; + time: number; + targetMessageId: bigint; + targetMessageSeq: number; + targetMessageClientSeq: number; + targetUin: number; + targetUid: string; + targetElems?: NapProtoEncodeStructType[]; + targetSourceMsg?: NapProtoEncodeStructType; + targetPeer?: Peer; - constructor(element: SendReplyElement) { - super(element); - this.time = +(element.replyElement.replyMsgTime ?? Math.floor(Date.now() / 1000)); - this.targetMessageId = BigInt(element.replyElement.replayMsgId ?? 0); - this.targetMessageSeq = +(element.replyElement.replayMsgSeq ?? 0); - this.targetMessageClientSeq = +(element.replyElement.replyMsgClientSeq ?? 0); - this.targetUin = +(element.replyElement.senderUin ?? 0); - this.targetUid = element.replyElement.senderUidStr ?? ''; - this.targetPeer = element.replyElement._replyMsgPeer; + constructor (element: SendReplyElement) { + super(element); + this.time = +(element.replyElement.replyMsgTime ?? Math.floor(Date.now() / 1000)); + this.targetMessageId = BigInt(element.replyElement.replayMsgId ?? 0); + this.targetMessageSeq = +(element.replyElement.replayMsgSeq ?? 0); + this.targetMessageClientSeq = +(element.replyElement.replyMsgClientSeq ?? 0); + this.targetUin = +(element.replyElement.senderUin ?? 0); + this.targetUid = element.replyElement.senderUidStr ?? ''; + this.targetPeer = element.replyElement._replyMsgPeer; + } + + get isGroupReply (): boolean { + return this.targetMessageClientSeq === 0; + } + + override buildElement (): NapProtoEncodeStructType[] { + return [{ + srcMsg: { + origSeqs: [this.isGroupReply ? this.targetMessageSeq : this.targetMessageClientSeq], + senderUin: BigInt(this.targetUin), + time: this.time, + elems: this.targetElems ?? [], + sourceMsg: new NapProtoMsg(PushMsgBody).encode(this.targetSourceMsg ?? {}), + toUin: BigInt(0), + }, + }]; + } + + static override parseElement = (elem: NapProtoDecodeStructType): ParseElementFnR => { + if (elem.srcMsg && elem.srcMsg.pbReserve) { + const reserve = elem.srcMsg.pbReserve; + return [{ + replyElement: { + replayMsgSeq: String(reserve.friendSeq ?? elem.srcMsg?.origSeqs?.[0] ?? 0), + replayMsgId: String(reserve.messageId ?? 0), + senderUin: String(elem?.srcMsg ?? 0), + }, + elementType: ElementType.UNKNOWN, + elementId: '', + }, null]; } + return undefined; + }; - get isGroupReply(): boolean { - return this.targetMessageClientSeq === 0; - } - - override buildElement(): NapProtoEncodeStructType[] { - return [{ - srcMsg: { - origSeqs: [this.isGroupReply ? this.targetMessageSeq : this.targetMessageClientSeq], - senderUin: BigInt(this.targetUin), - time: this.time, - elems: this.targetElems ?? [], - sourceMsg: new NapProtoMsg(PushMsgBody).encode(this.targetSourceMsg ?? {}), - toUin: BigInt(0), - } - }]; - } - - static override parseElement = (elem: NapProtoDecodeStructType): ParseElementFnR => { - if (elem.srcMsg && elem.srcMsg.pbReserve) { - const reserve = elem.srcMsg.pbReserve; - return [{ - replyElement: { - replayMsgSeq: String(reserve.friendSeq ?? elem.srcMsg?.origSeqs?.[0] ?? 0), - replayMsgId: String(reserve.messageId ?? 0), - senderUin: String(elem?.srcMsg ?? 0) - }, - elementType: ElementType.UNKNOWN, - elementId: '', - }, null]; - } - return undefined; - }; - - override toPreview(): string { - return '[回复消息]'; - } + override toPreview (): string { + return '[回复消息]'; + } } export class PacketMsgFaceElement extends IPacketMsgElement { - faceId: number; - isLargeFace: boolean; - resultId?: string; + faceId: number; + isLargeFace: boolean; + resultId?: string; - constructor(element: SendFaceElement) { - super(element); - this.faceId = element.faceElement.faceIndex; - this.resultId = element.faceElement.resultId; - this.isLargeFace = element.faceElement.faceType === FaceType.AniSticke; + constructor (element: SendFaceElement) { + super(element); + this.faceId = element.faceElement.faceIndex; + this.resultId = element.faceElement.resultId; + this.isLargeFace = element.faceElement.faceType === FaceType.AniSticke; + } + + override buildElement (): NapProtoEncodeStructType[] { + if (this.isLargeFace) { + return [{ + commonElem: { + serviceType: 37, + pbElem: new NapProtoMsg(QBigFaceExtra).encode({ + aniStickerPackId: '1', + aniStickerId: '8', + faceId: this.faceId, + sourceType: 1, + resultId: this.resultId, + preview: '', + randomType: 1, + }), + businessType: 1, + }, + }]; + } else if (this.faceId < 260) { + return [{ + face: { + index: this.faceId, + }, + }]; + } else { + return [{ + commonElem: { + serviceType: 33, + pbElem: new NapProtoMsg(QSmallFaceExtra).encode({ + faceId: this.faceId, + preview: '', + preview2: '', + }), + businessType: 1, + }, + }]; } + } - override buildElement(): NapProtoEncodeStructType[] { - if (this.isLargeFace) { - return [{ - commonElem: { - serviceType: 37, - pbElem: new NapProtoMsg(QBigFaceExtra).encode({ - aniStickerPackId: '1', - aniStickerId: '8', - faceId: this.faceId, - sourceType: 1, - resultId: this.resultId, - preview: '', - randomType: 1 - }), - businessType: 1 - } - }]; - } else if (this.faceId < 260) { - return [{ - face: { - index: this.faceId - } - }]; - } else { - return [{ - commonElem: { - serviceType: 33, - pbElem: new NapProtoMsg(QSmallFaceExtra).encode({ - faceId: this.faceId, - preview: '', - preview2: '' - }), - businessType: 1 - } - }]; - } + static override parseElement = (elem: NapProtoDecodeStructType): ParseElementFnR => { + if (elem.face?.index) { + return [{ + faceElement: { + faceIndex: elem.face.index, + faceType: FaceType.Normal, + }, + elementType: ElementType.UNKNOWN, + elementId: '', + }, null]; } - - static override parseElement = (elem: NapProtoDecodeStructType): ParseElementFnR => { - if (elem.face?.index) { - return [{ - faceElement: { - faceIndex: elem.face.index, - faceType: FaceType.Normal - }, - elementType: ElementType.UNKNOWN, - elementId: '', - }, null]; - } - if (elem?.commonElem?.serviceType === 37 && elem?.commonElem?.pbElem) { - const qface = new NapProtoMsg(QBigFaceExtra).decode(elem?.commonElem?.pbElem); - if (qface?.faceId) { - return [{ - faceElement: { - faceIndex: qface.faceId, - faceType: FaceType.Normal - }, - elementType: ElementType.UNKNOWN, - elementId: '', - }, null]; - } - } - if (elem?.commonElem?.serviceType === 33 && elem?.commonElem?.pbElem) { - const qface = new NapProtoMsg(QSmallFaceExtra).decode(elem?.commonElem?.pbElem); - if (qface?.faceId) { - return [{ - faceElement: { - faceIndex: qface.faceId, - faceType: FaceType.Normal - }, - elementType: ElementType.UNKNOWN, - elementId: '', - }, null]; - } - } - return undefined; - }; - - override toPreview(): string { - return '[表情]'; + if (elem?.commonElem?.serviceType === 37 && elem?.commonElem?.pbElem) { + const qface = new NapProtoMsg(QBigFaceExtra).decode(elem?.commonElem?.pbElem); + if (qface?.faceId) { + return [{ + faceElement: { + faceIndex: qface.faceId, + faceType: FaceType.Normal, + }, + elementType: ElementType.UNKNOWN, + elementId: '', + }, null]; + } } + if (elem?.commonElem?.serviceType === 33 && elem?.commonElem?.pbElem) { + const qface = new NapProtoMsg(QSmallFaceExtra).decode(elem?.commonElem?.pbElem); + if (qface?.faceId) { + return [{ + faceElement: { + faceIndex: qface.faceId, + faceType: FaceType.Normal, + }, + elementType: ElementType.UNKNOWN, + elementId: '', + }, null]; + } + } + return undefined; + }; + + override toPreview (): string { + return '[表情]'; + } } export class PacketMsgMarkFaceElement extends IPacketMsgElement { - emojiName: string; - emojiId: string; - emojiPackageId: number; - emojiKey: string; + emojiName: string; + emojiId: string; + emojiPackageId: number; + emojiKey: string; - constructor(element: SendMarketFaceElement) { - super(element); - this.emojiName = element.marketFaceElement.faceName; - this.emojiId = element.marketFaceElement.emojiId; - this.emojiPackageId = element.marketFaceElement.emojiPackageId; - this.emojiKey = element.marketFaceElement.key; - } + constructor (element: SendMarketFaceElement) { + super(element); + this.emojiName = element.marketFaceElement.faceName; + this.emojiId = element.marketFaceElement.emojiId; + this.emojiPackageId = element.marketFaceElement.emojiPackageId; + this.emojiKey = element.marketFaceElement.key; + } - override buildElement(): NapProtoEncodeStructType[] { - return [{ - marketFace: { - faceName: this.emojiName, - itemType: 6, - faceInfo: 1, - faceId: Buffer.from(this.emojiId, 'hex'), - tabId: this.emojiPackageId, - subType: 3, - key: this.emojiKey, - imageWidth: 300, - imageHeight: 300, - pbReserve: { - field8: 1 - } - } - }]; - } + override buildElement (): NapProtoEncodeStructType[] { + return [{ + marketFace: { + faceName: this.emojiName, + itemType: 6, + faceInfo: 1, + faceId: Buffer.from(this.emojiId, 'hex'), + tabId: this.emojiPackageId, + subType: 3, + key: this.emojiKey, + imageWidth: 300, + imageHeight: 300, + pbReserve: { + field8: 1, + }, + }, + }]; + } - override toPreview(): string { - return `${this.emojiName}`; - } + override toPreview (): string { + return `${this.emojiName}`; + } } export class PacketMsgPicElement extends IPacketMsgElement { - path: string; - name: string; - size: number; - md5: string; - width: number; - height: number; - picType: PicType; - picSubType: number; - summary: string; - sha1: string | null = null; - msgInfo: NapProtoEncodeStructType | null = null; - groupPicExt: NapProtoEncodeStructType | null = null; - c2cPicExt: NapProtoEncodeStructType | null = null; + path: string; + name: string; + size: number; + md5: string; + width: number; + height: number; + picType: PicType; + picSubType: number; + summary: string; + sha1: string | null = null; + msgInfo: NapProtoEncodeStructType | null = null; + groupPicExt: NapProtoEncodeStructType | null = null; + c2cPicExt: NapProtoEncodeStructType | null = null; - constructor(element: SendPicElement) { - super(element); - this.path = element.picElement.sourcePath; - this.name = element.picElement.fileName; - this.size = +element.picElement.fileSize; - this.md5 = element.picElement.md5HexStr ?? ''; - this.width = element.picElement.picWidth; - this.height = element.picElement.picHeight; - this.picType = element.picElement.picType; - this.picSubType = element.picElement.picSubType ?? 0; - this.summary = element.picElement.summary === '' ? ( - element.picElement.picSubType === 0 ? '[图片]' : '[动画表情]' - ) : element.picElement.summary; + constructor (element: SendPicElement) { + super(element); + this.path = element.picElement.sourcePath; + this.name = element.picElement.fileName; + this.size = +element.picElement.fileSize; + this.md5 = element.picElement.md5HexStr ?? ''; + this.width = element.picElement.picWidth; + this.height = element.picElement.picHeight; + this.picType = element.picElement.picType; + this.picSubType = element.picElement.picSubType ?? 0; + this.summary = element.picElement.summary === '' + ? ( + element.picElement.picSubType === 0 ? '[图片]' : '[动画表情]' + ) + : element.picElement.summary; + } + + override get valid (): boolean { + return !!this.msgInfo; + } + + override buildElement (): NapProtoEncodeStructType[] { + if (!this.msgInfo) return []; + return [{ + commonElem: { + serviceType: 48, + pbElem: new NapProtoMsg(MsgInfo).encode(this.msgInfo), + businessType: 10, + }, + }]; + } + + static override parseElement = (elem: NapProtoDecodeStructType): ParseElementFnR => { + if (elem?.commonElem?.serviceType === 48 || [10, 20].includes(elem?.commonElem?.businessType ?? 0)) { + const extra = new NapProtoMsg(MsgInfo).decode(elem.commonElem!.pbElem!); + const msgInfoBody = extra.msgInfoBody[0]; + const index = msgInfoBody?.index; + return [{ + picElement: { + fileSize: index?.info.fileSize ?? 0, + picWidth: index?.info?.width ?? 0, + picHeight: index?.info?.height ?? 0, + fileName: index?.info?.fileHash ?? '', + sourcePath: '', + original: false, + picType: PicType.NEWPIC_APNG, + fileUuid: '', + fileSubId: '', + thumbFileSize: 0, + summary: '[图片]', + thumbPath: new Map(), + }, + elementType: ElementType.UNKNOWN, + elementId: '', + }, elem]; } - - override get valid(): boolean { - return !!this.msgInfo; + if (elem?.notOnlineImage) { + const img = elem?.notOnlineImage; // url in originImageUrl + const preImg: MessageElement = { + picElement: { + fileSize: img.fileLen ?? 0, + picWidth: img.picWidth ?? 0, + picHeight: img.picHeight ?? 0, + fileName: Buffer.from(img.picMd5!).toString('hex') ?? '', + sourcePath: '', + original: false, + picType: PicType.NEWPIC_APNG, + fileUuid: '', + fileSubId: '', + thumbFileSize: 0, + summary: '[图片]', + thumbPath: new Map(), + }, + elementType: ElementType.UNKNOWN, + elementId: '', + }; + if (img.origUrl?.includes('&fileid=')) { + preImg.picElement!.originImageUrl = `https://multimedia.nt.qq.com.cn${img.origUrl}`; + } else { + preImg.picElement!.originImageUrl = `https://gchat.qpic.cn${img.origUrl}`; + } + return [preImg, elem]; } + return undefined; + }; - override buildElement(): NapProtoEncodeStructType[] { - if (!this.msgInfo) return []; - return [{ - commonElem: { - serviceType: 48, - pbElem: new NapProtoMsg(MsgInfo).encode(this.msgInfo), - businessType: 10, - } - }]; - } - - static override parseElement = (elem: NapProtoDecodeStructType): ParseElementFnR => { - if (elem?.commonElem?.serviceType === 48 || [10, 20].includes(elem?.commonElem?.businessType ?? 0)) { - const extra = new NapProtoMsg(MsgInfo).decode(elem.commonElem!.pbElem!); - const msgInfoBody = extra.msgInfoBody[0]; - const index = msgInfoBody?.index; - return [{ - picElement: { - fileSize: index?.info.fileSize ?? 0, - picWidth: index?.info?.width ?? 0, - picHeight: index?.info?.height ?? 0, - fileName: index?.info?.fileHash ?? '', - sourcePath: '', - original: false, - picType: PicType.NEWPIC_APNG, - fileUuid: '', - fileSubId: '', - thumbFileSize: 0, - summary: '[图片]', - thumbPath: new Map(), - }, - elementType: ElementType.UNKNOWN, - elementId: '', - }, elem]; - } - if (elem?.notOnlineImage) { - const img = elem?.notOnlineImage; // url in originImageUrl - const preImg: MessageElement = { - picElement: { - fileSize: img.fileLen ?? 0, - picWidth: img.picWidth ?? 0, - picHeight: img.picHeight ?? 0, - fileName: Buffer.from(img.picMd5!).toString('hex') ?? '', - sourcePath: '', - original: false, - picType: PicType.NEWPIC_APNG, - fileUuid: '', - fileSubId: '', - thumbFileSize: 0, - summary: '[图片]', - thumbPath: new Map(), - }, - elementType: ElementType.UNKNOWN, - elementId: '', - }; - if (img.origUrl?.includes('&fileid=')) { - preImg.picElement!.originImageUrl = `https://multimedia.nt.qq.com.cn${img.origUrl}`; - } else { - preImg.picElement!.originImageUrl = `https://gchat.qpic.cn${img.origUrl}`; - } - return [preImg, elem]; - } - return undefined; - }; - - override toPreview(): string { - return this.summary; - } + override toPreview (): string { + return this.summary; + } } export class PacketMsgVideoElement extends IPacketMsgElement { - fileSize?: string; - filePath?: string; - thumbSize?: number; - thumbPath?: string; - fileMd5?: string; - fileSha1?: string; - thumbMd5?: string; - thumbSha1?: string; - thumbWidth?: number; - thumbHeight?: number; - msgInfo: NapProtoEncodeStructType | null = null; + fileSize?: string; + filePath?: string; + thumbSize?: number; + thumbPath?: string; + fileMd5?: string; + fileSha1?: string; + thumbMd5?: string; + thumbSha1?: string; + thumbWidth?: number; + thumbHeight?: number; + msgInfo: NapProtoEncodeStructType | null = null; - constructor(element: SendVideoElement) { - super(element); - this.fileSize = element.videoElement.fileSize; - this.filePath = element.videoElement.filePath; - this.thumbSize = element.videoElement.thumbSize; - this.thumbPath = element.videoElement.thumbPath?.get(0) as string | undefined; - this.fileMd5 = element.videoElement.videoMd5; - this.thumbMd5 = element.videoElement.thumbMd5; - this.thumbWidth = element.videoElement.thumbWidth; - this.thumbHeight = element.videoElement.thumbHeight; - } + constructor (element: SendVideoElement) { + super(element); + this.fileSize = element.videoElement.fileSize; + this.filePath = element.videoElement.filePath; + this.thumbSize = element.videoElement.thumbSize; + this.thumbPath = element.videoElement.thumbPath?.get(0) as string | undefined; + this.fileMd5 = element.videoElement.videoMd5; + this.thumbMd5 = element.videoElement.thumbMd5; + this.thumbWidth = element.videoElement.thumbWidth; + this.thumbHeight = element.videoElement.thumbHeight; + } - override get valid(): boolean { - return !!this.msgInfo; - } + override get valid (): boolean { + return !!this.msgInfo; + } - override buildElement(): NapProtoEncodeStructType[] { - if (!this.msgInfo) return []; - return [{ - commonElem: { - serviceType: 48, - pbElem: new NapProtoMsg(MsgInfo).encode(this.msgInfo), - businessType: 21, - } - }]; - } + override buildElement (): NapProtoEncodeStructType[] { + if (!this.msgInfo) return []; + return [{ + commonElem: { + serviceType: 48, + pbElem: new NapProtoMsg(MsgInfo).encode(this.msgInfo), + businessType: 21, + }, + }]; + } - override toPreview(): string { - return '[视频]'; - } + override toPreview (): string { + return '[视频]'; + } } export class PacketMsgPttElement extends IPacketMsgElement { - filePath: string; - fileSize: number; - fileMd5: string; - fileSha1?: string; - fileDuration: number; - msgInfo: NapProtoEncodeStructType | null = null; + filePath: string; + fileSize: number; + fileMd5: string; + fileSha1?: string; + fileDuration: number; + msgInfo: NapProtoEncodeStructType | null = null; - constructor(element: SendPttElement) { - super(element); - this.filePath = element.pttElement.filePath; - this.fileSize = +element.pttElement.fileSize; // TODO: cc - this.fileMd5 = element.pttElement.md5HexStr; - this.fileDuration = Math.round(element.pttElement.duration); // TODO: cc - } + constructor (element: SendPttElement) { + super(element); + this.filePath = element.pttElement.filePath; + this.fileSize = +element.pttElement.fileSize; // TODO: cc + this.fileMd5 = element.pttElement.md5HexStr; + this.fileDuration = Math.round(element.pttElement.duration); // TODO: cc + } - override get valid(): boolean { - return false; - } + override get valid (): boolean { + return false; + } - override buildElement(): NapProtoEncodeStructType[] { - return []; - // if (!this.msgInfo) return []; - // return [{ - // commonElem: { - // serviceType: 48, - // pbElem: new NapProtoMsg(MsgInfo).encode(this.msgInfo), - // businessType: 22, - // } - // }]; - } + override buildElement (): NapProtoEncodeStructType[] { + return []; + // if (!this.msgInfo) return []; + // return [{ + // commonElem: { + // serviceType: 48, + // pbElem: new NapProtoMsg(MsgInfo).encode(this.msgInfo), + // businessType: 22, + // } + // }]; + } - override toPreview(): string { - return '[语音]'; - } + override toPreview (): string { + return '[语音]'; + } } export class PacketMsgFileElement extends IPacketMsgElement { - fileName: string; - filePath: string; - fileSize: number; - fileSha1?: Uint8Array; - fileMd5?: Uint8Array; - fileUuid?: string; - fileHash?: string; - isGroupFile?: boolean; - _private_send_uid?: string; - _private_recv_uid?: string; - _e37_800_rsp?: NapProtoEncodeStructType; + fileName: string; + filePath: string; + fileSize: number; + fileSha1?: Uint8Array; + fileMd5?: Uint8Array; + fileUuid?: string; + fileHash?: string; + isGroupFile?: boolean; + _private_send_uid?: string; + _private_recv_uid?: string; + _e37_800_rsp?: NapProtoEncodeStructType; - constructor(element: SendFileElement) { - super(element); - this.fileName = element.fileElement.fileName; - this.filePath = element.fileElement.filePath; - this.fileSize = +element.fileElement.fileSize; - } + constructor (element: SendFileElement) { + super(element); + this.fileName = element.fileElement.fileName; + this.filePath = element.fileElement.filePath; + this.fileSize = +element.fileElement.fileSize; + } - override get valid(): boolean { - return this.isGroupFile || Boolean(this._e37_800_rsp); - } + override get valid (): boolean { + return this.isGroupFile || Boolean(this._e37_800_rsp); + } - override buildContent(): Uint8Array | undefined { - if (this.isGroupFile || !this._e37_800_rsp) return undefined; - return new NapProtoMsg(FileExtra).encode({ - file: { - fileType: 0, - fileUuid: this.fileUuid, - fileMd5: this.fileMd5, - fileName: this.fileName, - fileSize: BigInt(this.fileSize), - subcmd: 1, - dangerEvel: 0, - expireTime: Math.floor(Date.now() / 1000) + 7 * 24 * 60 * 60, - fileHash: this.fileHash, - }, - field6: { - field2: { - field1: this._e37_800_rsp?.body?.field30?.field110, - fileUuid: this.fileUuid, - fileName: this.fileName, - field6: this._e37_800_rsp?.body?.field30?.field3, - field7: this._e37_800_rsp?.body?.field30?.field101, - field8: this._e37_800_rsp?.body?.field30?.field100, - timestamp1: this._e37_800_rsp?.body?.field30?.timestamp1, - fileHash: this.fileHash, - selfUid: this._private_send_uid, - destUid: this._private_recv_uid, - } - } - }); - } + override buildContent (): Uint8Array | undefined { + if (this.isGroupFile || !this._e37_800_rsp) return undefined; + return new NapProtoMsg(FileExtra).encode({ + file: { + fileType: 0, + fileUuid: this.fileUuid, + fileMd5: this.fileMd5, + fileName: this.fileName, + fileSize: BigInt(this.fileSize), + subcmd: 1, + dangerEvel: 0, + expireTime: Math.floor(Date.now() / 1000) + 7 * 24 * 60 * 60, + fileHash: this.fileHash, + }, + field6: { + field2: { + field1: this._e37_800_rsp?.body?.field30?.field110, + fileUuid: this.fileUuid, + fileName: this.fileName, + field6: this._e37_800_rsp?.body?.field30?.field3, + field7: this._e37_800_rsp?.body?.field30?.field101, + field8: this._e37_800_rsp?.body?.field30?.field100, + timestamp1: this._e37_800_rsp?.body?.field30?.timestamp1, + fileHash: this.fileHash, + selfUid: this._private_send_uid, + destUid: this._private_recv_uid, + }, + }, + }); + } - override buildElement(): NapProtoEncodeStructType[] { - if (!this.isGroupFile) return []; - const lb = Buffer.alloc(2); - const transElemVal = new NapProtoMsg(GroupFileExtra).encode({ - field1: 6, - fileName: this.fileName, - inner: { - info: { - busId: 102, - fileId: this.fileUuid, - fileSize: BigInt(this.fileSize), - fileName: this.fileName, - fileSha: this.fileSha1, - extInfoString: '', - fileMd5: this.fileMd5, - } - } - }); - lb.writeUInt16BE(transElemVal.length); - return [{ - transElem: { - elemType: 24, - elemValue: Buffer.concat([Buffer.from([0x01]), lb, transElemVal]) // TLV - } - }]; - } + override buildElement (): NapProtoEncodeStructType[] { + if (!this.isGroupFile) return []; + const lb = Buffer.alloc(2); + const transElemVal = new NapProtoMsg(GroupFileExtra).encode({ + field1: 6, + fileName: this.fileName, + inner: { + info: { + busId: 102, + fileId: this.fileUuid, + fileSize: BigInt(this.fileSize), + fileName: this.fileName, + fileSha: this.fileSha1, + extInfoString: '', + fileMd5: this.fileMd5, + }, + }, + }); + lb.writeUInt16BE(transElemVal.length); + return [{ + transElem: { + elemType: 24, + elemValue: Buffer.concat([Buffer.from([0x01]), lb, transElemVal]), // TLV + }, + }]; + } - override toPreview(): string { - return `[文件]${this.fileName}`; - } + override toPreview (): string { + return `[文件]${this.fileName}`; + } } export class PacketMsgLightAppElement extends IPacketMsgElement { - payload: string; + payload: string; - constructor(element: SendArkElement) { - super(element); - this.payload = element.arkElement.bytesData; - } + constructor (element: SendArkElement) { + super(element); + this.payload = element.arkElement.bytesData; + } - override buildElement(): NapProtoEncodeStructType[] { - return [{ - lightAppElem: { - data: Buffer.concat([ - Buffer.from([0x01]), - zlib.deflateSync(Buffer.from(this.payload, 'utf-8')) - ]) - } - }]; - } + override buildElement (): NapProtoEncodeStructType[] { + return [{ + lightAppElem: { + data: Buffer.concat([ + Buffer.from([0x01]), + zlib.deflateSync(Buffer.from(this.payload, 'utf-8')), + ]), + }, + }]; + } - override toPreview(): string { - return '[卡片消息]'; - } + override toPreview (): string { + return '[卡片消息]'; + } } export class PacketMsgMarkDownElement extends IPacketMsgElement { - content: string; + content: string; - constructor(element: SendMarkdownElement) { - super(element); - this.content = element.markdownElement.content; - } + constructor (element: SendMarkdownElement) { + super(element); + this.content = element.markdownElement.content; + } - override buildElement(): NapProtoEncodeStructType[] { - return [{ - commonElem: { - serviceType: 45, - pbElem: new NapProtoMsg(MarkdownData).encode({ - content: this.content - }), - businessType: 1 - } - }]; - } + override buildElement (): NapProtoEncodeStructType[] { + return [{ + commonElem: { + serviceType: 45, + pbElem: new NapProtoMsg(MarkdownData).encode({ + content: this.content, + }), + businessType: 1, + }, + }]; + } - override toPreview(): string { - return `[Markdown消息 ${this.content}]`; - } + override toPreview (): string { + return `[Markdown消息 ${this.content}]`; + } } export class PacketMultiMsgElement extends IPacketMsgElement { - resid: string; - message: PacketMsg[]; + resid: string; + message: PacketMsg[]; - constructor(rawElement: SendMultiForwardMsgElement, message?: PacketMsg[]) { - super(rawElement); - this.resid = rawElement.multiForwardMsgElement.resId; - this.message = message ?? []; - } + constructor (rawElement: SendMultiForwardMsgElement, message?: PacketMsg[]) { + super(rawElement); + this.resid = rawElement.multiForwardMsgElement.resId; + this.message = message ?? []; + } - override buildElement(): NapProtoEncodeStructType[] { - return [{ - lightAppElem: { - data: Buffer.concat([ - Buffer.from([0x01]), - zlib.deflateSync(Buffer.from(JSON.stringify(ForwardMsgBuilder.fromPacketMsg(this.resid, this.message)), 'utf-8')) - ]) - } - }]; - } + override buildElement (): NapProtoEncodeStructType[] { + return [{ + lightAppElem: { + data: Buffer.concat([ + Buffer.from([0x01]), + zlib.deflateSync(Buffer.from(JSON.stringify(ForwardMsgBuilder.fromPacketMsg(this.resid, this.message)), 'utf-8')), + ]), + }, + }]; + } - override toPreview(): string { - return '[聊天记录]'; - } + override toPreview (): string { + return '[聊天记录]'; + } } diff --git a/src/core/packet/message/message.ts b/src/core/packet/message/message.ts index 8bf61083..1e044392 100644 --- a/src/core/packet/message/message.ts +++ b/src/core/packet/message/message.ts @@ -1,15 +1,15 @@ import { IPacketMsgElement } from '@/core/packet/message/element'; -import {SendMessageElement, SendMultiForwardMsgElement} from '@/core'; +import { SendMessageElement, SendMultiForwardMsgElement } from '@/core'; -export type PacketSendMsgElement = SendMessageElement | SendMultiForwardMsgElement +export type PacketSendMsgElement = SendMessageElement | SendMultiForwardMsgElement; export interface PacketMsg { - seq?: number; - clientSeq?: number; - groupId?: number; - senderUid: string; - senderUin: number; - senderName: string; - time: number; - msg: IPacketMsgElement[] + seq?: number; + clientSeq?: number; + groupId?: number; + senderUid: string; + senderUin: number; + senderName: string; + time: number; + msg: IPacketMsgElement[] } diff --git a/src/core/packet/transformer/action/GetAiVoice.ts b/src/core/packet/transformer/action/GetAiVoice.ts index 5cb3483c..4f90d6e1 100644 --- a/src/core/packet/transformer/action/GetAiVoice.ts +++ b/src/core/packet/transformer/action/GetAiVoice.ts @@ -5,27 +5,27 @@ import OidbBase from '@/core/packet/transformer/oidb/oidbBase'; import { AIVoiceChatType } from '@/core/packet/entities/aiChat'; class GetAiVoice extends PacketTransformer { - constructor() { - super(); - } + constructor () { + super(); + } - build(groupUin: number, voiceId: string, text: string, sessionId: number, chatType: AIVoiceChatType): OidbPacket { - const data = new NapProtoMsg(proto.OidbSvcTrpcTcp0X929B_0).encode({ - groupUin: groupUin, - voiceId: voiceId, - text: text, - chatType: chatType, - session: { - sessionId: sessionId - } - }); - return OidbBase.build(0x929B, 0, data); - } + build (groupUin: number, voiceId: string, text: string, sessionId: number, chatType: AIVoiceChatType): OidbPacket { + const data = new NapProtoMsg(proto.OidbSvcTrpcTcp0X929B_0).encode({ + groupUin, + voiceId, + text, + chatType, + session: { + sessionId, + }, + }); + return OidbBase.build(0x929B, 0, data); + } - parse(data: Buffer) { - const oidbBody = OidbBase.parse(data).body; - return new NapProtoMsg(proto.OidbSvcTrpcTcp0X929B_0Resp).decode(oidbBody); - } + parse (data: Buffer) { + const oidbBody = OidbBase.parse(data).body; + return new NapProtoMsg(proto.OidbSvcTrpcTcp0X929B_0Resp).decode(oidbBody); + } } export default new GetAiVoice(); diff --git a/src/core/packet/transformer/action/GetMiniAppAdaptShareInfo.ts b/src/core/packet/transformer/action/GetMiniAppAdaptShareInfo.ts index ab5e203a..4b65121b 100644 --- a/src/core/packet/transformer/action/GetMiniAppAdaptShareInfo.ts +++ b/src/core/packet/transformer/action/GetMiniAppAdaptShareInfo.ts @@ -4,50 +4,50 @@ import { OidbPacket, PacketBufBuilder, PacketTransformer } from '@/core/packet/t import { MiniAppReqParams } from '@/core/packet/entities/miniApp'; class GetMiniAppAdaptShareInfo extends PacketTransformer { - constructor() { - super(); - } + constructor () { + super(); + } - build(req: MiniAppReqParams): OidbPacket { - const data = new NapProtoMsg(proto.MiniAppAdaptShareInfoReq).encode({ - appId: req.sdkId, - body: { - extInfo: { - field2: Buffer.alloc(0) - }, - appid: req.appId, - title: req.title, - desc: req.desc, - time: BigInt(Date.now()), - scene: req.scene, - templateType: req.templateType, - businessType: req.businessType, - picUrl: req.picUrl, - vidUrl: '', - jumpUrl: req.jumpUrl, - iconUrl: req.iconUrl, - verType: req.verType, - shareType: req.shareType, - versionId: req.versionId, - withShareTicket: req.withShareTicket, - webURL: req.webUrl ?? '', - appidRich: Buffer.alloc(0), - template: { - templateId: '', - templateData: '' - }, - field20: '' - } - }); - return { - cmd: 'LightAppSvc.mini_app_share.AdaptShareInfo', - data: PacketBufBuilder(data) - }; - } + build (req: MiniAppReqParams): OidbPacket { + const data = new NapProtoMsg(proto.MiniAppAdaptShareInfoReq).encode({ + appId: req.sdkId, + body: { + extInfo: { + field2: Buffer.alloc(0), + }, + appid: req.appId, + title: req.title, + desc: req.desc, + time: BigInt(Date.now()), + scene: req.scene, + templateType: req.templateType, + businessType: req.businessType, + picUrl: req.picUrl, + vidUrl: '', + jumpUrl: req.jumpUrl, + iconUrl: req.iconUrl, + verType: req.verType, + shareType: req.shareType, + versionId: req.versionId, + withShareTicket: req.withShareTicket, + webURL: req.webUrl ?? '', + appidRich: Buffer.alloc(0), + template: { + templateId: '', + templateData: '', + }, + field20: '', + }, + }); + return { + cmd: 'LightAppSvc.mini_app_share.AdaptShareInfo', + data: PacketBufBuilder(data), + }; + } - parse(data: Buffer) { - return new NapProtoMsg(proto.MiniAppAdaptShareInfoResp).decode(data); - } + parse (data: Buffer) { + return new NapProtoMsg(proto.MiniAppAdaptShareInfoResp).decode(data); + } } export default new GetMiniAppAdaptShareInfo(); diff --git a/src/core/packet/transformer/action/GetStrangerInfo.ts b/src/core/packet/transformer/action/GetStrangerInfo.ts index 1fcfc6b7..2d6591a7 100644 --- a/src/core/packet/transformer/action/GetStrangerInfo.ts +++ b/src/core/packet/transformer/action/GetStrangerInfo.ts @@ -4,22 +4,22 @@ import { OidbPacket, PacketTransformer } from '@/core/packet/transformer/base'; import OidbBase from '@/core/packet/transformer/oidb/oidbBase'; class GetStrangerInfo extends PacketTransformer { - constructor() { - super(); - } + constructor () { + super(); + } - build(uin: number): OidbPacket { - const body = new NapProtoMsg(proto.OidbSvcTrpcTcp0XFE1_2).encode({ - uin: uin, - key: [{ key: 27372 }] - }); - return OidbBase.build(0XFE1, 2, body); - } + build (uin: number): OidbPacket { + const body = new NapProtoMsg(proto.OidbSvcTrpcTcp0XFE1_2).encode({ + uin, + key: [{ key: 27372 }], + }); + return OidbBase.build(0XFE1, 2, body); + } - parse(data: Buffer) { - const oidbBody = OidbBase.parse(data).body; - return new NapProtoMsg(proto.OidbSvcTrpcTcp0XFE1_2RSP).decode(oidbBody); - } + parse (data: Buffer) { + const oidbBody = OidbBase.parse(data).body; + return new NapProtoMsg(proto.OidbSvcTrpcTcp0XFE1_2RSP).decode(oidbBody); + } } export default new GetStrangerInfo(); diff --git a/src/core/packet/transformer/action/ImageOCR.ts b/src/core/packet/transformer/action/ImageOCR.ts index 02217f79..5ddb330c 100644 --- a/src/core/packet/transformer/action/ImageOCR.ts +++ b/src/core/packet/transformer/action/ImageOCR.ts @@ -4,34 +4,34 @@ import { OidbPacket, PacketTransformer } from '@/core/packet/transformer/base'; import OidbBase from '@/core/packet/transformer/oidb/oidbBase'; class ImageOCR extends PacketTransformer { - constructor() { - super(); - } + constructor () { + super(); + } - build(url: string): OidbPacket { - const body = new NapProtoMsg(proto.OidbSvcTrpcTcp0xE07_0).encode( - { - version: 1, - client: 0, - entrance: 1, - ocrReqBody: { - imageUrl: url, - originMd5: '', - afterCompressMd5: '', - afterCompressFileSize: '', - afterCompressWeight: '', - afterCompressHeight: '', - isCut: false, - } - } - ); - return OidbBase.build(0XEB7, 1, body, false, false); - } + build (url: string): OidbPacket { + const body = new NapProtoMsg(proto.OidbSvcTrpcTcp0xE07_0).encode( + { + version: 1, + client: 0, + entrance: 1, + ocrReqBody: { + imageUrl: url, + originMd5: '', + afterCompressMd5: '', + afterCompressFileSize: '', + afterCompressWeight: '', + afterCompressHeight: '', + isCut: false, + }, + } + ); + return OidbBase.build(0XEB7, 1, body, false, false); + } - parse(data: Buffer) { - const base = OidbBase.parse(data); - return new NapProtoMsg(proto.OidbSvcTrpcTcp0xE07_0_Response).decode(base.body); - } + parse (data: Buffer) { + const base = OidbBase.parse(data); + return new NapProtoMsg(proto.OidbSvcTrpcTcp0xE07_0_Response).decode(base.body); + } } export default new ImageOCR(); diff --git a/src/core/packet/transformer/action/MoveGroupFile.ts b/src/core/packet/transformer/action/MoveGroupFile.ts index 47e1ec47..bb3fb577 100644 --- a/src/core/packet/transformer/action/MoveGroupFile.ts +++ b/src/core/packet/transformer/action/MoveGroupFile.ts @@ -4,32 +4,32 @@ import { OidbPacket, PacketTransformer } from '@/core/packet/transformer/base'; import OidbBase from '@/core/packet/transformer/oidb/oidbBase'; class MoveGroupFile extends PacketTransformer { - constructor() { - super(); - } + constructor () { + super(); + } - build(groupUin: number, fileUUID: string, currentParentDirectory: string, targetParentDirectory: string): OidbPacket { - const body = new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6).encode({ - move: { - groupUin: groupUin, - appId: 5, - busId: 102, - fileId: fileUUID, - parentDirectory: currentParentDirectory, - targetDirectory: targetParentDirectory, - } - }); - return OidbBase.build(0x6D6, 5, body, true, false); - } + build (groupUin: number, fileUUID: string, currentParentDirectory: string, targetParentDirectory: string): OidbPacket { + const body = new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6).encode({ + move: { + groupUin, + appId: 5, + busId: 102, + fileId: fileUUID, + parentDirectory: currentParentDirectory, + targetDirectory: targetParentDirectory, + }, + }); + return OidbBase.build(0x6D6, 5, body, true, false); + } - parse(data: Buffer) { - const oidbBody = OidbBase.parse(data).body; - const res = new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6Response).decode(oidbBody); - if (res.move.retCode !== 0) { - throw new Error(`sendGroupFileMoveReq error: ${res.move.clientWording} (code=${res.move.retCode})`); - } - return res; + parse (data: Buffer) { + const oidbBody = OidbBase.parse(data).body; + const res = new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6Response).decode(oidbBody); + if (res.move.retCode !== 0) { + throw new Error(`sendGroupFileMoveReq error: ${res.move.clientWording} (code=${res.move.retCode})`); } + return res; + } } export default new MoveGroupFile(); diff --git a/src/core/packet/transformer/action/RenameGroupFile.ts b/src/core/packet/transformer/action/RenameGroupFile.ts index 2cbaeacd..2a9183e9 100644 --- a/src/core/packet/transformer/action/RenameGroupFile.ts +++ b/src/core/packet/transformer/action/RenameGroupFile.ts @@ -4,31 +4,31 @@ import { OidbPacket, PacketTransformer } from '@/core/packet/transformer/base'; import OidbBase from '@/core/packet/transformer/oidb/oidbBase'; class RenameGroupFile extends PacketTransformer { - constructor() { - super(); - } + constructor () { + super(); + } - build(groupUin: number, fileUUID: string, currentParentDirectory: string, newName: string): OidbPacket { - const body = new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6).encode({ - rename: { - groupUin: groupUin, - busId: 102, - fileId: fileUUID, - parentFolder: currentParentDirectory, - newFileName: newName, - } - }); - return OidbBase.build(0x6D6, 4, body, true, false); - } + build (groupUin: number, fileUUID: string, currentParentDirectory: string, newName: string): OidbPacket { + const body = new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6).encode({ + rename: { + groupUin, + busId: 102, + fileId: fileUUID, + parentFolder: currentParentDirectory, + newFileName: newName, + }, + }); + return OidbBase.build(0x6D6, 4, body, true, false); + } - parse(data: Buffer) { - const oidbBody = OidbBase.parse(data).body; - const res = new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6Response).decode(oidbBody); - if (res.rename.retCode !== 0) { - throw new Error(`sendGroupFileRenameReq error: ${res.rename.clientWording} (code=${res.rename.retCode})`); - } - return res; + parse (data: Buffer) { + const oidbBody = OidbBase.parse(data).body; + const res = new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6Response).decode(oidbBody); + if (res.rename.retCode !== 0) { + throw new Error(`sendGroupFileRenameReq error: ${res.rename.clientWording} (code=${res.rename.retCode})`); } + return res; + } } export default new RenameGroupFile(); diff --git a/src/core/packet/transformer/highway/DownloadGroupFile.ts b/src/core/packet/transformer/highway/DownloadGroupFile.ts index c5b381dc..aa52756b 100644 --- a/src/core/packet/transformer/highway/DownloadGroupFile.ts +++ b/src/core/packet/transformer/highway/DownloadGroupFile.ts @@ -4,30 +4,30 @@ import { OidbPacket, PacketTransformer } from '@/core/packet/transformer/base'; import OidbBase from '@/core/packet/transformer/oidb/oidbBase'; class DownloadGroupFile extends PacketTransformer { - constructor() { - super(); - } + constructor () { + super(); + } - build(groupUin: number, fileUUID: string): OidbPacket { - const body = new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6).encode({ - download: { - groupUin: groupUin, - appId: 7, - busId: 102, - fileId: fileUUID - } - }); - return OidbBase.build(0x6D6, 2, body, true, false); - } + build (groupUin: number, fileUUID: string): OidbPacket { + const body = new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6).encode({ + download: { + groupUin, + appId: 7, + busId: 102, + fileId: fileUUID, + }, + }); + return OidbBase.build(0x6D6, 2, body, true, false); + } - parse(data: Buffer) { - const oidbBody = OidbBase.parse(data).body; - const res = new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6Response).decode(oidbBody); - if (res.download.retCode !== 0) { - throw new Error(`sendGroupFileDownloadReq error: ${res.download.clientWording} (code=${res.download.retCode})`); - } - return res; + parse (data: Buffer) { + const oidbBody = OidbBase.parse(data).body; + const res = new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6Response).decode(oidbBody); + if (res.download.retCode !== 0) { + throw new Error(`sendGroupFileDownloadReq error: ${res.download.clientWording} (code=${res.download.retCode})`); } + return res; + } } export default new DownloadGroupFile(); diff --git a/src/core/packet/transformer/highway/DownloadGroupImage.ts b/src/core/packet/transformer/highway/DownloadGroupImage.ts index 8b6aaa32..e38d9ea3 100644 --- a/src/core/packet/transformer/highway/DownloadGroupImage.ts +++ b/src/core/packet/transformer/highway/DownloadGroupImage.ts @@ -5,46 +5,46 @@ import OidbBase from '@/core/packet/transformer/oidb/oidbBase'; import { IndexNode } from '@/core/packet/transformer/proto'; class DownloadGroupImage extends PacketTransformer { - constructor() { - super(); - } + constructor () { + super(); + } - build(group_uin: number, node: NapProtoEncodeStructType): OidbPacket { - const body = new NapProtoMsg(proto.NTV2RichMediaReq).encode({ - reqHead: { - common: { - requestId: 1, - command: 200 - }, - scene: { - requestType: 2, - businessType: 1, - sceneType: 2, - group: { - groupUin: group_uin - } - }, - client: { - agentType: 2, - } - }, - download: { - node: node, - download: { - video: { - busiType: 0, - sceneType: 0 - } - } - } - }); - return OidbBase.build(0x11C4, 200, body, true, false); - } + build (group_uin: number, node: NapProtoEncodeStructType): OidbPacket { + const body = new NapProtoMsg(proto.NTV2RichMediaReq).encode({ + reqHead: { + common: { + requestId: 1, + command: 200, + }, + scene: { + requestType: 2, + businessType: 1, + sceneType: 2, + group: { + groupUin: group_uin, + }, + }, + client: { + agentType: 2, + }, + }, + download: { + node, + download: { + video: { + busiType: 0, + sceneType: 0, + }, + }, + }, + }); + return OidbBase.build(0x11C4, 200, body, true, false); + } - parse(data: Buffer) { - const oidbBody = OidbBase.parse(data).body; - return new NapProtoMsg(proto.NTV2RichMediaResp).decode(oidbBody); - } + parse (data: Buffer) { + const oidbBody = OidbBase.parse(data).body; + return new NapProtoMsg(proto.NTV2RichMediaResp).decode(oidbBody); + } } export default new DownloadGroupImage(); diff --git a/src/core/packet/transformer/highway/DownloadGroupVideo.ts b/src/core/packet/transformer/highway/DownloadGroupVideo.ts index 22fe2e8e..80955be3 100644 --- a/src/core/packet/transformer/highway/DownloadGroupVideo.ts +++ b/src/core/packet/transformer/highway/DownloadGroupVideo.ts @@ -5,46 +5,46 @@ import OidbBase from '@/core/packet/transformer/oidb/oidbBase'; import { IndexNode } from '@/core/packet/transformer/proto'; class DownloadGroupVideo extends PacketTransformer { - constructor() { - super(); - } + constructor () { + super(); + } - build(groupUin: number, node: NapProtoEncodeStructType): OidbPacket { - const body = new NapProtoMsg(proto.NTV2RichMediaReq).encode({ - reqHead: { - common: { - requestId: 1, - command: 200 - }, - scene: { - requestType: 2, - businessType: 2, - sceneType: 2, - group: { - groupUin: groupUin - } - }, - client: { - agentType: 2, - } - }, - download: { - node: node, - download: { - video: { - busiType: 0, - sceneType: 0 - } - } - } - }); - return OidbBase.build(0x11EA, 200, body, true, false); - } + build (groupUin: number, node: NapProtoEncodeStructType): OidbPacket { + const body = new NapProtoMsg(proto.NTV2RichMediaReq).encode({ + reqHead: { + common: { + requestId: 1, + command: 200, + }, + scene: { + requestType: 2, + businessType: 2, + sceneType: 2, + group: { + groupUin, + }, + }, + client: { + agentType: 2, + }, + }, + download: { + node, + download: { + video: { + busiType: 0, + sceneType: 0, + }, + }, + }, + }); + return OidbBase.build(0x11EA, 200, body, true, false); + } - parse(data: Buffer) { - const oidbBody = OidbBase.parse(data).body; - return new NapProtoMsg(proto.NTV2RichMediaResp).decode(oidbBody); - } + parse (data: Buffer) { + const oidbBody = OidbBase.parse(data).body; + return new NapProtoMsg(proto.NTV2RichMediaResp).decode(oidbBody); + } } export default new DownloadGroupVideo(); diff --git a/src/core/packet/transformer/highway/DownloadImage.ts b/src/core/packet/transformer/highway/DownloadImage.ts index dc42cfbd..8f7e773e 100644 --- a/src/core/packet/transformer/highway/DownloadImage.ts +++ b/src/core/packet/transformer/highway/DownloadImage.ts @@ -5,47 +5,47 @@ import OidbBase from '@/core/packet/transformer/oidb/oidbBase'; import { IndexNode } from '@/core/packet/transformer/proto'; class DownloadImage extends PacketTransformer { - constructor() { - super(); - } + constructor () { + super(); + } - build(selfUid: string, node: NapProtoEncodeStructType): OidbPacket { - const body = new NapProtoMsg(proto.NTV2RichMediaReq).encode({ - reqHead: { - common: { - requestId: 1, - command: 200 - }, - scene: { - requestType: 2, - businessType: 1, - sceneType: 1, - c2C: { - accountType: 2, - targetUid: selfUid - }, - }, - client: { - agentType: 2, - } - }, - download: { - node: node, - download: { - video: { - busiType: 0, - sceneType: 0 - } - } - } - }); - return OidbBase.build(0x11C5, 200, body, true, false); - } + build (selfUid: string, node: NapProtoEncodeStructType): OidbPacket { + const body = new NapProtoMsg(proto.NTV2RichMediaReq).encode({ + reqHead: { + common: { + requestId: 1, + command: 200, + }, + scene: { + requestType: 2, + businessType: 1, + sceneType: 1, + c2C: { + accountType: 2, + targetUid: selfUid, + }, + }, + client: { + agentType: 2, + }, + }, + download: { + node, + download: { + video: { + busiType: 0, + sceneType: 0, + }, + }, + }, + }); + return OidbBase.build(0x11C5, 200, body, true, false); + } - parse(data: Buffer) { - const oidbBody = OidbBase.parse(data).body; - return new NapProtoMsg(proto.NTV2RichMediaResp).decode(oidbBody); - } + parse (data: Buffer) { + const oidbBody = OidbBase.parse(data).body; + return new NapProtoMsg(proto.NTV2RichMediaResp).decode(oidbBody); + } } export default new DownloadImage(); diff --git a/src/core/packet/transformer/highway/DownloadOfflineFile.ts b/src/core/packet/transformer/highway/DownloadOfflineFile.ts index 278f877a..b9eb00ab 100644 --- a/src/core/packet/transformer/highway/DownloadOfflineFile.ts +++ b/src/core/packet/transformer/highway/DownloadOfflineFile.ts @@ -4,32 +4,32 @@ import { OidbPacket, PacketTransformer } from '@/core/packet/transformer/base'; import OidbBase from '@/core/packet/transformer/oidb/oidbBase'; class DownloadOfflineFile extends PacketTransformer { - constructor() { - super(); - } + constructor () { + super(); + } - build(fileUUID: string, fileHash: string, senderUid: string, receiverUid: string): OidbPacket { - const body = new NapProtoMsg(proto.OidbSvcTrpcTcp0XE37_800).encode({ - subCommand: 800, - field2: 0, - body: { - senderUid: senderUid, - receiverUid: receiverUid, - fileUuid: fileUUID, - fileHash: fileHash, - }, - field101: 3, - field102: 1, - field200: 1, - }); - return OidbBase.build(0xE37, 800, body, false, false); - } + build (fileUUID: string, fileHash: string, senderUid: string, receiverUid: string): OidbPacket { + const body = new NapProtoMsg(proto.OidbSvcTrpcTcp0XE37_800).encode({ + subCommand: 800, + field2: 0, + body: { + senderUid, + receiverUid, + fileUuid: fileUUID, + fileHash, + }, + field101: 3, + field102: 1, + field200: 1, + }); + return OidbBase.build(0xE37, 800, body, false, false); + } - // TODO:check - parse(data: Buffer) { - const oidbBody = OidbBase.parse(data).body; - return new NapProtoMsg(proto.OidbSvcTrpcTcp0XE37Response).decode(oidbBody); - } + // TODO:check + parse (data: Buffer) { + const oidbBody = OidbBase.parse(data).body; + return new NapProtoMsg(proto.OidbSvcTrpcTcp0XE37Response).decode(oidbBody); + } } export default new DownloadOfflineFile(); diff --git a/src/core/packet/transformer/highway/DownloadPrivateFile.ts b/src/core/packet/transformer/highway/DownloadPrivateFile.ts index fd3027b8..2af18a60 100644 --- a/src/core/packet/transformer/highway/DownloadPrivateFile.ts +++ b/src/core/packet/transformer/highway/DownloadPrivateFile.ts @@ -4,33 +4,33 @@ import { OidbPacket, PacketTransformer } from '@/core/packet/transformer/base'; import OidbBase from '@/core/packet/transformer/oidb/oidbBase'; class DownloadPrivateFile extends PacketTransformer { - constructor() { - super(); - } + constructor () { + super(); + } - build(selfUid: string, fileUUID: string, fileHash: string): OidbPacket { - const body = new NapProtoMsg(proto.OidbSvcTrpcTcp0XE37_1200).encode({ - subCommand: 1200, - field2: 1, - body: { - receiverUid: selfUid, - fileUuid: fileUUID, - type: 2, - fileHash: fileHash, - t2: 0 - }, - field101: 3, - field102: 103, - field200: 1, - field99999: Buffer.from([0xc0, 0x85, 0x2c, 0x01]) - }); - return OidbBase.build(0xE37, 1200, body, false, false); - } + build (selfUid: string, fileUUID: string, fileHash: string): OidbPacket { + const body = new NapProtoMsg(proto.OidbSvcTrpcTcp0XE37_1200).encode({ + subCommand: 1200, + field2: 1, + body: { + receiverUid: selfUid, + fileUuid: fileUUID, + type: 2, + fileHash, + t2: 0, + }, + field101: 3, + field102: 103, + field200: 1, + field99999: Buffer.from([0xc0, 0x85, 0x2c, 0x01]), + }); + return OidbBase.build(0xE37, 1200, body, false, false); + } - parse(data: Buffer) { - const oidbBody = OidbBase.parse(data).body; - return new NapProtoMsg(proto.OidbSvcTrpcTcp0XE37_1200Response).decode(oidbBody); - } + parse (data: Buffer) { + const oidbBody = OidbBase.parse(data).body; + return new NapProtoMsg(proto.OidbSvcTrpcTcp0XE37_1200Response).decode(oidbBody); + } } export default new DownloadPrivateFile(); diff --git a/src/core/packet/transformer/highway/DownloadVideo.ts b/src/core/packet/transformer/highway/DownloadVideo.ts index 0731b258..c2bed6bf 100644 --- a/src/core/packet/transformer/highway/DownloadVideo.ts +++ b/src/core/packet/transformer/highway/DownloadVideo.ts @@ -5,47 +5,47 @@ import OidbBase from '@/core/packet/transformer/oidb/oidbBase'; import { IndexNode } from '@/core/packet/transformer/proto'; class DownloadVideo extends PacketTransformer { - constructor() { - super(); - } + constructor () { + super(); + } - build(selfUid: string, node: NapProtoEncodeStructType): OidbPacket { - const body = new NapProtoMsg(proto.NTV2RichMediaReq).encode({ - reqHead: { - common: { - requestId: 1, - command: 200 - }, - scene: { - requestType: 2, - businessType: 2, - sceneType: 1, - c2C: { - accountType: 2, - targetUid: selfUid - }, - }, - client: { - agentType: 2, - } - }, - download: { - node: node, - download: { - video: { - busiType: 0, - sceneType: 0 - } - } - } - }); - return OidbBase.build(0x11E9, 200, body, true, false); - } + build (selfUid: string, node: NapProtoEncodeStructType): OidbPacket { + const body = new NapProtoMsg(proto.NTV2RichMediaReq).encode({ + reqHead: { + common: { + requestId: 1, + command: 200, + }, + scene: { + requestType: 2, + businessType: 2, + sceneType: 1, + c2C: { + accountType: 2, + targetUid: selfUid, + }, + }, + client: { + agentType: 2, + }, + }, + download: { + node, + download: { + video: { + busiType: 0, + sceneType: 0, + }, + }, + }, + }); + return OidbBase.build(0x11E9, 200, body, true, false); + } - parse(data: Buffer) { - const oidbBody = OidbBase.parse(data).body; - return new NapProtoMsg(proto.NTV2RichMediaResp).decode(oidbBody); - } + parse (data: Buffer) { + const oidbBody = OidbBase.parse(data).body; + return new NapProtoMsg(proto.NTV2RichMediaResp).decode(oidbBody); + } } export default new DownloadVideo(); diff --git a/src/core/packet/transformer/highway/FetchSessionKey.ts b/src/core/packet/transformer/highway/FetchSessionKey.ts index 6aef75f2..9b844b61 100644 --- a/src/core/packet/transformer/highway/FetchSessionKey.ts +++ b/src/core/packet/transformer/highway/FetchSessionKey.ts @@ -3,35 +3,35 @@ import { NapProtoMsg } from '@napneko/nap-proto-core'; import { OidbPacket, PacketBufBuilder, PacketTransformer } from '@/core/packet/transformer/base'; class FetchSessionKey extends PacketTransformer { - constructor() { - super(); - } + constructor () { + super(); + } - build(): OidbPacket { - const req = new NapProtoMsg(proto.HttpConn0x6ff_501).encode({ - httpConn: { - field1: 0, - field2: 0, - field3: 16, - field4: 1, - field6: 3, - serviceTypes: [1, 5, 10, 21], - // tgt: "", // TODO: do we really need tgt? seems not - field9: 2, - field10: 9, - field11: 8, - ver: '1.0.1' - } - }); - return { - cmd: 'HttpConn.0x6ff_501', - data: PacketBufBuilder(req) - }; - } + build (): OidbPacket { + const req = new NapProtoMsg(proto.HttpConn0x6ff_501).encode({ + httpConn: { + field1: 0, + field2: 0, + field3: 16, + field4: 1, + field6: 3, + serviceTypes: [1, 5, 10, 21], + // tgt: "", // TODO: do we really need tgt? seems not + field9: 2, + field10: 9, + field11: 8, + ver: '1.0.1', + }, + }); + return { + cmd: 'HttpConn.0x6ff_501', + data: PacketBufBuilder(req), + }; + } - parse(data: Buffer) { - return new NapProtoMsg(proto.HttpConn0x6ff_501Response).decode(data); - } + parse (data: Buffer) { + return new NapProtoMsg(proto.HttpConn0x6ff_501Response).decode(data); + } } export default new FetchSessionKey(); diff --git a/src/core/packet/transformer/highway/UploadGroupFile.ts b/src/core/packet/transformer/highway/UploadGroupFile.ts index 0df64d40..4689c9d1 100644 --- a/src/core/packet/transformer/highway/UploadGroupFile.ts +++ b/src/core/packet/transformer/highway/UploadGroupFile.ts @@ -5,34 +5,34 @@ import OidbBase from '@/core/packet/transformer/oidb/oidbBase'; import { PacketMsgFileElement } from '@/core/packet/message/element'; class UploadGroupFile extends PacketTransformer { - constructor() { - super(); - } + constructor () { + super(); + } - build(groupUin: number, file: PacketMsgFileElement): OidbPacket { - const body = new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6).encode({ - file: { - groupUin: groupUin, - appId: 4, - busId: 102, - entrance: 6, - targetDirectory: '/', // TODO: - fileName: file.fileName, - localDirectory: `/${file.fileName}`, - fileSize: BigInt(file.fileSize), - fileMd5: file.fileMd5, - fileSha1: file.fileSha1, - fileSha3: Buffer.alloc(0), - field15: true - } - }); - return OidbBase.build(0x6D6, 0, body, true, false); - } + build (groupUin: number, file: PacketMsgFileElement): OidbPacket { + const body = new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6).encode({ + file: { + groupUin, + appId: 4, + busId: 102, + entrance: 6, + targetDirectory: '/', // TODO: + fileName: file.fileName, + localDirectory: `/${file.fileName}`, + fileSize: BigInt(file.fileSize), + fileMd5: file.fileMd5, + fileSha1: file.fileSha1, + fileSha3: Buffer.alloc(0), + field15: true, + }, + }); + return OidbBase.build(0x6D6, 0, body, true, false); + } - parse(data: Buffer) { - const oidbBody = OidbBase.parse(data).body; - return new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6Response).decode(oidbBody); - } + parse (data: Buffer) { + const oidbBody = OidbBase.parse(data).body; + return new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6Response).decode(oidbBody); + } } export default new UploadGroupFile(); diff --git a/src/core/packet/transformer/highway/UploadGroupImage.ts b/src/core/packet/transformer/highway/UploadGroupImage.ts index 245a4af4..480f9415 100644 --- a/src/core/packet/transformer/highway/UploadGroupImage.ts +++ b/src/core/packet/transformer/highway/UploadGroupImage.ts @@ -6,85 +6,85 @@ import crypto from 'node:crypto'; import { PacketMsgPicElement } from '@/core/packet/message/element'; class UploadGroupImage extends PacketTransformer { - constructor() { - super(); - } + constructor () { + super(); + } - build(groupUin: number, img: PacketMsgPicElement): OidbPacket { - const data = new NapProtoMsg(proto.NTV2RichMediaReq).encode( + build (groupUin: number, img: PacketMsgPicElement): OidbPacket { + const data = new NapProtoMsg(proto.NTV2RichMediaReq).encode( + { + reqHead: { + common: { + requestId: 1, + command: 100, + }, + scene: { + requestType: 2, + businessType: 1, + sceneType: 2, + group: { + groupUin, + }, + }, + client: { + agentType: 2, + }, + }, + upload: { + uploadInfo: [ { - reqHead: { - common: { - requestId: 1, - command: 100 - }, - scene: { - requestType: 2, - businessType: 1, - sceneType: 2, - group: { - groupUin: groupUin - }, - }, - client: { - agentType: 2 - } + fileInfo: { + fileSize: +img.size, + fileHash: img.md5, + fileSha1: img.sha1!, + fileName: img.name, + type: { + type: 1, + picFormat: img.picType, // TODO: extend NapCat imgType /cc @MliKiowa + videoFormat: 0, + voiceFormat: 0, }, - upload: { - uploadInfo: [ - { - fileInfo: { - fileSize: +img.size, - fileHash: img.md5, - fileSha1: img.sha1!, - fileName: img.name, - type: { - type: 1, - picFormat: img.picType, //TODO: extend NapCat imgType /cc @MliKiowa - videoFormat: 0, - voiceFormat: 0, - }, - width: img.width, - height: img.height, - time: 0, - original: 1 - }, - subFileType: 0, - } - ], - tryFastUploadCompleted: true, - srvSendMsg: false, - clientRandomId: crypto.randomBytes(8).readBigUInt64BE() & BigInt('0x7FFFFFFFFFFFFFFF'), - compatQMsgSceneType: 2, - extBizInfo: { - pic: { - bizType: img.picSubType, - bytesPbReserveTroop: { - subType: img.picSubType, - }, - textSummary: img.summary, - }, - video: { - bytesPbReserve: Buffer.alloc(0), - }, - ptt: { - bytesPbReserve: Buffer.alloc(0), - bytesReserve: Buffer.alloc(0), - bytesGeneralFlags: Buffer.alloc(0), - } - }, - clientSeq: 0, - noNeedCompatMsg: false, - } - } - ); - return OidbBase.build(0x11C4, 100, data, true, false); - } + width: img.width, + height: img.height, + time: 0, + original: 1, + }, + subFileType: 0, + }, + ], + tryFastUploadCompleted: true, + srvSendMsg: false, + clientRandomId: crypto.randomBytes(8).readBigUInt64BE() & BigInt('0x7FFFFFFFFFFFFFFF'), + compatQMsgSceneType: 2, + extBizInfo: { + pic: { + bizType: img.picSubType, + bytesPbReserveTroop: { + subType: img.picSubType, + }, + textSummary: img.summary, + }, + video: { + bytesPbReserve: Buffer.alloc(0), + }, + ptt: { + bytesPbReserve: Buffer.alloc(0), + bytesReserve: Buffer.alloc(0), + bytesGeneralFlags: Buffer.alloc(0), + }, + }, + clientSeq: 0, + noNeedCompatMsg: false, + }, + } + ); + return OidbBase.build(0x11C4, 100, data, true, false); + } - parse(data: Buffer) { - const oidbBody = OidbBase.parse(data).body; - return new NapProtoMsg(proto.NTV2RichMediaResp).decode(oidbBody); - } + parse (data: Buffer) { + const oidbBody = OidbBase.parse(data).body; + return new NapProtoMsg(proto.NTV2RichMediaResp).decode(oidbBody); + } } export default new UploadGroupImage(); diff --git a/src/core/packet/transformer/highway/UploadGroupVideo.ts b/src/core/packet/transformer/highway/UploadGroupVideo.ts index 9637f5d0..48176cbc 100644 --- a/src/core/packet/transformer/highway/UploadGroupVideo.ts +++ b/src/core/packet/transformer/highway/UploadGroupVideo.ts @@ -6,99 +6,99 @@ import crypto from 'node:crypto'; import { PacketMsgVideoElement } from '@/core/packet/message/element'; class UploadGroupVideo extends PacketTransformer { - constructor() { - super(); - } + constructor () { + super(); + } - build(groupUin: number, video: PacketMsgVideoElement): OidbPacket { - if (!video.fileSize || !video.thumbSize) throw new Error('video.fileSize or video.thumbSize is empty'); - const data = new NapProtoMsg(proto.NTV2RichMediaReq).encode({ - reqHead: { - common: { - requestId: 3, - command: 100 - }, - scene: { - requestType: 2, - businessType: 2, - sceneType: 2, - group: { - groupUin: groupUin - }, - }, - client: { - agentType: 2 - } + build (groupUin: number, video: PacketMsgVideoElement): OidbPacket { + if (!video.fileSize || !video.thumbSize) throw new Error('video.fileSize or video.thumbSize is empty'); + const data = new NapProtoMsg(proto.NTV2RichMediaReq).encode({ + reqHead: { + common: { + requestId: 3, + command: 100, + }, + scene: { + requestType: 2, + businessType: 2, + sceneType: 2, + group: { + groupUin, + }, + }, + client: { + agentType: 2, + }, + }, + upload: { + uploadInfo: [ + { + fileInfo: { + fileSize: +video.fileSize, + fileHash: video.fileMd5, + fileSha1: video.fileSha1, + fileName: 'nya.mp4', + type: { + type: 2, + picFormat: 0, + videoFormat: 0, + voiceFormat: 0, + }, + height: 0, + width: 0, + time: 0, + original: 0, }, - upload: { - uploadInfo: [ - { - fileInfo: { - fileSize: +video.fileSize, - fileHash: video.fileMd5, - fileSha1: video.fileSha1, - fileName: 'nya.mp4', - type: { - type: 2, - picFormat: 0, - videoFormat: 0, - voiceFormat: 0 - }, - height: 0, - width: 0, - time: 0, - original: 0 - }, - subFileType: 0 - }, { - fileInfo: { - fileSize: +video.thumbSize, - fileHash: video.thumbMd5, - fileSha1: video.thumbSha1, - fileName: 'nya.jpg', - type: { - type: 1, - picFormat: 0, - videoFormat: 0, - voiceFormat: 0 - }, - height: video.thumbHeight, - width: video.thumbWidth, - time: 0, - original: 0 - }, - subFileType: 100 - } - ], - tryFastUploadCompleted: true, - srvSendMsg: false, - clientRandomId: crypto.randomBytes(8).readBigUInt64BE() & BigInt('0x7FFFFFFFFFFFFFFF'), - compatQMsgSceneType: 2, - extBizInfo: { - pic: { - bizType: 0, - textSummary: 'Nya~', - }, - video: { - bytesPbReserve: Buffer.from([0x80, 0x01, 0x00]), - }, - ptt: { - bytesPbReserve: Buffer.alloc(0), - bytesReserve: Buffer.alloc(0), - bytesGeneralFlags: Buffer.alloc(0), - } - }, - clientSeq: 0, - noNeedCompatMsg: false - } - }); - return OidbBase.build(0x11EA, 100, data, true, false); - } + subFileType: 0, + }, { + fileInfo: { + fileSize: +video.thumbSize, + fileHash: video.thumbMd5, + fileSha1: video.thumbSha1, + fileName: 'nya.jpg', + type: { + type: 1, + picFormat: 0, + videoFormat: 0, + voiceFormat: 0, + }, + height: video.thumbHeight, + width: video.thumbWidth, + time: 0, + original: 0, + }, + subFileType: 100, + }, + ], + tryFastUploadCompleted: true, + srvSendMsg: false, + clientRandomId: crypto.randomBytes(8).readBigUInt64BE() & BigInt('0x7FFFFFFFFFFFFFFF'), + compatQMsgSceneType: 2, + extBizInfo: { + pic: { + bizType: 0, + textSummary: 'Nya~', + }, + video: { + bytesPbReserve: Buffer.from([0x80, 0x01, 0x00]), + }, + ptt: { + bytesPbReserve: Buffer.alloc(0), + bytesReserve: Buffer.alloc(0), + bytesGeneralFlags: Buffer.alloc(0), + }, + }, + clientSeq: 0, + noNeedCompatMsg: false, + }, + }); + return OidbBase.build(0x11EA, 100, data, true, false); + } - parse(data: Buffer) { - const oidbBody = OidbBase.parse(data).body; - return new NapProtoMsg(proto.NTV2RichMediaResp).decode(oidbBody); - } + parse (data: Buffer) { + const oidbBody = OidbBase.parse(data).body; + return new NapProtoMsg(proto.NTV2RichMediaResp).decode(oidbBody); + } } export default new UploadGroupVideo(); diff --git a/src/core/packet/transformer/highway/UploadPrivateFile.ts b/src/core/packet/transformer/highway/UploadPrivateFile.ts index 8083f785..1f5a2cbe 100644 --- a/src/core/packet/transformer/highway/UploadPrivateFile.ts +++ b/src/core/packet/transformer/highway/UploadPrivateFile.ts @@ -6,36 +6,36 @@ import { PacketMsgFileElement } from '@/core/packet/message/element'; import { computeMd5AndLengthWithLimit } from '@/core/packet/utils/crypto/hash'; class UploadPrivateFile extends PacketTransformer { - constructor() { - super(); - } + constructor () { + super(); + } - async build(selfUid: string, peerUid: string, file: PacketMsgFileElement): Promise { - const body = new NapProtoMsg(proto.OidbSvcTrpcTcp0XE37_1700).encode({ - command: 1700, - seq: 0, - upload: { - senderUid: selfUid, - receiverUid: peerUid, - fileSize: file.fileSize, - fileName: file.fileName, - md510MCheckSum: await computeMd5AndLengthWithLimit(file.filePath, 10 * 1024 * 1024), - sha1CheckSum: file.fileSha1, - localPath: '/', - md5CheckSum: file.fileMd5, - sha3CheckSum: Buffer.alloc(0) - }, - businessId: 3, - clientType: 1, - flagSupportMediaPlatform: 1 - }); - return OidbBase.build(0xE37, 1700, body, false, false); - } + async build (selfUid: string, peerUid: string, file: PacketMsgFileElement): Promise { + const body = new NapProtoMsg(proto.OidbSvcTrpcTcp0XE37_1700).encode({ + command: 1700, + seq: 0, + upload: { + senderUid: selfUid, + receiverUid: peerUid, + fileSize: file.fileSize, + fileName: file.fileName, + md510MCheckSum: await computeMd5AndLengthWithLimit(file.filePath, 10 * 1024 * 1024), + sha1CheckSum: file.fileSha1, + localPath: '/', + md5CheckSum: file.fileMd5, + sha3CheckSum: Buffer.alloc(0), + }, + businessId: 3, + clientType: 1, + flagSupportMediaPlatform: 1, + }); + return OidbBase.build(0xE37, 1700, body, false, false); + } - parse(data: Buffer) { - const oidbBody = OidbBase.parse(data).body; - return new NapProtoMsg(proto.OidbSvcTrpcTcp0XE37Response).decode(oidbBody); - } + parse (data: Buffer) { + const oidbBody = OidbBase.parse(data).body; + return new NapProtoMsg(proto.OidbSvcTrpcTcp0XE37Response).decode(oidbBody); + } } export default new UploadPrivateFile(); diff --git a/src/core/packet/transformer/highway/UploadPrivateImage.ts b/src/core/packet/transformer/highway/UploadPrivateImage.ts index b655440f..83204674 100644 --- a/src/core/packet/transformer/highway/UploadPrivateImage.ts +++ b/src/core/packet/transformer/highway/UploadPrivateImage.ts @@ -6,85 +6,85 @@ import crypto from 'node:crypto'; import { PacketMsgPicElement } from '@/core/packet/message/element'; class UploadPrivateImage extends PacketTransformer { - constructor() { - super(); - } + constructor () { + super(); + } - build(peerUin: string, img: PacketMsgPicElement): OidbPacket { - const data = new NapProtoMsg(proto.NTV2RichMediaReq).encode({ - reqHead: { - common: { - requestId: 1, - command: 100 - }, - scene: { - requestType: 2, - businessType: 1, - sceneType: 1, - c2C: { - accountType: 2, - targetUid: peerUin - }, - }, - client: { - agentType: 2, - } + build (peerUin: string, img: PacketMsgPicElement): OidbPacket { + const data = new NapProtoMsg(proto.NTV2RichMediaReq).encode({ + reqHead: { + common: { + requestId: 1, + command: 100, + }, + scene: { + requestType: 2, + businessType: 1, + sceneType: 1, + c2C: { + accountType: 2, + targetUid: peerUin, + }, + }, + client: { + agentType: 2, + }, + }, + upload: { + uploadInfo: [ + { + fileInfo: { + fileSize: +img.size, + fileHash: img.md5, + fileSha1: img.sha1!, + fileName: img.name, + type: { + type: 1, + picFormat: img.picType, // TODO: extend NapCat imgType /cc @MliKiowa + videoFormat: 0, + voiceFormat: 0, + }, + width: img.width, + height: img.height, + time: 0, + original: 1, }, - upload: { - uploadInfo: [ - { - fileInfo: { - fileSize: +img.size, - fileHash: img.md5, - fileSha1: img.sha1!, - fileName: img.name, - type: { - type: 1, - picFormat: img.picType, //TODO: extend NapCat imgType /cc @MliKiowa - videoFormat: 0, - voiceFormat: 0, - }, - width: img.width, - height: img.height, - time: 0, - original: 1 - }, - subFileType: 0, - } - ], - tryFastUploadCompleted: true, - srvSendMsg: false, - clientRandomId: crypto.randomBytes(8).readBigUInt64BE() & BigInt('0x7FFFFFFFFFFFFFFF'), - compatQMsgSceneType: 1, - extBizInfo: { - pic: { - bizType: img.picSubType, - bytesPbReserveC2C: { - subType: img.picSubType, - }, - textSummary: img.summary, - }, - video: { - bytesPbReserve: Buffer.alloc(0), - }, - ptt: { - bytesPbReserve: Buffer.alloc(0), - bytesReserve: Buffer.alloc(0), - bytesGeneralFlags: Buffer.alloc(0), - } - }, - clientSeq: 0, - noNeedCompatMsg: false, - } - } - ); - return OidbBase.build(0x11C5, 100, data,true, false); + subFileType: 0, + }, + ], + tryFastUploadCompleted: true, + srvSendMsg: false, + clientRandomId: crypto.randomBytes(8).readBigUInt64BE() & BigInt('0x7FFFFFFFFFFFFFFF'), + compatQMsgSceneType: 1, + extBizInfo: { + pic: { + bizType: img.picSubType, + bytesPbReserveC2C: { + subType: img.picSubType, + }, + textSummary: img.summary, + }, + video: { + bytesPbReserve: Buffer.alloc(0), + }, + ptt: { + bytesPbReserve: Buffer.alloc(0), + bytesReserve: Buffer.alloc(0), + bytesGeneralFlags: Buffer.alloc(0), + }, + }, + clientSeq: 0, + noNeedCompatMsg: false, + }, } + ); + return OidbBase.build(0x11C5, 100, data, true, false); + } - parse(data: Buffer) { - const oidbBody = OidbBase.parse(data).body; - return new NapProtoMsg(proto.NTV2RichMediaResp).decode(oidbBody); - } + parse (data: Buffer) { + const oidbBody = OidbBase.parse(data).body; + return new NapProtoMsg(proto.NTV2RichMediaResp).decode(oidbBody); + } } export default new UploadPrivateImage(); diff --git a/src/core/packet/transformer/highway/UploadPrivatePtt.ts b/src/core/packet/transformer/highway/UploadPrivatePtt.ts index 07b151de..b917541a 100644 --- a/src/core/packet/transformer/highway/UploadPrivatePtt.ts +++ b/src/core/packet/transformer/highway/UploadPrivatePtt.ts @@ -6,76 +6,76 @@ import crypto from 'node:crypto'; import { PacketMsgPttElement } from '@/core/packet/message/element'; class UploadPrivatePtt extends PacketTransformer { - constructor() { - super(); - } + constructor () { + super(); + } - build(peerUin: string, ptt: PacketMsgPttElement): OidbPacket { - const data = new NapProtoMsg(proto.NTV2RichMediaReq).encode({ - reqHead: { - common: { - requestId: 4, - command: 100 - }, - scene: { - requestType: 2, - businessType: 3, - sceneType: 1, - c2C: { - accountType: 2, - targetUid: peerUin - } - }, - client: { - agentType: 2 - } + build (peerUin: string, ptt: PacketMsgPttElement): OidbPacket { + const data = new NapProtoMsg(proto.NTV2RichMediaReq).encode({ + reqHead: { + common: { + requestId: 4, + command: 100, + }, + scene: { + requestType: 2, + businessType: 3, + sceneType: 1, + c2C: { + accountType: 2, + targetUid: peerUin, + }, + }, + client: { + agentType: 2, + }, + }, + upload: { + uploadInfo: [ + { + fileInfo: { + fileSize: ptt.fileSize, + fileHash: ptt.fileMd5, + fileSha1: ptt.fileSha1, + fileName: `${ptt.fileMd5}.amr`, + type: { + type: 3, + picFormat: 0, + videoFormat: 0, + voiceFormat: 1, + }, + height: 0, + width: 0, + time: ptt.fileDuration, + original: 0, }, - upload: { - uploadInfo: [ - { - fileInfo: { - fileSize: ptt.fileSize, - fileHash: ptt.fileMd5, - fileSha1: ptt.fileSha1, - fileName: `${ptt.fileMd5}.amr`, - type: { - type: 3, - picFormat: 0, - videoFormat: 0, - voiceFormat: 1 - }, - height: 0, - width: 0, - time: ptt.fileDuration, - original: 0 - }, - subFileType: 0 - } - ], - tryFastUploadCompleted: true, - srvSendMsg: false, - clientRandomId: crypto.randomBytes(8).readBigUInt64BE() & BigInt('0x7FFFFFFFFFFFFFFF'), - compatQMsgSceneType: 1, - extBizInfo: { - pic: { - textSummary: 'Nya~', - }, - ptt: { - bytesReserve: Buffer.from([0x08, 0x00, 0x38, 0x00]), - bytesGeneralFlags: Buffer.from([0x9a, 0x01, 0x0b, 0xaa, 0x03, 0x08, 0x08, 0x04, 0x12, 0x04, 0x00, 0x00, 0x00, 0x00]), - } - }, - clientSeq: 0, - noNeedCompatMsg: false - } - }); - return OidbBase.build(0x126D, 100, data, true, false); - } + subFileType: 0, + }, + ], + tryFastUploadCompleted: true, + srvSendMsg: false, + clientRandomId: crypto.randomBytes(8).readBigUInt64BE() & BigInt('0x7FFFFFFFFFFFFFFF'), + compatQMsgSceneType: 1, + extBizInfo: { + pic: { + textSummary: 'Nya~', + }, + ptt: { + bytesReserve: Buffer.from([0x08, 0x00, 0x38, 0x00]), + bytesGeneralFlags: Buffer.from([0x9a, 0x01, 0x0b, 0xaa, 0x03, 0x08, 0x08, 0x04, 0x12, 0x04, 0x00, 0x00, 0x00, 0x00]), + }, + }, + clientSeq: 0, + noNeedCompatMsg: false, + }, + }); + return OidbBase.build(0x126D, 100, data, true, false); + } - parse(data: Buffer) { - const oidbBody = OidbBase.parse(data).body; - return new NapProtoMsg(proto.NTV2RichMediaResp).decode(oidbBody); - } + parse (data: Buffer) { + const oidbBody = OidbBase.parse(data).body; + return new NapProtoMsg(proto.NTV2RichMediaResp).decode(oidbBody); + } } export default new UploadPrivatePtt(); diff --git a/src/core/packet/transformer/highway/UploadPrivateVideo.ts b/src/core/packet/transformer/highway/UploadPrivateVideo.ts index 24c05093..03344ae3 100644 --- a/src/core/packet/transformer/highway/UploadPrivateVideo.ts +++ b/src/core/packet/transformer/highway/UploadPrivateVideo.ts @@ -6,100 +6,100 @@ import crypto from 'node:crypto'; import { PacketMsgVideoElement } from '@/core/packet/message/element'; class UploadPrivateVideo extends PacketTransformer { - constructor() { - super(); - } + constructor () { + super(); + } - build(peerUin: string, video: PacketMsgVideoElement): OidbPacket { - if (!video.fileSize || !video.thumbSize) throw new Error('video.fileSize or video.thumbSize is empty'); - const data = new NapProtoMsg(proto.NTV2RichMediaReq).encode({ - reqHead: { - common: { - requestId: 3, - command: 100 - }, - scene: { - requestType: 2, - businessType: 2, - sceneType: 1, - c2C: { - accountType: 2, - targetUid: peerUin - } - }, - client: { - agentType: 2 - } + build (peerUin: string, video: PacketMsgVideoElement): OidbPacket { + if (!video.fileSize || !video.thumbSize) throw new Error('video.fileSize or video.thumbSize is empty'); + const data = new NapProtoMsg(proto.NTV2RichMediaReq).encode({ + reqHead: { + common: { + requestId: 3, + command: 100, + }, + scene: { + requestType: 2, + businessType: 2, + sceneType: 1, + c2C: { + accountType: 2, + targetUid: peerUin, + }, + }, + client: { + agentType: 2, + }, + }, + upload: { + uploadInfo: [ + { + fileInfo: { + fileSize: +video.fileSize, + fileHash: video.fileMd5, + fileSha1: video.fileSha1, + fileName: 'nya.mp4', + type: { + type: 2, + picFormat: 0, + videoFormat: 0, + voiceFormat: 0, + }, + height: 0, + width: 0, + time: 0, + original: 0, }, - upload: { - uploadInfo: [ - { - fileInfo: { - fileSize: +video.fileSize, - fileHash: video.fileMd5, - fileSha1: video.fileSha1, - fileName: 'nya.mp4', - type: { - type: 2, - picFormat: 0, - videoFormat: 0, - voiceFormat: 0 - }, - height: 0, - width: 0, - time: 0, - original: 0 - }, - subFileType: 0 - }, { - fileInfo: { - fileSize: +video.thumbSize, - fileHash: video.thumbMd5, - fileSha1: video.thumbSha1, - fileName: 'nya.jpg', - type: { - type: 1, - picFormat: 0, - videoFormat: 0, - voiceFormat: 0 - }, - height: video.thumbHeight, - width: video.thumbWidth, - time: 0, - original: 0 - }, - subFileType: 100 - } - ], - tryFastUploadCompleted: true, - srvSendMsg: false, - clientRandomId: crypto.randomBytes(8).readBigUInt64BE() & BigInt('0x7FFFFFFFFFFFFFFF'), - compatQMsgSceneType: 2, - extBizInfo: { - pic: { - bizType: 0, - textSummary: 'Nya~', - }, - video: { - bytesPbReserve: Buffer.from([0x80, 0x01, 0x00]), - }, - ptt: { - bytesPbReserve: Buffer.alloc(0), - bytesReserve: Buffer.alloc(0), - bytesGeneralFlags: Buffer.alloc(0), - } - }, - clientSeq: 0, - noNeedCompatMsg: false - } - }); - return OidbBase.build(0x11E9, 100, data, true, false); - } + subFileType: 0, + }, { + fileInfo: { + fileSize: +video.thumbSize, + fileHash: video.thumbMd5, + fileSha1: video.thumbSha1, + fileName: 'nya.jpg', + type: { + type: 1, + picFormat: 0, + videoFormat: 0, + voiceFormat: 0, + }, + height: video.thumbHeight, + width: video.thumbWidth, + time: 0, + original: 0, + }, + subFileType: 100, + }, + ], + tryFastUploadCompleted: true, + srvSendMsg: false, + clientRandomId: crypto.randomBytes(8).readBigUInt64BE() & BigInt('0x7FFFFFFFFFFFFFFF'), + compatQMsgSceneType: 2, + extBizInfo: { + pic: { + bizType: 0, + textSummary: 'Nya~', + }, + video: { + bytesPbReserve: Buffer.from([0x80, 0x01, 0x00]), + }, + ptt: { + bytesPbReserve: Buffer.alloc(0), + bytesReserve: Buffer.alloc(0), + bytesGeneralFlags: Buffer.alloc(0), + }, + }, + clientSeq: 0, + noNeedCompatMsg: false, + }, + }); + return OidbBase.build(0x11E9, 100, data, true, false); + } - parse(data: Buffer) { - const oidbBody = OidbBase.parse(data).body; - return new NapProtoMsg(proto.NTV2RichMediaResp).decode(oidbBody); - } + parse (data: Buffer) { + const oidbBody = OidbBase.parse(data).body; + return new NapProtoMsg(proto.NTV2RichMediaResp).decode(oidbBody); + } } export default new UploadPrivateVideo(); diff --git a/src/core/packet/transformer/highway/index.ts b/src/core/packet/transformer/highway/index.ts index ef202112..596d156f 100644 --- a/src/core/packet/transformer/highway/index.ts +++ b/src/core/packet/transformer/highway/index.ts @@ -15,4 +15,4 @@ export { default as DownloadImage } from './DownloadImage'; export { default as DownloadGroupImage } from './DownloadGroupImage'; export { default as DownloadVideo } from './DownloadVideo'; export { default as DownloadGroupVideo } from './DownloadGroupVideo'; -export { default as DownloadPtt } from './DownloadPtt'; \ No newline at end of file +export { default as DownloadPtt } from './DownloadPtt'; diff --git a/src/core/packet/transformer/message/DownloadForwardMsg.ts b/src/core/packet/transformer/message/DownloadForwardMsg.ts index a1248e69..4ec6cc30 100644 --- a/src/core/packet/transformer/message/DownloadForwardMsg.ts +++ b/src/core/packet/transformer/message/DownloadForwardMsg.ts @@ -3,35 +3,35 @@ import { NapProtoMsg } from '@napneko/nap-proto-core'; import { OidbPacket, PacketBufBuilder, PacketTransformer } from '@/core/packet/transformer/base'; class DownloadForwardMsg extends PacketTransformer { - constructor() { - super(); - } + constructor () { + super(); + } - build(uid: string, resId: string): OidbPacket { - const req = new NapProtoMsg(proto.RecvLongMsgReq).encode({ - info: { - uid: { - uid: uid - }, - resId: resId, - acquire: true - }, - settings: { - field1: 2, - field2: 0, - field3: 0, - field4: 0 - } - }); - return { - cmd: 'trpc.group.long_msg_interface.MsgService.SsoRecvLongMsg', - data: PacketBufBuilder(req) - }; - } + build (uid: string, resId: string): OidbPacket { + const req = new NapProtoMsg(proto.RecvLongMsgReq).encode({ + info: { + uid: { + uid, + }, + resId, + acquire: true, + }, + settings: { + field1: 2, + field2: 0, + field3: 0, + field4: 0, + }, + }); + return { + cmd: 'trpc.group.long_msg_interface.MsgService.SsoRecvLongMsg', + data: PacketBufBuilder(req), + }; + } - parse(data: Buffer) { - return new NapProtoMsg(proto.RecvLongMsgResp).decode(data); - } + parse (data: Buffer) { + return new NapProtoMsg(proto.RecvLongMsgResp).decode(data); + } } export default new DownloadForwardMsg(); diff --git a/src/core/packet/transformer/message/FetchC2CMessage.ts b/src/core/packet/transformer/message/FetchC2CMessage.ts index 1fc7adf9..dfa17489 100644 --- a/src/core/packet/transformer/message/FetchC2CMessage.ts +++ b/src/core/packet/transformer/message/FetchC2CMessage.ts @@ -3,25 +3,25 @@ import { NapProtoMsg } from '@napneko/nap-proto-core'; import { OidbPacket, PacketBufBuilder, PacketTransformer } from '@/core/packet/transformer/base'; class FetchC2CMessage extends PacketTransformer { - constructor() { - super(); - } + constructor () { + super(); + } - build(targetUid: string, startSeq: number, endSeq: number): OidbPacket { - const req = new NapProtoMsg(proto.SsoGetC2cMsg).encode({ - friendUid: targetUid, - startSequence: startSeq, - endSequence: endSeq, - }); - return { - cmd: 'trpc.msg.register_proxy.RegisterProxy.SsoGetC2cMsg', - data: PacketBufBuilder(req) - }; - } + build (targetUid: string, startSeq: number, endSeq: number): OidbPacket { + const req = new NapProtoMsg(proto.SsoGetC2cMsg).encode({ + friendUid: targetUid, + startSequence: startSeq, + endSequence: endSeq, + }); + return { + cmd: 'trpc.msg.register_proxy.RegisterProxy.SsoGetC2cMsg', + data: PacketBufBuilder(req), + }; + } - parse(data: Buffer) { - return new NapProtoMsg(proto.SsoGetC2cMsgResponse).decode(data); - } + parse (data: Buffer) { + return new NapProtoMsg(proto.SsoGetC2cMsgResponse).decode(data); + } } export default new FetchC2CMessage(); diff --git a/src/core/packet/transformer/message/FetchGroupMessage.ts b/src/core/packet/transformer/message/FetchGroupMessage.ts index 1bcbd2a6..7dee73f8 100644 --- a/src/core/packet/transformer/message/FetchGroupMessage.ts +++ b/src/core/packet/transformer/message/FetchGroupMessage.ts @@ -3,28 +3,28 @@ import { NapProtoMsg } from '@napneko/nap-proto-core'; import { OidbPacket, PacketBufBuilder, PacketTransformer } from '@/core/packet/transformer/base'; class FetchGroupMessage extends PacketTransformer { - constructor() { - super(); - } + constructor () { + super(); + } - build(groupUin: number, startSeq: number, endSeq: number): OidbPacket { - const req = new NapProtoMsg(proto.SsoGetGroupMsg).encode({ - info: { - groupUin: groupUin, - startSequence: startSeq, - endSequence: endSeq - }, - direction: true - }); - return { - cmd: 'trpc.msg.register_proxy.RegisterProxy.SsoGetGroupMsg', - data: PacketBufBuilder(req) - }; - } + build (groupUin: number, startSeq: number, endSeq: number): OidbPacket { + const req = new NapProtoMsg(proto.SsoGetGroupMsg).encode({ + info: { + groupUin, + startSequence: startSeq, + endSequence: endSeq, + }, + direction: true, + }); + return { + cmd: 'trpc.msg.register_proxy.RegisterProxy.SsoGetGroupMsg', + data: PacketBufBuilder(req), + }; + } - parse(data: Buffer) { - return new NapProtoMsg(proto.SsoGetGroupMsgResponse).decode(data); - } + parse (data: Buffer) { + return new NapProtoMsg(proto.SsoGetGroupMsgResponse).decode(data); + } } export default new FetchGroupMessage(); diff --git a/src/core/packet/transformer/message/UploadForwardMsg.ts b/src/core/packet/transformer/message/UploadForwardMsg.ts index c9d8a0d7..43cd8453 100644 --- a/src/core/packet/transformer/message/UploadForwardMsg.ts +++ b/src/core/packet/transformer/message/UploadForwardMsg.ts @@ -5,47 +5,47 @@ import { OidbPacket, PacketBufBuilder, PacketTransformer } from '@/core/packet/t import { PacketMsg } from '@/core/packet/message/message'; class UploadForwardMsg extends PacketTransformer { - constructor() { - super(); - } + constructor () { + super(); + } - build(selfUid: string, msg: PacketMsg[], groupUin: number = 0): OidbPacket { - const msgBody = this.msgBuilder.buildFakeMsg(selfUid, msg); - const longMsgResultData = new NapProtoMsg(proto.LongMsgResult).encode( - { - action: [{ - actionCommand: 'MultiMsg', - actionData: { - msgBody: msgBody - } - }] - } - ); - const payload = zlib.gzipSync(Buffer.from(longMsgResultData)); - const req = new NapProtoMsg(proto.SendLongMsgReq).encode( - { - info: { - type: groupUin === 0 ? 1 : 3, - uid: { - uid: groupUin === 0 ? selfUid : groupUin.toString(), - }, - groupUin: groupUin, - payload: payload - }, - settings: { - field1: 4, field2: 1, field3: 7, field4: 0 - } - } - ); - return { - cmd: 'trpc.group.long_msg_interface.MsgService.SsoSendLongMsg', - data: PacketBufBuilder(req) - }; - } + build (selfUid: string, msg: PacketMsg[], groupUin: number = 0): OidbPacket { + const msgBody = this.msgBuilder.buildFakeMsg(selfUid, msg); + const longMsgResultData = new NapProtoMsg(proto.LongMsgResult).encode( + { + action: [{ + actionCommand: 'MultiMsg', + actionData: { + msgBody, + }, + }], + } + ); + const payload = zlib.gzipSync(Buffer.from(longMsgResultData)); + const req = new NapProtoMsg(proto.SendLongMsgReq).encode( + { + info: { + type: groupUin === 0 ? 1 : 3, + uid: { + uid: groupUin === 0 ? selfUid : groupUin.toString(), + }, + groupUin, + payload, + }, + settings: { + field1: 4, field2: 1, field3: 7, field4: 0, + }, + } + ); + return { + cmd: 'trpc.group.long_msg_interface.MsgService.SsoSendLongMsg', + data: PacketBufBuilder(req), + }; + } - parse(data: Buffer) { - return new NapProtoMsg(proto.SendLongMsgResp).decode(data); - } + parse (data: Buffer) { + return new NapProtoMsg(proto.SendLongMsgResp).decode(data); + } } export default new UploadForwardMsg(); diff --git a/src/core/packet/transformer/proto/message/action.ts b/src/core/packet/transformer/proto/message/action.ts index 7bdbf7f2..f7bfb5f4 100644 --- a/src/core/packet/transformer/proto/message/action.ts +++ b/src/core/packet/transformer/proto/message/action.ts @@ -2,115 +2,115 @@ import { ProtoField, ScalarType } from '@napneko/nap-proto-core'; import { PushMsgBody } from '@/core/packet/transformer/proto'; export const LongMsgResult = { - action: ProtoField(2, () => LongMsgAction, false, true) + action: ProtoField(2, () => LongMsgAction, false, true), }; export const LongMsgAction = { - actionCommand: ProtoField(1, ScalarType.STRING), - actionData: ProtoField(2, () => LongMsgContent) + actionCommand: ProtoField(1, ScalarType.STRING), + actionData: ProtoField(2, () => LongMsgContent), }; export const LongMsgContent = { - msgBody: ProtoField(1, () => PushMsgBody, false, true) + msgBody: ProtoField(1, () => PushMsgBody, false, true), }; export const RecvLongMsgReq = { - info: ProtoField(1, () => RecvLongMsgInfo, true), - settings: ProtoField(15, () => LongMsgSettings, true) + info: ProtoField(1, () => RecvLongMsgInfo, true), + settings: ProtoField(15, () => LongMsgSettings, true), }; export const RecvLongMsgInfo = { - uid: ProtoField(1, () => LongMsgUid, true), - resId: ProtoField(2, ScalarType.STRING, true), - acquire: ProtoField(3, ScalarType.BOOL) + uid: ProtoField(1, () => LongMsgUid, true), + resId: ProtoField(2, ScalarType.STRING, true), + acquire: ProtoField(3, ScalarType.BOOL), }; export const LongMsgUid = { - uid: ProtoField(2, ScalarType.STRING, true) + uid: ProtoField(2, ScalarType.STRING, true), }; export const LongMsgSettings = { - field1: ProtoField(1, ScalarType.UINT32), - field2: ProtoField(2, ScalarType.UINT32), - field3: ProtoField(3, ScalarType.UINT32), - field4: ProtoField(4, ScalarType.UINT32) + field1: ProtoField(1, ScalarType.UINT32), + field2: ProtoField(2, ScalarType.UINT32), + field3: ProtoField(3, ScalarType.UINT32), + field4: ProtoField(4, ScalarType.UINT32), }; export const RecvLongMsgResp = { - result: ProtoField(1, () => RecvLongMsgResult), - settings: ProtoField(15, () => LongMsgSettings) + result: ProtoField(1, () => RecvLongMsgResult), + settings: ProtoField(15, () => LongMsgSettings), }; export const RecvLongMsgResult = { - resId: ProtoField(3, ScalarType.STRING), - payload: ProtoField(4, ScalarType.BYTES) + resId: ProtoField(3, ScalarType.STRING), + payload: ProtoField(4, ScalarType.BYTES), }; export const SendLongMsgReq = { - info: ProtoField(2, () => SendLongMsgInfo), - settings: ProtoField(15, () => LongMsgSettings) + info: ProtoField(2, () => SendLongMsgInfo), + settings: ProtoField(15, () => LongMsgSettings), }; export const SendLongMsgInfo = { - type: ProtoField(1, ScalarType.UINT32), - uid: ProtoField(2, () => LongMsgUid, true), - groupUin: ProtoField(3, ScalarType.UINT32, true), - payload: ProtoField(4, ScalarType.BYTES, true) + type: ProtoField(1, ScalarType.UINT32), + uid: ProtoField(2, () => LongMsgUid, true), + groupUin: ProtoField(3, ScalarType.UINT32, true), + payload: ProtoField(4, ScalarType.BYTES, true), }; export const SendLongMsgResp = { - result: ProtoField(2, () => SendLongMsgResult), - settings: ProtoField(15, () => LongMsgSettings) + result: ProtoField(2, () => SendLongMsgResult), + settings: ProtoField(15, () => LongMsgSettings), }; export const SendLongMsgResult = { - resId: ProtoField(3, ScalarType.STRING) + resId: ProtoField(3, ScalarType.STRING), }; export const SsoGetGroupMsg = { - info: ProtoField(1, () => SsoGetGroupMsgInfo), - direction: ProtoField(2, ScalarType.BOOL) + info: ProtoField(1, () => SsoGetGroupMsgInfo), + direction: ProtoField(2, ScalarType.BOOL), }; export const SsoGetGroupMsgInfo = { - groupUin: ProtoField(1, ScalarType.UINT32), - startSequence: ProtoField(2, ScalarType.UINT32), - endSequence: ProtoField(3, ScalarType.UINT32) + groupUin: ProtoField(1, ScalarType.UINT32), + startSequence: ProtoField(2, ScalarType.UINT32), + endSequence: ProtoField(3, ScalarType.UINT32), }; export const SsoGetGroupMsgResponse = { - body: ProtoField(3, () => SsoGetGroupMsgResponseBody) + body: ProtoField(3, () => SsoGetGroupMsgResponseBody), }; export const SsoGetGroupMsgResponseBody = { - groupUin: ProtoField(3, ScalarType.UINT32), - startSequence: ProtoField(4, ScalarType.UINT32), - endSequence: ProtoField(5, ScalarType.UINT32), - messages: ProtoField(6, () => PushMsgBody, false, true) + groupUin: ProtoField(3, ScalarType.UINT32), + startSequence: ProtoField(4, ScalarType.UINT32), + endSequence: ProtoField(5, ScalarType.UINT32), + messages: ProtoField(6, () => PushMsgBody, false, true), }; export const SsoGetRoamMsg = { - friendUid: ProtoField(1, ScalarType.STRING, true), - time: ProtoField(2, ScalarType.UINT32), - random: ProtoField(3, ScalarType.UINT32), - count: ProtoField(4, ScalarType.UINT32), - direction: ProtoField(5, ScalarType.BOOL) + friendUid: ProtoField(1, ScalarType.STRING, true), + time: ProtoField(2, ScalarType.UINT32), + random: ProtoField(3, ScalarType.UINT32), + count: ProtoField(4, ScalarType.UINT32), + direction: ProtoField(5, ScalarType.BOOL), }; export const SsoGetRoamMsgResponse = { - friendUid: ProtoField(3, ScalarType.STRING), - timestamp: ProtoField(5, ScalarType.UINT32), - random: ProtoField(6, ScalarType.UINT32), - messages: ProtoField(7, () => PushMsgBody, false, true) + friendUid: ProtoField(3, ScalarType.STRING), + timestamp: ProtoField(5, ScalarType.UINT32), + random: ProtoField(6, ScalarType.UINT32), + messages: ProtoField(7, () => PushMsgBody, false, true), }; export const SsoGetC2cMsg = { - friendUid: ProtoField(2, ScalarType.STRING, true), - startSequence: ProtoField(3, ScalarType.UINT32), - endSequence: ProtoField(4, ScalarType.UINT32) + friendUid: ProtoField(2, ScalarType.STRING, true), + startSequence: ProtoField(3, ScalarType.UINT32), + endSequence: ProtoField(4, ScalarType.UINT32), }; export const SsoGetC2cMsgResponse = { - friendUid: ProtoField(4, ScalarType.STRING), - messages: ProtoField(7, () => PushMsgBody, false, true) + friendUid: ProtoField(4, ScalarType.STRING), + messages: ProtoField(7, () => PushMsgBody, false, true), }; diff --git a/src/core/packet/transformer/proto/message/c2c.ts b/src/core/packet/transformer/proto/message/c2c.ts index cc99f6f2..44346efd 100644 --- a/src/core/packet/transformer/proto/message/c2c.ts +++ b/src/core/packet/transformer/proto/message/c2c.ts @@ -1,10 +1,10 @@ import { ProtoField, ScalarType } from '@napneko/nap-proto-core'; export const C2C = { - uin: ProtoField(1, ScalarType.UINT32, true), - uid: ProtoField(2, ScalarType.STRING, true), - field3: ProtoField(3, ScalarType.UINT32, true), - sig: ProtoField(4, ScalarType.UINT32, true), - receiverUin: ProtoField(5, ScalarType.UINT32, true), - receiverUid: ProtoField(6, ScalarType.STRING, true), + uin: ProtoField(1, ScalarType.UINT32, true), + uid: ProtoField(2, ScalarType.STRING, true), + field3: ProtoField(3, ScalarType.UINT32, true), + sig: ProtoField(4, ScalarType.UINT32, true), + receiverUin: ProtoField(5, ScalarType.UINT32, true), + receiverUid: ProtoField(6, ScalarType.STRING, true), }; diff --git a/src/core/packet/transformer/proto/message/component.ts b/src/core/packet/transformer/proto/message/component.ts index 3299f0ef..ac35765c 100644 --- a/src/core/packet/transformer/proto/message/component.ts +++ b/src/core/packet/transformer/proto/message/component.ts @@ -2,164 +2,164 @@ import { ProtoField, ScalarType } from '@napneko/nap-proto-core'; import { Elem } from '@/core/packet/transformer/proto'; export const Attr = { - codePage: ProtoField(1, ScalarType.INT32), - time: ProtoField(2, ScalarType.INT32), - random: ProtoField(3, ScalarType.INT32), - color: ProtoField(4, ScalarType.INT32), - size: ProtoField(5, ScalarType.INT32), - effect: ProtoField(6, ScalarType.INT32), - charSet: ProtoField(7, ScalarType.INT32), - pitchAndFamily: ProtoField(8, ScalarType.INT32), - fontName: ProtoField(9, ScalarType.STRING), - reserveData: ProtoField(10, ScalarType.BYTES), + codePage: ProtoField(1, ScalarType.INT32), + time: ProtoField(2, ScalarType.INT32), + random: ProtoField(3, ScalarType.INT32), + color: ProtoField(4, ScalarType.INT32), + size: ProtoField(5, ScalarType.INT32), + effect: ProtoField(6, ScalarType.INT32), + charSet: ProtoField(7, ScalarType.INT32), + pitchAndFamily: ProtoField(8, ScalarType.INT32), + fontName: ProtoField(9, ScalarType.STRING), + reserveData: ProtoField(10, ScalarType.BYTES), }; export const NotOnlineFile = { - fileType: ProtoField(1, ScalarType.INT32, true), - sig: ProtoField(2, ScalarType.BYTES, true), - fileUuid: ProtoField(3, ScalarType.STRING, true), - fileMd5: ProtoField(4, ScalarType.BYTES, true), - fileName: ProtoField(5, ScalarType.STRING, true), - fileSize: ProtoField(6, ScalarType.INT64, true), - note: ProtoField(7, ScalarType.BYTES, true), - reserved: ProtoField(8, ScalarType.INT32, true), - subcmd: ProtoField(9, ScalarType.INT32, true), - microCloud: ProtoField(10, ScalarType.INT32, true), - bytesFileUrls: ProtoField(11, ScalarType.BYTES, false, true), - downloadFlag: ProtoField(12, ScalarType.INT32, true), - dangerEvel: ProtoField(50, ScalarType.INT32, true), - lifeTime: ProtoField(51, ScalarType.INT32, true), - uploadTime: ProtoField(52, ScalarType.INT32, true), - absFileType: ProtoField(53, ScalarType.INT32, true), - clientType: ProtoField(54, ScalarType.INT32, true), - expireTime: ProtoField(55, ScalarType.INT32, true), - pbReserve: ProtoField(56, ScalarType.BYTES, true), - fileHash: ProtoField(57, ScalarType.STRING, true), + fileType: ProtoField(1, ScalarType.INT32, true), + sig: ProtoField(2, ScalarType.BYTES, true), + fileUuid: ProtoField(3, ScalarType.STRING, true), + fileMd5: ProtoField(4, ScalarType.BYTES, true), + fileName: ProtoField(5, ScalarType.STRING, true), + fileSize: ProtoField(6, ScalarType.INT64, true), + note: ProtoField(7, ScalarType.BYTES, true), + reserved: ProtoField(8, ScalarType.INT32, true), + subcmd: ProtoField(9, ScalarType.INT32, true), + microCloud: ProtoField(10, ScalarType.INT32, true), + bytesFileUrls: ProtoField(11, ScalarType.BYTES, false, true), + downloadFlag: ProtoField(12, ScalarType.INT32, true), + dangerEvel: ProtoField(50, ScalarType.INT32, true), + lifeTime: ProtoField(51, ScalarType.INT32, true), + uploadTime: ProtoField(52, ScalarType.INT32, true), + absFileType: ProtoField(53, ScalarType.INT32, true), + clientType: ProtoField(54, ScalarType.INT32, true), + expireTime: ProtoField(55, ScalarType.INT32, true), + pbReserve: ProtoField(56, ScalarType.BYTES, true), + fileHash: ProtoField(57, ScalarType.STRING, true), }; export const Ptt = { - fileType: ProtoField(1, ScalarType.INT32), - srcUin: ProtoField(2, ScalarType.UINT64), - fileUuid: ProtoField(3, ScalarType.STRING), - fileMd5: ProtoField(4, ScalarType.BYTES), - fileName: ProtoField(5, ScalarType.STRING), - fileSize: ProtoField(6, ScalarType.INT32), - reserve: ProtoField(7, ScalarType.BYTES), - fileId: ProtoField(8, ScalarType.INT32), - serverIp: ProtoField(9, ScalarType.INT32), - serverPort: ProtoField(10, ScalarType.INT32), - boolValid: ProtoField(11, ScalarType.BOOL), - signature: ProtoField(12, ScalarType.BYTES), - shortcut: ProtoField(13, ScalarType.BYTES), - fileKey: ProtoField(14, ScalarType.BYTES), - magicPttIndex: ProtoField(15, ScalarType.INT32), - voiceSwitch: ProtoField(16, ScalarType.INT32), - pttUrl: ProtoField(17, ScalarType.BYTES), - groupFileKey: ProtoField(18, ScalarType.STRING), - time: ProtoField(19, ScalarType.INT32), - downPara: ProtoField(20, ScalarType.BYTES), - format: ProtoField(29, ScalarType.INT32), - pbReserve: ProtoField(30, ScalarType.BYTES), - bytesPttUrls: ProtoField(31, ScalarType.BYTES, false, true), - downloadFlag: ProtoField(32, ScalarType.INT32), + fileType: ProtoField(1, ScalarType.INT32), + srcUin: ProtoField(2, ScalarType.UINT64), + fileUuid: ProtoField(3, ScalarType.STRING), + fileMd5: ProtoField(4, ScalarType.BYTES), + fileName: ProtoField(5, ScalarType.STRING), + fileSize: ProtoField(6, ScalarType.INT32), + reserve: ProtoField(7, ScalarType.BYTES), + fileId: ProtoField(8, ScalarType.INT32), + serverIp: ProtoField(9, ScalarType.INT32), + serverPort: ProtoField(10, ScalarType.INT32), + boolValid: ProtoField(11, ScalarType.BOOL), + signature: ProtoField(12, ScalarType.BYTES), + shortcut: ProtoField(13, ScalarType.BYTES), + fileKey: ProtoField(14, ScalarType.BYTES), + magicPttIndex: ProtoField(15, ScalarType.INT32), + voiceSwitch: ProtoField(16, ScalarType.INT32), + pttUrl: ProtoField(17, ScalarType.BYTES), + groupFileKey: ProtoField(18, ScalarType.STRING), + time: ProtoField(19, ScalarType.INT32), + downPara: ProtoField(20, ScalarType.BYTES), + format: ProtoField(29, ScalarType.INT32), + pbReserve: ProtoField(30, ScalarType.BYTES), + bytesPttUrls: ProtoField(31, ScalarType.BYTES, false, true), + downloadFlag: ProtoField(32, ScalarType.INT32), }; export const RichText = { - attr: ProtoField(1, () => Attr, true), - elems: ProtoField(2, () => Elem, false, true), - notOnlineFile: ProtoField(3, () => NotOnlineFile, true), - ptt: ProtoField(4, () => Ptt, true), + attr: ProtoField(1, () => Attr, true), + elems: ProtoField(2, () => Elem, false, true), + notOnlineFile: ProtoField(3, () => NotOnlineFile, true), + ptt: ProtoField(4, () => Ptt, true), }; export const ButtonExtra = { - data: ProtoField(1, () => KeyboardData), + data: ProtoField(1, () => KeyboardData), }; export const KeyboardData = { - rows: ProtoField(1, () => Row, false, true), + rows: ProtoField(1, () => Row, false, true), }; export const Row = { - buttons: ProtoField(1, () => Button, false, true), + buttons: ProtoField(1, () => Button, false, true), }; export const Button = { - id: ProtoField(1, ScalarType.STRING), - renderData: ProtoField(2, () => RenderData), - action: ProtoField(3, () => Action), + id: ProtoField(1, ScalarType.STRING), + renderData: ProtoField(2, () => RenderData), + action: ProtoField(3, () => Action), }; export const RenderData = { - label: ProtoField(1, ScalarType.STRING), - visitedLabel: ProtoField(2, ScalarType.STRING), - style: ProtoField(3, ScalarType.INT32), + label: ProtoField(1, ScalarType.STRING), + visitedLabel: ProtoField(2, ScalarType.STRING), + style: ProtoField(3, ScalarType.INT32), }; export const Action = { - type: ProtoField(1, ScalarType.INT32), - permission: ProtoField(2, () => Permission), - unsupportTips: ProtoField(4, ScalarType.STRING), - data: ProtoField(5, ScalarType.STRING), - reply: ProtoField(7, ScalarType.BOOL), - enter: ProtoField(8, ScalarType.BOOL), + type: ProtoField(1, ScalarType.INT32), + permission: ProtoField(2, () => Permission), + unsupportTips: ProtoField(4, ScalarType.STRING), + data: ProtoField(5, ScalarType.STRING), + reply: ProtoField(7, ScalarType.BOOL), + enter: ProtoField(8, ScalarType.BOOL), }; export const Permission = { - type: ProtoField(1, ScalarType.INT32), - specifyRoleIds: ProtoField(2, ScalarType.STRING, false, true), - specifyUserIds: ProtoField(3, ScalarType.STRING, false, true), + type: ProtoField(1, ScalarType.INT32), + specifyRoleIds: ProtoField(2, ScalarType.STRING, false, true), + specifyUserIds: ProtoField(3, ScalarType.STRING, false, true), }; export const FileExtra = { - file: ProtoField(1, () => NotOnlineFile), - field6: ProtoField(6, () => PrivateFileExtra), + file: ProtoField(1, () => NotOnlineFile), + field6: ProtoField(6, () => PrivateFileExtra), }; export const PrivateFileExtra = { - field2: ProtoField(2, () => PrivateFileExtraField2), + field2: ProtoField(2, () => PrivateFileExtraField2), }; export const PrivateFileExtraField2 = { - field1: ProtoField(1, ScalarType.UINT32), - fileUuid: ProtoField(4, ScalarType.STRING), - fileName: ProtoField(5, ScalarType.STRING), - field6: ProtoField(6, ScalarType.UINT32), - field7: ProtoField(7, ScalarType.BYTES), - field8: ProtoField(8, ScalarType.BYTES), - timestamp1: ProtoField(9, ScalarType.UINT32), - fileHash: ProtoField(14, ScalarType.STRING), - selfUid: ProtoField(15, ScalarType.STRING), - destUid: ProtoField(16, ScalarType.STRING), + field1: ProtoField(1, ScalarType.UINT32), + fileUuid: ProtoField(4, ScalarType.STRING), + fileName: ProtoField(5, ScalarType.STRING), + field6: ProtoField(6, ScalarType.UINT32), + field7: ProtoField(7, ScalarType.BYTES), + field8: ProtoField(8, ScalarType.BYTES), + timestamp1: ProtoField(9, ScalarType.UINT32), + fileHash: ProtoField(14, ScalarType.STRING), + selfUid: ProtoField(15, ScalarType.STRING), + destUid: ProtoField(16, ScalarType.STRING), }; export const GroupFileExtra = { - field1: ProtoField(1, ScalarType.UINT32), - fileName: ProtoField(2, ScalarType.STRING), - display: ProtoField(3, ScalarType.STRING), - inner: ProtoField(7, () => GroupFileExtraInner), + field1: ProtoField(1, ScalarType.UINT32), + fileName: ProtoField(2, ScalarType.STRING), + display: ProtoField(3, ScalarType.STRING), + inner: ProtoField(7, () => GroupFileExtraInner), }; export const GroupFileExtraInner = { - info: ProtoField(2, () => GroupFileExtraInfo), + info: ProtoField(2, () => GroupFileExtraInfo), }; export const GroupFileExtraInfo = { - busId: ProtoField(1, ScalarType.UINT32), - fileId: ProtoField(2, ScalarType.STRING), - fileSize: ProtoField(3, ScalarType.UINT64), - fileName: ProtoField(4, ScalarType.STRING), - field5: ProtoField(5, ScalarType.UINT32), - fileSha: ProtoField(6, ScalarType.BYTES), - extInfoString: ProtoField(7, ScalarType.STRING), - fileMd5: ProtoField(8, ScalarType.BYTES), + busId: ProtoField(1, ScalarType.UINT32), + fileId: ProtoField(2, ScalarType.STRING), + fileSize: ProtoField(3, ScalarType.UINT64), + fileName: ProtoField(4, ScalarType.STRING), + field5: ProtoField(5, ScalarType.UINT32), + fileSha: ProtoField(6, ScalarType.BYTES), + extInfoString: ProtoField(7, ScalarType.STRING), + fileMd5: ProtoField(8, ScalarType.BYTES), }; export const ImageExtraUrl = { - origUrl: ProtoField(30, ScalarType.STRING), + origUrl: ProtoField(30, ScalarType.STRING), }; export const PokeExtra = { - type: ProtoField(1, ScalarType.UINT32), - field7: ProtoField(7, ScalarType.UINT32), - field8: ProtoField(8, ScalarType.UINT32), + type: ProtoField(1, ScalarType.UINT32), + field7: ProtoField(7, ScalarType.UINT32), + field8: ProtoField(8, ScalarType.UINT32), }; diff --git a/src/core/packet/transformer/proto/message/element.ts b/src/core/packet/transformer/proto/message/element.ts index 2e674860..acadefd3 100644 --- a/src/core/packet/transformer/proto/message/element.ts +++ b/src/core/packet/transformer/proto/message/element.ts @@ -1,360 +1,360 @@ import { ProtoField, ScalarType } from '@napneko/nap-proto-core'; export const Elem = { - text: ProtoField(1, () => Text, true), - face: ProtoField(2, () => Face, true), - onlineImage: ProtoField(3, () => OnlineImage, true), - notOnlineImage: ProtoField(4, () => NotOnlineImage, true), - transElem: ProtoField(5, () => TransElem, true), - marketFace: ProtoField(6, () => MarketFace, true), - customFace: ProtoField(8, () => CustomFace, true), - elemFlags2: ProtoField(9, () => ElemFlags2, true), - richMsg: ProtoField(12, () => RichMsg, true), - groupFile: ProtoField(13, () => GroupFile, true), - extraInfo: ProtoField(16, () => ExtraInfo, true), - videoFile: ProtoField(19, () => VideoFile, true), - anonymousGroupMessage: ProtoField(21, () => AnonymousGroupMessage, true), - customElem: ProtoField(31, () => CustomElem, true), - generalFlags: ProtoField(37, () => GeneralFlags, true), - srcMsg: ProtoField(45, () => SrcMsg, true), - lightAppElem: ProtoField(51, () => LightAppElem, true), - commonElem: ProtoField(53, () => CommonElem, true), + text: ProtoField(1, () => Text, true), + face: ProtoField(2, () => Face, true), + onlineImage: ProtoField(3, () => OnlineImage, true), + notOnlineImage: ProtoField(4, () => NotOnlineImage, true), + transElem: ProtoField(5, () => TransElem, true), + marketFace: ProtoField(6, () => MarketFace, true), + customFace: ProtoField(8, () => CustomFace, true), + elemFlags2: ProtoField(9, () => ElemFlags2, true), + richMsg: ProtoField(12, () => RichMsg, true), + groupFile: ProtoField(13, () => GroupFile, true), + extraInfo: ProtoField(16, () => ExtraInfo, true), + videoFile: ProtoField(19, () => VideoFile, true), + anonymousGroupMessage: ProtoField(21, () => AnonymousGroupMessage, true), + customElem: ProtoField(31, () => CustomElem, true), + generalFlags: ProtoField(37, () => GeneralFlags, true), + srcMsg: ProtoField(45, () => SrcMsg, true), + lightAppElem: ProtoField(51, () => LightAppElem, true), + commonElem: ProtoField(53, () => CommonElem, true), }; export const Text = { - str: ProtoField(1, ScalarType.STRING, true), - lint: ProtoField(2, ScalarType.STRING, true), - attr6Buf: ProtoField(3, ScalarType.BYTES, true), - attr7Buf: ProtoField(4, ScalarType.BYTES, true), - buf: ProtoField(11, ScalarType.BYTES, true), - pbReserve: ProtoField(12, ScalarType.BYTES, true), + str: ProtoField(1, ScalarType.STRING, true), + lint: ProtoField(2, ScalarType.STRING, true), + attr6Buf: ProtoField(3, ScalarType.BYTES, true), + attr7Buf: ProtoField(4, ScalarType.BYTES, true), + buf: ProtoField(11, ScalarType.BYTES, true), + pbReserve: ProtoField(12, ScalarType.BYTES, true), }; export const Face = { - index: ProtoField(1, ScalarType.INT32, true), - old: ProtoField(2, ScalarType.BYTES, true), - buf: ProtoField(11, ScalarType.BYTES, true), + index: ProtoField(1, ScalarType.INT32, true), + old: ProtoField(2, ScalarType.BYTES, true), + buf: ProtoField(11, ScalarType.BYTES, true), }; export const OnlineImage = { - guid: ProtoField(1, ScalarType.BYTES), - filePath: ProtoField(2, ScalarType.BYTES), - oldVerSendFile: ProtoField(3, ScalarType.BYTES), + guid: ProtoField(1, ScalarType.BYTES), + filePath: ProtoField(2, ScalarType.BYTES), + oldVerSendFile: ProtoField(3, ScalarType.BYTES), }; export const NotOnlineImage = { - filePath: ProtoField(1, ScalarType.STRING), - fileLen: ProtoField(2, ScalarType.UINT32), - downloadPath: ProtoField(3, ScalarType.STRING), - oldVerSendFile: ProtoField(4, ScalarType.BYTES), - imgType: ProtoField(5, ScalarType.INT32), - previewsImage: ProtoField(6, ScalarType.BYTES), - picMd5: ProtoField(7, ScalarType.BYTES), - picHeight: ProtoField(8, ScalarType.UINT32), - picWidth: ProtoField(9, ScalarType.UINT32), - resId: ProtoField(10, ScalarType.STRING), - flag: ProtoField(11, ScalarType.BYTES), - thumbUrl: ProtoField(12, ScalarType.STRING), - original: ProtoField(13, ScalarType.INT32), - bigUrl: ProtoField(14, ScalarType.STRING), - origUrl: ProtoField(15, ScalarType.STRING), - bizType: ProtoField(16, ScalarType.INT32), - result: ProtoField(17, ScalarType.INT32), - index: ProtoField(18, ScalarType.INT32), - opFaceBuf: ProtoField(19, ScalarType.BYTES), - oldPicMd5: ProtoField(20, ScalarType.BOOL), - thumbWidth: ProtoField(21, ScalarType.INT32), - thumbHeight: ProtoField(22, ScalarType.INT32), - fileId: ProtoField(23, ScalarType.INT32), - showLen: ProtoField(24, ScalarType.UINT32), - downloadLen: ProtoField(25, ScalarType.UINT32), - x400Url: ProtoField(26, ScalarType.STRING), - x400Width: ProtoField(27, ScalarType.INT32), - x400Height: ProtoField(28, ScalarType.INT32), - pbRes: ProtoField(29, () => NotOnlineImage_PbReserve), + filePath: ProtoField(1, ScalarType.STRING), + fileLen: ProtoField(2, ScalarType.UINT32), + downloadPath: ProtoField(3, ScalarType.STRING), + oldVerSendFile: ProtoField(4, ScalarType.BYTES), + imgType: ProtoField(5, ScalarType.INT32), + previewsImage: ProtoField(6, ScalarType.BYTES), + picMd5: ProtoField(7, ScalarType.BYTES), + picHeight: ProtoField(8, ScalarType.UINT32), + picWidth: ProtoField(9, ScalarType.UINT32), + resId: ProtoField(10, ScalarType.STRING), + flag: ProtoField(11, ScalarType.BYTES), + thumbUrl: ProtoField(12, ScalarType.STRING), + original: ProtoField(13, ScalarType.INT32), + bigUrl: ProtoField(14, ScalarType.STRING), + origUrl: ProtoField(15, ScalarType.STRING), + bizType: ProtoField(16, ScalarType.INT32), + result: ProtoField(17, ScalarType.INT32), + index: ProtoField(18, ScalarType.INT32), + opFaceBuf: ProtoField(19, ScalarType.BYTES), + oldPicMd5: ProtoField(20, ScalarType.BOOL), + thumbWidth: ProtoField(21, ScalarType.INT32), + thumbHeight: ProtoField(22, ScalarType.INT32), + fileId: ProtoField(23, ScalarType.INT32), + showLen: ProtoField(24, ScalarType.UINT32), + downloadLen: ProtoField(25, ScalarType.UINT32), + x400Url: ProtoField(26, ScalarType.STRING), + x400Width: ProtoField(27, ScalarType.INT32), + x400Height: ProtoField(28, ScalarType.INT32), + pbRes: ProtoField(29, () => NotOnlineImage_PbReserve), }; export const NotOnlineImage_PbReserve = { - subType: ProtoField(1, ScalarType.INT32), - field3: ProtoField(3, ScalarType.INT32), - field4: ProtoField(4, ScalarType.INT32), - summary: ProtoField(8, ScalarType.STRING), - field10: ProtoField(10, ScalarType.INT32), - field20: ProtoField(20, () => NotOnlineImage_PbReserve2), - url: ProtoField(30, ScalarType.STRING), - md5Str: ProtoField(31, ScalarType.STRING), + subType: ProtoField(1, ScalarType.INT32), + field3: ProtoField(3, ScalarType.INT32), + field4: ProtoField(4, ScalarType.INT32), + summary: ProtoField(8, ScalarType.STRING), + field10: ProtoField(10, ScalarType.INT32), + field20: ProtoField(20, () => NotOnlineImage_PbReserve2), + url: ProtoField(30, ScalarType.STRING), + md5Str: ProtoField(31, ScalarType.STRING), }; export const NotOnlineImage_PbReserve2 = { - field1: ProtoField(1, ScalarType.INT32), - field2: ProtoField(2, ScalarType.STRING), - field3: ProtoField(3, ScalarType.INT32), - field4: ProtoField(4, ScalarType.INT32), - field5: ProtoField(5, ScalarType.INT32), - field7: ProtoField(7, ScalarType.STRING), + field1: ProtoField(1, ScalarType.INT32), + field2: ProtoField(2, ScalarType.STRING), + field3: ProtoField(3, ScalarType.INT32), + field4: ProtoField(4, ScalarType.INT32), + field5: ProtoField(5, ScalarType.INT32), + field7: ProtoField(7, ScalarType.STRING), }; export const TransElem = { - elemType: ProtoField(1, ScalarType.INT32), - elemValue: ProtoField(2, ScalarType.BYTES), + elemType: ProtoField(1, ScalarType.INT32), + elemValue: ProtoField(2, ScalarType.BYTES), }; export const MarketFace = { - faceName: ProtoField(1, ScalarType.STRING), - itemType: ProtoField(2, ScalarType.INT32), - faceInfo: ProtoField(3, ScalarType.INT32), - faceId: ProtoField(4, ScalarType.BYTES), - tabId: ProtoField(5, ScalarType.INT32), - subType: ProtoField(6, ScalarType.INT32), - key: ProtoField(7, ScalarType.STRING), - param: ProtoField(8, ScalarType.BYTES), - mediaType: ProtoField(9, ScalarType.INT32), - imageWidth: ProtoField(10, ScalarType.INT32), - imageHeight: ProtoField(11, ScalarType.INT32), - mobileparam: ProtoField(12, ScalarType.BYTES), - pbReserve: ProtoField(13, () => MarketFacePbRes), + faceName: ProtoField(1, ScalarType.STRING), + itemType: ProtoField(2, ScalarType.INT32), + faceInfo: ProtoField(3, ScalarType.INT32), + faceId: ProtoField(4, ScalarType.BYTES), + tabId: ProtoField(5, ScalarType.INT32), + subType: ProtoField(6, ScalarType.INT32), + key: ProtoField(7, ScalarType.STRING), + param: ProtoField(8, ScalarType.BYTES), + mediaType: ProtoField(9, ScalarType.INT32), + imageWidth: ProtoField(10, ScalarType.INT32), + imageHeight: ProtoField(11, ScalarType.INT32), + mobileparam: ProtoField(12, ScalarType.BYTES), + pbReserve: ProtoField(13, () => MarketFacePbRes), }; export const MarketFacePbRes = { - field8: ProtoField(8, ScalarType.INT32) + field8: ProtoField(8, ScalarType.INT32), }; export const CustomFace = { - guid: ProtoField(1, ScalarType.BYTES), - filePath: ProtoField(2, ScalarType.STRING), - shortcut: ProtoField(3, ScalarType.STRING), - buffer: ProtoField(4, ScalarType.BYTES), - flag: ProtoField(5, ScalarType.BYTES), - oldData: ProtoField(6, ScalarType.BYTES, true), - fileId: ProtoField(7, ScalarType.UINT32), - serverIp: ProtoField(8, ScalarType.INT32, true), - serverPort: ProtoField(9, ScalarType.INT32, true), - fileType: ProtoField(10, ScalarType.INT32), - signature: ProtoField(11, ScalarType.BYTES), - useful: ProtoField(12, ScalarType.INT32), - md5: ProtoField(13, ScalarType.BYTES), - thumbUrl: ProtoField(14, ScalarType.STRING), - bigUrl: ProtoField(15, ScalarType.STRING), - origUrl: ProtoField(16, ScalarType.STRING), - bizType: ProtoField(17, ScalarType.INT32), - repeatIndex: ProtoField(18, ScalarType.INT32), - repeatImage: ProtoField(19, ScalarType.INT32), - imageType: ProtoField(20, ScalarType.INT32), - index: ProtoField(21, ScalarType.INT32), - width: ProtoField(22, ScalarType.INT32), - height: ProtoField(23, ScalarType.INT32), - source: ProtoField(24, ScalarType.INT32), - size: ProtoField(25, ScalarType.UINT32), - origin: ProtoField(26, ScalarType.INT32), - thumbWidth: ProtoField(27, ScalarType.INT32, true), - thumbHeight: ProtoField(28, ScalarType.INT32, true), - showLen: ProtoField(29, ScalarType.INT32), - downloadLen: ProtoField(30, ScalarType.INT32), - x400Url: ProtoField(31, ScalarType.STRING, true), - x400Width: ProtoField(32, ScalarType.INT32), - x400Height: ProtoField(33, ScalarType.INT32), - pbRes: ProtoField(34, () => CustomFace_PbReserve, true), + guid: ProtoField(1, ScalarType.BYTES), + filePath: ProtoField(2, ScalarType.STRING), + shortcut: ProtoField(3, ScalarType.STRING), + buffer: ProtoField(4, ScalarType.BYTES), + flag: ProtoField(5, ScalarType.BYTES), + oldData: ProtoField(6, ScalarType.BYTES, true), + fileId: ProtoField(7, ScalarType.UINT32), + serverIp: ProtoField(8, ScalarType.INT32, true), + serverPort: ProtoField(9, ScalarType.INT32, true), + fileType: ProtoField(10, ScalarType.INT32), + signature: ProtoField(11, ScalarType.BYTES), + useful: ProtoField(12, ScalarType.INT32), + md5: ProtoField(13, ScalarType.BYTES), + thumbUrl: ProtoField(14, ScalarType.STRING), + bigUrl: ProtoField(15, ScalarType.STRING), + origUrl: ProtoField(16, ScalarType.STRING), + bizType: ProtoField(17, ScalarType.INT32), + repeatIndex: ProtoField(18, ScalarType.INT32), + repeatImage: ProtoField(19, ScalarType.INT32), + imageType: ProtoField(20, ScalarType.INT32), + index: ProtoField(21, ScalarType.INT32), + width: ProtoField(22, ScalarType.INT32), + height: ProtoField(23, ScalarType.INT32), + source: ProtoField(24, ScalarType.INT32), + size: ProtoField(25, ScalarType.UINT32), + origin: ProtoField(26, ScalarType.INT32), + thumbWidth: ProtoField(27, ScalarType.INT32, true), + thumbHeight: ProtoField(28, ScalarType.INT32, true), + showLen: ProtoField(29, ScalarType.INT32), + downloadLen: ProtoField(30, ScalarType.INT32), + x400Url: ProtoField(31, ScalarType.STRING, true), + x400Width: ProtoField(32, ScalarType.INT32), + x400Height: ProtoField(33, ScalarType.INT32), + pbRes: ProtoField(34, () => CustomFace_PbReserve, true), }; export const CustomFace_PbReserve = { - subType: ProtoField(1, ScalarType.INT32), - summary: ProtoField(9, ScalarType.STRING), + subType: ProtoField(1, ScalarType.INT32), + summary: ProtoField(9, ScalarType.STRING), }; export const ElemFlags2 = { - colorTextId: ProtoField(1, ScalarType.UINT32), - msgId: ProtoField(2, ScalarType.UINT64), - whisperSessionId: ProtoField(3, ScalarType.UINT32), - pttChangeBit: ProtoField(4, ScalarType.UINT32), - vipStatus: ProtoField(5, ScalarType.UINT32), - compatibleId: ProtoField(6, ScalarType.UINT32), - insts: ProtoField(7, () => Instance, false, true), - msgRptCnt: ProtoField(8, ScalarType.UINT32), - srcInst: ProtoField(9, () => Instance), - longtitude: ProtoField(10, ScalarType.UINT32), - latitude: ProtoField(11, ScalarType.UINT32), - customFont: ProtoField(12, ScalarType.UINT32), - pcSupportDef: ProtoField(13, () => PcSupportDef), - crmFlags: ProtoField(14, ScalarType.UINT32, true), + colorTextId: ProtoField(1, ScalarType.UINT32), + msgId: ProtoField(2, ScalarType.UINT64), + whisperSessionId: ProtoField(3, ScalarType.UINT32), + pttChangeBit: ProtoField(4, ScalarType.UINT32), + vipStatus: ProtoField(5, ScalarType.UINT32), + compatibleId: ProtoField(6, ScalarType.UINT32), + insts: ProtoField(7, () => Instance, false, true), + msgRptCnt: ProtoField(8, ScalarType.UINT32), + srcInst: ProtoField(9, () => Instance), + longtitude: ProtoField(10, ScalarType.UINT32), + latitude: ProtoField(11, ScalarType.UINT32), + customFont: ProtoField(12, ScalarType.UINT32), + pcSupportDef: ProtoField(13, () => PcSupportDef), + crmFlags: ProtoField(14, ScalarType.UINT32, true), }; export const PcSupportDef = { - pcPtlBegin: ProtoField(1, ScalarType.UINT32), - pcPtlEnd: ProtoField(2, ScalarType.UINT32), - macPtlBegin: ProtoField(3, ScalarType.UINT32), - macPtlEnd: ProtoField(4, ScalarType.UINT32), - ptlsSupport: ProtoField(5, ScalarType.INT32, false, true), - ptlsNotSupport: ProtoField(6, ScalarType.UINT32, false, true), + pcPtlBegin: ProtoField(1, ScalarType.UINT32), + pcPtlEnd: ProtoField(2, ScalarType.UINT32), + macPtlBegin: ProtoField(3, ScalarType.UINT32), + macPtlEnd: ProtoField(4, ScalarType.UINT32), + ptlsSupport: ProtoField(5, ScalarType.INT32, false, true), + ptlsNotSupport: ProtoField(6, ScalarType.UINT32, false, true), }; export const Instance = { - appId: ProtoField(1, ScalarType.UINT32), - instId: ProtoField(2, ScalarType.UINT32), + appId: ProtoField(1, ScalarType.UINT32), + instId: ProtoField(2, ScalarType.UINT32), }; export const RichMsg = { - template1: ProtoField(1, ScalarType.BYTES, true), - serviceId: ProtoField(2, ScalarType.INT32, true), - msgResId: ProtoField(3, ScalarType.BYTES, true), - rand: ProtoField(4, ScalarType.INT32, true), - seq: ProtoField(5, ScalarType.UINT32, true), + template1: ProtoField(1, ScalarType.BYTES, true), + serviceId: ProtoField(2, ScalarType.INT32, true), + msgResId: ProtoField(3, ScalarType.BYTES, true), + rand: ProtoField(4, ScalarType.INT32, true), + seq: ProtoField(5, ScalarType.UINT32, true), }; export const GroupFile = { - filename: ProtoField(1, ScalarType.BYTES), - fileSize: ProtoField(2, ScalarType.UINT64), - fileId: ProtoField(3, ScalarType.BYTES), - batchId: ProtoField(4, ScalarType.BYTES), - fileKey: ProtoField(5, ScalarType.BYTES), - mark: ProtoField(6, ScalarType.BYTES), - sequence: ProtoField(7, ScalarType.UINT64), - batchItemId: ProtoField(8, ScalarType.BYTES), - feedMsgTime: ProtoField(9, ScalarType.INT32), - pbReserve: ProtoField(10, ScalarType.BYTES), + filename: ProtoField(1, ScalarType.BYTES), + fileSize: ProtoField(2, ScalarType.UINT64), + fileId: ProtoField(3, ScalarType.BYTES), + batchId: ProtoField(4, ScalarType.BYTES), + fileKey: ProtoField(5, ScalarType.BYTES), + mark: ProtoField(6, ScalarType.BYTES), + sequence: ProtoField(7, ScalarType.UINT64), + batchItemId: ProtoField(8, ScalarType.BYTES), + feedMsgTime: ProtoField(9, ScalarType.INT32), + pbReserve: ProtoField(10, ScalarType.BYTES), }; export const ExtraInfo = { - nick: ProtoField(1, ScalarType.BYTES), - groupCard: ProtoField(2, ScalarType.BYTES), - level: ProtoField(3, ScalarType.INT32), - flags: ProtoField(4, ScalarType.INT32), - groupMask: ProtoField(5, ScalarType.INT32), - msgTailId: ProtoField(6, ScalarType.INT32), - senderTitle: ProtoField(7, ScalarType.BYTES), - apnsTips: ProtoField(8, ScalarType.BYTES), - uin: ProtoField(9, ScalarType.UINT64), - msgStateFlag: ProtoField(10, ScalarType.INT32), - apnsSoundType: ProtoField(11, ScalarType.INT32), - newGroupFlag: ProtoField(12, ScalarType.INT32), + nick: ProtoField(1, ScalarType.BYTES), + groupCard: ProtoField(2, ScalarType.BYTES), + level: ProtoField(3, ScalarType.INT32), + flags: ProtoField(4, ScalarType.INT32), + groupMask: ProtoField(5, ScalarType.INT32), + msgTailId: ProtoField(6, ScalarType.INT32), + senderTitle: ProtoField(7, ScalarType.BYTES), + apnsTips: ProtoField(8, ScalarType.BYTES), + uin: ProtoField(9, ScalarType.UINT64), + msgStateFlag: ProtoField(10, ScalarType.INT32), + apnsSoundType: ProtoField(11, ScalarType.INT32), + newGroupFlag: ProtoField(12, ScalarType.INT32), }; export const VideoFile = { - fileUuid: ProtoField(1, ScalarType.STRING), - fileMd5: ProtoField(2, ScalarType.BYTES), - fileName: ProtoField(3, ScalarType.STRING), - fileFormat: ProtoField(4, ScalarType.INT32), - fileTime: ProtoField(5, ScalarType.INT32), - fileSize: ProtoField(6, ScalarType.INT32), - thumbWidth: ProtoField(7, ScalarType.INT32), - thumbHeight: ProtoField(8, ScalarType.INT32), - thumbFileMd5: ProtoField(9, ScalarType.BYTES), - source: ProtoField(10, ScalarType.BYTES), - thumbFileSize: ProtoField(11, ScalarType.INT32), - busiType: ProtoField(12, ScalarType.INT32), - fromChatType: ProtoField(13, ScalarType.INT32), - toChatType: ProtoField(14, ScalarType.INT32), - boolSupportProgressive: ProtoField(15, ScalarType.BOOL), - fileWidth: ProtoField(16, ScalarType.INT32), - fileHeight: ProtoField(17, ScalarType.INT32), - subBusiType: ProtoField(18, ScalarType.INT32), - videoAttr: ProtoField(19, ScalarType.INT32), - bytesThumbFileUrls: ProtoField(20, ScalarType.BYTES, false, true), - bytesVideoFileUrls: ProtoField(21, ScalarType.BYTES, false, true), - thumbDownloadFlag: ProtoField(22, ScalarType.INT32), - videoDownloadFlag: ProtoField(23, ScalarType.INT32), - pbReserve: ProtoField(24, ScalarType.BYTES), + fileUuid: ProtoField(1, ScalarType.STRING), + fileMd5: ProtoField(2, ScalarType.BYTES), + fileName: ProtoField(3, ScalarType.STRING), + fileFormat: ProtoField(4, ScalarType.INT32), + fileTime: ProtoField(5, ScalarType.INT32), + fileSize: ProtoField(6, ScalarType.INT32), + thumbWidth: ProtoField(7, ScalarType.INT32), + thumbHeight: ProtoField(8, ScalarType.INT32), + thumbFileMd5: ProtoField(9, ScalarType.BYTES), + source: ProtoField(10, ScalarType.BYTES), + thumbFileSize: ProtoField(11, ScalarType.INT32), + busiType: ProtoField(12, ScalarType.INT32), + fromChatType: ProtoField(13, ScalarType.INT32), + toChatType: ProtoField(14, ScalarType.INT32), + boolSupportProgressive: ProtoField(15, ScalarType.BOOL), + fileWidth: ProtoField(16, ScalarType.INT32), + fileHeight: ProtoField(17, ScalarType.INT32), + subBusiType: ProtoField(18, ScalarType.INT32), + videoAttr: ProtoField(19, ScalarType.INT32), + bytesThumbFileUrls: ProtoField(20, ScalarType.BYTES, false, true), + bytesVideoFileUrls: ProtoField(21, ScalarType.BYTES, false, true), + thumbDownloadFlag: ProtoField(22, ScalarType.INT32), + videoDownloadFlag: ProtoField(23, ScalarType.INT32), + pbReserve: ProtoField(24, ScalarType.BYTES), }; export const AnonymousGroupMessage = { - flags: ProtoField(1, ScalarType.INT32), - anonId: ProtoField(2, ScalarType.BYTES), - anonNick: ProtoField(3, ScalarType.BYTES), - headPortrait: ProtoField(4, ScalarType.INT32), - expireTime: ProtoField(5, ScalarType.INT32), - bubbleId: ProtoField(6, ScalarType.INT32), - rankColor: ProtoField(7, ScalarType.BYTES), + flags: ProtoField(1, ScalarType.INT32), + anonId: ProtoField(2, ScalarType.BYTES), + anonNick: ProtoField(3, ScalarType.BYTES), + headPortrait: ProtoField(4, ScalarType.INT32), + expireTime: ProtoField(5, ScalarType.INT32), + bubbleId: ProtoField(6, ScalarType.INT32), + rankColor: ProtoField(7, ScalarType.BYTES), }; export const CustomElem = { - desc: ProtoField(1, ScalarType.BYTES), - data: ProtoField(2, ScalarType.BYTES), - enumType: ProtoField(3, ScalarType.INT32), - ext: ProtoField(4, ScalarType.BYTES), - sound: ProtoField(5, ScalarType.BYTES), + desc: ProtoField(1, ScalarType.BYTES), + data: ProtoField(2, ScalarType.BYTES), + enumType: ProtoField(3, ScalarType.INT32), + ext: ProtoField(4, ScalarType.BYTES), + sound: ProtoField(5, ScalarType.BYTES), }; export const GeneralFlags = { - bubbleDiyTextId: ProtoField(1, ScalarType.INT32), - groupFlagNew: ProtoField(2, ScalarType.INT32), - uin: ProtoField(3, ScalarType.UINT64), - rpId: ProtoField(4, ScalarType.BYTES), - prpFold: ProtoField(5, ScalarType.INT32), - longTextFlag: ProtoField(6, ScalarType.INT32), - longTextResId: ProtoField(7, ScalarType.STRING, true), - groupType: ProtoField(8, ScalarType.INT32), - toUinFlag: ProtoField(9, ScalarType.INT32), - glamourLevel: ProtoField(10, ScalarType.INT32), - memberLevel: ProtoField(11, ScalarType.INT32), - groupRankSeq: ProtoField(12, ScalarType.UINT64), - olympicTorch: ProtoField(13, ScalarType.INT32), - babyqGuideMsgCookie: ProtoField(14, ScalarType.BYTES), - uin32ExpertFlag: ProtoField(15, ScalarType.INT32), - bubbleSubId: ProtoField(16, ScalarType.INT32), - pendantId: ProtoField(17, ScalarType.UINT64), - rpIndex: ProtoField(18, ScalarType.BYTES), - pbReserve: ProtoField(19, ScalarType.BYTES), + bubbleDiyTextId: ProtoField(1, ScalarType.INT32), + groupFlagNew: ProtoField(2, ScalarType.INT32), + uin: ProtoField(3, ScalarType.UINT64), + rpId: ProtoField(4, ScalarType.BYTES), + prpFold: ProtoField(5, ScalarType.INT32), + longTextFlag: ProtoField(6, ScalarType.INT32), + longTextResId: ProtoField(7, ScalarType.STRING, true), + groupType: ProtoField(8, ScalarType.INT32), + toUinFlag: ProtoField(9, ScalarType.INT32), + glamourLevel: ProtoField(10, ScalarType.INT32), + memberLevel: ProtoField(11, ScalarType.INT32), + groupRankSeq: ProtoField(12, ScalarType.UINT64), + olympicTorch: ProtoField(13, ScalarType.INT32), + babyqGuideMsgCookie: ProtoField(14, ScalarType.BYTES), + uin32ExpertFlag: ProtoField(15, ScalarType.INT32), + bubbleSubId: ProtoField(16, ScalarType.INT32), + pendantId: ProtoField(17, ScalarType.UINT64), + rpIndex: ProtoField(18, ScalarType.BYTES), + pbReserve: ProtoField(19, ScalarType.BYTES), }; export const SrcMsg = { - origSeqs: ProtoField(1, ScalarType.UINT32, false, true), - senderUin: ProtoField(2, ScalarType.UINT64), - time: ProtoField(3, ScalarType.INT32, true), - flag: ProtoField(4, ScalarType.INT32, true), - elems: ProtoField(5, () => Elem, false, true), - type: ProtoField(6, ScalarType.INT32, true), - richMsg: ProtoField(7, ScalarType.BYTES, true), - pbReserve: ProtoField(8, () => SrcMsgPbRes, true), - sourceMsg: ProtoField(9, ScalarType.BYTES, true), - toUin: ProtoField(10, ScalarType.UINT64, true), - troopName: ProtoField(11, ScalarType.BYTES, true), + origSeqs: ProtoField(1, ScalarType.UINT32, false, true), + senderUin: ProtoField(2, ScalarType.UINT64), + time: ProtoField(3, ScalarType.INT32, true), + flag: ProtoField(4, ScalarType.INT32, true), + elems: ProtoField(5, () => Elem, false, true), + type: ProtoField(6, ScalarType.INT32, true), + richMsg: ProtoField(7, ScalarType.BYTES, true), + pbReserve: ProtoField(8, () => SrcMsgPbRes, true), + sourceMsg: ProtoField(9, ScalarType.BYTES, true), + toUin: ProtoField(10, ScalarType.UINT64, true), + troopName: ProtoField(11, ScalarType.BYTES, true), }; export const SrcMsgPbRes = { - messageId: ProtoField(3, ScalarType.UINT64), - senderUid: ProtoField(6, ScalarType.STRING, true), - receiverUid: ProtoField(7, ScalarType.STRING, true), - friendSeq: ProtoField(8, ScalarType.UINT32, true), + messageId: ProtoField(3, ScalarType.UINT64), + senderUid: ProtoField(6, ScalarType.STRING, true), + receiverUid: ProtoField(7, ScalarType.STRING, true), + friendSeq: ProtoField(8, ScalarType.UINT32, true), }; export const LightAppElem = { - data: ProtoField(1, ScalarType.BYTES), - msgResid: ProtoField(2, ScalarType.BYTES, true), + data: ProtoField(1, ScalarType.BYTES), + msgResid: ProtoField(2, ScalarType.BYTES, true), }; export const CommonElem = { - serviceType: ProtoField(1, ScalarType.INT32), - pbElem: ProtoField(2, ScalarType.BYTES), - businessType: ProtoField(3, ScalarType.UINT32), + serviceType: ProtoField(1, ScalarType.INT32), + pbElem: ProtoField(2, ScalarType.BYTES), + businessType: ProtoField(3, ScalarType.UINT32), }; export const FaceExtra = { - faceId: ProtoField(1, ScalarType.INT32, true), + faceId: ProtoField(1, ScalarType.INT32, true), }; export const MentionExtra = { - type: ProtoField(3, ScalarType.INT32, true), - uin: ProtoField(4, ScalarType.UINT32, true), - field5: ProtoField(5, ScalarType.INT32, true), - uid: ProtoField(9, ScalarType.STRING, true), + type: ProtoField(3, ScalarType.INT32, true), + uin: ProtoField(4, ScalarType.UINT32, true), + field5: ProtoField(5, ScalarType.INT32, true), + uid: ProtoField(9, ScalarType.STRING, true), }; export const QBigFaceExtra = { - AniStickerPackId: ProtoField(1, ScalarType.STRING, true), - AniStickerId: ProtoField(2, ScalarType.STRING, true), - faceId: ProtoField(3, ScalarType.INT32, true), - sourceType: ProtoField(4, ScalarType.INT32, true), - AniStickerType: ProtoField(5, ScalarType.INT32, true), - resultId: ProtoField(6, ScalarType.STRING, true), - preview: ProtoField(7, ScalarType.STRING, true), - randomType: ProtoField(9, ScalarType.INT32, true), + AniStickerPackId: ProtoField(1, ScalarType.STRING, true), + AniStickerId: ProtoField(2, ScalarType.STRING, true), + faceId: ProtoField(3, ScalarType.INT32, true), + sourceType: ProtoField(4, ScalarType.INT32, true), + AniStickerType: ProtoField(5, ScalarType.INT32, true), + resultId: ProtoField(6, ScalarType.STRING, true), + preview: ProtoField(7, ScalarType.STRING, true), + randomType: ProtoField(9, ScalarType.INT32, true), }; export const QSmallFaceExtra = { - faceId: ProtoField(1, ScalarType.UINT32), - preview: ProtoField(2, ScalarType.STRING), - preview2: ProtoField(3, ScalarType.STRING), + faceId: ProtoField(1, ScalarType.UINT32), + preview: ProtoField(2, ScalarType.STRING), + preview2: ProtoField(3, ScalarType.STRING), }; export const MarkdownData = { - content: ProtoField(1, ScalarType.STRING) + content: ProtoField(1, ScalarType.STRING), }; diff --git a/src/core/packet/transformer/proto/message/group.ts b/src/core/packet/transformer/proto/message/group.ts index ceaef2b2..76baa63f 100644 --- a/src/core/packet/transformer/proto/message/group.ts +++ b/src/core/packet/transformer/proto/message/group.ts @@ -1,18 +1,18 @@ import { ProtoField, ScalarType } from '@napneko/nap-proto-core'; export const GroupRecallMsg = { - type: ProtoField(1, ScalarType.UINT32), - groupUin: ProtoField(2, ScalarType.UINT32), - field3: ProtoField(3, () => GroupRecallMsgField3), - field4: ProtoField(4, () => GroupRecallMsgField4), + type: ProtoField(1, ScalarType.UINT32), + groupUin: ProtoField(2, ScalarType.UINT32), + field3: ProtoField(3, () => GroupRecallMsgField3), + field4: ProtoField(4, () => GroupRecallMsgField4), }; export const GroupRecallMsgField3 = { - sequence: ProtoField(1, ScalarType.UINT32), - random: ProtoField(2, ScalarType.UINT32), - field3: ProtoField(3, ScalarType.UINT32), + sequence: ProtoField(1, ScalarType.UINT32), + random: ProtoField(2, ScalarType.UINT32), + field3: ProtoField(3, ScalarType.UINT32), }; export const GroupRecallMsgField4 = { - field1: ProtoField(1, ScalarType.UINT32), + field1: ProtoField(1, ScalarType.UINT32), }; diff --git a/src/core/packet/transformer/proto/message/groupAdmin.ts b/src/core/packet/transformer/proto/message/groupAdmin.ts index 7f0df482..ac6cf077 100644 --- a/src/core/packet/transformer/proto/message/groupAdmin.ts +++ b/src/core/packet/transformer/proto/message/groupAdmin.ts @@ -1,18 +1,18 @@ import { ProtoField, ScalarType } from '@napneko/nap-proto-core'; export const GroupAdminExtra = { - adminUid: ProtoField(1, ScalarType.STRING), - isPromote: ProtoField(2, ScalarType.BOOL), + adminUid: ProtoField(1, ScalarType.STRING), + isPromote: ProtoField(2, ScalarType.BOOL), }; export const GroupAdminBody = { - extraDisable: ProtoField(1, () => GroupAdminExtra), - extraEnable: ProtoField(2, () => GroupAdminExtra), + extraDisable: ProtoField(1, () => GroupAdminExtra), + extraEnable: ProtoField(2, () => GroupAdminExtra), }; export const GroupAdmin = { - groupUin: ProtoField(1, ScalarType.UINT32), - flag: ProtoField(2, ScalarType.UINT32), - isPromote: ProtoField(3, ScalarType.BOOL), - body: ProtoField(4, () => GroupAdminBody), -}; \ No newline at end of file + groupUin: ProtoField(1, ScalarType.UINT32), + flag: ProtoField(2, ScalarType.UINT32), + isPromote: ProtoField(3, ScalarType.BOOL), + body: ProtoField(4, () => GroupAdminBody), +}; diff --git a/src/core/packet/transformer/proto/message/message.ts b/src/core/packet/transformer/proto/message/message.ts index 1d804a1b..82912dfa 100644 --- a/src/core/packet/transformer/proto/message/message.ts +++ b/src/core/packet/transformer/proto/message/message.ts @@ -1,139 +1,138 @@ import { ProtoField, ScalarType } from '@napneko/nap-proto-core'; import { - C2C, - ForwardHead, - Grp, - GrpTmp, - ResponseForward, - ResponseGrp, RichText, - Trans0X211, - WPATmp + C2C, + ForwardHead, + Grp, + GrpTmp, + ResponseForward, + ResponseGrp, RichText, + Trans0X211, + WPATmp, } from '@/core/packet/transformer/proto'; export const ContentHead = { - type: ProtoField(1, ScalarType.UINT32), - subType: ProtoField(2, ScalarType.UINT32, true), - c2cCmd: ProtoField(3, ScalarType.UINT32, true), - ranDom: ProtoField(4, ScalarType.UINT32, true), - sequence: ProtoField(5, ScalarType.UINT32, true), - timeStamp: ProtoField(6, ScalarType.UINT32, true), - pkgNum: ProtoField(7, ScalarType.UINT64, true), - pkgIndex: ProtoField(8, ScalarType.UINT32, true), - divSeq: ProtoField(9, ScalarType.UINT32, true), - autoReply: ProtoField(10, ScalarType.UINT32), - ntMsgSeq: ProtoField(10, ScalarType.UINT32, true), - newId: ProtoField(12, ScalarType.UINT64, true), - forward: ProtoField(15, () => ForwardHead, true), + type: ProtoField(1, ScalarType.UINT32), + subType: ProtoField(2, ScalarType.UINT32, true), + c2cCmd: ProtoField(3, ScalarType.UINT32, true), + ranDom: ProtoField(4, ScalarType.UINT32, true), + sequence: ProtoField(5, ScalarType.UINT32, true), + timeStamp: ProtoField(6, ScalarType.UINT32, true), + pkgNum: ProtoField(7, ScalarType.UINT64, true), + pkgIndex: ProtoField(8, ScalarType.UINT32, true), + divSeq: ProtoField(9, ScalarType.UINT32, true), + autoReply: ProtoField(10, ScalarType.UINT32), + ntMsgSeq: ProtoField(10, ScalarType.UINT32, true), + newId: ProtoField(12, ScalarType.UINT64, true), + forward: ProtoField(15, () => ForwardHead, true), }; export const MessageBody = { - richText: ProtoField(1, () => RichText, true), - msgContent: ProtoField(2, ScalarType.BYTES, true), - msgEncryptContent: ProtoField(3, ScalarType.BYTES, true), + richText: ProtoField(1, () => RichText, true), + msgContent: ProtoField(2, ScalarType.BYTES, true), + msgEncryptContent: ProtoField(3, ScalarType.BYTES, true), }; export const Message = { - routingHead: ProtoField(1, () => RoutingHead, true), - contentHead: ProtoField(2, () => ContentHead, true), - body: ProtoField(3, () => MessageBody, true), - clientSequence: ProtoField(4, ScalarType.UINT32, true), - random: ProtoField(5, ScalarType.UINT32, true), - syncCookie: ProtoField(6, ScalarType.BYTES, true), - via: ProtoField(8, ScalarType.UINT32, true), - dataStatist: ProtoField(9, ScalarType.UINT32, true), - ctrl: ProtoField(12, () => MessageControl, true), - multiSendSeq: ProtoField(14, ScalarType.UINT32), + routingHead: ProtoField(1, () => RoutingHead, true), + contentHead: ProtoField(2, () => ContentHead, true), + body: ProtoField(3, () => MessageBody, true), + clientSequence: ProtoField(4, ScalarType.UINT32, true), + random: ProtoField(5, ScalarType.UINT32, true), + syncCookie: ProtoField(6, ScalarType.BYTES, true), + via: ProtoField(8, ScalarType.UINT32, true), + dataStatist: ProtoField(9, ScalarType.UINT32, true), + ctrl: ProtoField(12, () => MessageControl, true), + multiSendSeq: ProtoField(14, ScalarType.UINT32), }; export const MessageControl = { - msgFlag: ProtoField(1, ScalarType.INT32), + msgFlag: ProtoField(1, ScalarType.INT32), }; export const PushMsg = { - message: ProtoField(1, () => PushMsgBody), - status: ProtoField(3, ScalarType.INT32, true), - pingFlag: ProtoField(5, ScalarType.INT32, true), - generalFlag: ProtoField(9, ScalarType.INT32, true), + message: ProtoField(1, () => PushMsgBody), + status: ProtoField(3, ScalarType.INT32, true), + pingFlag: ProtoField(5, ScalarType.INT32, true), + generalFlag: ProtoField(9, ScalarType.INT32, true), }; export const GroupChangeInfo = { - operator: ProtoField(1, () => GroupChangeOperator, true), + operator: ProtoField(1, () => GroupChangeOperator, true), }; export const GroupChangeOperator = { - operatorUid: ProtoField(1, ScalarType.STRING, true), + operatorUid: ProtoField(1, ScalarType.STRING, true), }; export const GroupChange = { - groupUin: ProtoField(1, ScalarType.UINT32), - flag: ProtoField(2, ScalarType.UINT32), - memberUid: ProtoField(3, ScalarType.STRING, true), - decreaseType: ProtoField(4, ScalarType.UINT32), - operatorInfo: ProtoField(5, ScalarType.BYTES, true), - increaseType: ProtoField(6, ScalarType.UINT32), - field7: ProtoField(7, ScalarType.BYTES, true), + groupUin: ProtoField(1, ScalarType.UINT32), + flag: ProtoField(2, ScalarType.UINT32), + memberUid: ProtoField(3, ScalarType.STRING, true), + decreaseType: ProtoField(4, ScalarType.UINT32), + operatorInfo: ProtoField(5, ScalarType.BYTES, true), + increaseType: ProtoField(6, ScalarType.UINT32), + field7: ProtoField(7, ScalarType.BYTES, true), }; // Group Reaction Related export const GroupReactionDataInnerDataTarget = { - seq: ProtoField(1, ScalarType.UINT64, true), + seq: ProtoField(1, ScalarType.UINT64, true), }; export const GroupReactionDataContent = { - code: ProtoField(1, ScalarType.STRING, true), - count: ProtoField(3, ScalarType.UINT32, true), - operatorUid: ProtoField(4, ScalarType.STRING, true), - type: ProtoField(5, ScalarType.UINT32, true), + code: ProtoField(1, ScalarType.STRING, true), + count: ProtoField(3, ScalarType.UINT32, true), + operatorUid: ProtoField(4, ScalarType.STRING, true), + type: ProtoField(5, ScalarType.UINT32, true), }; export const GroupReactionDataInnerData = { - groupReactionTarget: ProtoField(2, () => GroupReactionDataInnerDataTarget, true), - groupReactionDataContent: ProtoField(3, () => GroupReactionDataContent, true), + groupReactionTarget: ProtoField(2, () => GroupReactionDataInnerDataTarget, true), + groupReactionDataContent: ProtoField(3, () => GroupReactionDataContent, true), }; export const GroupReactionDataInner = { - data: ProtoField(1, () => GroupReactionDataInnerData, true), + data: ProtoField(1, () => GroupReactionDataInnerData, true), }; export const GroupReactionData = { - data: ProtoField(1, () => GroupReactionDataInner, true), + data: ProtoField(1, () => GroupReactionDataInner, true), }; export const GroupReactNotify = { - groupUin: ProtoField(4, ScalarType.UINT64, true), - field13: ProtoField(13, ScalarType.UINT32, true), - groupReactionData: ProtoField(44, () => GroupReactionData, true), + groupUin: ProtoField(4, ScalarType.UINT64, true), + field13: ProtoField(13, ScalarType.UINT32, true), + groupReactionData: ProtoField(44, () => GroupReactionData, true), }; // Group Invite Related export const GroupInvite = { - groupUin: ProtoField(1, ScalarType.UINT32), - field2: ProtoField(2, ScalarType.UINT32), - field3: ProtoField(2, ScalarType.UINT32), - field4: ProtoField(2, ScalarType.UINT32), - invitorUid: ProtoField(5, ScalarType.STRING), + groupUin: ProtoField(1, ScalarType.UINT32), + field2: ProtoField(2, ScalarType.UINT32), + field3: ProtoField(2, ScalarType.UINT32), + field4: ProtoField(2, ScalarType.UINT32), + invitorUid: ProtoField(5, ScalarType.STRING), }; export const PushMsgBody = { - responseHead: ProtoField(1, () => ResponseHead), - contentHead: ProtoField(2, () => ContentHead), - body: ProtoField(3, () => MessageBody, true), + responseHead: ProtoField(1, () => ResponseHead), + contentHead: ProtoField(2, () => ContentHead), + body: ProtoField(3, () => MessageBody, true), }; export const ResponseHead = { - fromUin: ProtoField(1, ScalarType.UINT32), - fromUid: ProtoField(2, ScalarType.STRING, true), - type: ProtoField(3, ScalarType.UINT32), - sigMap: ProtoField(4, ScalarType.UINT32), - toUin: ProtoField(5, ScalarType.UINT32), - toUid: ProtoField(6, ScalarType.STRING, true), - forward: ProtoField(7, () => ResponseForward, true), - grp: ProtoField(8, () => ResponseGrp, true), + fromUin: ProtoField(1, ScalarType.UINT32), + fromUid: ProtoField(2, ScalarType.STRING, true), + type: ProtoField(3, ScalarType.UINT32), + sigMap: ProtoField(4, ScalarType.UINT32), + toUin: ProtoField(5, ScalarType.UINT32), + toUid: ProtoField(6, ScalarType.STRING, true), + forward: ProtoField(7, () => ResponseForward, true), + grp: ProtoField(8, () => ResponseGrp, true), }; export const RoutingHead = { - c2c: ProtoField(1, () => C2C, true), - grp: ProtoField(2, () => Grp, true), - grpTmp: ProtoField(3, () => GrpTmp, true), - wpaTmp: ProtoField(6, () => WPATmp, true), - trans0X211: ProtoField(15, () => Trans0X211, true), + c2c: ProtoField(1, () => C2C, true), + grp: ProtoField(2, () => Grp, true), + grpTmp: ProtoField(3, () => GrpTmp, true), + wpaTmp: ProtoField(6, () => WPATmp, true), + trans0X211: ProtoField(15, () => Trans0X211, true), }; - diff --git a/src/core/packet/transformer/proto/message/notify.ts b/src/core/packet/transformer/proto/message/notify.ts index 5e573e59..b55cf09b 100644 --- a/src/core/packet/transformer/proto/message/notify.ts +++ b/src/core/packet/transformer/proto/message/notify.ts @@ -1,21 +1,21 @@ import { ProtoField, ScalarType } from '@napneko/nap-proto-core'; export const FriendRecall = { - info: ProtoField(1, () => FriendRecallInfo), - instId: ProtoField(2, ScalarType.UINT32), - appId: ProtoField(3, ScalarType.UINT32), - longMessageFlag: ProtoField(4, ScalarType.UINT32), - reserved: ProtoField(5, ScalarType.BYTES), + info: ProtoField(1, () => FriendRecallInfo), + instId: ProtoField(2, ScalarType.UINT32), + appId: ProtoField(3, ScalarType.UINT32), + longMessageFlag: ProtoField(4, ScalarType.UINT32), + reserved: ProtoField(5, ScalarType.BYTES), }; export const FriendRecallInfo = { - fromUid: ProtoField(1, ScalarType.STRING), - toUid: ProtoField(2, ScalarType.STRING), - sequence: ProtoField(3, ScalarType.UINT32), - newId: ProtoField(4, ScalarType.UINT64), - time: ProtoField(5, ScalarType.UINT32), - random: ProtoField(6, ScalarType.UINT32), - pkgNum: ProtoField(7, ScalarType.UINT32), - pkgIndex: ProtoField(8, ScalarType.UINT32), - divSeq: ProtoField(9, ScalarType.UINT32), + fromUid: ProtoField(1, ScalarType.STRING), + toUid: ProtoField(2, ScalarType.STRING), + sequence: ProtoField(3, ScalarType.UINT32), + newId: ProtoField(4, ScalarType.UINT64), + time: ProtoField(5, ScalarType.UINT32), + random: ProtoField(6, ScalarType.UINT32), + pkgNum: ProtoField(7, ScalarType.UINT32), + pkgIndex: ProtoField(8, ScalarType.UINT32), + divSeq: ProtoField(9, ScalarType.UINT32), }; diff --git a/src/core/packet/transformer/proto/message/routing.ts b/src/core/packet/transformer/proto/message/routing.ts index 0af33197..9f3b2a84 100644 --- a/src/core/packet/transformer/proto/message/routing.ts +++ b/src/core/packet/transformer/proto/message/routing.ts @@ -1,40 +1,40 @@ import { ProtoField, ScalarType } from '@napneko/nap-proto-core'; export const ForwardHead = { - field1: ProtoField(1, ScalarType.UINT32, true), - field2: ProtoField(2, ScalarType.UINT32, true), - field3: ProtoField(3, ScalarType.UINT32, true), - unknownBase64: ProtoField(5, ScalarType.STRING, true), - avatar: ProtoField(6, ScalarType.STRING, true), + field1: ProtoField(1, ScalarType.UINT32, true), + field2: ProtoField(2, ScalarType.UINT32, true), + field3: ProtoField(3, ScalarType.UINT32, true), + unknownBase64: ProtoField(5, ScalarType.STRING, true), + avatar: ProtoField(6, ScalarType.STRING, true), }; export const Grp = { - groupCode: ProtoField(1, ScalarType.UINT32, true), + groupCode: ProtoField(1, ScalarType.UINT32, true), }; export const GrpTmp = { - groupUin: ProtoField(1, ScalarType.UINT32, true), - toUin: ProtoField(2, ScalarType.UINT32, true), + groupUin: ProtoField(1, ScalarType.UINT32, true), + toUin: ProtoField(2, ScalarType.UINT32, true), }; export const ResponseForward = { - friendName: ProtoField(6, ScalarType.STRING, true), + friendName: ProtoField(6, ScalarType.STRING, true), }; export const ResponseGrp = { - groupUin: ProtoField(1, ScalarType.UINT32), - memberName: ProtoField(4, ScalarType.STRING), - unknown5: ProtoField(5, ScalarType.UINT32), - groupName: ProtoField(7, ScalarType.STRING), + groupUin: ProtoField(1, ScalarType.UINT32), + memberName: ProtoField(4, ScalarType.STRING), + unknown5: ProtoField(5, ScalarType.UINT32), + groupName: ProtoField(7, ScalarType.STRING), }; export const Trans0X211 = { - toUin: ProtoField(1, ScalarType.UINT64, true), - ccCmd: ProtoField(2, ScalarType.UINT32, true), - uid: ProtoField(8, ScalarType.STRING, true), + toUin: ProtoField(1, ScalarType.UINT64, true), + ccCmd: ProtoField(2, ScalarType.UINT32, true), + uid: ProtoField(8, ScalarType.STRING, true), }; export const WPATmp = { - toUin: ProtoField(1, ScalarType.UINT64), - sig: ProtoField(2, ScalarType.BYTES), + toUin: ProtoField(1, ScalarType.UINT64), + sig: ProtoField(2, ScalarType.BYTES), };