mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2025-12-19 21:20:07 +08:00
feat: 统一并标准化eslint
This commit is contained in:
parent
d5b8f886d6
commit
2889a9f8db
@ -15,7 +15,7 @@ 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
|
||||
|
||||
@ -1,10 +0,0 @@
|
||||
{
|
||||
"trailingComma": "es5",
|
||||
"tabWidth": 4,
|
||||
"semi": true,
|
||||
"singleQuote": true,
|
||||
"bracketSpacing": true,
|
||||
"arrowParens": "always",
|
||||
"printWidth": 120,
|
||||
"endOfLine": "auto"
|
||||
}
|
||||
28
.vscode/settings.json
vendored
28
.vscode/settings.json
vendored
@ -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,
|
||||
}
|
||||
@ -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];
|
||||
const options = neostandard({
|
||||
ts: true,
|
||||
ignores,
|
||||
semi: true, // 强制使用分号
|
||||
}).map(commaDangle);
|
||||
|
||||
export default options;
|
||||
|
||||
@ -1,7 +0,0 @@
|
||||
dist
|
||||
*.md
|
||||
*.html
|
||||
yarn.lock
|
||||
package-lock.json
|
||||
node_modules
|
||||
pnpm-lock.yaml
|
||||
@ -1,23 +0,0 @@
|
||||
{
|
||||
"printWidth": 80,
|
||||
"tabWidth": 2,
|
||||
"useTabs": false,
|
||||
"singleQuote": true,
|
||||
"semi": false,
|
||||
"trailingComma": "none",
|
||||
"bracketSpacing": true,
|
||||
"importOrder": [
|
||||
"<THIRD_PARTY_MODULES>",
|
||||
"^@/const/(.*)$",
|
||||
"^@/store/(.*)$",
|
||||
"^@/components/(.*)$",
|
||||
"^@/contexts/(.*)$",
|
||||
"^@/hooks/(.*)$",
|
||||
"^@/utils/(.*)$",
|
||||
"^@/(.*)$",
|
||||
"^[./]"
|
||||
],
|
||||
"importOrderSeparation": true,
|
||||
"importOrderSortSpecifiers": true,
|
||||
"plugins": ["@trivago/prettier-plugin-sort-imports"]
|
||||
}
|
||||
@ -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
|
||||
]
|
||||
@ -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",
|
||||
|
||||
@ -1,69 +1,69 @@
|
||||
import { useEffect, useRef, useState } from 'react'
|
||||
import { useEffect, useRef, useState } from 'react';
|
||||
|
||||
// 全局图片缓存
|
||||
const imageCache = new Map<string, HTMLImageElement>()
|
||||
const imageCache = new Map<string, HTMLImageElement>();
|
||||
|
||||
export function usePreloadImages(urls: string[]) {
|
||||
const [loadedUrls, setLoadedUrls] = useState<Record<string, boolean>>({})
|
||||
const [isLoading, setIsLoading] = useState(true)
|
||||
const isMounted = useRef(true)
|
||||
export function usePreloadImages (urls: string[]) {
|
||||
const [loadedUrls, setLoadedUrls] = useState<Record<string, boolean>>({});
|
||||
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<string, boolean> = {}
|
||||
let pendingCount = urls.length
|
||||
setIsLoading(true);
|
||||
const loadedImages: Record<string, boolean> = {};
|
||||
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 };
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
1015
package-lock.json
generated
1015
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
16
package.json
16
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",
|
||||
|
||||
@ -6,7 +6,7 @@ import {
|
||||
PacketMsgFileElement,
|
||||
PacketMsgPicElement,
|
||||
PacketMsgPttElement,
|
||||
PacketMsgVideoElement
|
||||
PacketMsgVideoElement,
|
||||
} from '@/core/packet/message/element';
|
||||
import { ChatType, Peer } from '@/core';
|
||||
import { calculateSha1, calculateSha1StreamBytes, computeMd5AndLengthWithLimit } from '@/core/packet/utils/crypto/hash';
|
||||
@ -41,7 +41,7 @@ export class PacketHighwayContext {
|
||||
protected hwClient: PacketHighwayClient;
|
||||
private cachedPrepareReq: Promise<void> | null = null;
|
||||
|
||||
constructor(napcore: NapCoreContext, logger: PacketLogger, client: PacketClientContext) {
|
||||
constructor (napcore: NapCoreContext, logger: PacketLogger, client: PacketClientContext) {
|
||||
this.napcore = napcore;
|
||||
this.client = client;
|
||||
this.sig = {
|
||||
@ -55,7 +55,7 @@ export class PacketHighwayContext {
|
||||
this.hwClient = new PacketHighwayClient(this.sig, this.logger);
|
||||
}
|
||||
|
||||
private async checkAvailable() {
|
||||
private async checkAvailable () {
|
||||
if (this.sig.sigSession === null || this.sig.sessionKey === null) {
|
||||
if (this.cachedPrepareReq === null) {
|
||||
this.cachedPrepareReq = this.prepareUpload().finally(() => {
|
||||
@ -66,7 +66,7 @@ export class PacketHighwayContext {
|
||||
}
|
||||
}
|
||||
|
||||
private async prepareUpload(): Promise<void> {
|
||||
private async prepareUpload (): Promise<void> {
|
||||
this.logger.debug('[Highway] on prepareUpload!');
|
||||
const packet = FetchSessionKey.build();
|
||||
const req = await this.client.sendOidbPacket(packet, true);
|
||||
@ -79,7 +79,7 @@ export class PacketHighwayContext {
|
||||
this.logger.debug(`[Highway PrepareUpload] server addr add: ${int32ip2str(addr.ip)}:${addr.port}`);
|
||||
this.sig.serverAddr.push({
|
||||
ip: int32ip2str(addr.ip),
|
||||
port: addr.port
|
||||
port: addr.port,
|
||||
});
|
||||
this.hwClient.changeServer(int32ip2str(addr.ip), addr.port);
|
||||
}
|
||||
@ -89,7 +89,7 @@ export class PacketHighwayContext {
|
||||
}
|
||||
}
|
||||
|
||||
async uploadImage(peer: Peer, img: PacketMsgPicElement): Promise<void> {
|
||||
async uploadImage (peer: Peer, img: PacketMsgPicElement): Promise<void> {
|
||||
await this.checkAvailable();
|
||||
if (peer.chatType === ChatType.KCHATTYPEGROUP) {
|
||||
await this.uploadGroupImage(+peer.peerUid, img);
|
||||
@ -100,7 +100,7 @@ export class PacketHighwayContext {
|
||||
}
|
||||
}
|
||||
|
||||
async uploadVideo(peer: Peer, video: PacketMsgVideoElement): Promise<void> {
|
||||
async uploadVideo (peer: Peer, video: PacketMsgVideoElement): Promise<void> {
|
||||
await this.checkAvailable();
|
||||
if (+(video.fileSize ?? 0) > 1024 * 1024 * 100) {
|
||||
throw new Error(`[Highway] 视频文件过大: ${(+(video.fileSize ?? 0) / (1024 * 1024)).toFixed(2)} MB > 100 MB,请使用文件上传!`);
|
||||
@ -114,7 +114,7 @@ export class PacketHighwayContext {
|
||||
}
|
||||
}
|
||||
|
||||
async uploadPtt(peer: Peer, ptt: PacketMsgPttElement): Promise<void> {
|
||||
async uploadPtt (peer: Peer, ptt: PacketMsgPttElement): Promise<void> {
|
||||
await this.checkAvailable();
|
||||
if (peer.chatType === ChatType.KCHATTYPEGROUP) {
|
||||
await this.uploadGroupPtt(+peer.peerUid, ptt);
|
||||
@ -125,7 +125,7 @@ export class PacketHighwayContext {
|
||||
}
|
||||
}
|
||||
|
||||
async uploadFile(peer: Peer, file: PacketMsgFileElement): Promise<void> {
|
||||
async uploadFile (peer: Peer, file: PacketMsgFileElement): Promise<void> {
|
||||
await this.checkAvailable();
|
||||
if (peer.chatType === ChatType.KCHATTYPEGROUP) {
|
||||
await this.uploadGroupFile(+peer.peerUid, file);
|
||||
@ -136,7 +136,7 @@ export class PacketHighwayContext {
|
||||
}
|
||||
}
|
||||
|
||||
private async uploadGroupImage(groupUin: number, img: PacketMsgPicElement): Promise<void> {
|
||||
private async uploadGroupImage (groupUin: number, img: PacketMsgPicElement): Promise<void> {
|
||||
img.sha1 = Buffer.from(await calculateSha1(img.path)).toString('hex');
|
||||
const req = UploadGroupImage.build(groupUin, img);
|
||||
const resp = await this.client.sendOidbPacket(req, true);
|
||||
@ -151,13 +151,13 @@ export class PacketHighwayContext {
|
||||
fileUuid: index.fileUuid,
|
||||
uKey: ukey,
|
||||
network: {
|
||||
ipv4S: oidbIpv4s2HighwayIpv4s(preRespData.upload.ipv4S)
|
||||
ipv4S: oidbIpv4s2HighwayIpv4s(preRespData.upload.ipv4S),
|
||||
},
|
||||
msgInfoBody: preRespData.upload.msgInfo.msgInfoBody,
|
||||
blockSize: BlockSize,
|
||||
hash: {
|
||||
fileSha1: [sha1]
|
||||
}
|
||||
fileSha1: [sha1],
|
||||
},
|
||||
});
|
||||
await this.hwClient.upload(
|
||||
1004,
|
||||
@ -173,7 +173,7 @@ export class PacketHighwayContext {
|
||||
// img.groupPicExt = new NapProtoMsg(CustomFace).decode(preRespData.tcpUpload.compatQMsg)
|
||||
}
|
||||
|
||||
private async uploadC2CImage(peerUid: string, img: PacketMsgPicElement): Promise<void> {
|
||||
private async uploadC2CImage (peerUid: string, img: PacketMsgPicElement): Promise<void> {
|
||||
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);
|
||||
@ -188,13 +188,13 @@ export class PacketHighwayContext {
|
||||
fileUuid: index.fileUuid,
|
||||
uKey: ukey,
|
||||
network: {
|
||||
ipv4S: oidbIpv4s2HighwayIpv4s(preRespData.upload.ipv4S)
|
||||
ipv4S: oidbIpv4s2HighwayIpv4s(preRespData.upload.ipv4S),
|
||||
},
|
||||
msgInfoBody: preRespData.upload.msgInfo.msgInfoBody,
|
||||
blockSize: BlockSize,
|
||||
hash: {
|
||||
fileSha1: [sha1]
|
||||
}
|
||||
fileSha1: [sha1],
|
||||
},
|
||||
});
|
||||
await this.hwClient.upload(
|
||||
1003,
|
||||
@ -209,7 +209,7 @@ export class PacketHighwayContext {
|
||||
img.msgInfo = preRespData.upload.msgInfo;
|
||||
}
|
||||
|
||||
private async uploadGroupVideo(groupUin: number, video: PacketMsgVideoElement): Promise<void> {
|
||||
private async uploadGroupVideo (groupUin: number, video: PacketMsgVideoElement): Promise<void> {
|
||||
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');
|
||||
@ -225,13 +225,13 @@ export class PacketHighwayContext {
|
||||
fileUuid: index.fileUuid,
|
||||
uKey: ukey,
|
||||
network: {
|
||||
ipv4S: oidbIpv4s2HighwayIpv4s(preRespData.upload.ipv4S)
|
||||
ipv4S: oidbIpv4s2HighwayIpv4s(preRespData.upload.ipv4S),
|
||||
},
|
||||
msgInfoBody: preRespData.upload.msgInfo.msgInfoBody,
|
||||
blockSize: BlockSize,
|
||||
hash: {
|
||||
fileSha1: await calculateSha1StreamBytes(video.filePath)
|
||||
}
|
||||
fileSha1: await calculateSha1StreamBytes(video.filePath),
|
||||
},
|
||||
});
|
||||
await this.hwClient.upload(
|
||||
1005,
|
||||
@ -253,13 +253,13 @@ export class PacketHighwayContext {
|
||||
fileUuid: index.fileUuid,
|
||||
uKey: subFile!.uKey,
|
||||
network: {
|
||||
ipv4S: oidbIpv4s2HighwayIpv4s(subFile!.ipv4S)
|
||||
ipv4S: oidbIpv4s2HighwayIpv4s(subFile!.ipv4S),
|
||||
},
|
||||
msgInfoBody: preRespData.upload.msgInfo.msgInfoBody,
|
||||
blockSize: BlockSize,
|
||||
hash: {
|
||||
fileSha1: [sha1]
|
||||
}
|
||||
fileSha1: [sha1],
|
||||
},
|
||||
});
|
||||
await this.hwClient.upload(
|
||||
1006,
|
||||
@ -274,7 +274,7 @@ export class PacketHighwayContext {
|
||||
video.msgInfo = preRespData.upload.msgInfo;
|
||||
}
|
||||
|
||||
private async uploadC2CVideo(peerUid: string, video: PacketMsgVideoElement): Promise<void> {
|
||||
private async uploadC2CVideo (peerUid: string, video: PacketMsgVideoElement): Promise<void> {
|
||||
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');
|
||||
@ -290,13 +290,13 @@ export class PacketHighwayContext {
|
||||
fileUuid: index.fileUuid,
|
||||
uKey: ukey,
|
||||
network: {
|
||||
ipv4S: oidbIpv4s2HighwayIpv4s(preRespData.upload.ipv4S)
|
||||
ipv4S: oidbIpv4s2HighwayIpv4s(preRespData.upload.ipv4S),
|
||||
},
|
||||
msgInfoBody: preRespData.upload.msgInfo.msgInfoBody,
|
||||
blockSize: BlockSize,
|
||||
hash: {
|
||||
fileSha1: await calculateSha1StreamBytes(video.filePath)
|
||||
}
|
||||
fileSha1: await calculateSha1StreamBytes(video.filePath),
|
||||
},
|
||||
});
|
||||
await this.hwClient.upload(
|
||||
1001,
|
||||
@ -318,13 +318,13 @@ export class PacketHighwayContext {
|
||||
fileUuid: index.fileUuid,
|
||||
uKey: subFile!.uKey,
|
||||
network: {
|
||||
ipv4S: oidbIpv4s2HighwayIpv4s(subFile!.ipv4S)
|
||||
ipv4S: oidbIpv4s2HighwayIpv4s(subFile!.ipv4S),
|
||||
},
|
||||
msgInfoBody: preRespData.upload.msgInfo.msgInfoBody,
|
||||
blockSize: BlockSize,
|
||||
hash: {
|
||||
fileSha1: [sha1]
|
||||
}
|
||||
fileSha1: [sha1],
|
||||
},
|
||||
});
|
||||
await this.hwClient.upload(
|
||||
1002,
|
||||
@ -339,7 +339,7 @@ export class PacketHighwayContext {
|
||||
video.msgInfo = preRespData.upload.msgInfo;
|
||||
}
|
||||
|
||||
private async uploadGroupPtt(groupUin: number, ptt: PacketMsgPttElement): Promise<void> {
|
||||
private async uploadGroupPtt (groupUin: number, ptt: PacketMsgPttElement): Promise<void> {
|
||||
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);
|
||||
@ -354,13 +354,13 @@ export class PacketHighwayContext {
|
||||
fileUuid: index.fileUuid,
|
||||
uKey: ukey,
|
||||
network: {
|
||||
ipv4S: oidbIpv4s2HighwayIpv4s(preRespData.upload.ipv4S)
|
||||
ipv4S: oidbIpv4s2HighwayIpv4s(preRespData.upload.ipv4S),
|
||||
},
|
||||
msgInfoBody: preRespData.upload.msgInfo.msgInfoBody,
|
||||
blockSize: BlockSize,
|
||||
hash: {
|
||||
fileSha1: [sha1]
|
||||
}
|
||||
fileSha1: [sha1],
|
||||
},
|
||||
});
|
||||
await this.hwClient.upload(
|
||||
1008,
|
||||
@ -375,7 +375,7 @@ export class PacketHighwayContext {
|
||||
ptt.msgInfo = preRespData.upload.msgInfo;
|
||||
}
|
||||
|
||||
private async uploadC2CPtt(peerUid: string, ptt: PacketMsgPttElement): Promise<void> {
|
||||
private async uploadC2CPtt (peerUid: string, ptt: PacketMsgPttElement): Promise<void> {
|
||||
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);
|
||||
@ -390,13 +390,13 @@ export class PacketHighwayContext {
|
||||
fileUuid: index.fileUuid,
|
||||
uKey: ukey,
|
||||
network: {
|
||||
ipv4S: oidbIpv4s2HighwayIpv4s(preRespData.upload.ipv4S)
|
||||
ipv4S: oidbIpv4s2HighwayIpv4s(preRespData.upload.ipv4S),
|
||||
},
|
||||
msgInfoBody: preRespData.upload.msgInfo.msgInfoBody,
|
||||
blockSize: BlockSize,
|
||||
hash: {
|
||||
fileSha1: [sha1]
|
||||
}
|
||||
fileSha1: [sha1],
|
||||
},
|
||||
});
|
||||
await this.hwClient.upload(
|
||||
1007,
|
||||
@ -411,7 +411,7 @@ export class PacketHighwayContext {
|
||||
ptt.msgInfo = preRespData.upload.msgInfo;
|
||||
}
|
||||
|
||||
private async uploadGroupFile(groupUin: number, file: PacketMsgFileElement): Promise<void> {
|
||||
private async uploadGroupFile (groupUin: number, file: PacketMsgFileElement): Promise<void> {
|
||||
file.isGroupFile = true;
|
||||
file.fileMd5 = await computeMd5AndLengthWithLimit(file.filePath);
|
||||
file.fileSha1 = await calculateSha1(file.filePath);
|
||||
@ -442,10 +442,10 @@ export class PacketHighwayContext {
|
||||
appId: '100',
|
||||
terminalType: 3,
|
||||
clientVer: '1.1.1',
|
||||
unknown: 4
|
||||
unknown: 4,
|
||||
},
|
||||
fileNameInfo: {
|
||||
fileName: file.fileName
|
||||
fileName: file.fileName,
|
||||
},
|
||||
host: {
|
||||
hosts: [
|
||||
@ -455,9 +455,9 @@ export class PacketHighwayContext {
|
||||
unknown: 1,
|
||||
},
|
||||
port: preRespData.upload.uploadPort,
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
unknown200: 0,
|
||||
});
|
||||
@ -474,7 +474,7 @@ export class PacketHighwayContext {
|
||||
file.fileUuid = preRespData.upload.fileId;
|
||||
}
|
||||
|
||||
private async uploadC2CFile(peerUid: string, file: PacketMsgFileElement): Promise<void> {
|
||||
private async uploadC2CFile (peerUid: string, file: PacketMsgFileElement): Promise<void> {
|
||||
file.isGroupFile = false;
|
||||
file.fileMd5 = await computeMd5AndLengthWithLimit(file.filePath);
|
||||
file.fileSha1 = await calculateSha1(file.filePath);
|
||||
@ -503,10 +503,10 @@ export class PacketHighwayContext {
|
||||
appId: '100',
|
||||
terminalType: 3,
|
||||
clientVer: '1.1.1',
|
||||
unknown: 4
|
||||
unknown: 4,
|
||||
},
|
||||
fileNameInfo: {
|
||||
fileName: file.fileName
|
||||
fileName: file.fileName,
|
||||
},
|
||||
host: {
|
||||
hosts: [
|
||||
@ -516,12 +516,12 @@ export class PacketHighwayContext {
|
||||
unknown: 1,
|
||||
},
|
||||
port: preRespData.upload?.uploadPort,
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
unknown200: 1,
|
||||
unknown3: 0
|
||||
unknown3: 0,
|
||||
});
|
||||
await this.hwClient.upload(
|
||||
95,
|
||||
|
||||
@ -6,7 +6,7 @@ import { Frame } from '@/core/packet/highway/frame';
|
||||
import * as proto from '@/core/packet/transformer/proto';
|
||||
|
||||
export class HighwayHttpUploader extends IHighwayUploader {
|
||||
async upload(): Promise<void> {
|
||||
async upload (): Promise<void> {
|
||||
const controller = new AbortController();
|
||||
const { signal } = controller;
|
||||
const upload = (async () => {
|
||||
@ -31,7 +31,7 @@ export class HighwayHttpUploader extends IHighwayUploader {
|
||||
await Promise.race([upload, timeout]);
|
||||
}
|
||||
|
||||
private async uploadBlock(block: Buffer, offset: number): Promise<void> {
|
||||
private async uploadBlock (block: Buffer, offset: number): Promise<void> {
|
||||
const chunkMD5 = crypto.createHash('md5').update(block).digest();
|
||||
const payload = this.buildPicUpHead(offset, block.length, chunkMD5);
|
||||
const frame = Frame.pack(Buffer.from(payload), block);
|
||||
@ -42,13 +42,13 @@ export class HighwayHttpUploader extends IHighwayUploader {
|
||||
if (headData.errorCode !== 0) throw new Error(`[Highway] httpUploadBlock failed (code=${headData.errorCode})`);
|
||||
}
|
||||
|
||||
private async httpPostHighwayContent(frame: Buffer, serverURL: string): Promise<Buffer> {
|
||||
private async httpPostHighwayContent (frame: Buffer, serverURL: string): Promise<Buffer> {
|
||||
return new Promise((resolve, reject) => {
|
||||
try {
|
||||
const options: http.RequestOptions = {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Connection': 'keep-alive',
|
||||
Connection: 'keep-alive',
|
||||
'Accept-Encoding': 'identity',
|
||||
'User-Agent': 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2)',
|
||||
'Content-Length': frame.length.toString(),
|
||||
|
||||
@ -11,14 +11,13 @@ class HighwayTcpUploaderTransform extends stream.Transform {
|
||||
uploader: HighwayTcpUploader;
|
||||
offset: number;
|
||||
|
||||
constructor(uploader: HighwayTcpUploader) {
|
||||
constructor (uploader: HighwayTcpUploader) {
|
||||
super();
|
||||
this.uploader = uploader;
|
||||
this.offset = 0;
|
||||
}
|
||||
|
||||
// eslint-disable-next-line no-undef
|
||||
override _transform(data: Buffer, _: BufferEncoding, callback: stream.TransformCallback) {
|
||||
override _transform (data: Buffer, _: BufferEncoding, callback: stream.TransformCallback) {
|
||||
let chunkOffset = 0;
|
||||
while (chunkOffset < data.length) {
|
||||
const chunkSize = Math.min(BlockSize, data.length - chunkOffset);
|
||||
@ -34,7 +33,7 @@ class HighwayTcpUploaderTransform extends stream.Transform {
|
||||
}
|
||||
|
||||
export class HighwayTcpUploader extends IHighwayUploader {
|
||||
async upload(): Promise<void> {
|
||||
async upload (): Promise<void> {
|
||||
const controller = new AbortController();
|
||||
const { signal } = controller;
|
||||
const upload = new Promise<void>((resolve, reject) => {
|
||||
|
||||
@ -8,17 +8,17 @@ export abstract class IHighwayUploader {
|
||||
readonly trans: PacketHighwayTrans;
|
||||
readonly logger: PacketLogger;
|
||||
|
||||
constructor(trans: PacketHighwayTrans, logger: PacketLogger) {
|
||||
constructor (trans: PacketHighwayTrans, logger: PacketLogger) {
|
||||
this.trans = trans;
|
||||
this.logger = logger;
|
||||
}
|
||||
|
||||
private encryptTransExt(key: Uint8Array) {
|
||||
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<void> {
|
||||
protected timeout (): Promise<void> {
|
||||
return new Promise<void>((_, reject) => {
|
||||
setTimeout(() => {
|
||||
reject(new Error(`[Highway] timeout after ${this.trans.timeout}s`));
|
||||
@ -27,7 +27,7 @@ export abstract class IHighwayUploader {
|
||||
});
|
||||
}
|
||||
|
||||
buildPicUpHead(offset: number, bodyLength: number, bodyMd5: Uint8Array): Uint8Array {
|
||||
buildPicUpHead (offset: number, bodyLength: number, bodyMd5: Uint8Array): Uint8Array {
|
||||
return new NapProtoMsg(proto.ReqDataHighwayHead).encode({
|
||||
msgBaseHead: {
|
||||
version: 1,
|
||||
@ -55,9 +55,9 @@ export abstract class IHighwayUploader {
|
||||
msgLoginSigHead: {
|
||||
uint32LoginSigType: 8,
|
||||
appId: 1600001604,
|
||||
}
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
abstract upload(): Promise<void>;
|
||||
abstract upload (): Promise<void>;
|
||||
}
|
||||
|
||||
@ -8,11 +8,11 @@ import { SendTextElement } from '@/core';
|
||||
export class PacketMsgBuilder {
|
||||
protected static failBackText = new PacketMsgTextElement(
|
||||
{
|
||||
textElement: { content: '[该消息类型暂不支持查看]' }
|
||||
textElement: { content: '[该消息类型暂不支持查看]' },
|
||||
} as SendTextElement
|
||||
);
|
||||
|
||||
buildFakeMsg(selfUid: string, element: PacketMsg[]): NapProtoEncodeStructType<typeof PushMsgBody>[] {
|
||||
buildFakeMsg (selfUid: string, element: PacketMsg[]): NapProtoEncodeStructType<typeof PushMsgBody>[] {
|
||||
return element.map((node): NapProtoEncodeStructType<typeof PushMsgBody> => {
|
||||
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<PacketSendMsgElement>) => {
|
||||
@ -29,15 +29,19 @@ export class PacketMsgBuilder {
|
||||
sigMap: 0,
|
||||
toUin: 0,
|
||||
fromUid: '',
|
||||
forward: node.groupId ? undefined : {
|
||||
forward: node.groupId
|
||||
? undefined
|
||||
: {
|
||||
friendName: node.senderName,
|
||||
},
|
||||
toUid: node.groupId ? undefined : selfUid,
|
||||
grp: node.groupId ? {
|
||||
grp: node.groupId
|
||||
? {
|
||||
groupUin: node.groupId,
|
||||
memberName: node.senderName,
|
||||
unknown5: 2
|
||||
} : undefined,
|
||||
unknown5: 2,
|
||||
}
|
||||
: undefined,
|
||||
},
|
||||
contentHead: {
|
||||
type: node.groupId ? 82 : 9,
|
||||
@ -51,15 +55,15 @@ export class PacketMsgBuilder {
|
||||
field2: 0,
|
||||
field3: node.groupId ? 1 : 2,
|
||||
unknownBase64: avatar,
|
||||
avatar: avatar
|
||||
}
|
||||
avatar,
|
||||
},
|
||||
},
|
||||
body: {
|
||||
richText: {
|
||||
elems: msgElement
|
||||
elems: msgElement,
|
||||
},
|
||||
msgContent,
|
||||
},
|
||||
msgContent: msgContent,
|
||||
}
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
@ -14,7 +14,7 @@ import {
|
||||
SendPttElement,
|
||||
SendReplyElement,
|
||||
SendTextElement,
|
||||
SendVideoElement
|
||||
SendVideoElement,
|
||||
} from '@/core';
|
||||
import {
|
||||
IPacketMsgElement,
|
||||
@ -29,11 +29,11 @@ import {
|
||||
PacketMsgReplyElement,
|
||||
PacketMsgTextElement,
|
||||
PacketMsgVideoElement,
|
||||
PacketMultiMsgElement
|
||||
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,
|
||||
@ -46,7 +46,7 @@ const SupportedElementTypes = [
|
||||
ElementType.PTT,
|
||||
ElementType.ARK,
|
||||
ElementType.MARKDOWN,
|
||||
ElementType.MULTIFORWARD
|
||||
ElementType.MULTIFORWARD,
|
||||
];
|
||||
|
||||
type SendMessageTypeElementMap = {
|
||||
@ -67,7 +67,7 @@ type ElementToPacketMsgConverters = {
|
||||
[K in keyof SendMessageTypeElementMap]: (
|
||||
sendElement: MessageElement
|
||||
) => IPacketMsgElement<SendMessageTypeElementMap[K]>;
|
||||
}
|
||||
};
|
||||
|
||||
export type rawMsgWithSendMsg = {
|
||||
senderUin: number;
|
||||
@ -76,11 +76,11 @@ export type rawMsgWithSendMsg = {
|
||||
groupId?: number;
|
||||
time: number;
|
||||
msg: PacketSendMsgElement[]
|
||||
}
|
||||
};
|
||||
|
||||
// TODO: make it become adapter?
|
||||
export class PacketMsgConverter {
|
||||
private isValidElementType(type: ElementType): type is keyof ElementToPacketMsgConverters {
|
||||
private isValidElementType (type: ElementType): type is keyof ElementToPacketMsgConverters {
|
||||
return SupportedElementTypes.includes(type);
|
||||
}
|
||||
|
||||
@ -120,10 +120,10 @@ export class PacketMsgConverter {
|
||||
},
|
||||
[ElementType.MULTIFORWARD]: (element) => {
|
||||
return new PacketMultiMsgElement(element as SendMultiForwardMsgElement);
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
rawMsgWithSendMsgToPacketMsg(msg: rawMsgWithSendMsg): PacketMsg {
|
||||
rawMsgWithSendMsgToPacketMsg (msg: rawMsgWithSendMsg): PacketMsg {
|
||||
return {
|
||||
senderUid: msg.senderUid ?? '',
|
||||
senderUin: msg.senderUin,
|
||||
@ -133,11 +133,11 @@ export class PacketMsgConverter {
|
||||
msg: msg.msg.map((element) => {
|
||||
if (!this.isValidElementType(element.elementType)) return null;
|
||||
return this.rawToPacketMsgConverters[element.elementType](element as MessageElement);
|
||||
}).filter((e) => e !== null)
|
||||
}).filter((e) => e !== null),
|
||||
};
|
||||
}
|
||||
|
||||
rawMsgToPacketMsg(msg: RawMessage, ctxPeer: Peer): PacketMsg {
|
||||
rawMsgToPacketMsg (msg: RawMessage, ctxPeer: Peer): PacketMsg {
|
||||
return {
|
||||
seq: +msg.msgSeq,
|
||||
groupId: ctxPeer.chatType === ChatType.KCHATTYPEGROUP ? +msg.peerUid : undefined,
|
||||
@ -152,11 +152,11 @@ export class PacketMsgConverter {
|
||||
msg: msg.elements.map((element) => {
|
||||
if (!this.isValidElementType(element.elementType)) return null;
|
||||
return this.rawToPacketMsgConverters[element.elementType](element);
|
||||
}).filter((e) => e !== null)
|
||||
}).filter((e) => e !== null),
|
||||
};
|
||||
}
|
||||
|
||||
packetMsgToRaw(msg: NapProtoDecodeStructType<typeof Elem>[]): [MessageElement, NapProtoDecodeStructType<typeof Elem> | null][] {
|
||||
packetMsgToRaw (msg: NapProtoDecodeStructType<typeof Elem>[]): [MessageElement, NapProtoDecodeStructType<typeof Elem> | null][] {
|
||||
const converters = [PacketMsgTextElement.parseElement,
|
||||
PacketMsgAtElement.parseElement, PacketMsgReplyElement.parseElement, PacketMsgPicElement.parseElement];
|
||||
return msg.map((element) => {
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
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,
|
||||
@ -31,10 +31,10 @@ import {
|
||||
SendMultiForwardMsgElement,
|
||||
SendTextElement,
|
||||
SendVideoElement,
|
||||
Peer
|
||||
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<typeof Elem> | null] | undefined;
|
||||
type ParseElementFn = (elem: NapProtoDecodeStructType<typeof Elem>) => ParseElementFnR;
|
||||
@ -42,25 +42,24 @@ type ParseElementFn = (elem: NapProtoDecodeStructType<typeof Elem>) => ParseElem
|
||||
// raw <-> packet
|
||||
// TODO: SendStructLongMsgElement
|
||||
export abstract class IPacketMsgElement<T extends PacketSendMsgElement> {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
protected constructor(_rawElement: T) {
|
||||
protected constructor (_rawElement: T) {
|
||||
}
|
||||
|
||||
get valid(): boolean {
|
||||
get valid (): boolean {
|
||||
return true;
|
||||
}
|
||||
|
||||
buildContent(): Uint8Array | undefined {
|
||||
buildContent (): Uint8Array | undefined {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
buildElement(): NapProtoEncodeStructType<typeof Elem>[] {
|
||||
buildElement (): NapProtoEncodeStructType<typeof Elem>[] {
|
||||
return [];
|
||||
}
|
||||
|
||||
static parseElement: ParseElementFn;
|
||||
|
||||
toPreview(): string {
|
||||
toPreview (): string {
|
||||
return '[暂不支持该消息类型喵~]';
|
||||
}
|
||||
}
|
||||
@ -68,16 +67,16 @@ export abstract class IPacketMsgElement<T extends PacketSendMsgElement> {
|
||||
export class PacketMsgTextElement extends IPacketMsgElement<SendTextElement> {
|
||||
text: string;
|
||||
|
||||
constructor(element: SendTextElement) {
|
||||
constructor (element: SendTextElement) {
|
||||
super(element);
|
||||
this.text = element.textElement.content;
|
||||
}
|
||||
|
||||
override buildElement(): NapProtoEncodeStructType<typeof Elem>[] {
|
||||
override buildElement (): NapProtoEncodeStructType<typeof Elem>[] {
|
||||
return [{
|
||||
text: {
|
||||
str: this.text
|
||||
}
|
||||
str: this.text,
|
||||
},
|
||||
}];
|
||||
}
|
||||
|
||||
@ -98,24 +97,22 @@ export class PacketMsgTextElement extends IPacketMsgElement<SendTextElement> {
|
||||
return undefined;
|
||||
};
|
||||
|
||||
override toPreview(): string {
|
||||
override toPreview (): string {
|
||||
return this.text;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
export class PacketMsgAtElement extends PacketMsgTextElement {
|
||||
targetUid: string;
|
||||
atAll: boolean;
|
||||
|
||||
constructor(element: SendTextElement) {
|
||||
constructor (element: SendTextElement) {
|
||||
super(element);
|
||||
this.targetUid = element.textElement.atNtUid;
|
||||
this.atAll = element.textElement.atType === NTMsgAtType.ATTYPEALL;
|
||||
}
|
||||
|
||||
override buildElement(): NapProtoEncodeStructType<typeof Elem>[] {
|
||||
override buildElement (): NapProtoEncodeStructType<typeof Elem>[] {
|
||||
return [{
|
||||
text: {
|
||||
str: this.text,
|
||||
@ -125,10 +122,11 @@ export class PacketMsgAtElement extends PacketMsgTextElement {
|
||||
field5: 0,
|
||||
uid: this.targetUid,
|
||||
}
|
||||
)
|
||||
}
|
||||
),
|
||||
},
|
||||
}];
|
||||
}
|
||||
|
||||
static override parseElement = (elem: NapProtoDecodeStructType<typeof Elem>): ParseElementFnR => {
|
||||
if (elem.text?.str && (elem.text?.attr6Buf?.length ?? 100) >= 11) {
|
||||
return [{
|
||||
@ -158,7 +156,7 @@ export class PacketMsgReplyElement extends IPacketMsgElement<SendReplyElement> {
|
||||
targetSourceMsg?: NapProtoEncodeStructType<typeof PushMsgBody>;
|
||||
targetPeer?: Peer;
|
||||
|
||||
constructor(element: SendReplyElement) {
|
||||
constructor (element: SendReplyElement) {
|
||||
super(element);
|
||||
this.time = +(element.replyElement.replyMsgTime ?? Math.floor(Date.now() / 1000));
|
||||
this.targetMessageId = BigInt(element.replyElement.replayMsgId ?? 0);
|
||||
@ -169,11 +167,11 @@ export class PacketMsgReplyElement extends IPacketMsgElement<SendReplyElement> {
|
||||
this.targetPeer = element.replyElement._replyMsgPeer;
|
||||
}
|
||||
|
||||
get isGroupReply(): boolean {
|
||||
get isGroupReply (): boolean {
|
||||
return this.targetMessageClientSeq === 0;
|
||||
}
|
||||
|
||||
override buildElement(): NapProtoEncodeStructType<typeof Elem>[] {
|
||||
override buildElement (): NapProtoEncodeStructType<typeof Elem>[] {
|
||||
return [{
|
||||
srcMsg: {
|
||||
origSeqs: [this.isGroupReply ? this.targetMessageSeq : this.targetMessageClientSeq],
|
||||
@ -182,7 +180,7 @@ export class PacketMsgReplyElement extends IPacketMsgElement<SendReplyElement> {
|
||||
elems: this.targetElems ?? [],
|
||||
sourceMsg: new NapProtoMsg(PushMsgBody).encode(this.targetSourceMsg ?? {}),
|
||||
toUin: BigInt(0),
|
||||
}
|
||||
},
|
||||
}];
|
||||
}
|
||||
|
||||
@ -193,7 +191,7 @@ export class PacketMsgReplyElement extends IPacketMsgElement<SendReplyElement> {
|
||||
replyElement: {
|
||||
replayMsgSeq: String(reserve.friendSeq ?? elem.srcMsg?.origSeqs?.[0] ?? 0),
|
||||
replayMsgId: String(reserve.messageId ?? 0),
|
||||
senderUin: String(elem?.srcMsg ?? 0)
|
||||
senderUin: String(elem?.srcMsg ?? 0),
|
||||
},
|
||||
elementType: ElementType.UNKNOWN,
|
||||
elementId: '',
|
||||
@ -202,7 +200,7 @@ export class PacketMsgReplyElement extends IPacketMsgElement<SendReplyElement> {
|
||||
return undefined;
|
||||
};
|
||||
|
||||
override toPreview(): string {
|
||||
override toPreview (): string {
|
||||
return '[回复消息]';
|
||||
}
|
||||
}
|
||||
@ -212,14 +210,14 @@ export class PacketMsgFaceElement extends IPacketMsgElement<SendFaceElement> {
|
||||
isLargeFace: boolean;
|
||||
resultId?: string;
|
||||
|
||||
constructor(element: SendFaceElement) {
|
||||
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<typeof Elem>[] {
|
||||
override buildElement (): NapProtoEncodeStructType<typeof Elem>[] {
|
||||
if (this.isLargeFace) {
|
||||
return [{
|
||||
commonElem: {
|
||||
@ -231,16 +229,16 @@ export class PacketMsgFaceElement extends IPacketMsgElement<SendFaceElement> {
|
||||
sourceType: 1,
|
||||
resultId: this.resultId,
|
||||
preview: '',
|
||||
randomType: 1
|
||||
randomType: 1,
|
||||
}),
|
||||
businessType: 1
|
||||
}
|
||||
businessType: 1,
|
||||
},
|
||||
}];
|
||||
} else if (this.faceId < 260) {
|
||||
return [{
|
||||
face: {
|
||||
index: this.faceId
|
||||
}
|
||||
index: this.faceId,
|
||||
},
|
||||
}];
|
||||
} else {
|
||||
return [{
|
||||
@ -249,10 +247,10 @@ export class PacketMsgFaceElement extends IPacketMsgElement<SendFaceElement> {
|
||||
pbElem: new NapProtoMsg(QSmallFaceExtra).encode({
|
||||
faceId: this.faceId,
|
||||
preview: '',
|
||||
preview2: ''
|
||||
preview2: '',
|
||||
}),
|
||||
businessType: 1
|
||||
}
|
||||
businessType: 1,
|
||||
},
|
||||
}];
|
||||
}
|
||||
}
|
||||
@ -262,7 +260,7 @@ export class PacketMsgFaceElement extends IPacketMsgElement<SendFaceElement> {
|
||||
return [{
|
||||
faceElement: {
|
||||
faceIndex: elem.face.index,
|
||||
faceType: FaceType.Normal
|
||||
faceType: FaceType.Normal,
|
||||
},
|
||||
elementType: ElementType.UNKNOWN,
|
||||
elementId: '',
|
||||
@ -274,7 +272,7 @@ export class PacketMsgFaceElement extends IPacketMsgElement<SendFaceElement> {
|
||||
return [{
|
||||
faceElement: {
|
||||
faceIndex: qface.faceId,
|
||||
faceType: FaceType.Normal
|
||||
faceType: FaceType.Normal,
|
||||
},
|
||||
elementType: ElementType.UNKNOWN,
|
||||
elementId: '',
|
||||
@ -287,7 +285,7 @@ export class PacketMsgFaceElement extends IPacketMsgElement<SendFaceElement> {
|
||||
return [{
|
||||
faceElement: {
|
||||
faceIndex: qface.faceId,
|
||||
faceType: FaceType.Normal
|
||||
faceType: FaceType.Normal,
|
||||
},
|
||||
elementType: ElementType.UNKNOWN,
|
||||
elementId: '',
|
||||
@ -297,7 +295,7 @@ export class PacketMsgFaceElement extends IPacketMsgElement<SendFaceElement> {
|
||||
return undefined;
|
||||
};
|
||||
|
||||
override toPreview(): string {
|
||||
override toPreview (): string {
|
||||
return '[表情]';
|
||||
}
|
||||
}
|
||||
@ -308,7 +306,7 @@ export class PacketMsgMarkFaceElement extends IPacketMsgElement<SendMarketFaceEl
|
||||
emojiPackageId: number;
|
||||
emojiKey: string;
|
||||
|
||||
constructor(element: SendMarketFaceElement) {
|
||||
constructor (element: SendMarketFaceElement) {
|
||||
super(element);
|
||||
this.emojiName = element.marketFaceElement.faceName;
|
||||
this.emojiId = element.marketFaceElement.emojiId;
|
||||
@ -316,7 +314,7 @@ export class PacketMsgMarkFaceElement extends IPacketMsgElement<SendMarketFaceEl
|
||||
this.emojiKey = element.marketFaceElement.key;
|
||||
}
|
||||
|
||||
override buildElement(): NapProtoEncodeStructType<typeof Elem>[] {
|
||||
override buildElement (): NapProtoEncodeStructType<typeof Elem>[] {
|
||||
return [{
|
||||
marketFace: {
|
||||
faceName: this.emojiName,
|
||||
@ -329,13 +327,13 @@ export class PacketMsgMarkFaceElement extends IPacketMsgElement<SendMarketFaceEl
|
||||
imageWidth: 300,
|
||||
imageHeight: 300,
|
||||
pbReserve: {
|
||||
field8: 1
|
||||
}
|
||||
}
|
||||
field8: 1,
|
||||
},
|
||||
},
|
||||
}];
|
||||
}
|
||||
|
||||
override toPreview(): string {
|
||||
override toPreview (): string {
|
||||
return `${this.emojiName}`;
|
||||
}
|
||||
}
|
||||
@ -355,7 +353,7 @@ export class PacketMsgPicElement extends IPacketMsgElement<SendPicElement> {
|
||||
groupPicExt: NapProtoEncodeStructType<typeof CustomFace> | null = null;
|
||||
c2cPicExt: NapProtoEncodeStructType<typeof NotOnlineImage> | null = null;
|
||||
|
||||
constructor(element: SendPicElement) {
|
||||
constructor (element: SendPicElement) {
|
||||
super(element);
|
||||
this.path = element.picElement.sourcePath;
|
||||
this.name = element.picElement.fileName;
|
||||
@ -365,23 +363,25 @@ export class PacketMsgPicElement extends IPacketMsgElement<SendPicElement> {
|
||||
this.height = element.picElement.picHeight;
|
||||
this.picType = element.picElement.picType;
|
||||
this.picSubType = element.picElement.picSubType ?? 0;
|
||||
this.summary = element.picElement.summary === '' ? (
|
||||
this.summary = element.picElement.summary === ''
|
||||
? (
|
||||
element.picElement.picSubType === 0 ? '[图片]' : '[动画表情]'
|
||||
) : element.picElement.summary;
|
||||
)
|
||||
: element.picElement.summary;
|
||||
}
|
||||
|
||||
override get valid(): boolean {
|
||||
override get valid (): boolean {
|
||||
return !!this.msgInfo;
|
||||
}
|
||||
|
||||
override buildElement(): NapProtoEncodeStructType<typeof Elem>[] {
|
||||
override buildElement (): NapProtoEncodeStructType<typeof Elem>[] {
|
||||
if (!this.msgInfo) return [];
|
||||
return [{
|
||||
commonElem: {
|
||||
serviceType: 48,
|
||||
pbElem: new NapProtoMsg(MsgInfo).encode(this.msgInfo),
|
||||
businessType: 10,
|
||||
}
|
||||
},
|
||||
}];
|
||||
}
|
||||
|
||||
@ -439,7 +439,7 @@ export class PacketMsgPicElement extends IPacketMsgElement<SendPicElement> {
|
||||
return undefined;
|
||||
};
|
||||
|
||||
override toPreview(): string {
|
||||
override toPreview (): string {
|
||||
return this.summary;
|
||||
}
|
||||
}
|
||||
@ -457,7 +457,7 @@ export class PacketMsgVideoElement extends IPacketMsgElement<SendVideoElement> {
|
||||
thumbHeight?: number;
|
||||
msgInfo: NapProtoEncodeStructType<typeof MsgInfo> | null = null;
|
||||
|
||||
constructor(element: SendVideoElement) {
|
||||
constructor (element: SendVideoElement) {
|
||||
super(element);
|
||||
this.fileSize = element.videoElement.fileSize;
|
||||
this.filePath = element.videoElement.filePath;
|
||||
@ -469,22 +469,22 @@ export class PacketMsgVideoElement extends IPacketMsgElement<SendVideoElement> {
|
||||
this.thumbHeight = element.videoElement.thumbHeight;
|
||||
}
|
||||
|
||||
override get valid(): boolean {
|
||||
override get valid (): boolean {
|
||||
return !!this.msgInfo;
|
||||
}
|
||||
|
||||
override buildElement(): NapProtoEncodeStructType<typeof Elem>[] {
|
||||
override buildElement (): NapProtoEncodeStructType<typeof Elem>[] {
|
||||
if (!this.msgInfo) return [];
|
||||
return [{
|
||||
commonElem: {
|
||||
serviceType: 48,
|
||||
pbElem: new NapProtoMsg(MsgInfo).encode(this.msgInfo),
|
||||
businessType: 21,
|
||||
}
|
||||
},
|
||||
}];
|
||||
}
|
||||
|
||||
override toPreview(): string {
|
||||
override toPreview (): string {
|
||||
return '[视频]';
|
||||
}
|
||||
}
|
||||
@ -497,7 +497,7 @@ export class PacketMsgPttElement extends IPacketMsgElement<SendPttElement> {
|
||||
fileDuration: number;
|
||||
msgInfo: NapProtoEncodeStructType<typeof MsgInfo> | null = null;
|
||||
|
||||
constructor(element: SendPttElement) {
|
||||
constructor (element: SendPttElement) {
|
||||
super(element);
|
||||
this.filePath = element.pttElement.filePath;
|
||||
this.fileSize = +element.pttElement.fileSize; // TODO: cc
|
||||
@ -505,11 +505,11 @@ export class PacketMsgPttElement extends IPacketMsgElement<SendPttElement> {
|
||||
this.fileDuration = Math.round(element.pttElement.duration); // TODO: cc
|
||||
}
|
||||
|
||||
override get valid(): boolean {
|
||||
override get valid (): boolean {
|
||||
return false;
|
||||
}
|
||||
|
||||
override buildElement(): NapProtoEncodeStructType<typeof Elem>[] {
|
||||
override buildElement (): NapProtoEncodeStructType<typeof Elem>[] {
|
||||
return [];
|
||||
// if (!this.msgInfo) return [];
|
||||
// return [{
|
||||
@ -521,7 +521,7 @@ export class PacketMsgPttElement extends IPacketMsgElement<SendPttElement> {
|
||||
// }];
|
||||
}
|
||||
|
||||
override toPreview(): string {
|
||||
override toPreview (): string {
|
||||
return '[语音]';
|
||||
}
|
||||
}
|
||||
@ -539,18 +539,18 @@ export class PacketMsgFileElement extends IPacketMsgElement<SendFileElement> {
|
||||
_private_recv_uid?: string;
|
||||
_e37_800_rsp?: NapProtoEncodeStructType<typeof OidbSvcTrpcTcp0XE37_800Response>;
|
||||
|
||||
constructor(element: SendFileElement) {
|
||||
constructor (element: SendFileElement) {
|
||||
super(element);
|
||||
this.fileName = element.fileElement.fileName;
|
||||
this.filePath = element.fileElement.filePath;
|
||||
this.fileSize = +element.fileElement.fileSize;
|
||||
}
|
||||
|
||||
override get valid(): boolean {
|
||||
override get valid (): boolean {
|
||||
return this.isGroupFile || Boolean(this._e37_800_rsp);
|
||||
}
|
||||
|
||||
override buildContent(): Uint8Array | undefined {
|
||||
override buildContent (): Uint8Array | undefined {
|
||||
if (this.isGroupFile || !this._e37_800_rsp) return undefined;
|
||||
return new NapProtoMsg(FileExtra).encode({
|
||||
file: {
|
||||
@ -576,12 +576,12 @@ export class PacketMsgFileElement extends IPacketMsgElement<SendFileElement> {
|
||||
fileHash: this.fileHash,
|
||||
selfUid: this._private_send_uid,
|
||||
destUid: this._private_recv_uid,
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
override buildElement(): NapProtoEncodeStructType<typeof Elem>[] {
|
||||
override buildElement (): NapProtoEncodeStructType<typeof Elem>[] {
|
||||
if (!this.isGroupFile) return [];
|
||||
const lb = Buffer.alloc(2);
|
||||
const transElemVal = new NapProtoMsg(GroupFileExtra).encode({
|
||||
@ -596,19 +596,19 @@ export class PacketMsgFileElement extends IPacketMsgElement<SendFileElement> {
|
||||
fileSha: this.fileSha1,
|
||||
extInfoString: '',
|
||||
fileMd5: this.fileMd5,
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
});
|
||||
lb.writeUInt16BE(transElemVal.length);
|
||||
return [{
|
||||
transElem: {
|
||||
elemType: 24,
|
||||
elemValue: Buffer.concat([Buffer.from([0x01]), lb, transElemVal]) // TLV
|
||||
}
|
||||
elemValue: Buffer.concat([Buffer.from([0x01]), lb, transElemVal]), // TLV
|
||||
},
|
||||
}];
|
||||
}
|
||||
|
||||
override toPreview(): string {
|
||||
override toPreview (): string {
|
||||
return `[文件]${this.fileName}`;
|
||||
}
|
||||
}
|
||||
@ -616,23 +616,23 @@ export class PacketMsgFileElement extends IPacketMsgElement<SendFileElement> {
|
||||
export class PacketMsgLightAppElement extends IPacketMsgElement<SendArkElement> {
|
||||
payload: string;
|
||||
|
||||
constructor(element: SendArkElement) {
|
||||
constructor (element: SendArkElement) {
|
||||
super(element);
|
||||
this.payload = element.arkElement.bytesData;
|
||||
}
|
||||
|
||||
override buildElement(): NapProtoEncodeStructType<typeof Elem>[] {
|
||||
override buildElement (): NapProtoEncodeStructType<typeof Elem>[] {
|
||||
return [{
|
||||
lightAppElem: {
|
||||
data: Buffer.concat([
|
||||
Buffer.from([0x01]),
|
||||
zlib.deflateSync(Buffer.from(this.payload, 'utf-8'))
|
||||
])
|
||||
}
|
||||
zlib.deflateSync(Buffer.from(this.payload, 'utf-8')),
|
||||
]),
|
||||
},
|
||||
}];
|
||||
}
|
||||
|
||||
override toPreview(): string {
|
||||
override toPreview (): string {
|
||||
return '[卡片消息]';
|
||||
}
|
||||
}
|
||||
@ -640,24 +640,24 @@ export class PacketMsgLightAppElement extends IPacketMsgElement<SendArkElement>
|
||||
export class PacketMsgMarkDownElement extends IPacketMsgElement<SendMarkdownElement> {
|
||||
content: string;
|
||||
|
||||
constructor(element: SendMarkdownElement) {
|
||||
constructor (element: SendMarkdownElement) {
|
||||
super(element);
|
||||
this.content = element.markdownElement.content;
|
||||
}
|
||||
|
||||
override buildElement(): NapProtoEncodeStructType<typeof Elem>[] {
|
||||
override buildElement (): NapProtoEncodeStructType<typeof Elem>[] {
|
||||
return [{
|
||||
commonElem: {
|
||||
serviceType: 45,
|
||||
pbElem: new NapProtoMsg(MarkdownData).encode({
|
||||
content: this.content
|
||||
content: this.content,
|
||||
}),
|
||||
businessType: 1
|
||||
}
|
||||
businessType: 1,
|
||||
},
|
||||
}];
|
||||
}
|
||||
|
||||
override toPreview(): string {
|
||||
override toPreview (): string {
|
||||
return `[Markdown消息 ${this.content}]`;
|
||||
}
|
||||
}
|
||||
@ -666,24 +666,24 @@ export class PacketMultiMsgElement extends IPacketMsgElement<SendMultiForwardMsg
|
||||
resid: string;
|
||||
message: PacketMsg[];
|
||||
|
||||
constructor(rawElement: SendMultiForwardMsgElement, message?: PacketMsg[]) {
|
||||
constructor (rawElement: SendMultiForwardMsgElement, message?: PacketMsg[]) {
|
||||
super(rawElement);
|
||||
this.resid = rawElement.multiForwardMsgElement.resId;
|
||||
this.message = message ?? [];
|
||||
}
|
||||
|
||||
override buildElement(): NapProtoEncodeStructType<typeof Elem>[] {
|
||||
override buildElement (): NapProtoEncodeStructType<typeof Elem>[] {
|
||||
return [{
|
||||
lightAppElem: {
|
||||
data: Buffer.concat([
|
||||
Buffer.from([0x01]),
|
||||
zlib.deflateSync(Buffer.from(JSON.stringify(ForwardMsgBuilder.fromPacketMsg(this.resid, this.message)), 'utf-8'))
|
||||
])
|
||||
}
|
||||
zlib.deflateSync(Buffer.from(JSON.stringify(ForwardMsgBuilder.fromPacketMsg(this.resid, this.message)), 'utf-8')),
|
||||
]),
|
||||
},
|
||||
}];
|
||||
}
|
||||
|
||||
override toPreview(): string {
|
||||
override toPreview (): string {
|
||||
return '[聊天记录]';
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
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;
|
||||
|
||||
@ -5,24 +5,24 @@ import OidbBase from '@/core/packet/transformer/oidb/oidbBase';
|
||||
import { AIVoiceChatType } from '@/core/packet/entities/aiChat';
|
||||
|
||||
class GetAiVoice extends PacketTransformer<typeof proto.OidbSvcTrpcTcp0X929B_0Resp> {
|
||||
constructor() {
|
||||
constructor () {
|
||||
super();
|
||||
}
|
||||
|
||||
build(groupUin: number, voiceId: string, text: string, sessionId: number, chatType: AIVoiceChatType): OidbPacket {
|
||||
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,
|
||||
groupUin,
|
||||
voiceId,
|
||||
text,
|
||||
chatType,
|
||||
session: {
|
||||
sessionId: sessionId
|
||||
}
|
||||
sessionId,
|
||||
},
|
||||
});
|
||||
return OidbBase.build(0x929B, 0, data);
|
||||
}
|
||||
|
||||
parse(data: Buffer) {
|
||||
parse (data: Buffer) {
|
||||
const oidbBody = OidbBase.parse(data).body;
|
||||
return new NapProtoMsg(proto.OidbSvcTrpcTcp0X929B_0Resp).decode(oidbBody);
|
||||
}
|
||||
|
||||
@ -4,16 +4,16 @@ import { OidbPacket, PacketBufBuilder, PacketTransformer } from '@/core/packet/t
|
||||
import { MiniAppReqParams } from '@/core/packet/entities/miniApp';
|
||||
|
||||
class GetMiniAppAdaptShareInfo extends PacketTransformer<typeof proto.MiniAppAdaptShareInfoResp> {
|
||||
constructor() {
|
||||
constructor () {
|
||||
super();
|
||||
}
|
||||
|
||||
build(req: MiniAppReqParams): OidbPacket {
|
||||
build (req: MiniAppReqParams): OidbPacket {
|
||||
const data = new NapProtoMsg(proto.MiniAppAdaptShareInfoReq).encode({
|
||||
appId: req.sdkId,
|
||||
body: {
|
||||
extInfo: {
|
||||
field2: Buffer.alloc(0)
|
||||
field2: Buffer.alloc(0),
|
||||
},
|
||||
appid: req.appId,
|
||||
title: req.title,
|
||||
@ -34,18 +34,18 @@ class GetMiniAppAdaptShareInfo extends PacketTransformer<typeof proto.MiniAppAda
|
||||
appidRich: Buffer.alloc(0),
|
||||
template: {
|
||||
templateId: '',
|
||||
templateData: ''
|
||||
templateData: '',
|
||||
},
|
||||
field20: '',
|
||||
},
|
||||
field20: ''
|
||||
}
|
||||
});
|
||||
return {
|
||||
cmd: 'LightAppSvc.mini_app_share.AdaptShareInfo',
|
||||
data: PacketBufBuilder(data)
|
||||
data: PacketBufBuilder(data),
|
||||
};
|
||||
}
|
||||
|
||||
parse(data: Buffer) {
|
||||
parse (data: Buffer) {
|
||||
return new NapProtoMsg(proto.MiniAppAdaptShareInfoResp).decode(data);
|
||||
}
|
||||
}
|
||||
|
||||
@ -4,19 +4,19 @@ import { OidbPacket, PacketTransformer } from '@/core/packet/transformer/base';
|
||||
import OidbBase from '@/core/packet/transformer/oidb/oidbBase';
|
||||
|
||||
class GetStrangerInfo extends PacketTransformer<typeof proto.OidbSvcTrpcTcp0XFE1_2RSP> {
|
||||
constructor() {
|
||||
constructor () {
|
||||
super();
|
||||
}
|
||||
|
||||
build(uin: number): OidbPacket {
|
||||
build (uin: number): OidbPacket {
|
||||
const body = new NapProtoMsg(proto.OidbSvcTrpcTcp0XFE1_2).encode({
|
||||
uin: uin,
|
||||
key: [{ key: 27372 }]
|
||||
uin,
|
||||
key: [{ key: 27372 }],
|
||||
});
|
||||
return OidbBase.build(0XFE1, 2, body);
|
||||
}
|
||||
|
||||
parse(data: Buffer) {
|
||||
parse (data: Buffer) {
|
||||
const oidbBody = OidbBase.parse(data).body;
|
||||
return new NapProtoMsg(proto.OidbSvcTrpcTcp0XFE1_2RSP).decode(oidbBody);
|
||||
}
|
||||
|
||||
@ -4,11 +4,11 @@ import { OidbPacket, PacketTransformer } from '@/core/packet/transformer/base';
|
||||
import OidbBase from '@/core/packet/transformer/oidb/oidbBase';
|
||||
|
||||
class ImageOCR extends PacketTransformer<typeof proto.OidbSvcTrpcTcp0xE07_0_Response> {
|
||||
constructor() {
|
||||
constructor () {
|
||||
super();
|
||||
}
|
||||
|
||||
build(url: string): OidbPacket {
|
||||
build (url: string): OidbPacket {
|
||||
const body = new NapProtoMsg(proto.OidbSvcTrpcTcp0xE07_0).encode(
|
||||
{
|
||||
version: 1,
|
||||
@ -22,13 +22,13 @@ class ImageOCR extends PacketTransformer<typeof proto.OidbSvcTrpcTcp0xE07_0_Resp
|
||||
afterCompressWeight: '',
|
||||
afterCompressHeight: '',
|
||||
isCut: false,
|
||||
}
|
||||
},
|
||||
}
|
||||
);
|
||||
return OidbBase.build(0XEB7, 1, body, false, false);
|
||||
}
|
||||
|
||||
parse(data: Buffer) {
|
||||
parse (data: Buffer) {
|
||||
const base = OidbBase.parse(data);
|
||||
return new NapProtoMsg(proto.OidbSvcTrpcTcp0xE07_0_Response).decode(base.body);
|
||||
}
|
||||
|
||||
@ -4,25 +4,25 @@ import { OidbPacket, PacketTransformer } from '@/core/packet/transformer/base';
|
||||
import OidbBase from '@/core/packet/transformer/oidb/oidbBase';
|
||||
|
||||
class MoveGroupFile extends PacketTransformer<typeof proto.OidbSvcTrpcTcp0x6D6Response> {
|
||||
constructor() {
|
||||
constructor () {
|
||||
super();
|
||||
}
|
||||
|
||||
build(groupUin: number, fileUUID: string, currentParentDirectory: string, targetParentDirectory: string): OidbPacket {
|
||||
build (groupUin: number, fileUUID: string, currentParentDirectory: string, targetParentDirectory: string): OidbPacket {
|
||||
const body = new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6).encode({
|
||||
move: {
|
||||
groupUin: groupUin,
|
||||
groupUin,
|
||||
appId: 5,
|
||||
busId: 102,
|
||||
fileId: fileUUID,
|
||||
parentDirectory: currentParentDirectory,
|
||||
targetDirectory: targetParentDirectory,
|
||||
}
|
||||
},
|
||||
});
|
||||
return OidbBase.build(0x6D6, 5, body, true, false);
|
||||
}
|
||||
|
||||
parse(data: Buffer) {
|
||||
parse (data: Buffer) {
|
||||
const oidbBody = OidbBase.parse(data).body;
|
||||
const res = new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6Response).decode(oidbBody);
|
||||
if (res.move.retCode !== 0) {
|
||||
|
||||
@ -4,24 +4,24 @@ import { OidbPacket, PacketTransformer } from '@/core/packet/transformer/base';
|
||||
import OidbBase from '@/core/packet/transformer/oidb/oidbBase';
|
||||
|
||||
class RenameGroupFile extends PacketTransformer<typeof proto.OidbSvcTrpcTcp0x6D6Response> {
|
||||
constructor() {
|
||||
constructor () {
|
||||
super();
|
||||
}
|
||||
|
||||
build(groupUin: number, fileUUID: string, currentParentDirectory: string, newName: string): OidbPacket {
|
||||
build (groupUin: number, fileUUID: string, currentParentDirectory: string, newName: string): OidbPacket {
|
||||
const body = new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6).encode({
|
||||
rename: {
|
||||
groupUin: groupUin,
|
||||
groupUin,
|
||||
busId: 102,
|
||||
fileId: fileUUID,
|
||||
parentFolder: currentParentDirectory,
|
||||
newFileName: newName,
|
||||
}
|
||||
},
|
||||
});
|
||||
return OidbBase.build(0x6D6, 4, body, true, false);
|
||||
}
|
||||
|
||||
parse(data: Buffer) {
|
||||
parse (data: Buffer) {
|
||||
const oidbBody = OidbBase.parse(data).body;
|
||||
const res = new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6Response).decode(oidbBody);
|
||||
if (res.rename.retCode !== 0) {
|
||||
|
||||
@ -4,23 +4,23 @@ import { OidbPacket, PacketTransformer } from '@/core/packet/transformer/base';
|
||||
import OidbBase from '@/core/packet/transformer/oidb/oidbBase';
|
||||
|
||||
class DownloadGroupFile extends PacketTransformer<typeof proto.OidbSvcTrpcTcp0x6D6Response> {
|
||||
constructor() {
|
||||
constructor () {
|
||||
super();
|
||||
}
|
||||
|
||||
build(groupUin: number, fileUUID: string): OidbPacket {
|
||||
build (groupUin: number, fileUUID: string): OidbPacket {
|
||||
const body = new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6).encode({
|
||||
download: {
|
||||
groupUin: groupUin,
|
||||
groupUin,
|
||||
appId: 7,
|
||||
busId: 102,
|
||||
fileId: fileUUID
|
||||
}
|
||||
fileId: fileUUID,
|
||||
},
|
||||
});
|
||||
return OidbBase.build(0x6D6, 2, body, true, false);
|
||||
}
|
||||
|
||||
parse(data: Buffer) {
|
||||
parse (data: Buffer) {
|
||||
const oidbBody = OidbBase.parse(data).body;
|
||||
const res = new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6Response).decode(oidbBody);
|
||||
if (res.download.retCode !== 0) {
|
||||
|
||||
@ -5,43 +5,43 @@ import OidbBase from '@/core/packet/transformer/oidb/oidbBase';
|
||||
import { IndexNode } from '@/core/packet/transformer/proto';
|
||||
|
||||
class DownloadGroupImage extends PacketTransformer<typeof proto.NTV2RichMediaResp> {
|
||||
constructor() {
|
||||
constructor () {
|
||||
super();
|
||||
}
|
||||
|
||||
build(group_uin: number, node: NapProtoEncodeStructType<typeof IndexNode>): OidbPacket {
|
||||
build (group_uin: number, node: NapProtoEncodeStructType<typeof IndexNode>): OidbPacket {
|
||||
const body = new NapProtoMsg(proto.NTV2RichMediaReq).encode({
|
||||
reqHead: {
|
||||
common: {
|
||||
requestId: 1,
|
||||
command: 200
|
||||
command: 200,
|
||||
},
|
||||
scene: {
|
||||
requestType: 2,
|
||||
businessType: 1,
|
||||
sceneType: 2,
|
||||
group: {
|
||||
groupUin: group_uin
|
||||
}
|
||||
groupUin: group_uin,
|
||||
},
|
||||
},
|
||||
client: {
|
||||
agentType: 2,
|
||||
}
|
||||
},
|
||||
},
|
||||
download: {
|
||||
node: node,
|
||||
node,
|
||||
download: {
|
||||
video: {
|
||||
busiType: 0,
|
||||
sceneType: 0
|
||||
}
|
||||
}
|
||||
}
|
||||
sceneType: 0,
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
return OidbBase.build(0x11C4, 200, body, true, false);
|
||||
}
|
||||
|
||||
parse(data: Buffer) {
|
||||
parse (data: Buffer) {
|
||||
const oidbBody = OidbBase.parse(data).body;
|
||||
return new NapProtoMsg(proto.NTV2RichMediaResp).decode(oidbBody);
|
||||
}
|
||||
|
||||
@ -5,43 +5,43 @@ import OidbBase from '@/core/packet/transformer/oidb/oidbBase';
|
||||
import { IndexNode } from '@/core/packet/transformer/proto';
|
||||
|
||||
class DownloadGroupVideo extends PacketTransformer<typeof proto.NTV2RichMediaResp> {
|
||||
constructor() {
|
||||
constructor () {
|
||||
super();
|
||||
}
|
||||
|
||||
build(groupUin: number, node: NapProtoEncodeStructType<typeof IndexNode>): OidbPacket {
|
||||
build (groupUin: number, node: NapProtoEncodeStructType<typeof IndexNode>): OidbPacket {
|
||||
const body = new NapProtoMsg(proto.NTV2RichMediaReq).encode({
|
||||
reqHead: {
|
||||
common: {
|
||||
requestId: 1,
|
||||
command: 200
|
||||
command: 200,
|
||||
},
|
||||
scene: {
|
||||
requestType: 2,
|
||||
businessType: 2,
|
||||
sceneType: 2,
|
||||
group: {
|
||||
groupUin: groupUin
|
||||
}
|
||||
groupUin,
|
||||
},
|
||||
},
|
||||
client: {
|
||||
agentType: 2,
|
||||
}
|
||||
},
|
||||
},
|
||||
download: {
|
||||
node: node,
|
||||
node,
|
||||
download: {
|
||||
video: {
|
||||
busiType: 0,
|
||||
sceneType: 0
|
||||
}
|
||||
}
|
||||
}
|
||||
sceneType: 0,
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
return OidbBase.build(0x11EA, 200, body, true, false);
|
||||
}
|
||||
|
||||
parse(data: Buffer) {
|
||||
parse (data: Buffer) {
|
||||
const oidbBody = OidbBase.parse(data).body;
|
||||
return new NapProtoMsg(proto.NTV2RichMediaResp).decode(oidbBody);
|
||||
}
|
||||
|
||||
@ -5,16 +5,16 @@ import OidbBase from '@/core/packet/transformer/oidb/oidbBase';
|
||||
import { IndexNode } from '@/core/packet/transformer/proto';
|
||||
|
||||
class DownloadImage extends PacketTransformer<typeof proto.NTV2RichMediaResp> {
|
||||
constructor() {
|
||||
constructor () {
|
||||
super();
|
||||
}
|
||||
|
||||
build(selfUid: string, node: NapProtoEncodeStructType<typeof IndexNode>): OidbPacket {
|
||||
build (selfUid: string, node: NapProtoEncodeStructType<typeof IndexNode>): OidbPacket {
|
||||
const body = new NapProtoMsg(proto.NTV2RichMediaReq).encode({
|
||||
reqHead: {
|
||||
common: {
|
||||
requestId: 1,
|
||||
command: 200
|
||||
command: 200,
|
||||
},
|
||||
scene: {
|
||||
requestType: 2,
|
||||
@ -22,27 +22,27 @@ class DownloadImage extends PacketTransformer<typeof proto.NTV2RichMediaResp> {
|
||||
sceneType: 1,
|
||||
c2C: {
|
||||
accountType: 2,
|
||||
targetUid: selfUid
|
||||
targetUid: selfUid,
|
||||
},
|
||||
},
|
||||
client: {
|
||||
agentType: 2,
|
||||
}
|
||||
},
|
||||
},
|
||||
download: {
|
||||
node: node,
|
||||
node,
|
||||
download: {
|
||||
video: {
|
||||
busiType: 0,
|
||||
sceneType: 0
|
||||
}
|
||||
}
|
||||
}
|
||||
sceneType: 0,
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
return OidbBase.build(0x11C5, 200, body, true, false);
|
||||
}
|
||||
|
||||
parse(data: Buffer) {
|
||||
parse (data: Buffer) {
|
||||
const oidbBody = OidbBase.parse(data).body;
|
||||
return new NapProtoMsg(proto.NTV2RichMediaResp).decode(oidbBody);
|
||||
}
|
||||
|
||||
@ -4,19 +4,19 @@ import { OidbPacket, PacketTransformer } from '@/core/packet/transformer/base';
|
||||
import OidbBase from '@/core/packet/transformer/oidb/oidbBase';
|
||||
|
||||
class DownloadOfflineFile extends PacketTransformer<typeof proto.OidbSvcTrpcTcp0XE37Response> {
|
||||
constructor() {
|
||||
constructor () {
|
||||
super();
|
||||
}
|
||||
|
||||
build(fileUUID: string, fileHash: string, senderUid: string, receiverUid: string): OidbPacket {
|
||||
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,
|
||||
senderUid,
|
||||
receiverUid,
|
||||
fileUuid: fileUUID,
|
||||
fileHash: fileHash,
|
||||
fileHash,
|
||||
},
|
||||
field101: 3,
|
||||
field102: 1,
|
||||
@ -26,7 +26,7 @@ class DownloadOfflineFile extends PacketTransformer<typeof proto.OidbSvcTrpcTcp0
|
||||
}
|
||||
|
||||
// TODO:check
|
||||
parse(data: Buffer) {
|
||||
parse (data: Buffer) {
|
||||
const oidbBody = OidbBase.parse(data).body;
|
||||
return new NapProtoMsg(proto.OidbSvcTrpcTcp0XE37Response).decode(oidbBody);
|
||||
}
|
||||
|
||||
@ -4,11 +4,11 @@ import { OidbPacket, PacketTransformer } from '@/core/packet/transformer/base';
|
||||
import OidbBase from '@/core/packet/transformer/oidb/oidbBase';
|
||||
|
||||
class DownloadPrivateFile extends PacketTransformer<typeof proto.OidbSvcTrpcTcp0XE37_1200Response> {
|
||||
constructor() {
|
||||
constructor () {
|
||||
super();
|
||||
}
|
||||
|
||||
build(selfUid: string, fileUUID: string, fileHash: string): OidbPacket {
|
||||
build (selfUid: string, fileUUID: string, fileHash: string): OidbPacket {
|
||||
const body = new NapProtoMsg(proto.OidbSvcTrpcTcp0XE37_1200).encode({
|
||||
subCommand: 1200,
|
||||
field2: 1,
|
||||
@ -16,18 +16,18 @@ class DownloadPrivateFile extends PacketTransformer<typeof proto.OidbSvcTrpcTcp0
|
||||
receiverUid: selfUid,
|
||||
fileUuid: fileUUID,
|
||||
type: 2,
|
||||
fileHash: fileHash,
|
||||
t2: 0
|
||||
fileHash,
|
||||
t2: 0,
|
||||
},
|
||||
field101: 3,
|
||||
field102: 103,
|
||||
field200: 1,
|
||||
field99999: Buffer.from([0xc0, 0x85, 0x2c, 0x01])
|
||||
field99999: Buffer.from([0xc0, 0x85, 0x2c, 0x01]),
|
||||
});
|
||||
return OidbBase.build(0xE37, 1200, body, false, false);
|
||||
}
|
||||
|
||||
parse(data: Buffer) {
|
||||
parse (data: Buffer) {
|
||||
const oidbBody = OidbBase.parse(data).body;
|
||||
return new NapProtoMsg(proto.OidbSvcTrpcTcp0XE37_1200Response).decode(oidbBody);
|
||||
}
|
||||
|
||||
@ -5,16 +5,16 @@ import OidbBase from '@/core/packet/transformer/oidb/oidbBase';
|
||||
import { IndexNode } from '@/core/packet/transformer/proto';
|
||||
|
||||
class DownloadVideo extends PacketTransformer<typeof proto.NTV2RichMediaResp> {
|
||||
constructor() {
|
||||
constructor () {
|
||||
super();
|
||||
}
|
||||
|
||||
build(selfUid: string, node: NapProtoEncodeStructType<typeof IndexNode>): OidbPacket {
|
||||
build (selfUid: string, node: NapProtoEncodeStructType<typeof IndexNode>): OidbPacket {
|
||||
const body = new NapProtoMsg(proto.NTV2RichMediaReq).encode({
|
||||
reqHead: {
|
||||
common: {
|
||||
requestId: 1,
|
||||
command: 200
|
||||
command: 200,
|
||||
},
|
||||
scene: {
|
||||
requestType: 2,
|
||||
@ -22,27 +22,27 @@ class DownloadVideo extends PacketTransformer<typeof proto.NTV2RichMediaResp> {
|
||||
sceneType: 1,
|
||||
c2C: {
|
||||
accountType: 2,
|
||||
targetUid: selfUid
|
||||
targetUid: selfUid,
|
||||
},
|
||||
},
|
||||
client: {
|
||||
agentType: 2,
|
||||
}
|
||||
},
|
||||
},
|
||||
download: {
|
||||
node: node,
|
||||
node,
|
||||
download: {
|
||||
video: {
|
||||
busiType: 0,
|
||||
sceneType: 0
|
||||
}
|
||||
}
|
||||
}
|
||||
sceneType: 0,
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
return OidbBase.build(0x11E9, 200, body, true, false);
|
||||
}
|
||||
|
||||
parse(data: Buffer) {
|
||||
parse (data: Buffer) {
|
||||
const oidbBody = OidbBase.parse(data).body;
|
||||
return new NapProtoMsg(proto.NTV2RichMediaResp).decode(oidbBody);
|
||||
}
|
||||
|
||||
@ -3,11 +3,11 @@ import { NapProtoMsg } from '@napneko/nap-proto-core';
|
||||
import { OidbPacket, PacketBufBuilder, PacketTransformer } from '@/core/packet/transformer/base';
|
||||
|
||||
class FetchSessionKey extends PacketTransformer<typeof proto.HttpConn0x6ff_501Response> {
|
||||
constructor() {
|
||||
constructor () {
|
||||
super();
|
||||
}
|
||||
|
||||
build(): OidbPacket {
|
||||
build (): OidbPacket {
|
||||
const req = new NapProtoMsg(proto.HttpConn0x6ff_501).encode({
|
||||
httpConn: {
|
||||
field1: 0,
|
||||
@ -20,16 +20,16 @@ class FetchSessionKey extends PacketTransformer<typeof proto.HttpConn0x6ff_501Re
|
||||
field9: 2,
|
||||
field10: 9,
|
||||
field11: 8,
|
||||
ver: '1.0.1'
|
||||
}
|
||||
ver: '1.0.1',
|
||||
},
|
||||
});
|
||||
return {
|
||||
cmd: 'HttpConn.0x6ff_501',
|
||||
data: PacketBufBuilder(req)
|
||||
data: PacketBufBuilder(req),
|
||||
};
|
||||
}
|
||||
|
||||
parse(data: Buffer) {
|
||||
parse (data: Buffer) {
|
||||
return new NapProtoMsg(proto.HttpConn0x6ff_501Response).decode(data);
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,14 +5,14 @@ import OidbBase from '@/core/packet/transformer/oidb/oidbBase';
|
||||
import { PacketMsgFileElement } from '@/core/packet/message/element';
|
||||
|
||||
class UploadGroupFile extends PacketTransformer<typeof proto.OidbSvcTrpcTcp0x6D6Response> {
|
||||
constructor() {
|
||||
constructor () {
|
||||
super();
|
||||
}
|
||||
|
||||
build(groupUin: number, file: PacketMsgFileElement): OidbPacket {
|
||||
build (groupUin: number, file: PacketMsgFileElement): OidbPacket {
|
||||
const body = new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6).encode({
|
||||
file: {
|
||||
groupUin: groupUin,
|
||||
groupUin,
|
||||
appId: 4,
|
||||
busId: 102,
|
||||
entrance: 6,
|
||||
@ -23,13 +23,13 @@ class UploadGroupFile extends PacketTransformer<typeof proto.OidbSvcTrpcTcp0x6D6
|
||||
fileMd5: file.fileMd5,
|
||||
fileSha1: file.fileSha1,
|
||||
fileSha3: Buffer.alloc(0),
|
||||
field15: true
|
||||
}
|
||||
field15: true,
|
||||
},
|
||||
});
|
||||
return OidbBase.build(0x6D6, 0, body, true, false);
|
||||
}
|
||||
|
||||
parse(data: Buffer) {
|
||||
parse (data: Buffer) {
|
||||
const oidbBody = OidbBase.parse(data).body;
|
||||
return new NapProtoMsg(proto.OidbSvcTrpcTcp0x6D6Response).decode(oidbBody);
|
||||
}
|
||||
|
||||
@ -6,29 +6,29 @@ import crypto from 'node:crypto';
|
||||
import { PacketMsgPicElement } from '@/core/packet/message/element';
|
||||
|
||||
class UploadGroupImage extends PacketTransformer<typeof proto.NTV2RichMediaResp> {
|
||||
constructor() {
|
||||
constructor () {
|
||||
super();
|
||||
}
|
||||
|
||||
build(groupUin: number, img: PacketMsgPicElement): OidbPacket {
|
||||
build (groupUin: number, img: PacketMsgPicElement): OidbPacket {
|
||||
const data = new NapProtoMsg(proto.NTV2RichMediaReq).encode(
|
||||
{
|
||||
reqHead: {
|
||||
common: {
|
||||
requestId: 1,
|
||||
command: 100
|
||||
command: 100,
|
||||
},
|
||||
scene: {
|
||||
requestType: 2,
|
||||
businessType: 1,
|
||||
sceneType: 2,
|
||||
group: {
|
||||
groupUin: groupUin
|
||||
groupUin,
|
||||
},
|
||||
},
|
||||
client: {
|
||||
agentType: 2
|
||||
}
|
||||
agentType: 2,
|
||||
},
|
||||
},
|
||||
upload: {
|
||||
uploadInfo: [
|
||||
@ -40,17 +40,17 @@ class UploadGroupImage extends PacketTransformer<typeof proto.NTV2RichMediaResp>
|
||||
fileName: img.name,
|
||||
type: {
|
||||
type: 1,
|
||||
picFormat: img.picType, //TODO: extend NapCat imgType /cc @MliKiowa
|
||||
picFormat: img.picType, // TODO: extend NapCat imgType /cc @MliKiowa
|
||||
videoFormat: 0,
|
||||
voiceFormat: 0,
|
||||
},
|
||||
width: img.width,
|
||||
height: img.height,
|
||||
time: 0,
|
||||
original: 1
|
||||
original: 1,
|
||||
},
|
||||
subFileType: 0,
|
||||
}
|
||||
},
|
||||
],
|
||||
tryFastUploadCompleted: true,
|
||||
srvSendMsg: false,
|
||||
@ -71,17 +71,17 @@ class UploadGroupImage extends PacketTransformer<typeof proto.NTV2RichMediaResp>
|
||||
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) {
|
||||
parse (data: Buffer) {
|
||||
const oidbBody = OidbBase.parse(data).body;
|
||||
return new NapProtoMsg(proto.NTV2RichMediaResp).decode(oidbBody);
|
||||
}
|
||||
|
||||
@ -6,29 +6,29 @@ import crypto from 'node:crypto';
|
||||
import { PacketMsgVideoElement } from '@/core/packet/message/element';
|
||||
|
||||
class UploadGroupVideo extends PacketTransformer<typeof proto.NTV2RichMediaResp> {
|
||||
constructor() {
|
||||
constructor () {
|
||||
super();
|
||||
}
|
||||
|
||||
build(groupUin: number, video: PacketMsgVideoElement): OidbPacket {
|
||||
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
|
||||
command: 100,
|
||||
},
|
||||
scene: {
|
||||
requestType: 2,
|
||||
businessType: 2,
|
||||
sceneType: 2,
|
||||
group: {
|
||||
groupUin: groupUin
|
||||
groupUin,
|
||||
},
|
||||
},
|
||||
client: {
|
||||
agentType: 2
|
||||
}
|
||||
agentType: 2,
|
||||
},
|
||||
},
|
||||
upload: {
|
||||
uploadInfo: [
|
||||
@ -42,14 +42,14 @@ class UploadGroupVideo extends PacketTransformer<typeof proto.NTV2RichMediaResp>
|
||||
type: 2,
|
||||
picFormat: 0,
|
||||
videoFormat: 0,
|
||||
voiceFormat: 0
|
||||
voiceFormat: 0,
|
||||
},
|
||||
height: 0,
|
||||
width: 0,
|
||||
time: 0,
|
||||
original: 0
|
||||
original: 0,
|
||||
},
|
||||
subFileType: 0
|
||||
subFileType: 0,
|
||||
}, {
|
||||
fileInfo: {
|
||||
fileSize: +video.thumbSize,
|
||||
@ -60,15 +60,15 @@ class UploadGroupVideo extends PacketTransformer<typeof proto.NTV2RichMediaResp>
|
||||
type: 1,
|
||||
picFormat: 0,
|
||||
videoFormat: 0,
|
||||
voiceFormat: 0
|
||||
voiceFormat: 0,
|
||||
},
|
||||
height: video.thumbHeight,
|
||||
width: video.thumbWidth,
|
||||
time: 0,
|
||||
original: 0
|
||||
original: 0,
|
||||
},
|
||||
subFileType: 100,
|
||||
},
|
||||
subFileType: 100
|
||||
}
|
||||
],
|
||||
tryFastUploadCompleted: true,
|
||||
srvSendMsg: false,
|
||||
@ -86,16 +86,16 @@ class UploadGroupVideo extends PacketTransformer<typeof proto.NTV2RichMediaResp>
|
||||
bytesPbReserve: Buffer.alloc(0),
|
||||
bytesReserve: Buffer.alloc(0),
|
||||
bytesGeneralFlags: Buffer.alloc(0),
|
||||
}
|
||||
},
|
||||
},
|
||||
clientSeq: 0,
|
||||
noNeedCompatMsg: false
|
||||
}
|
||||
noNeedCompatMsg: false,
|
||||
},
|
||||
});
|
||||
return OidbBase.build(0x11EA, 100, data, true, false);
|
||||
}
|
||||
|
||||
parse(data: Buffer) {
|
||||
parse (data: Buffer) {
|
||||
const oidbBody = OidbBase.parse(data).body;
|
||||
return new NapProtoMsg(proto.NTV2RichMediaResp).decode(oidbBody);
|
||||
}
|
||||
|
||||
@ -6,11 +6,11 @@ import { PacketMsgFileElement } from '@/core/packet/message/element';
|
||||
import { computeMd5AndLengthWithLimit } from '@/core/packet/utils/crypto/hash';
|
||||
|
||||
class UploadPrivateFile extends PacketTransformer<typeof proto.OidbSvcTrpcTcp0XE37Response> {
|
||||
constructor() {
|
||||
constructor () {
|
||||
super();
|
||||
}
|
||||
|
||||
async build(selfUid: string, peerUid: string, file: PacketMsgFileElement): Promise<OidbPacket> {
|
||||
async build (selfUid: string, peerUid: string, file: PacketMsgFileElement): Promise<OidbPacket> {
|
||||
const body = new NapProtoMsg(proto.OidbSvcTrpcTcp0XE37_1700).encode({
|
||||
command: 1700,
|
||||
seq: 0,
|
||||
@ -23,16 +23,16 @@ class UploadPrivateFile extends PacketTransformer<typeof proto.OidbSvcTrpcTcp0XE
|
||||
sha1CheckSum: file.fileSha1,
|
||||
localPath: '/',
|
||||
md5CheckSum: file.fileMd5,
|
||||
sha3CheckSum: Buffer.alloc(0)
|
||||
sha3CheckSum: Buffer.alloc(0),
|
||||
},
|
||||
businessId: 3,
|
||||
clientType: 1,
|
||||
flagSupportMediaPlatform: 1
|
||||
flagSupportMediaPlatform: 1,
|
||||
});
|
||||
return OidbBase.build(0xE37, 1700, body, false, false);
|
||||
}
|
||||
|
||||
parse(data: Buffer) {
|
||||
parse (data: Buffer) {
|
||||
const oidbBody = OidbBase.parse(data).body;
|
||||
return new NapProtoMsg(proto.OidbSvcTrpcTcp0XE37Response).decode(oidbBody);
|
||||
}
|
||||
|
||||
@ -6,16 +6,16 @@ import crypto from 'node:crypto';
|
||||
import { PacketMsgPicElement } from '@/core/packet/message/element';
|
||||
|
||||
class UploadPrivateImage extends PacketTransformer<typeof proto.NTV2RichMediaResp> {
|
||||
constructor() {
|
||||
constructor () {
|
||||
super();
|
||||
}
|
||||
|
||||
build(peerUin: string, img: PacketMsgPicElement): OidbPacket {
|
||||
build (peerUin: string, img: PacketMsgPicElement): OidbPacket {
|
||||
const data = new NapProtoMsg(proto.NTV2RichMediaReq).encode({
|
||||
reqHead: {
|
||||
common: {
|
||||
requestId: 1,
|
||||
command: 100
|
||||
command: 100,
|
||||
},
|
||||
scene: {
|
||||
requestType: 2,
|
||||
@ -23,12 +23,12 @@ class UploadPrivateImage extends PacketTransformer<typeof proto.NTV2RichMediaRes
|
||||
sceneType: 1,
|
||||
c2C: {
|
||||
accountType: 2,
|
||||
targetUid: peerUin
|
||||
targetUid: peerUin,
|
||||
},
|
||||
},
|
||||
client: {
|
||||
agentType: 2,
|
||||
}
|
||||
},
|
||||
},
|
||||
upload: {
|
||||
uploadInfo: [
|
||||
@ -40,17 +40,17 @@ class UploadPrivateImage extends PacketTransformer<typeof proto.NTV2RichMediaRes
|
||||
fileName: img.name,
|
||||
type: {
|
||||
type: 1,
|
||||
picFormat: img.picType, //TODO: extend NapCat imgType /cc @MliKiowa
|
||||
picFormat: img.picType, // TODO: extend NapCat imgType /cc @MliKiowa
|
||||
videoFormat: 0,
|
||||
voiceFormat: 0,
|
||||
},
|
||||
width: img.width,
|
||||
height: img.height,
|
||||
time: 0,
|
||||
original: 1
|
||||
original: 1,
|
||||
},
|
||||
subFileType: 0,
|
||||
}
|
||||
},
|
||||
],
|
||||
tryFastUploadCompleted: true,
|
||||
srvSendMsg: false,
|
||||
@ -71,17 +71,17 @@ class UploadPrivateImage extends PacketTransformer<typeof proto.NTV2RichMediaRes
|
||||
bytesPbReserve: Buffer.alloc(0),
|
||||
bytesReserve: Buffer.alloc(0),
|
||||
bytesGeneralFlags: Buffer.alloc(0),
|
||||
}
|
||||
},
|
||||
},
|
||||
clientSeq: 0,
|
||||
noNeedCompatMsg: false,
|
||||
}
|
||||
},
|
||||
}
|
||||
);
|
||||
return OidbBase.build(0x11C5, 100, data,true, false);
|
||||
return OidbBase.build(0x11C5, 100, data, true, false);
|
||||
}
|
||||
|
||||
parse(data: Buffer) {
|
||||
parse (data: Buffer) {
|
||||
const oidbBody = OidbBase.parse(data).body;
|
||||
return new NapProtoMsg(proto.NTV2RichMediaResp).decode(oidbBody);
|
||||
}
|
||||
|
||||
@ -6,16 +6,16 @@ import crypto from 'node:crypto';
|
||||
import { PacketMsgPttElement } from '@/core/packet/message/element';
|
||||
|
||||
class UploadPrivatePtt extends PacketTransformer<typeof proto.NTV2RichMediaResp> {
|
||||
constructor() {
|
||||
constructor () {
|
||||
super();
|
||||
}
|
||||
|
||||
build(peerUin: string, ptt: PacketMsgPttElement): OidbPacket {
|
||||
build (peerUin: string, ptt: PacketMsgPttElement): OidbPacket {
|
||||
const data = new NapProtoMsg(proto.NTV2RichMediaReq).encode({
|
||||
reqHead: {
|
||||
common: {
|
||||
requestId: 4,
|
||||
command: 100
|
||||
command: 100,
|
||||
},
|
||||
scene: {
|
||||
requestType: 2,
|
||||
@ -23,12 +23,12 @@ class UploadPrivatePtt extends PacketTransformer<typeof proto.NTV2RichMediaResp>
|
||||
sceneType: 1,
|
||||
c2C: {
|
||||
accountType: 2,
|
||||
targetUid: peerUin
|
||||
}
|
||||
targetUid: peerUin,
|
||||
},
|
||||
},
|
||||
client: {
|
||||
agentType: 2
|
||||
}
|
||||
agentType: 2,
|
||||
},
|
||||
},
|
||||
upload: {
|
||||
uploadInfo: [
|
||||
@ -42,15 +42,15 @@ class UploadPrivatePtt extends PacketTransformer<typeof proto.NTV2RichMediaResp>
|
||||
type: 3,
|
||||
picFormat: 0,
|
||||
videoFormat: 0,
|
||||
voiceFormat: 1
|
||||
voiceFormat: 1,
|
||||
},
|
||||
height: 0,
|
||||
width: 0,
|
||||
time: ptt.fileDuration,
|
||||
original: 0
|
||||
original: 0,
|
||||
},
|
||||
subFileType: 0,
|
||||
},
|
||||
subFileType: 0
|
||||
}
|
||||
],
|
||||
tryFastUploadCompleted: true,
|
||||
srvSendMsg: false,
|
||||
@ -63,16 +63,16 @@ class UploadPrivatePtt extends PacketTransformer<typeof proto.NTV2RichMediaResp>
|
||||
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
|
||||
}
|
||||
noNeedCompatMsg: false,
|
||||
},
|
||||
});
|
||||
return OidbBase.build(0x126D, 100, data, true, false);
|
||||
}
|
||||
|
||||
parse(data: Buffer) {
|
||||
parse (data: Buffer) {
|
||||
const oidbBody = OidbBase.parse(data).body;
|
||||
return new NapProtoMsg(proto.NTV2RichMediaResp).decode(oidbBody);
|
||||
}
|
||||
|
||||
@ -6,17 +6,17 @@ import crypto from 'node:crypto';
|
||||
import { PacketMsgVideoElement } from '@/core/packet/message/element';
|
||||
|
||||
class UploadPrivateVideo extends PacketTransformer<typeof proto.NTV2RichMediaResp> {
|
||||
constructor() {
|
||||
constructor () {
|
||||
super();
|
||||
}
|
||||
|
||||
build(peerUin: string, video: PacketMsgVideoElement): OidbPacket {
|
||||
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
|
||||
command: 100,
|
||||
},
|
||||
scene: {
|
||||
requestType: 2,
|
||||
@ -24,12 +24,12 @@ class UploadPrivateVideo extends PacketTransformer<typeof proto.NTV2RichMediaRes
|
||||
sceneType: 1,
|
||||
c2C: {
|
||||
accountType: 2,
|
||||
targetUid: peerUin
|
||||
}
|
||||
targetUid: peerUin,
|
||||
},
|
||||
},
|
||||
client: {
|
||||
agentType: 2
|
||||
}
|
||||
agentType: 2,
|
||||
},
|
||||
},
|
||||
upload: {
|
||||
uploadInfo: [
|
||||
@ -43,14 +43,14 @@ class UploadPrivateVideo extends PacketTransformer<typeof proto.NTV2RichMediaRes
|
||||
type: 2,
|
||||
picFormat: 0,
|
||||
videoFormat: 0,
|
||||
voiceFormat: 0
|
||||
voiceFormat: 0,
|
||||
},
|
||||
height: 0,
|
||||
width: 0,
|
||||
time: 0,
|
||||
original: 0
|
||||
original: 0,
|
||||
},
|
||||
subFileType: 0
|
||||
subFileType: 0,
|
||||
}, {
|
||||
fileInfo: {
|
||||
fileSize: +video.thumbSize,
|
||||
@ -61,15 +61,15 @@ class UploadPrivateVideo extends PacketTransformer<typeof proto.NTV2RichMediaRes
|
||||
type: 1,
|
||||
picFormat: 0,
|
||||
videoFormat: 0,
|
||||
voiceFormat: 0
|
||||
voiceFormat: 0,
|
||||
},
|
||||
height: video.thumbHeight,
|
||||
width: video.thumbWidth,
|
||||
time: 0,
|
||||
original: 0
|
||||
original: 0,
|
||||
},
|
||||
subFileType: 100,
|
||||
},
|
||||
subFileType: 100
|
||||
}
|
||||
],
|
||||
tryFastUploadCompleted: true,
|
||||
srvSendMsg: false,
|
||||
@ -87,16 +87,16 @@ class UploadPrivateVideo extends PacketTransformer<typeof proto.NTV2RichMediaRes
|
||||
bytesPbReserve: Buffer.alloc(0),
|
||||
bytesReserve: Buffer.alloc(0),
|
||||
bytesGeneralFlags: Buffer.alloc(0),
|
||||
}
|
||||
},
|
||||
},
|
||||
clientSeq: 0,
|
||||
noNeedCompatMsg: false
|
||||
}
|
||||
noNeedCompatMsg: false,
|
||||
},
|
||||
});
|
||||
return OidbBase.build(0x11E9, 100, data, true, false);
|
||||
}
|
||||
|
||||
parse(data: Buffer) {
|
||||
parse (data: Buffer) {
|
||||
const oidbBody = OidbBase.parse(data).body;
|
||||
return new NapProtoMsg(proto.NTV2RichMediaResp).decode(oidbBody);
|
||||
}
|
||||
|
||||
@ -3,33 +3,33 @@ import { NapProtoMsg } from '@napneko/nap-proto-core';
|
||||
import { OidbPacket, PacketBufBuilder, PacketTransformer } from '@/core/packet/transformer/base';
|
||||
|
||||
class DownloadForwardMsg extends PacketTransformer<typeof proto.RecvLongMsgResp> {
|
||||
constructor() {
|
||||
constructor () {
|
||||
super();
|
||||
}
|
||||
|
||||
build(uid: string, resId: string): OidbPacket {
|
||||
build (uid: string, resId: string): OidbPacket {
|
||||
const req = new NapProtoMsg(proto.RecvLongMsgReq).encode({
|
||||
info: {
|
||||
uid: {
|
||||
uid: uid
|
||||
uid,
|
||||
},
|
||||
resId: resId,
|
||||
acquire: true
|
||||
resId,
|
||||
acquire: true,
|
||||
},
|
||||
settings: {
|
||||
field1: 2,
|
||||
field2: 0,
|
||||
field3: 0,
|
||||
field4: 0
|
||||
}
|
||||
field4: 0,
|
||||
},
|
||||
});
|
||||
return {
|
||||
cmd: 'trpc.group.long_msg_interface.MsgService.SsoRecvLongMsg',
|
||||
data: PacketBufBuilder(req)
|
||||
data: PacketBufBuilder(req),
|
||||
};
|
||||
}
|
||||
|
||||
parse(data: Buffer) {
|
||||
parse (data: Buffer) {
|
||||
return new NapProtoMsg(proto.RecvLongMsgResp).decode(data);
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,11 +3,11 @@ import { NapProtoMsg } from '@napneko/nap-proto-core';
|
||||
import { OidbPacket, PacketBufBuilder, PacketTransformer } from '@/core/packet/transformer/base';
|
||||
|
||||
class FetchC2CMessage extends PacketTransformer<typeof proto.SsoGetC2cMsgResponse> {
|
||||
constructor() {
|
||||
constructor () {
|
||||
super();
|
||||
}
|
||||
|
||||
build(targetUid: string, startSeq: number, endSeq: number): OidbPacket {
|
||||
build (targetUid: string, startSeq: number, endSeq: number): OidbPacket {
|
||||
const req = new NapProtoMsg(proto.SsoGetC2cMsg).encode({
|
||||
friendUid: targetUid,
|
||||
startSequence: startSeq,
|
||||
@ -15,11 +15,11 @@ class FetchC2CMessage extends PacketTransformer<typeof proto.SsoGetC2cMsgRespons
|
||||
});
|
||||
return {
|
||||
cmd: 'trpc.msg.register_proxy.RegisterProxy.SsoGetC2cMsg',
|
||||
data: PacketBufBuilder(req)
|
||||
data: PacketBufBuilder(req),
|
||||
};
|
||||
}
|
||||
|
||||
parse(data: Buffer) {
|
||||
parse (data: Buffer) {
|
||||
return new NapProtoMsg(proto.SsoGetC2cMsgResponse).decode(data);
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,26 +3,26 @@ import { NapProtoMsg } from '@napneko/nap-proto-core';
|
||||
import { OidbPacket, PacketBufBuilder, PacketTransformer } from '@/core/packet/transformer/base';
|
||||
|
||||
class FetchGroupMessage extends PacketTransformer<typeof proto.SsoGetGroupMsgResponse> {
|
||||
constructor() {
|
||||
constructor () {
|
||||
super();
|
||||
}
|
||||
|
||||
build(groupUin: number, startSeq: number, endSeq: number): OidbPacket {
|
||||
build (groupUin: number, startSeq: number, endSeq: number): OidbPacket {
|
||||
const req = new NapProtoMsg(proto.SsoGetGroupMsg).encode({
|
||||
info: {
|
||||
groupUin: groupUin,
|
||||
groupUin,
|
||||
startSequence: startSeq,
|
||||
endSequence: endSeq
|
||||
endSequence: endSeq,
|
||||
},
|
||||
direction: true
|
||||
direction: true,
|
||||
});
|
||||
return {
|
||||
cmd: 'trpc.msg.register_proxy.RegisterProxy.SsoGetGroupMsg',
|
||||
data: PacketBufBuilder(req)
|
||||
data: PacketBufBuilder(req),
|
||||
};
|
||||
}
|
||||
|
||||
parse(data: Buffer) {
|
||||
parse (data: Buffer) {
|
||||
return new NapProtoMsg(proto.SsoGetGroupMsgResponse).decode(data);
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,20 +5,20 @@ import { OidbPacket, PacketBufBuilder, PacketTransformer } from '@/core/packet/t
|
||||
import { PacketMsg } from '@/core/packet/message/message';
|
||||
|
||||
class UploadForwardMsg extends PacketTransformer<typeof proto.SendLongMsgResp> {
|
||||
constructor() {
|
||||
constructor () {
|
||||
super();
|
||||
}
|
||||
|
||||
build(selfUid: string, msg: PacketMsg[], groupUin: number = 0): OidbPacket {
|
||||
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
|
||||
}
|
||||
}]
|
||||
msgBody,
|
||||
},
|
||||
}],
|
||||
}
|
||||
);
|
||||
const payload = zlib.gzipSync(Buffer.from(longMsgResultData));
|
||||
@ -29,21 +29,21 @@ class UploadForwardMsg extends PacketTransformer<typeof proto.SendLongMsgResp> {
|
||||
uid: {
|
||||
uid: groupUin === 0 ? selfUid : groupUin.toString(),
|
||||
},
|
||||
groupUin: groupUin,
|
||||
payload: payload
|
||||
groupUin,
|
||||
payload,
|
||||
},
|
||||
settings: {
|
||||
field1: 4, field2: 1, field3: 7, field4: 0
|
||||
}
|
||||
field1: 4, field2: 1, field3: 7, field4: 0,
|
||||
},
|
||||
}
|
||||
);
|
||||
return {
|
||||
cmd: 'trpc.group.long_msg_interface.MsgService.SsoSendLongMsg',
|
||||
data: PacketBufBuilder(req)
|
||||
data: PacketBufBuilder(req),
|
||||
};
|
||||
}
|
||||
|
||||
parse(data: Buffer) {
|
||||
parse (data: Buffer) {
|
||||
return new NapProtoMsg(proto.SendLongMsgResp).decode(data);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2,91 +2,91 @@ 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)
|
||||
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)
|
||||
settings: ProtoField(15, () => LongMsgSettings, true),
|
||||
};
|
||||
|
||||
export const RecvLongMsgInfo = {
|
||||
uid: ProtoField(1, () => LongMsgUid, true),
|
||||
resId: ProtoField(2, ScalarType.STRING, true),
|
||||
acquire: ProtoField(3, ScalarType.BOOL)
|
||||
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)
|
||||
field4: ProtoField(4, ScalarType.UINT32),
|
||||
};
|
||||
|
||||
export const RecvLongMsgResp = {
|
||||
result: ProtoField(1, () => RecvLongMsgResult),
|
||||
settings: ProtoField(15, () => LongMsgSettings)
|
||||
settings: ProtoField(15, () => LongMsgSettings),
|
||||
};
|
||||
|
||||
export const RecvLongMsgResult = {
|
||||
resId: ProtoField(3, ScalarType.STRING),
|
||||
payload: ProtoField(4, ScalarType.BYTES)
|
||||
payload: ProtoField(4, ScalarType.BYTES),
|
||||
};
|
||||
|
||||
export const SendLongMsgReq = {
|
||||
info: ProtoField(2, () => SendLongMsgInfo),
|
||||
settings: ProtoField(15, () => LongMsgSettings)
|
||||
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)
|
||||
payload: ProtoField(4, ScalarType.BYTES, true),
|
||||
};
|
||||
|
||||
export const SendLongMsgResp = {
|
||||
result: ProtoField(2, () => SendLongMsgResult),
|
||||
settings: ProtoField(15, () => LongMsgSettings)
|
||||
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)
|
||||
direction: ProtoField(2, ScalarType.BOOL),
|
||||
};
|
||||
|
||||
export const SsoGetGroupMsgInfo = {
|
||||
groupUin: ProtoField(1, ScalarType.UINT32),
|
||||
startSequence: ProtoField(2, ScalarType.UINT32),
|
||||
endSequence: ProtoField(3, 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)
|
||||
messages: ProtoField(6, () => PushMsgBody, false, true),
|
||||
};
|
||||
|
||||
export const SsoGetRoamMsg = {
|
||||
@ -94,23 +94,23 @@ export const SsoGetRoamMsg = {
|
||||
time: ProtoField(2, ScalarType.UINT32),
|
||||
random: ProtoField(3, ScalarType.UINT32),
|
||||
count: ProtoField(4, ScalarType.UINT32),
|
||||
direction: ProtoField(5, ScalarType.BOOL)
|
||||
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)
|
||||
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)
|
||||
endSequence: ProtoField(4, ScalarType.UINT32),
|
||||
};
|
||||
|
||||
export const SsoGetC2cMsgResponse = {
|
||||
friendUid: ProtoField(4, ScalarType.STRING),
|
||||
messages: ProtoField(7, () => PushMsgBody, false, true)
|
||||
messages: ProtoField(7, () => PushMsgBody, false, true),
|
||||
};
|
||||
|
||||
@ -116,7 +116,7 @@ export const MarketFace = {
|
||||
};
|
||||
|
||||
export const MarketFacePbRes = {
|
||||
field8: ProtoField(8, ScalarType.INT32)
|
||||
field8: ProtoField(8, ScalarType.INT32),
|
||||
};
|
||||
|
||||
export const CustomFace = {
|
||||
@ -356,5 +356,5 @@ export const QSmallFaceExtra = {
|
||||
};
|
||||
|
||||
export const MarkdownData = {
|
||||
content: ProtoField(1, ScalarType.STRING)
|
||||
content: ProtoField(1, ScalarType.STRING),
|
||||
};
|
||||
|
||||
@ -7,7 +7,7 @@ import {
|
||||
ResponseForward,
|
||||
ResponseGrp, RichText,
|
||||
Trans0X211,
|
||||
WPATmp
|
||||
WPATmp,
|
||||
} from '@/core/packet/transformer/proto';
|
||||
|
||||
export const ContentHead = {
|
||||
@ -136,4 +136,3 @@ export const RoutingHead = {
|
||||
wpaTmp: ProtoField(6, () => WPATmp, true),
|
||||
trans0X211: ProtoField(15, () => Trans0X211, true),
|
||||
};
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user