mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2025-07-19 12:03:37 +00:00
Compare commits
20 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
29c31b7aba | ||
![]() |
402919d6f2 | ||
![]() |
82608dd5ff | ||
![]() |
f312368df2 | ||
![]() |
374fc64427 | ||
![]() |
95bd74bb0d | ||
![]() |
a9f5069649 | ||
![]() |
957f7ffd8d | ||
![]() |
336dd3ce10 | ||
![]() |
47a7295477 | ||
![]() |
341a0e1c2a | ||
![]() |
c4f73d0eb8 | ||
![]() |
bd9258bae4 | ||
![]() |
e3b3260aa0 | ||
![]() |
676766c99e | ||
![]() |
1025a07593 | ||
![]() |
00c3fcd033 | ||
![]() |
b8457d4aff | ||
![]() |
a2ecf10d19 | ||
![]() |
1e63a2a7e7 |
@@ -5,7 +5,7 @@ if %errorLevel% == 0 (
|
|||||||
echo Administrator mode detected.
|
echo Administrator mode detected.
|
||||||
) else (
|
) else (
|
||||||
echo Please run this script in administrator mode.
|
echo Please run this script in administrator mode.
|
||||||
powershell -Command "Start-Process 'cmd.exe' -ArgumentList '/c cd /d \"%cd%\" && \"%~f0\"' -Verb runAs"
|
powershell -Command "Start-Process 'cmd.exe' -ArgumentList '/c cd /d \"%cd%\" && \"%~f0\" %1' -Verb runAs"
|
||||||
exit
|
exit
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -35,6 +35,6 @@ if not exist "%QQpath%" (
|
|||||||
set NAPCAT_MAIN_PATH=%NAPCAT_MAIN_PATH:\=/%
|
set NAPCAT_MAIN_PATH=%NAPCAT_MAIN_PATH:\=/%
|
||||||
echo (async () =^> {await import("file:///%NAPCAT_MAIN_PATH%")})() > %NAPCAT_LOAD_PATH%
|
echo (async () =^> {await import("file:///%NAPCAT_MAIN_PATH%")})() > %NAPCAT_LOAD_PATH%
|
||||||
|
|
||||||
"%NAPCAT_LAUNCHER_PATH%" "%QQPath%" "%NAPCAT_INJECT_PATH%"
|
"%NAPCAT_LAUNCHER_PATH%" "%QQPath%" "%NAPCAT_INJECT_PATH%" %1
|
||||||
|
|
||||||
REM "%NAPCAT_LAUNCHER_PATH%" "%QQPath%" "%NAPCAT_INJECT_PATH%" 123456
|
REM "%NAPCAT_LAUNCHER_PATH%" "%QQPath%" "%NAPCAT_INJECT_PATH%" 123456
|
@@ -5,7 +5,7 @@ if %errorLevel% == 0 (
|
|||||||
echo Administrator mode detected.
|
echo Administrator mode detected.
|
||||||
) else (
|
) else (
|
||||||
echo Please run this script in administrator mode.
|
echo Please run this script in administrator mode.
|
||||||
powershell -Command "Start-Process 'wt.exe' -ArgumentList 'cmd /c cd /d \"%cd%\" && \"%~f0\"' -Verb runAs"
|
powershell -Command "Start-Process 'wt.exe' -ArgumentList 'cmd /c cd /d \"%cd%\" && \"%~f0\" %1' -Verb runAs"
|
||||||
exit
|
exit
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -36,6 +36,4 @@ if not exist "%QQpath%" (
|
|||||||
set NAPCAT_MAIN_PATH=%NAPCAT_MAIN_PATH:\=/%
|
set NAPCAT_MAIN_PATH=%NAPCAT_MAIN_PATH:\=/%
|
||||||
echo (async () =^> {await import("file:///%NAPCAT_MAIN_PATH%")})() > %NAPCAT_LOAD_PATH%
|
echo (async () =^> {await import("file:///%NAPCAT_MAIN_PATH%")})() > %NAPCAT_LOAD_PATH%
|
||||||
|
|
||||||
"%NAPCAT_LAUNCHER_PATH%" "%QQPath%" "%NAPCAT_INJECT_PATH%"
|
"%NAPCAT_LAUNCHER_PATH%" "%QQPath%" "%NAPCAT_INJECT_PATH%" %1
|
||||||
|
|
||||||
REM "%NAPCAT_LAUNCHER_PATH%" "%QQPath%" "%NAPCAT_INJECT_PATH%" 123456
|
|
4
launcher/quickLoginExample.bat
Normal file
4
launcher/quickLoginExample.bat
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
@echo off
|
||||||
|
REM ./launcher.bat 123456
|
||||||
|
REM ./launcher-win10.bat 123456
|
||||||
|
REM 带有REM的为注释 删掉你需要的系统的那行REM这三个单词 修改QQ本脚本启动即可
|
@@ -4,7 +4,7 @@
|
|||||||
"name": "NapCatQQ",
|
"name": "NapCatQQ",
|
||||||
"slug": "NapCat.Framework",
|
"slug": "NapCat.Framework",
|
||||||
"description": "高性能的 OneBot 11 协议实现",
|
"description": "高性能的 OneBot 11 协议实现",
|
||||||
"version": "2.4.4",
|
"version": "2.4.6",
|
||||||
"icon": "./logo.png",
|
"icon": "./logo.png",
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
{
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
"name": "napcat",
|
"name": "napcat",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "2.4.4",
|
"version": "2.4.6",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build:framework": "vite build --mode framework",
|
"build:framework": "vite build --mode framework",
|
||||||
"build:shell": "vite build --mode shell",
|
"build:shell": "vite build --mode shell",
|
||||||
@@ -57,6 +57,7 @@
|
|||||||
"image-size": "^1.1.1",
|
"image-size": "^1.1.1",
|
||||||
"json-schema-to-ts": "^3.1.0",
|
"json-schema-to-ts": "^3.1.0",
|
||||||
"log4js": "^6.9.1",
|
"log4js": "^6.9.1",
|
||||||
|
"protobufjs": "~7.4.0",
|
||||||
"qrcode-terminal": "^0.12.0",
|
"qrcode-terminal": "^0.12.0",
|
||||||
"silk-wasm": "^3.6.1",
|
"silk-wasm": "^3.6.1",
|
||||||
"strtok3": "8.0.1",
|
"strtok3": "8.0.1",
|
||||||
|
@@ -160,8 +160,7 @@ type Uri2LocalRes = {
|
|||||||
errMsg: string,
|
errMsg: string,
|
||||||
fileName: string,
|
fileName: string,
|
||||||
ext: string,
|
ext: string,
|
||||||
path: string,
|
path: string
|
||||||
isLocal: boolean
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function checkFileV2(filePath: string) {
|
export async function checkFileV2(filePath: string) {
|
||||||
@@ -194,7 +193,6 @@ export async function checkUriType(Uri: string) {
|
|||||||
return undefined;
|
return undefined;
|
||||||
}, Uri);
|
}, Uri);
|
||||||
if (LocalFileRet) return LocalFileRet;
|
if (LocalFileRet) return LocalFileRet;
|
||||||
|
|
||||||
const OtherFileRet = await solveProblem((uri: string) => {
|
const OtherFileRet = await solveProblem((uri: string) => {
|
||||||
//再判断是否是Http
|
//再判断是否是Http
|
||||||
if (uri.startsWith('http://') || uri.startsWith('https://')) {
|
if (uri.startsWith('http://') || uri.startsWith('https://')) {
|
||||||
@@ -206,13 +204,13 @@ export async function checkUriType(Uri: string) {
|
|||||||
}
|
}
|
||||||
if (uri.startsWith('file://')) {
|
if (uri.startsWith('file://')) {
|
||||||
let filePath: string;
|
let filePath: string;
|
||||||
// await fs.copyFile(url.pathname, filePath);
|
|
||||||
const pathname = decodeURIComponent(new URL(uri).pathname);
|
const pathname = decodeURIComponent(new URL(uri).pathname);
|
||||||
if (process.platform === 'win32') {
|
if (process.platform === 'win32') {
|
||||||
filePath = pathname.slice(1);
|
filePath = pathname.slice(1);
|
||||||
} else {
|
} else {
|
||||||
filePath = pathname;
|
filePath = pathname;
|
||||||
}
|
}
|
||||||
|
|
||||||
return { Uri: filePath, Type: FileUriType.Local };
|
return { Uri: filePath, Type: FileUriType.Local };
|
||||||
}
|
}
|
||||||
if (uri.startsWith('data:')) {
|
if (uri.startsWith('data:')) {
|
||||||
@@ -228,35 +226,44 @@ export async function checkUriType(Uri: string) {
|
|||||||
export async function uri2local(dir: string, uri: string, filename: string | undefined = undefined): Promise<Uri2LocalRes> {
|
export async function uri2local(dir: string, uri: string, filename: string | undefined = undefined): Promise<Uri2LocalRes> {
|
||||||
const { Uri: HandledUri, Type: UriType } = await checkUriType(uri);
|
const { Uri: HandledUri, Type: UriType } = await checkUriType(uri);
|
||||||
//解析失败
|
//解析失败
|
||||||
|
const tempName = randomUUID();
|
||||||
|
if (!filename) filename = randomUUID();
|
||||||
|
//解析Http和Https协议
|
||||||
|
|
||||||
if (UriType == FileUriType.Unknown) {
|
if (UriType == FileUriType.Unknown) {
|
||||||
return { success: false, errMsg: '未知文件类型', fileName: '', ext: '', path: '', isLocal: false };
|
return { success: false, errMsg: '未知文件类型', fileName: '', ext: '', path: '' };
|
||||||
}
|
}
|
||||||
//解析File协议和本地文件
|
//解析File协议和本地文件
|
||||||
if (UriType == FileUriType.Local) {
|
if (UriType == FileUriType.Local) {
|
||||||
const fileExt = path.extname(HandledUri);
|
const fileExt = path.extname(HandledUri);
|
||||||
let filename = path.basename(HandledUri, fileExt);
|
let filename = path.basename(HandledUri, fileExt);
|
||||||
filename += fileExt;
|
filename += fileExt;
|
||||||
return { success: true, errMsg: '', fileName: filename, ext: fileExt, path: HandledUri, isLocal: true };
|
//复制文件到临时文件并保持后缀
|
||||||
|
const filenameTemp = tempName + fileExt;
|
||||||
|
const filePath = path.join(dir, filenameTemp);
|
||||||
|
fs.copyFileSync(HandledUri, filePath);
|
||||||
|
//console.log('复制文件到临时文件', HandledUri, filePath);
|
||||||
|
return { success: true, errMsg: '', fileName: filename, ext: fileExt, path: filePath };
|
||||||
}
|
}
|
||||||
//接下来都要有文件名
|
//接下来都要有文件名
|
||||||
if (!filename) filename = randomUUID();
|
|
||||||
//解析Http和Https协议
|
|
||||||
|
|
||||||
if (UriType == FileUriType.Remote) {
|
if (UriType == FileUriType.Remote) {
|
||||||
const pathInfo = path.parse(decodeURIComponent(new URL(HandledUri).pathname));
|
const pathInfo = path.parse(decodeURIComponent(new URL(HandledUri).pathname));
|
||||||
if (pathInfo.name) {
|
if (pathInfo.name) {
|
||||||
filename = pathInfo.name;
|
let pathlen = 200 - dir.length - pathInfo.name.length;
|
||||||
|
filename = pathlen > 0 ? pathInfo.name.substring(0, pathlen) : pathInfo.name.substring(pathInfo.name.length, pathInfo.name.length - 10);//过长截断
|
||||||
if (pathInfo.ext) {
|
if (pathInfo.ext) {
|
||||||
filename += pathInfo.ext;
|
filename += pathInfo.ext;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
filename = filename.replace(/[/\\:*?"<>|]/g, '_');
|
filename = filename.replace(/[/\\:*?"<>|]/g, '_');
|
||||||
const fileExt = path.extname(HandledUri);
|
const fileExt = path.extname(HandledUri).replace(/[/\\:*?"<>|]/g, '_').substring(0, 10);
|
||||||
const filePath = path.join(dir, filename);
|
const filePath = path.join(dir, tempName + fileExt);
|
||||||
const buffer = await httpDownload(HandledUri);
|
const buffer = await httpDownload(HandledUri);
|
||||||
fs.writeFileSync(filePath, buffer);
|
//fs.writeFileSync(filePath, buffer);
|
||||||
return { success: true, errMsg: '', fileName: filename, ext: fileExt, path: filePath, isLocal: false };
|
//没有文件就创建
|
||||||
|
fs.writeFileSync(filePath, buffer, { flag: 'wx' });
|
||||||
|
return { success: true, errMsg: '', fileName: filename, ext: fileExt, path: filePath };
|
||||||
}
|
}
|
||||||
//解析Base64
|
//解析Base64
|
||||||
if (UriType == FileUriType.Base64) {
|
if (UriType == FileUriType.Base64) {
|
||||||
@@ -271,7 +278,7 @@ export async function uri2local(dir: string, uri: string, filename: string | und
|
|||||||
fileExt = ext;
|
fileExt = ext;
|
||||||
filename = filename + '.' + ext;
|
filename = filename + '.' + ext;
|
||||||
}
|
}
|
||||||
return { success: true, errMsg: '', fileName: filename, ext: fileExt, path: filePath, isLocal: false };
|
return { success: true, errMsg: '', fileName: filename, ext: fileExt, path: filePath };
|
||||||
}
|
}
|
||||||
return { success: false, errMsg: '未知文件类型', fileName: '', ext: '', path: '', isLocal: false };
|
return { success: false, errMsg: '未知文件类型', fileName: '', ext: '', path: '' };
|
||||||
}
|
}
|
||||||
|
@@ -1 +1 @@
|
|||||||
export const napCatVersion = '2.4.4';
|
export const napCatVersion = '2.4.6';
|
||||||
|
@@ -24,6 +24,7 @@ import pathLib from 'node:path';
|
|||||||
import { defaultVideoThumbB64, getVideoInfo } from '@/common/video';
|
import { defaultVideoThumbB64, getVideoInfo } from '@/common/video';
|
||||||
import ffmpeg from 'fluent-ffmpeg';
|
import ffmpeg from 'fluent-ffmpeg';
|
||||||
import { encodeSilk } from '@/common/audio';
|
import { encodeSilk } from '@/common/audio';
|
||||||
|
import { MessageContext } from '@/onebot/api';
|
||||||
|
|
||||||
export class NTQQFileApi {
|
export class NTQQFileApi {
|
||||||
context: InstanceContext;
|
context: InstanceContext;
|
||||||
@@ -33,7 +34,7 @@ export class NTQQFileApi {
|
|||||||
constructor(context: InstanceContext, core: NapCatCore) {
|
constructor(context: InstanceContext, core: NapCatCore) {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
this.core = core;
|
this.core = core;
|
||||||
this.rkeyManager = new RkeyManager('https://llob.linyuchen.net/rkey', this.context.logger);
|
this.rkeyManager = new RkeyManager(['https://llob.linyuchen.net/rkey', 'http://napcat-sign.wumiao.wang:2082/rkey'], this.context.logger);
|
||||||
}
|
}
|
||||||
|
|
||||||
async copyFile(filePath: string, destPath: string) {
|
async copyFile(filePath: string, destPath: string) {
|
||||||
@@ -71,7 +72,7 @@ export class NTQQFileApi {
|
|||||||
file_uuid: '',
|
file_uuid: '',
|
||||||
});
|
});
|
||||||
|
|
||||||
await this.copyFile(filePath, mediaPath!);
|
await this.copyFile(filePath, mediaPath);
|
||||||
const fileSize = await this.getFileSize(filePath);
|
const fileSize = await this.getFileSize(filePath);
|
||||||
return {
|
return {
|
||||||
md5: fileMd5,
|
md5: fileMd5,
|
||||||
@@ -82,7 +83,7 @@ export class NTQQFileApi {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
async createValidSendFileElement(filePath: string, fileName: string = '', folderId: string = '',): Promise<SendFileElement> {
|
async createValidSendFileElement(context: MessageContext, filePath: string, fileName: string = '', folderId: string = '',): Promise<SendFileElement> {
|
||||||
const {
|
const {
|
||||||
fileName: _fileName,
|
fileName: _fileName,
|
||||||
path,
|
path,
|
||||||
@@ -91,6 +92,7 @@ export class NTQQFileApi {
|
|||||||
if (fileSize === 0) {
|
if (fileSize === 0) {
|
||||||
throw new Error('文件异常,大小为0');
|
throw new Error('文件异常,大小为0');
|
||||||
}
|
}
|
||||||
|
context.deleteAfterSentFiles.push(path);
|
||||||
return {
|
return {
|
||||||
elementType: ElementType.FILE,
|
elementType: ElementType.FILE,
|
||||||
elementId: '',
|
elementId: '',
|
||||||
@@ -103,12 +105,13 @@ export class NTQQFileApi {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
async createValidSendPicElement(picPath: string, summary: string = '', subType: 0 | 1 = 0,): Promise<SendPicElement> {
|
async createValidSendPicElement(context: MessageContext, picPath: string, summary: string = '', subType: 0 | 1 = 0,): Promise<SendPicElement> {
|
||||||
const { md5, fileName, path, fileSize } = await this.core.apis.FileApi.uploadFile(picPath, ElementType.PIC, subType);
|
const { md5, fileName, path, fileSize } = await this.core.apis.FileApi.uploadFile(picPath, ElementType.PIC, subType);
|
||||||
if (fileSize === 0) {
|
if (fileSize === 0) {
|
||||||
throw new Error('文件异常,大小为0');
|
throw new Error('文件异常,大小为0');
|
||||||
}
|
}
|
||||||
const imageSize = await this.core.apis.FileApi.getImageSize(picPath);
|
const imageSize = await this.core.apis.FileApi.getImageSize(picPath);
|
||||||
|
context.deleteAfterSentFiles.push(path);
|
||||||
return {
|
return {
|
||||||
elementType: ElementType.PIC,
|
elementType: ElementType.PIC,
|
||||||
elementId: '',
|
elementId: '',
|
||||||
@@ -130,26 +133,31 @@ export class NTQQFileApi {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
async createValidSendVideoElement(filePath: string, fileName: string = '', diyThumbPath: string = ''): Promise<SendVideoElement> {
|
async createValidSendVideoElement(context: MessageContext, filePath: string, fileName: string = '', diyThumbPath: string = ''): Promise<SendVideoElement> {
|
||||||
const logger = this.core.context.logger;
|
const logger = this.core.context.logger;
|
||||||
const { fileName: _fileName, path, fileSize, md5 } = await this.core.apis.FileApi.uploadFile(filePath, ElementType.VIDEO);
|
|
||||||
if (fileSize === 0) {
|
|
||||||
throw new Error('文件异常,大小为0');
|
|
||||||
}
|
|
||||||
let thumb = path.replace(`${pathLib.sep}Ori${pathLib.sep}`, `${pathLib.sep}Thumb${pathLib.sep}`);
|
|
||||||
thumb = pathLib.dirname(thumb);
|
|
||||||
let videoInfo = {
|
let videoInfo = {
|
||||||
width: 1920, height: 1080,
|
width: 1920, height: 1080,
|
||||||
time: 15,
|
time: 15,
|
||||||
format: 'mp4',
|
format: 'mp4',
|
||||||
size: fileSize,
|
size: 0,
|
||||||
filePath,
|
filePath,
|
||||||
};
|
};
|
||||||
try {
|
try {
|
||||||
videoInfo = await getVideoInfo(path, logger);
|
videoInfo = await getVideoInfo(filePath, logger);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
logger.logError('获取视频信息失败,将使用默认值', e);
|
logger.logError('获取视频信息失败,将使用默认值', e);
|
||||||
}
|
}
|
||||||
|
let newFilePath = filePath + '.mp4';
|
||||||
|
fs.renameSync(filePath, newFilePath);
|
||||||
|
filePath = newFilePath;
|
||||||
|
const { fileName: _fileName, path, fileSize, md5 } = await this.core.apis.FileApi.uploadFile(filePath, ElementType.VIDEO);
|
||||||
|
if (fileSize === 0) {
|
||||||
|
throw new Error('文件异常,大小为0');
|
||||||
|
}
|
||||||
|
videoInfo.size = fileSize;
|
||||||
|
let thumb = path.replace(`${pathLib.sep}Ori${pathLib.sep}`, `${pathLib.sep}Thumb${pathLib.sep}`);
|
||||||
|
thumb = pathLib.dirname(thumb);
|
||||||
|
|
||||||
const thumbPath = new Map();
|
const thumbPath = new Map();
|
||||||
const _thumbPath = await new Promise<string | undefined>((resolve, reject) => {
|
const _thumbPath = await new Promise<string | undefined>((resolve, reject) => {
|
||||||
const thumbFileName = `${md5}_0.png`;
|
const thumbFileName = `${md5}_0.png`;
|
||||||
@@ -179,6 +187,7 @@ export class NTQQFileApi {
|
|||||||
const thumbSize = _thumbPath ? (await fsPromises.stat(_thumbPath)).size : 0;
|
const thumbSize = _thumbPath ? (await fsPromises.stat(_thumbPath)).size : 0;
|
||||||
thumbPath.set(0, _thumbPath);
|
thumbPath.set(0, _thumbPath);
|
||||||
const thumbMd5 = _thumbPath ? await calculateFileMD5(_thumbPath) : '';
|
const thumbMd5 = _thumbPath ? await calculateFileMD5(_thumbPath) : '';
|
||||||
|
context.deleteAfterSentFiles.push(path);
|
||||||
return {
|
return {
|
||||||
elementType: ElementType.VIDEO,
|
elementType: ElementType.VIDEO,
|
||||||
elementId: '',
|
elementId: '',
|
||||||
|
@@ -24,7 +24,7 @@ export class NTQQGroupApi {
|
|||||||
constructor(context: InstanceContext, core: NapCatCore) {
|
constructor(context: InstanceContext, core: NapCatCore) {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
this.core = core;
|
this.core = core;
|
||||||
this.initCache().then().catch(context.logger.logError);
|
this.initCache().then().catch(context.logger.logError.bind(context.logger));
|
||||||
}
|
}
|
||||||
|
|
||||||
async initCache() {
|
async initCache() {
|
||||||
|
@@ -159,7 +159,7 @@ export class NTQQUserApi {
|
|||||||
if (uid) return uid;
|
if (uid) return uid;
|
||||||
uid = (await this.context.session.getUixConvertService().getUid([Uin])).uidInfo.get(Uin);
|
uid = (await this.context.session.getUixConvertService().getUid([Uin])).uidInfo.get(Uin);
|
||||||
if (uid) return uid;
|
if (uid) return uid;
|
||||||
const unverifiedUid = (await this.getUserDetailInfoByUinV2(Uin)).detail.uid;//从QQ Native 特殊转换
|
const unverifiedUid = (await this.getUserDetailInfoByUin(Uin)).detail.uid;//从QQ Native 特殊转换
|
||||||
if (unverifiedUid.indexOf('*') == -1) uid = unverifiedUid;
|
if (unverifiedUid.indexOf('*') == -1) uid = unverifiedUid;
|
||||||
//if (uid) return uid;
|
//if (uid) return uid;
|
||||||
return uid;
|
return uid;
|
||||||
@@ -195,7 +195,7 @@ export class NTQQUserApi {
|
|||||||
return await this.context.session.getRecentContactService().getRecentContactList();
|
return await this.context.session.getRecentContactService().getRecentContactList();
|
||||||
}
|
}
|
||||||
|
|
||||||
async getUserDetailInfoByUinV2(Uin: string) {
|
async getUserDetailInfoByUin(Uin: string) {
|
||||||
return await this.core.eventWrapper.callNoListenerEvent(
|
return await this.core.eventWrapper.callNoListenerEvent(
|
||||||
'NodeIKernelProfileService/getUserDetailInfoByUin',
|
'NodeIKernelProfileService/getUserDetailInfoByUin',
|
||||||
Uin
|
Uin
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { GroupMemberRole, Peer } from '@/core';
|
import { GroupMemberRole } from '@/core';
|
||||||
|
|
||||||
export interface Peer {
|
export interface Peer {
|
||||||
chatType: ChatType;
|
chatType: ChatType;
|
||||||
|
@@ -297,7 +297,7 @@ export enum BizKey {
|
|||||||
KPHOTOWALL
|
KPHOTOWALL
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface UserDetailInfoByUinV2 {
|
export interface UserDetailInfoByUin {
|
||||||
result: number,
|
result: number,
|
||||||
errMsg: string,
|
errMsg: string,
|
||||||
detail: {
|
detail: {
|
||||||
@@ -308,65 +308,6 @@ export interface UserDetailInfoByUinV2 {
|
|||||||
photoWall: null
|
photoWall: null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface UserDetailInfoByUin {
|
|
||||||
result: number,
|
|
||||||
errMsg: string,
|
|
||||||
info: {
|
|
||||||
uid: string,//这个没办法用
|
|
||||||
qid: string,
|
|
||||||
uin: string,
|
|
||||||
nick: string,
|
|
||||||
remark: string,
|
|
||||||
longNick: string,
|
|
||||||
avatarUrl: string,
|
|
||||||
birthday_year: number,
|
|
||||||
birthday_month: number,
|
|
||||||
birthday_day: number,
|
|
||||||
sex: number,//0
|
|
||||||
topTime: string,
|
|
||||||
constellation: number,
|
|
||||||
shengXiao: number,
|
|
||||||
kBloodType: number,
|
|
||||||
homeTown: string,
|
|
||||||
makeFriendCareer: number,
|
|
||||||
pos: string,
|
|
||||||
eMail: string,
|
|
||||||
phoneNum: string,
|
|
||||||
college: string,
|
|
||||||
country: string,
|
|
||||||
province: string,
|
|
||||||
city: string,
|
|
||||||
postCode: string,
|
|
||||||
address: string,
|
|
||||||
isBlock: boolean,
|
|
||||||
isSpecialCareOpen: boolean,
|
|
||||||
isSpecialCareZone: boolean,
|
|
||||||
ringId: string,
|
|
||||||
regTime: number,
|
|
||||||
interest: string,
|
|
||||||
termType: number,
|
|
||||||
labels: any[],
|
|
||||||
qqLevel: { crownNum: number, sunNum: number, moonNum: number, starNum: number },
|
|
||||||
isHideQQLevel: number,
|
|
||||||
privilegeIcon: { jumpUrl: string, openIconList: any[], closeIconList: any[] },
|
|
||||||
isHidePrivilegeIcon: number,
|
|
||||||
photoWall: { picList: any[] },
|
|
||||||
vipFlag: boolean,
|
|
||||||
yearVipFlag: boolean,
|
|
||||||
svipFlag: boolean,
|
|
||||||
vipLevel: number,
|
|
||||||
status: number,
|
|
||||||
qidianMasterFlag: number,
|
|
||||||
qidianCrewFlag: number,
|
|
||||||
qidianCrewFlag2: number,
|
|
||||||
extStatus: number,
|
|
||||||
recommendImgFlag: number,
|
|
||||||
disableEmojiShortCuts: number,
|
|
||||||
pendantId: string,
|
|
||||||
vipNameColorId: string
|
|
||||||
}
|
|
||||||
}
|
|
||||||
export enum UserDetailSource {
|
export enum UserDetailSource {
|
||||||
KDB,
|
KDB,
|
||||||
KSERVER
|
KSERVER
|
||||||
|
18
src/core/external/proto/ProfileLikeTip.proto
vendored
Normal file
18
src/core/external/proto/ProfileLikeTip.proto
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
package SysMessage;
|
||||||
|
|
||||||
|
message likeDetail {
|
||||||
|
string txt = 1;
|
||||||
|
int64 uin = 3;
|
||||||
|
string nickname = 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
message likeMsg {
|
||||||
|
int32 times = 1;
|
||||||
|
int32 time = 2;
|
||||||
|
likeDetail detail = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
message profileLikeTip {
|
||||||
|
likeMsg msg = 14;
|
||||||
|
}
|
@@ -8,7 +8,7 @@ interface ServerRkeyData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class RkeyManager {
|
export class RkeyManager {
|
||||||
serverUrl: string = '';
|
serverUrl: string[] = [];
|
||||||
logger: LogWrapper;
|
logger: LogWrapper;
|
||||||
private rkeyData: ServerRkeyData = {
|
private rkeyData: ServerRkeyData = {
|
||||||
group_rkey: '',
|
group_rkey: '',
|
||||||
@@ -16,7 +16,7 @@ export class RkeyManager {
|
|||||||
expired_time: 0,
|
expired_time: 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
constructor(serverUrl: string, logger: LogWrapper) {
|
constructor(serverUrl: string[], logger: LogWrapper) {
|
||||||
this.logger = logger;
|
this.logger = logger;
|
||||||
this.serverUrl = serverUrl;
|
this.serverUrl = serverUrl;
|
||||||
}
|
}
|
||||||
@@ -40,6 +40,13 @@ export class RkeyManager {
|
|||||||
|
|
||||||
async refreshRkey(): Promise<any> {
|
async refreshRkey(): Promise<any> {
|
||||||
//刷新rkey
|
//刷新rkey
|
||||||
this.rkeyData = await RequestUtil.HttpGetJson<ServerRkeyData>(this.serverUrl, 'GET');
|
for (let url of this.serverUrl) {
|
||||||
|
try {
|
||||||
|
this.rkeyData = await RequestUtil.HttpGetJson<ServerRkeyData>(url, 'GET');
|
||||||
|
} catch (e) {
|
||||||
|
this.logger.logError(`[Rkey] Get Rkey ${url} Error `, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,341 +0,0 @@
|
|||||||
// @generated by protobuf-ts 2.9.4
|
|
||||||
// @generated from protobuf file "EmojiLikeToOthers.proto" (package "SysMessage", syntax proto3)
|
|
||||||
// tslint:disable
|
|
||||||
import type {
|
|
||||||
BinaryReadOptions,
|
|
||||||
BinaryWriteOptions,
|
|
||||||
IBinaryReader,
|
|
||||||
IBinaryWriter,
|
|
||||||
PartialMessage,
|
|
||||||
} from '@protobuf-ts/runtime';
|
|
||||||
import { MessageType, reflectionMergePartial, UnknownFieldHandler, WireType } from '@protobuf-ts/runtime';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @generated from protobuf message SysMessage.EmojiLikeToOthersWrapper1
|
|
||||||
*/
|
|
||||||
export interface EmojiLikeToOthersWrapper1 {
|
|
||||||
/**
|
|
||||||
* @generated from protobuf field: SysMessage.EmojiLikeToOthersWrapper2 wrapper = 1;
|
|
||||||
*/
|
|
||||||
wrapper?: EmojiLikeToOthersWrapper2;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @generated from protobuf message SysMessage.EmojiLikeToOthersWrapper2
|
|
||||||
*/
|
|
||||||
export interface EmojiLikeToOthersWrapper2 {
|
|
||||||
/**
|
|
||||||
* @generated from protobuf field: SysMessage.EmojiLikeToOthersWrapper3 body = 1;
|
|
||||||
*/
|
|
||||||
body?: EmojiLikeToOthersWrapper3;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @generated from protobuf message SysMessage.EmojiLikeToOthersWrapper3
|
|
||||||
*/
|
|
||||||
export interface EmojiLikeToOthersWrapper3 {
|
|
||||||
/**
|
|
||||||
* @generated from protobuf field: SysMessage.EmojiLikeToOthersMsgSpec msgSpec = 2;
|
|
||||||
*/
|
|
||||||
msgSpec?: EmojiLikeToOthersMsgSpec;
|
|
||||||
/**
|
|
||||||
* @generated from protobuf field: SysMessage.EmojiLikeToOthersAttributes attributes = 3;
|
|
||||||
*/
|
|
||||||
attributes?: EmojiLikeToOthersAttributes;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @generated from protobuf message SysMessage.EmojiLikeToOthersMsgSpec
|
|
||||||
*/
|
|
||||||
export interface EmojiLikeToOthersMsgSpec {
|
|
||||||
/**
|
|
||||||
* @generated from protobuf field: uint32 msgSeq = 1;
|
|
||||||
*/
|
|
||||||
msgSeq: number;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @generated from protobuf message SysMessage.EmojiLikeToOthersAttributes
|
|
||||||
*/
|
|
||||||
export interface EmojiLikeToOthersAttributes {
|
|
||||||
/**
|
|
||||||
* @generated from protobuf field: string emojiId = 1;
|
|
||||||
*/
|
|
||||||
emojiId: string;
|
|
||||||
/**
|
|
||||||
* @generated from protobuf field: string senderUid = 4;
|
|
||||||
*/
|
|
||||||
senderUid: string;
|
|
||||||
/**
|
|
||||||
* @generated from protobuf field: SysMessage.EmojiLikeToOthersAttributes.Operation operation = 5;
|
|
||||||
*/
|
|
||||||
operation: EmojiLikeToOthersAttributes_Operation;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @generated from protobuf enum SysMessage.EmojiLikeToOthersAttributes.Operation
|
|
||||||
*/
|
|
||||||
export enum EmojiLikeToOthersAttributes_Operation {
|
|
||||||
/**
|
|
||||||
* @generated from protobuf enum value: FALLBACK = 0;
|
|
||||||
*/
|
|
||||||
FALLBACK = 0,
|
|
||||||
/**
|
|
||||||
* @generated from protobuf enum value: LIKE = 1;
|
|
||||||
*/
|
|
||||||
LIKE = 1,
|
|
||||||
/**
|
|
||||||
* @generated from protobuf enum value: UNLIKE = 2;
|
|
||||||
*/
|
|
||||||
UNLIKE = 2
|
|
||||||
}
|
|
||||||
// @generated message type with reflection information, may provide speed optimized methods
|
|
||||||
class EmojiLikeToOthersWrapper1$Type extends MessageType<EmojiLikeToOthersWrapper1> {
|
|
||||||
constructor() {
|
|
||||||
super("SysMessage.EmojiLikeToOthersWrapper1", [
|
|
||||||
{ no: 1, name: "wrapper", kind: "message", T: () => EmojiLikeToOthersWrapper2 }
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
create(value?: PartialMessage<EmojiLikeToOthersWrapper1>): EmojiLikeToOthersWrapper1 {
|
|
||||||
const message = globalThis.Object.create((this.messagePrototype!));
|
|
||||||
if (value !== undefined)
|
|
||||||
reflectionMergePartial<EmojiLikeToOthersWrapper1>(this, message, value);
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: EmojiLikeToOthersWrapper1): EmojiLikeToOthersWrapper1 {
|
|
||||||
let message = target ?? this.create(), end = reader.pos + length;
|
|
||||||
while (reader.pos < end) {
|
|
||||||
let [fieldNo, wireType] = reader.tag();
|
|
||||||
switch (fieldNo) {
|
|
||||||
case /* SysMessage.EmojiLikeToOthersWrapper2 wrapper */ 1:
|
|
||||||
message.wrapper = EmojiLikeToOthersWrapper2.internalBinaryRead(reader, reader.uint32(), options, message.wrapper);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
let u = options.readUnknownField;
|
|
||||||
if (u === "throw")
|
|
||||||
throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
|
|
||||||
let d = reader.skip(wireType);
|
|
||||||
if (u !== false)
|
|
||||||
(u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
internalBinaryWrite(message: EmojiLikeToOthersWrapper1, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
|
|
||||||
/* SysMessage.EmojiLikeToOthersWrapper2 wrapper = 1; */
|
|
||||||
if (message.wrapper)
|
|
||||||
EmojiLikeToOthersWrapper2.internalBinaryWrite(message.wrapper, writer.tag(1, WireType.LengthDelimited).fork(), options).join();
|
|
||||||
let u = options.writeUnknownFields;
|
|
||||||
if (u !== false)
|
|
||||||
(u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
|
|
||||||
return writer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @generated MessageType for protobuf message SysMessage.EmojiLikeToOthersWrapper1
|
|
||||||
*/
|
|
||||||
export const EmojiLikeToOthersWrapper1 = new EmojiLikeToOthersWrapper1$Type();
|
|
||||||
// @generated message type with reflection information, may provide speed optimized methods
|
|
||||||
class EmojiLikeToOthersWrapper2$Type extends MessageType<EmojiLikeToOthersWrapper2> {
|
|
||||||
constructor() {
|
|
||||||
super("SysMessage.EmojiLikeToOthersWrapper2", [
|
|
||||||
{ no: 1, name: "body", kind: "message", T: () => EmojiLikeToOthersWrapper3 }
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
create(value?: PartialMessage<EmojiLikeToOthersWrapper2>): EmojiLikeToOthersWrapper2 {
|
|
||||||
const message = globalThis.Object.create((this.messagePrototype!));
|
|
||||||
if (value !== undefined)
|
|
||||||
reflectionMergePartial<EmojiLikeToOthersWrapper2>(this, message, value);
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: EmojiLikeToOthersWrapper2): EmojiLikeToOthersWrapper2 {
|
|
||||||
let message = target ?? this.create(), end = reader.pos + length;
|
|
||||||
while (reader.pos < end) {
|
|
||||||
let [fieldNo, wireType] = reader.tag();
|
|
||||||
switch (fieldNo) {
|
|
||||||
case /* SysMessage.EmojiLikeToOthersWrapper3 body */ 1:
|
|
||||||
message.body = EmojiLikeToOthersWrapper3.internalBinaryRead(reader, reader.uint32(), options, message.body);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
let u = options.readUnknownField;
|
|
||||||
if (u === "throw")
|
|
||||||
throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
|
|
||||||
let d = reader.skip(wireType);
|
|
||||||
if (u !== false)
|
|
||||||
(u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
internalBinaryWrite(message: EmojiLikeToOthersWrapper2, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
|
|
||||||
/* SysMessage.EmojiLikeToOthersWrapper3 body = 1; */
|
|
||||||
if (message.body)
|
|
||||||
EmojiLikeToOthersWrapper3.internalBinaryWrite(message.body, writer.tag(1, WireType.LengthDelimited).fork(), options).join();
|
|
||||||
let u = options.writeUnknownFields;
|
|
||||||
if (u !== false)
|
|
||||||
(u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
|
|
||||||
return writer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @generated MessageType for protobuf message SysMessage.EmojiLikeToOthersWrapper2
|
|
||||||
*/
|
|
||||||
export const EmojiLikeToOthersWrapper2 = new EmojiLikeToOthersWrapper2$Type();
|
|
||||||
// @generated message type with reflection information, may provide speed optimized methods
|
|
||||||
class EmojiLikeToOthersWrapper3$Type extends MessageType<EmojiLikeToOthersWrapper3> {
|
|
||||||
constructor() {
|
|
||||||
super("SysMessage.EmojiLikeToOthersWrapper3", [
|
|
||||||
{ no: 2, name: "msgSpec", kind: "message", T: () => EmojiLikeToOthersMsgSpec },
|
|
||||||
{ no: 3, name: "attributes", kind: "message", T: () => EmojiLikeToOthersAttributes }
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
create(value?: PartialMessage<EmojiLikeToOthersWrapper3>): EmojiLikeToOthersWrapper3 {
|
|
||||||
const message = globalThis.Object.create((this.messagePrototype!));
|
|
||||||
if (value !== undefined)
|
|
||||||
reflectionMergePartial<EmojiLikeToOthersWrapper3>(this, message, value);
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: EmojiLikeToOthersWrapper3): EmojiLikeToOthersWrapper3 {
|
|
||||||
let message = target ?? this.create(), end = reader.pos + length;
|
|
||||||
while (reader.pos < end) {
|
|
||||||
let [fieldNo, wireType] = reader.tag();
|
|
||||||
switch (fieldNo) {
|
|
||||||
case /* SysMessage.EmojiLikeToOthersMsgSpec msgSpec */ 2:
|
|
||||||
message.msgSpec = EmojiLikeToOthersMsgSpec.internalBinaryRead(reader, reader.uint32(), options, message.msgSpec);
|
|
||||||
break;
|
|
||||||
case /* SysMessage.EmojiLikeToOthersAttributes attributes */ 3:
|
|
||||||
message.attributes = EmojiLikeToOthersAttributes.internalBinaryRead(reader, reader.uint32(), options, message.attributes);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
let u = options.readUnknownField;
|
|
||||||
if (u === "throw")
|
|
||||||
throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
|
|
||||||
let d = reader.skip(wireType);
|
|
||||||
if (u !== false)
|
|
||||||
(u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
internalBinaryWrite(message: EmojiLikeToOthersWrapper3, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
|
|
||||||
/* SysMessage.EmojiLikeToOthersMsgSpec msgSpec = 2; */
|
|
||||||
if (message.msgSpec)
|
|
||||||
EmojiLikeToOthersMsgSpec.internalBinaryWrite(message.msgSpec, writer.tag(2, WireType.LengthDelimited).fork(), options).join();
|
|
||||||
/* SysMessage.EmojiLikeToOthersAttributes attributes = 3; */
|
|
||||||
if (message.attributes)
|
|
||||||
EmojiLikeToOthersAttributes.internalBinaryWrite(message.attributes, writer.tag(3, WireType.LengthDelimited).fork(), options).join();
|
|
||||||
let u = options.writeUnknownFields;
|
|
||||||
if (u !== false)
|
|
||||||
(u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
|
|
||||||
return writer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @generated MessageType for protobuf message SysMessage.EmojiLikeToOthersWrapper3
|
|
||||||
*/
|
|
||||||
export const EmojiLikeToOthersWrapper3 = new EmojiLikeToOthersWrapper3$Type();
|
|
||||||
// @generated message type with reflection information, may provide speed optimized methods
|
|
||||||
class EmojiLikeToOthersMsgSpec$Type extends MessageType<EmojiLikeToOthersMsgSpec> {
|
|
||||||
constructor() {
|
|
||||||
super("SysMessage.EmojiLikeToOthersMsgSpec", [
|
|
||||||
{ no: 1, name: "msgSeq", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
create(value?: PartialMessage<EmojiLikeToOthersMsgSpec>): EmojiLikeToOthersMsgSpec {
|
|
||||||
const message = globalThis.Object.create((this.messagePrototype!));
|
|
||||||
message.msgSeq = 0;
|
|
||||||
if (value !== undefined)
|
|
||||||
reflectionMergePartial<EmojiLikeToOthersMsgSpec>(this, message, value);
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: EmojiLikeToOthersMsgSpec): EmojiLikeToOthersMsgSpec {
|
|
||||||
let message = target ?? this.create(), end = reader.pos + length;
|
|
||||||
while (reader.pos < end) {
|
|
||||||
let [fieldNo, wireType] = reader.tag();
|
|
||||||
switch (fieldNo) {
|
|
||||||
case /* uint32 msgSeq */ 1:
|
|
||||||
message.msgSeq = reader.uint32();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
let u = options.readUnknownField;
|
|
||||||
if (u === "throw")
|
|
||||||
throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
|
|
||||||
let d = reader.skip(wireType);
|
|
||||||
if (u !== false)
|
|
||||||
(u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
internalBinaryWrite(message: EmojiLikeToOthersMsgSpec, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
|
|
||||||
/* uint32 msgSeq = 1; */
|
|
||||||
if (message.msgSeq !== 0)
|
|
||||||
writer.tag(1, WireType.Varint).uint32(message.msgSeq);
|
|
||||||
let u = options.writeUnknownFields;
|
|
||||||
if (u !== false)
|
|
||||||
(u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
|
|
||||||
return writer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @generated MessageType for protobuf message SysMessage.EmojiLikeToOthersMsgSpec
|
|
||||||
*/
|
|
||||||
export const EmojiLikeToOthersMsgSpec = new EmojiLikeToOthersMsgSpec$Type();
|
|
||||||
// @generated message type with reflection information, may provide speed optimized methods
|
|
||||||
class EmojiLikeToOthersAttributes$Type extends MessageType<EmojiLikeToOthersAttributes> {
|
|
||||||
constructor() {
|
|
||||||
super("SysMessage.EmojiLikeToOthersAttributes", [
|
|
||||||
{ no: 1, name: "emojiId", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
|
|
||||||
{ no: 4, name: "senderUid", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
|
|
||||||
{ no: 5, name: "operation", kind: "enum", T: () => ["SysMessage.EmojiLikeToOthersAttributes.Operation", EmojiLikeToOthersAttributes_Operation] }
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
create(value?: PartialMessage<EmojiLikeToOthersAttributes>): EmojiLikeToOthersAttributes {
|
|
||||||
const message = globalThis.Object.create((this.messagePrototype!));
|
|
||||||
message.emojiId = "";
|
|
||||||
message.senderUid = "";
|
|
||||||
message.operation = 0;
|
|
||||||
if (value !== undefined)
|
|
||||||
reflectionMergePartial<EmojiLikeToOthersAttributes>(this, message, value);
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: EmojiLikeToOthersAttributes): EmojiLikeToOthersAttributes {
|
|
||||||
let message = target ?? this.create(), end = reader.pos + length;
|
|
||||||
while (reader.pos < end) {
|
|
||||||
let [fieldNo, wireType] = reader.tag();
|
|
||||||
switch (fieldNo) {
|
|
||||||
case /* string emojiId */ 1:
|
|
||||||
message.emojiId = reader.string();
|
|
||||||
break;
|
|
||||||
case /* string senderUid */ 4:
|
|
||||||
message.senderUid = reader.string();
|
|
||||||
break;
|
|
||||||
case /* SysMessage.EmojiLikeToOthersAttributes.Operation operation */ 5:
|
|
||||||
message.operation = reader.int32();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
let u = options.readUnknownField;
|
|
||||||
if (u === "throw")
|
|
||||||
throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
|
|
||||||
let d = reader.skip(wireType);
|
|
||||||
if (u !== false)
|
|
||||||
(u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
internalBinaryWrite(message: EmojiLikeToOthersAttributes, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
|
|
||||||
/* string emojiId = 1; */
|
|
||||||
if (message.emojiId !== "")
|
|
||||||
writer.tag(1, WireType.LengthDelimited).string(message.emojiId);
|
|
||||||
/* string senderUid = 4; */
|
|
||||||
if (message.senderUid !== "")
|
|
||||||
writer.tag(4, WireType.LengthDelimited).string(message.senderUid);
|
|
||||||
/* SysMessage.EmojiLikeToOthersAttributes.Operation operation = 5; */
|
|
||||||
if (message.operation !== 0)
|
|
||||||
writer.tag(5, WireType.Varint).int32(message.operation);
|
|
||||||
let u = options.writeUnknownFields;
|
|
||||||
if (u !== false)
|
|
||||||
(u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
|
|
||||||
return writer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @generated MessageType for protobuf message SysMessage.EmojiLikeToOthersAttributes
|
|
||||||
*/
|
|
||||||
export const EmojiLikeToOthersAttributes = new EmojiLikeToOthersAttributes$Type();
|
|
@@ -1,104 +0,0 @@
|
|||||||
// @generated by protobuf-ts 2.9.4
|
|
||||||
// @generated from protobuf file "GreyTipWrapper.proto" (package "SysMessage", syntax proto3)
|
|
||||||
// tslint:disable
|
|
||||||
import type {
|
|
||||||
BinaryReadOptions,
|
|
||||||
BinaryWriteOptions,
|
|
||||||
IBinaryReader,
|
|
||||||
IBinaryWriter,
|
|
||||||
PartialMessage,
|
|
||||||
} from '@protobuf-ts/runtime';
|
|
||||||
import { MessageType, reflectionMergePartial, UnknownFieldHandler, WireType } from '@protobuf-ts/runtime';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @generated from protobuf message SysMessage.GreyTipWrapper
|
|
||||||
*/
|
|
||||||
export interface GreyTipWrapper {
|
|
||||||
/**
|
|
||||||
* @generated from protobuf field: uint32 subTypeId = 1;
|
|
||||||
*/
|
|
||||||
subTypeId: number;
|
|
||||||
/**
|
|
||||||
* @generated from protobuf field: uint32 groupCode = 4;
|
|
||||||
*/
|
|
||||||
groupCode: number;
|
|
||||||
/**
|
|
||||||
* @generated from protobuf field: uint32 subTypeIdMinusOne = 13;
|
|
||||||
*/
|
|
||||||
subTypeIdMinusOne: number;
|
|
||||||
/**
|
|
||||||
* @generated from protobuf field: bytes rest = 44;
|
|
||||||
*/
|
|
||||||
rest: Uint8Array;
|
|
||||||
}
|
|
||||||
// @generated message type with reflection information, may provide speed optimized methods
|
|
||||||
class GreyTipWrapper$Type extends MessageType<GreyTipWrapper> {
|
|
||||||
constructor() {
|
|
||||||
super("SysMessage.GreyTipWrapper", [
|
|
||||||
{ no: 1, name: "subTypeId", kind: "scalar", T: 13 /*ScalarType.UINT32*/ },
|
|
||||||
{ no: 4, name: "groupCode", kind: "scalar", T: 13 /*ScalarType.UINT32*/ },
|
|
||||||
{ no: 13, name: "subTypeIdMinusOne", kind: "scalar", T: 13 /*ScalarType.UINT32*/ },
|
|
||||||
{ no: 44, name: "rest", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
create(value?: PartialMessage<GreyTipWrapper>): GreyTipWrapper {
|
|
||||||
const message = globalThis.Object.create((this.messagePrototype!));
|
|
||||||
message.subTypeId = 0;
|
|
||||||
message.groupCode = 0;
|
|
||||||
message.subTypeIdMinusOne = 0;
|
|
||||||
message.rest = new Uint8Array(0);
|
|
||||||
if (value !== undefined)
|
|
||||||
reflectionMergePartial<GreyTipWrapper>(this, message, value);
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: GreyTipWrapper): GreyTipWrapper {
|
|
||||||
let message = target ?? this.create(), end = reader.pos + length;
|
|
||||||
while (reader.pos < end) {
|
|
||||||
let [fieldNo, wireType] = reader.tag();
|
|
||||||
switch (fieldNo) {
|
|
||||||
case /* uint32 subTypeId */ 1:
|
|
||||||
message.subTypeId = reader.uint32();
|
|
||||||
break;
|
|
||||||
case /* uint32 groupCode */ 4:
|
|
||||||
message.groupCode = reader.uint32();
|
|
||||||
break;
|
|
||||||
case /* uint32 subTypeIdMinusOne */ 13:
|
|
||||||
message.subTypeIdMinusOne = reader.uint32();
|
|
||||||
break;
|
|
||||||
case /* bytes rest */ 44:
|
|
||||||
message.rest = reader.bytes();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
let u = options.readUnknownField;
|
|
||||||
if (u === "throw")
|
|
||||||
throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
|
|
||||||
let d = reader.skip(wireType);
|
|
||||||
if (u !== false)
|
|
||||||
(u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
internalBinaryWrite(message: GreyTipWrapper, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
|
|
||||||
/* uint32 subTypeId = 1; */
|
|
||||||
if (message.subTypeId !== 0)
|
|
||||||
writer.tag(1, WireType.Varint).uint32(message.subTypeId);
|
|
||||||
/* uint32 groupCode = 4; */
|
|
||||||
if (message.groupCode !== 0)
|
|
||||||
writer.tag(4, WireType.Varint).uint32(message.groupCode);
|
|
||||||
/* uint32 subTypeIdMinusOne = 13; */
|
|
||||||
if (message.subTypeIdMinusOne !== 0)
|
|
||||||
writer.tag(13, WireType.Varint).uint32(message.subTypeIdMinusOne);
|
|
||||||
/* bytes rest = 44; */
|
|
||||||
if (message.rest.length)
|
|
||||||
writer.tag(44, WireType.LengthDelimited).bytes(message.rest);
|
|
||||||
let u = options.writeUnknownFields;
|
|
||||||
if (u !== false)
|
|
||||||
(u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
|
|
||||||
return writer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @generated MessageType for protobuf message SysMessage.GreyTipWrapper
|
|
||||||
*/
|
|
||||||
export const GreyTipWrapper = new GreyTipWrapper$Type();
|
|
83
src/core/proto/ProfileLike.ts
Normal file
83
src/core/proto/ProfileLike.ts
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
import * as pb from 'protobufjs';
|
||||||
|
|
||||||
|
// Proto: from src/core/proto/ProfileLike.proto
|
||||||
|
// Author: Mlikiowa
|
||||||
|
|
||||||
|
export interface LikeDetailType {
|
||||||
|
txt: string;
|
||||||
|
uin: pb.Long;
|
||||||
|
nickname: string;
|
||||||
|
}
|
||||||
|
export interface LikeMsgType {
|
||||||
|
times: number;
|
||||||
|
time: number;
|
||||||
|
detail: LikeDetailType;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ProfileLikeTipType {
|
||||||
|
msg: LikeMsgType;
|
||||||
|
}
|
||||||
|
export interface SysMessageHeaderType {
|
||||||
|
id: string;
|
||||||
|
timestamp: number;
|
||||||
|
sender: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SysMessageMsgSpecType {
|
||||||
|
msgType: number;
|
||||||
|
subType: number;
|
||||||
|
subSubType: number;
|
||||||
|
msgSeq: number;
|
||||||
|
time: number;
|
||||||
|
msgId: pb.Long;
|
||||||
|
other: number;
|
||||||
|
}
|
||||||
|
export interface SysMessageBodyWrapperType {
|
||||||
|
wrappedBody: Uint8Array;
|
||||||
|
}
|
||||||
|
export interface SysMessageType {
|
||||||
|
header: SysMessageHeaderType[];
|
||||||
|
msgSpec: SysMessageMsgSpecType[];
|
||||||
|
bodyWrapper: SysMessageBodyWrapperType;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const SysMessageHeader = new pb.Type("SysMessageHeader")
|
||||||
|
.add(new pb.Field("PeerNumber", 1, "uint32"))
|
||||||
|
.add(new pb.Field("PeerString", 2, "string"))
|
||||||
|
.add(new pb.Field("Uin", 5, "uint32"))
|
||||||
|
.add(new pb.Field("Uid", 6, "string", "optional"));
|
||||||
|
|
||||||
|
export const SysMessageMsgSpec = new pb.Type("SysMessageMsgSpec")
|
||||||
|
.add(new pb.Field("msgType", 1, "uint32"))
|
||||||
|
.add(new pb.Field("subType", 2, "uint32"))
|
||||||
|
.add(new pb.Field("subSubType", 3, "uint32"))
|
||||||
|
.add(new pb.Field("msgSeq", 5, "uint32"))
|
||||||
|
.add(new pb.Field("time", 6, "uint32"))
|
||||||
|
.add(new pb.Field("msgId", 12, "uint64"))
|
||||||
|
.add(new pb.Field("other", 13, "uint32"));
|
||||||
|
|
||||||
|
export const SysMessageBodyWrapper = new pb.Type("SysMessageBodyWrapper")
|
||||||
|
.add(new pb.Field("wrappedBody", 2, "bytes"));
|
||||||
|
|
||||||
|
export const SysMessage = new pb.Type("SysMessage")
|
||||||
|
.add(SysMessageHeader)
|
||||||
|
.add(SysMessageMsgSpec)
|
||||||
|
.add(SysMessageBodyWrapper)
|
||||||
|
.add(new pb.Field("header", 1, "SysMessageHeader", "repeated"))
|
||||||
|
.add(new pb.Field("msgSpec", 2, "SysMessageMsgSpec", "repeated"))
|
||||||
|
.add(new pb.Field("bodyWrapper", 3, "SysMessageBodyWrapper"));
|
||||||
|
|
||||||
|
export const likeDetail = new pb.Type("likeDetail")
|
||||||
|
.add(new pb.Field("txt", 1, "string"))
|
||||||
|
.add(new pb.Field("uin", 3, "int64"))
|
||||||
|
.add(new pb.Field("nickname", 5, "string"));
|
||||||
|
|
||||||
|
export const likeMsg = new pb.Type("likeMsg")
|
||||||
|
.add(likeDetail)
|
||||||
|
.add(new pb.Field("times", 1, "int32"))
|
||||||
|
.add(new pb.Field("time", 2, "int32"))
|
||||||
|
.add(new pb.Field("detail", 3, "likeDetail"));
|
||||||
|
|
||||||
|
export const profileLikeTip = new pb.Type("profileLikeTip")
|
||||||
|
.add(likeMsg)
|
||||||
|
.add(new pb.Field("msg", 14, "likeMsg"));
|
@@ -1,435 +0,0 @@
|
|||||||
// @generated by protobuf-ts 2.9.4
|
|
||||||
// @generated from protobuf file "SysMessage.proto" (package "SysMessage", syntax proto3)
|
|
||||||
// tslint:disable
|
|
||||||
import type {
|
|
||||||
BinaryReadOptions,
|
|
||||||
BinaryWriteOptions,
|
|
||||||
IBinaryReader,
|
|
||||||
IBinaryWriter,
|
|
||||||
PartialMessage,
|
|
||||||
} from '@protobuf-ts/runtime';
|
|
||||||
import { MessageType, reflectionMergePartial, UnknownFieldHandler, WireType } from '@protobuf-ts/runtime';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @generated from protobuf message SysMessage.SysMessage
|
|
||||||
*/
|
|
||||||
export interface SysMessage {
|
|
||||||
/**
|
|
||||||
* @generated from protobuf field: repeated SysMessage.SysMessageHeader header = 1;
|
|
||||||
*/
|
|
||||||
header: SysMessageHeader[];
|
|
||||||
/**
|
|
||||||
* @generated from protobuf field: repeated SysMessage.SysMessageMsgSpec msgSpec = 2;
|
|
||||||
*/
|
|
||||||
msgSpec: SysMessageMsgSpec[];
|
|
||||||
/**
|
|
||||||
* @generated from protobuf field: SysMessage.SysMessageBodyWrapper bodyWrapper = 3;
|
|
||||||
*/
|
|
||||||
bodyWrapper?: SysMessageBodyWrapper;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @generated from protobuf message SysMessage.SysMessageHeader
|
|
||||||
*/
|
|
||||||
export interface SysMessageHeader {
|
|
||||||
/**
|
|
||||||
* @generated from protobuf field: uint32 PeerNumber = 1 [json_name = "PeerNumber"];
|
|
||||||
*/
|
|
||||||
peerNumber: number;
|
|
||||||
/**
|
|
||||||
* @generated from protobuf field: string PeerString = 2 [json_name = "PeerString"];
|
|
||||||
*/
|
|
||||||
peerString: string;
|
|
||||||
/**
|
|
||||||
* @generated from protobuf field: uint32 Uin = 5 [json_name = "Uin"];
|
|
||||||
*/
|
|
||||||
uin: number;
|
|
||||||
/**
|
|
||||||
* @generated from protobuf field: optional string Uid = 6 [json_name = "Uid"];
|
|
||||||
*/
|
|
||||||
uid?: string;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @generated from protobuf message SysMessage.SysMessageMsgSpec
|
|
||||||
*/
|
|
||||||
export interface SysMessageMsgSpec {
|
|
||||||
/**
|
|
||||||
* @generated from protobuf field: uint32 msgType = 1;
|
|
||||||
*/
|
|
||||||
msgType: number;
|
|
||||||
/**
|
|
||||||
* @generated from protobuf field: uint32 subType = 2;
|
|
||||||
*/
|
|
||||||
subType: number;
|
|
||||||
/**
|
|
||||||
* @generated from protobuf field: uint32 subSubType = 3;
|
|
||||||
*/
|
|
||||||
subSubType: number;
|
|
||||||
/**
|
|
||||||
* @generated from protobuf field: uint32 msgSeq = 5;
|
|
||||||
*/
|
|
||||||
msgSeq: number;
|
|
||||||
/**
|
|
||||||
* @generated from protobuf field: uint32 time = 6;
|
|
||||||
*/
|
|
||||||
time: number;
|
|
||||||
/**
|
|
||||||
* @generated from protobuf field: uint64 msgId = 12;
|
|
||||||
*/
|
|
||||||
msgId: bigint;
|
|
||||||
/**
|
|
||||||
* @generated from protobuf field: uint32 other = 13;
|
|
||||||
*/
|
|
||||||
other: number;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @generated from protobuf message SysMessage.SysMessageBodyWrapper
|
|
||||||
*/
|
|
||||||
export interface SysMessageBodyWrapper {
|
|
||||||
/**
|
|
||||||
* @generated from protobuf field: bytes wrappedBody = 2;
|
|
||||||
*/
|
|
||||||
wrappedBody: Uint8Array; // Find the first [08], or ignore the first 7 bytes?
|
|
||||||
// And it becomes another ProtoBuf message.
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @generated from protobuf message SysMessage.KeyValuePair
|
|
||||||
*/
|
|
||||||
export interface KeyValuePair {
|
|
||||||
/**
|
|
||||||
* @generated from protobuf field: string key = 1;
|
|
||||||
*/
|
|
||||||
key: string;
|
|
||||||
/**
|
|
||||||
* @generated from protobuf field: string value = 2;
|
|
||||||
*/
|
|
||||||
value: string;
|
|
||||||
}
|
|
||||||
// @generated message type with reflection information, may provide speed optimized methods
|
|
||||||
class SysMessage$Type extends MessageType<SysMessage> {
|
|
||||||
constructor() {
|
|
||||||
super("SysMessage.SysMessage", [
|
|
||||||
{ no: 1, name: "header", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => SysMessageHeader },
|
|
||||||
{ no: 2, name: "msgSpec", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => SysMessageMsgSpec },
|
|
||||||
{ no: 3, name: "bodyWrapper", kind: "message", T: () => SysMessageBodyWrapper }
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
create(value?: PartialMessage<SysMessage>): SysMessage {
|
|
||||||
const message = globalThis.Object.create((this.messagePrototype!));
|
|
||||||
message.header = [];
|
|
||||||
message.msgSpec = [];
|
|
||||||
if (value !== undefined)
|
|
||||||
reflectionMergePartial<SysMessage>(this, message, value);
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: SysMessage): SysMessage {
|
|
||||||
let message = target ?? this.create(), end = reader.pos + length;
|
|
||||||
while (reader.pos < end) {
|
|
||||||
let [fieldNo, wireType] = reader.tag();
|
|
||||||
switch (fieldNo) {
|
|
||||||
case /* repeated SysMessage.SysMessageHeader header */ 1:
|
|
||||||
message.header.push(SysMessageHeader.internalBinaryRead(reader, reader.uint32(), options));
|
|
||||||
break;
|
|
||||||
case /* repeated SysMessage.SysMessageMsgSpec msgSpec */ 2:
|
|
||||||
message.msgSpec.push(SysMessageMsgSpec.internalBinaryRead(reader, reader.uint32(), options));
|
|
||||||
break;
|
|
||||||
case /* SysMessage.SysMessageBodyWrapper bodyWrapper */ 3:
|
|
||||||
message.bodyWrapper = SysMessageBodyWrapper.internalBinaryRead(reader, reader.uint32(), options, message.bodyWrapper);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
let u = options.readUnknownField;
|
|
||||||
if (u === "throw")
|
|
||||||
throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
|
|
||||||
let d = reader.skip(wireType);
|
|
||||||
if (u !== false)
|
|
||||||
(u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
internalBinaryWrite(message: SysMessage, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
|
|
||||||
/* repeated SysMessage.SysMessageHeader header = 1; */
|
|
||||||
for (let i = 0; i < message.header.length; i++)
|
|
||||||
SysMessageHeader.internalBinaryWrite(message.header[i], writer.tag(1, WireType.LengthDelimited).fork(), options).join();
|
|
||||||
/* repeated SysMessage.SysMessageMsgSpec msgSpec = 2; */
|
|
||||||
for (let i = 0; i < message.msgSpec.length; i++)
|
|
||||||
SysMessageMsgSpec.internalBinaryWrite(message.msgSpec[i], writer.tag(2, WireType.LengthDelimited).fork(), options).join();
|
|
||||||
/* SysMessage.SysMessageBodyWrapper bodyWrapper = 3; */
|
|
||||||
if (message.bodyWrapper)
|
|
||||||
SysMessageBodyWrapper.internalBinaryWrite(message.bodyWrapper, writer.tag(3, WireType.LengthDelimited).fork(), options).join();
|
|
||||||
let u = options.writeUnknownFields;
|
|
||||||
if (u !== false)
|
|
||||||
(u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
|
|
||||||
return writer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @generated MessageType for protobuf message SysMessage.SysMessage
|
|
||||||
*/
|
|
||||||
export const SysMessage = new SysMessage$Type();
|
|
||||||
// @generated message type with reflection information, may provide speed optimized methods
|
|
||||||
class SysMessageHeader$Type extends MessageType<SysMessageHeader> {
|
|
||||||
constructor() {
|
|
||||||
super("SysMessage.SysMessageHeader", [
|
|
||||||
{ no: 1, name: "PeerNumber", kind: "scalar", jsonName: "PeerNumber", T: 13 /*ScalarType.UINT32*/ },
|
|
||||||
{ no: 2, name: "PeerString", kind: "scalar", jsonName: "PeerString", T: 9 /*ScalarType.STRING*/ },
|
|
||||||
{ no: 5, name: "Uin", kind: "scalar", jsonName: "Uin", T: 13 /*ScalarType.UINT32*/ },
|
|
||||||
{ no: 6, name: "Uid", kind: "scalar", jsonName: "Uid", opt: true, T: 9 /*ScalarType.STRING*/ }
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
create(value?: PartialMessage<SysMessageHeader>): SysMessageHeader {
|
|
||||||
const message = globalThis.Object.create((this.messagePrototype!));
|
|
||||||
message.peerNumber = 0;
|
|
||||||
message.peerString = "";
|
|
||||||
message.uin = 0;
|
|
||||||
if (value !== undefined)
|
|
||||||
reflectionMergePartial<SysMessageHeader>(this, message, value);
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: SysMessageHeader): SysMessageHeader {
|
|
||||||
let message = target ?? this.create(), end = reader.pos + length;
|
|
||||||
while (reader.pos < end) {
|
|
||||||
let [fieldNo, wireType] = reader.tag();
|
|
||||||
switch (fieldNo) {
|
|
||||||
case /* uint32 PeerNumber = 1 [json_name = "PeerNumber"];*/ 1:
|
|
||||||
message.peerNumber = reader.uint32();
|
|
||||||
break;
|
|
||||||
case /* string PeerString = 2 [json_name = "PeerString"];*/ 2:
|
|
||||||
message.peerString = reader.string();
|
|
||||||
break;
|
|
||||||
case /* uint32 Uin = 5 [json_name = "Uin"];*/ 5:
|
|
||||||
message.uin = reader.uint32();
|
|
||||||
break;
|
|
||||||
case /* optional string Uid = 6 [json_name = "Uid"];*/ 6:
|
|
||||||
message.uid = reader.string();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
let u = options.readUnknownField;
|
|
||||||
if (u === "throw")
|
|
||||||
throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
|
|
||||||
let d = reader.skip(wireType);
|
|
||||||
if (u !== false)
|
|
||||||
(u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
internalBinaryWrite(message: SysMessageHeader, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
|
|
||||||
/* uint32 PeerNumber = 1 [json_name = "PeerNumber"]; */
|
|
||||||
if (message.peerNumber !== 0)
|
|
||||||
writer.tag(1, WireType.Varint).uint32(message.peerNumber);
|
|
||||||
/* string PeerString = 2 [json_name = "PeerString"]; */
|
|
||||||
if (message.peerString !== "")
|
|
||||||
writer.tag(2, WireType.LengthDelimited).string(message.peerString);
|
|
||||||
/* uint32 Uin = 5 [json_name = "Uin"]; */
|
|
||||||
if (message.uin !== 0)
|
|
||||||
writer.tag(5, WireType.Varint).uint32(message.uin);
|
|
||||||
/* optional string Uid = 6 [json_name = "Uid"]; */
|
|
||||||
if (message.uid !== undefined)
|
|
||||||
writer.tag(6, WireType.LengthDelimited).string(message.uid);
|
|
||||||
let u = options.writeUnknownFields;
|
|
||||||
if (u !== false)
|
|
||||||
(u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
|
|
||||||
return writer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @generated MessageType for protobuf message SysMessage.SysMessageHeader
|
|
||||||
*/
|
|
||||||
export const SysMessageHeader = new SysMessageHeader$Type();
|
|
||||||
// @generated message type with reflection information, may provide speed optimized methods
|
|
||||||
class SysMessageMsgSpec$Type extends MessageType<SysMessageMsgSpec> {
|
|
||||||
constructor() {
|
|
||||||
super("SysMessage.SysMessageMsgSpec", [
|
|
||||||
{ no: 1, name: "msgType", kind: "scalar", T: 13 /*ScalarType.UINT32*/ },
|
|
||||||
{ no: 2, name: "subType", kind: "scalar", T: 13 /*ScalarType.UINT32*/ },
|
|
||||||
{ no: 3, name: "subSubType", kind: "scalar", T: 13 /*ScalarType.UINT32*/ },
|
|
||||||
{ no: 5, name: "msgSeq", kind: "scalar", T: 13 /*ScalarType.UINT32*/ },
|
|
||||||
{ no: 6, name: "time", kind: "scalar", T: 13 /*ScalarType.UINT32*/ },
|
|
||||||
{ no: 12, name: "msgId", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ },
|
|
||||||
{ no: 13, name: "other", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
create(value?: PartialMessage<SysMessageMsgSpec>): SysMessageMsgSpec {
|
|
||||||
const message = globalThis.Object.create((this.messagePrototype!));
|
|
||||||
message.msgType = 0;
|
|
||||||
message.subType = 0;
|
|
||||||
message.subSubType = 0;
|
|
||||||
message.msgSeq = 0;
|
|
||||||
message.time = 0;
|
|
||||||
message.msgId = 0n;
|
|
||||||
message.other = 0;
|
|
||||||
if (value !== undefined)
|
|
||||||
reflectionMergePartial<SysMessageMsgSpec>(this, message, value);
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: SysMessageMsgSpec): SysMessageMsgSpec {
|
|
||||||
let message = target ?? this.create(), end = reader.pos + length;
|
|
||||||
while (reader.pos < end) {
|
|
||||||
let [fieldNo, wireType] = reader.tag();
|
|
||||||
switch (fieldNo) {
|
|
||||||
case /* uint32 msgType */ 1:
|
|
||||||
message.msgType = reader.uint32();
|
|
||||||
break;
|
|
||||||
case /* uint32 subType */ 2:
|
|
||||||
message.subType = reader.uint32();
|
|
||||||
break;
|
|
||||||
case /* uint32 subSubType */ 3:
|
|
||||||
message.subSubType = reader.uint32();
|
|
||||||
break;
|
|
||||||
case /* uint32 msgSeq */ 5:
|
|
||||||
message.msgSeq = reader.uint32();
|
|
||||||
break;
|
|
||||||
case /* uint32 time */ 6:
|
|
||||||
message.time = reader.uint32();
|
|
||||||
break;
|
|
||||||
case /* uint64 msgId */ 12:
|
|
||||||
message.msgId = reader.uint64().toBigInt();
|
|
||||||
break;
|
|
||||||
case /* uint32 other */ 13:
|
|
||||||
message.other = reader.uint32();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
let u = options.readUnknownField;
|
|
||||||
if (u === "throw")
|
|
||||||
throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
|
|
||||||
let d = reader.skip(wireType);
|
|
||||||
if (u !== false)
|
|
||||||
(u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
internalBinaryWrite(message: SysMessageMsgSpec, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
|
|
||||||
/* uint32 msgType = 1; */
|
|
||||||
if (message.msgType !== 0)
|
|
||||||
writer.tag(1, WireType.Varint).uint32(message.msgType);
|
|
||||||
/* uint32 subType = 2; */
|
|
||||||
if (message.subType !== 0)
|
|
||||||
writer.tag(2, WireType.Varint).uint32(message.subType);
|
|
||||||
/* uint32 subSubType = 3; */
|
|
||||||
if (message.subSubType !== 0)
|
|
||||||
writer.tag(3, WireType.Varint).uint32(message.subSubType);
|
|
||||||
/* uint32 msgSeq = 5; */
|
|
||||||
if (message.msgSeq !== 0)
|
|
||||||
writer.tag(5, WireType.Varint).uint32(message.msgSeq);
|
|
||||||
/* uint32 time = 6; */
|
|
||||||
if (message.time !== 0)
|
|
||||||
writer.tag(6, WireType.Varint).uint32(message.time);
|
|
||||||
/* uint64 msgId = 12; */
|
|
||||||
if (message.msgId !== 0n)
|
|
||||||
writer.tag(12, WireType.Varint).uint64(message.msgId);
|
|
||||||
/* uint32 other = 13; */
|
|
||||||
if (message.other !== 0)
|
|
||||||
writer.tag(13, WireType.Varint).uint32(message.other);
|
|
||||||
let u = options.writeUnknownFields;
|
|
||||||
if (u !== false)
|
|
||||||
(u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
|
|
||||||
return writer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @generated MessageType for protobuf message SysMessage.SysMessageMsgSpec
|
|
||||||
*/
|
|
||||||
export const SysMessageMsgSpec = new SysMessageMsgSpec$Type();
|
|
||||||
// @generated message type with reflection information, may provide speed optimized methods
|
|
||||||
class SysMessageBodyWrapper$Type extends MessageType<SysMessageBodyWrapper> {
|
|
||||||
constructor() {
|
|
||||||
super("SysMessage.SysMessageBodyWrapper", [
|
|
||||||
{ no: 2, name: "wrappedBody", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
create(value?: PartialMessage<SysMessageBodyWrapper>): SysMessageBodyWrapper {
|
|
||||||
const message = globalThis.Object.create((this.messagePrototype!));
|
|
||||||
message.wrappedBody = new Uint8Array(0);
|
|
||||||
if (value !== undefined)
|
|
||||||
reflectionMergePartial<SysMessageBodyWrapper>(this, message, value);
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: SysMessageBodyWrapper): SysMessageBodyWrapper {
|
|
||||||
let message = target ?? this.create(), end = reader.pos + length;
|
|
||||||
while (reader.pos < end) {
|
|
||||||
let [fieldNo, wireType] = reader.tag();
|
|
||||||
switch (fieldNo) {
|
|
||||||
case /* bytes wrappedBody */ 2:
|
|
||||||
message.wrappedBody = reader.bytes();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
let u = options.readUnknownField;
|
|
||||||
if (u === "throw")
|
|
||||||
throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
|
|
||||||
let d = reader.skip(wireType);
|
|
||||||
if (u !== false)
|
|
||||||
(u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
internalBinaryWrite(message: SysMessageBodyWrapper, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
|
|
||||||
/* bytes wrappedBody = 2; */
|
|
||||||
if (message.wrappedBody.length)
|
|
||||||
writer.tag(2, WireType.LengthDelimited).bytes(message.wrappedBody);
|
|
||||||
let u = options.writeUnknownFields;
|
|
||||||
if (u !== false)
|
|
||||||
(u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
|
|
||||||
return writer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @generated MessageType for protobuf message SysMessage.SysMessageBodyWrapper
|
|
||||||
*/
|
|
||||||
export const SysMessageBodyWrapper = new SysMessageBodyWrapper$Type();
|
|
||||||
// @generated message type with reflection information, may provide speed optimized methods
|
|
||||||
class KeyValuePair$Type extends MessageType<KeyValuePair> {
|
|
||||||
constructor() {
|
|
||||||
super("SysMessage.KeyValuePair", [
|
|
||||||
{ no: 1, name: "key", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
|
|
||||||
{ no: 2, name: "value", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
create(value?: PartialMessage<KeyValuePair>): KeyValuePair {
|
|
||||||
const message = globalThis.Object.create((this.messagePrototype!));
|
|
||||||
message.key = "";
|
|
||||||
message.value = "";
|
|
||||||
if (value !== undefined)
|
|
||||||
reflectionMergePartial<KeyValuePair>(this, message, value);
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: KeyValuePair): KeyValuePair {
|
|
||||||
let message = target ?? this.create(), end = reader.pos + length;
|
|
||||||
while (reader.pos < end) {
|
|
||||||
let [fieldNo, wireType] = reader.tag();
|
|
||||||
switch (fieldNo) {
|
|
||||||
case /* string key */ 1:
|
|
||||||
message.key = reader.string();
|
|
||||||
break;
|
|
||||||
case /* string value */ 2:
|
|
||||||
message.value = reader.string();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
let u = options.readUnknownField;
|
|
||||||
if (u === "throw")
|
|
||||||
throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
|
|
||||||
let d = reader.skip(wireType);
|
|
||||||
if (u !== false)
|
|
||||||
(u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
internalBinaryWrite(message: KeyValuePair, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
|
|
||||||
/* string key = 1; */
|
|
||||||
if (message.key !== "")
|
|
||||||
writer.tag(1, WireType.LengthDelimited).string(message.key);
|
|
||||||
/* string value = 2; */
|
|
||||||
if (message.value !== "")
|
|
||||||
writer.tag(2, WireType.LengthDelimited).string(message.value);
|
|
||||||
let u = options.writeUnknownFields;
|
|
||||||
if (u !== false)
|
|
||||||
(u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
|
|
||||||
return writer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @generated MessageType for protobuf message SysMessage.KeyValuePair
|
|
||||||
*/
|
|
||||||
export const KeyValuePair = new KeyValuePair$Type();
|
|
@@ -1,5 +1,5 @@
|
|||||||
import { AnyCnameRecord } from 'node:dns';
|
import { AnyCnameRecord } from 'node:dns';
|
||||||
import { BizKey, ModifyProfileParams, NodeIKernelProfileListener, ProfileBizType, SimpleInfo, UserDetailInfoByUinV2, UserDetailSource } from '@/core';
|
import { BizKey, ModifyProfileParams, NodeIKernelProfileListener, ProfileBizType, SimpleInfo, UserDetailInfoByUin, UserDetailSource } from '@/core';
|
||||||
import { GeneralCallResult } from '@/core/services/common';
|
import { GeneralCallResult } from '@/core/services/common';
|
||||||
|
|
||||||
export interface NodeIKernelProfileService {
|
export interface NodeIKernelProfileService {
|
||||||
@@ -55,7 +55,7 @@ export interface NodeIKernelProfileService {
|
|||||||
|
|
||||||
getUserDetailInfoWithBizInfo(uid: string, Biz: BizKey[]): Promise<GeneralCallResult>;
|
getUserDetailInfoWithBizInfo(uid: string, Biz: BizKey[]): Promise<GeneralCallResult>;
|
||||||
|
|
||||||
getUserDetailInfoByUin(uin: string): Promise<UserDetailInfoByUinV2>;
|
getUserDetailInfoByUin(uin: string): Promise<UserDetailInfoByUin>;
|
||||||
|
|
||||||
getZplanAvatarInfos(args: string[]): Promise<unknown>;
|
getZplanAvatarInfos(args: string[]): Promise<unknown>;
|
||||||
|
|
||||||
|
@@ -19,26 +19,21 @@ export class OCRImage extends BaseAction<Payload, any> {
|
|||||||
payloadSchema = SchemaData;
|
payloadSchema = SchemaData;
|
||||||
|
|
||||||
async _handle(payload: Payload) {
|
async _handle(payload: Payload) {
|
||||||
const { path, isLocal, success } = (await uri2local(this.core.NapCatTempPath, payload.image));
|
const { path, success } = (await uri2local(this.core.NapCatTempPath, payload.image));
|
||||||
if (!success) {
|
if (!success) {
|
||||||
throw `OCR ${payload.image}失败,image字段可能格式不正确`;
|
throw `OCR ${payload.image}失败,image字段可能格式不正确`;
|
||||||
}
|
}
|
||||||
if (path) {
|
if (path) {
|
||||||
await checkFileReceived(path, 5000); // 文件不存在QQ会崩溃,需要提前判断
|
await checkFileReceived(path, 5000); // 文件不存在QQ会崩溃,需要提前判断
|
||||||
const ret = await this.core.apis.SystemApi.ocrImage(path);
|
const ret = await this.core.apis.SystemApi.ocrImage(path);
|
||||||
if (!isLocal) {
|
fs.unlink(path, () => { });
|
||||||
fs.unlink(path, () => {
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
throw `OCR ${payload.file}失败`;
|
throw `OCR ${payload.file}失败`;
|
||||||
}
|
}
|
||||||
return ret.result;
|
return ret.result;
|
||||||
}
|
}
|
||||||
if (!isLocal) {
|
fs.unlink(path, () => { });
|
||||||
fs.unlink(path, () => {
|
|
||||||
});
|
|
||||||
}
|
|
||||||
throw `OCR ${payload.file}失败,文件可能不存在`;
|
throw `OCR ${payload.file}失败,文件可能不存在`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -24,17 +24,16 @@ export default class SetAvatar extends BaseAction<Payload, null> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async _handle(payload: Payload): Promise<null> {
|
async _handle(payload: Payload): Promise<null> {
|
||||||
const { path, isLocal, success } = (await uri2local(this.core.NapCatTempPath, payload.file));
|
const { path, success } = (await uri2local(this.core.NapCatTempPath, payload.file));
|
||||||
if (!success) {
|
if (!success) {
|
||||||
throw `头像${payload.file}设置失败,file字段可能格式不正确`;
|
throw `头像${payload.file}设置失败,file字段可能格式不正确`;
|
||||||
}
|
}
|
||||||
if (path) {
|
if (path) {
|
||||||
await checkFileReceived(path, 5000); // 文件不存在QQ会崩溃,需要提前判断
|
await checkFileReceived(path, 5000); // 文件不存在QQ会崩溃,需要提前判断
|
||||||
const ret = await this.core.apis.UserApi.setQQAvatar(path);
|
const ret = await this.core.apis.UserApi.setQQAvatar(path);
|
||||||
if (!isLocal) {
|
fs.unlink(path, () => {
|
||||||
fs.unlink(path, () => {
|
});
|
||||||
});
|
|
||||||
}
|
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
throw `头像${payload.file}设置失败,api无返回`;
|
throw `头像${payload.file}设置失败,api无返回`;
|
||||||
}
|
}
|
||||||
@@ -45,10 +44,8 @@ export default class SetAvatar extends BaseAction<Payload, null> {
|
|||||||
throw `头像${payload.file}设置失败,未知的错误,${ret['result']}:${ret['errMsg']}`;
|
throw `头像${payload.file}设置失败,未知的错误,${ret['result']}:${ret['errMsg']}`;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!isLocal) {
|
fs.unlink(path, () => { });
|
||||||
fs.unlink(path, () => {
|
|
||||||
});
|
|
||||||
}
|
|
||||||
throw `头像${payload.file}设置失败,无法获取头像,文件可能不存在`;
|
throw `头像${payload.file}设置失败,无法获取头像,文件可能不存在`;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
@@ -20,7 +20,7 @@ export default class GoCQHTTPGetStrangerInfo extends BaseAction<Payload, OB11Use
|
|||||||
|
|
||||||
async _handle(payload: Payload): Promise<OB11User> {
|
async _handle(payload: Payload): Promise<OB11User> {
|
||||||
const user_id = payload.user_id.toString();
|
const user_id = payload.user_id.toString();
|
||||||
const extendData = await this.core.apis.UserApi.getUserDetailInfoByUinV2(user_id);
|
const extendData = await this.core.apis.UserApi.getUserDetailInfoByUin(user_id);
|
||||||
const uid = (await this.core.apis.UserApi.getUidByUinV2(user_id))!;
|
const uid = (await this.core.apis.UserApi.getUidByUinV2(user_id))!;
|
||||||
if (!uid || uid.indexOf('*') != -1) {
|
if (!uid || uid.indexOf('*') != -1) {
|
||||||
return {
|
return {
|
||||||
|
@@ -31,7 +31,6 @@ export class SendGroupNotice extends BaseAction<Payload, null> {
|
|||||||
//公告图逻辑
|
//公告图逻辑
|
||||||
const {
|
const {
|
||||||
path,
|
path,
|
||||||
isLocal,
|
|
||||||
success,
|
success,
|
||||||
} = (await uri2local(this.core.NapCatTempPath, payload.image));
|
} = (await uri2local(this.core.NapCatTempPath, payload.image));
|
||||||
if (!success) {
|
if (!success) {
|
||||||
@@ -45,10 +44,10 @@ export class SendGroupNotice extends BaseAction<Payload, null> {
|
|||||||
if (ImageUploadResult.errCode != 0) {
|
if (ImageUploadResult.errCode != 0) {
|
||||||
throw `群公告${payload.image}设置失败,图片上传失败`;
|
throw `群公告${payload.image}设置失败,图片上传失败`;
|
||||||
}
|
}
|
||||||
if (!isLocal) {
|
|
||||||
unlink(path, () => {
|
unlink(path, () => {
|
||||||
});
|
});
|
||||||
}
|
|
||||||
UploadImage = ImageUploadResult.picInfo;
|
UploadImage = ImageUploadResult.picInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -25,17 +25,14 @@ export default class SetGroupPortrait extends BaseAction<Payload, any> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async _handle(payload: Payload): Promise<any> {
|
async _handle(payload: Payload): Promise<any> {
|
||||||
const { path, isLocal, success } = (await uri2local(this.core.NapCatTempPath, payload.file));
|
const { path, success } = (await uri2local(this.core.NapCatTempPath, payload.file));
|
||||||
if (!success) {
|
if (!success) {
|
||||||
throw `头像${payload.file}设置失败,file字段可能格式不正确`;
|
throw `头像${payload.file}设置失败,file字段可能格式不正确`;
|
||||||
}
|
}
|
||||||
if (path) {
|
if (path) {
|
||||||
await checkFileReceived(path, 5000); // 文件不存在QQ会崩溃,需要提前判断
|
await checkFileReceived(path, 5000); // 文件不存在QQ会崩溃,需要提前判断
|
||||||
const ret = await this.core.apis.GroupApi.setGroupAvatar(payload.group_id.toString(), path) as any;
|
const ret = await this.core.apis.GroupApi.setGroupAvatar(payload.group_id.toString(), path) as any;
|
||||||
if (!isLocal) {
|
fs.unlink(path, () => { });
|
||||||
fs.unlink(path, () => {
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
throw `头像${payload.file}设置失败,api无返回`;
|
throw `头像${payload.file}设置失败,api无返回`;
|
||||||
}
|
}
|
||||||
@@ -46,10 +43,7 @@ export default class SetGroupPortrait extends BaseAction<Payload, any> {
|
|||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
} else {
|
} else {
|
||||||
if (!isLocal) {
|
fs.unlink(path, () => {});
|
||||||
fs.unlink(path, () => {
|
|
||||||
});
|
|
||||||
}
|
|
||||||
throw `头像${payload.file}设置失败,无法获取头像,文件可能不存在`;
|
throw `头像${payload.file}设置失败,无法获取头像,文件可能不存在`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,9 +1,10 @@
|
|||||||
import BaseAction from '../BaseAction';
|
import BaseAction from '../BaseAction';
|
||||||
import { ActionName } from '../types';
|
import { ActionName } from '../types';
|
||||||
import { ChatType } from '@/core/entities';
|
import { ChatType, Peer } from '@/core/entities';
|
||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
import { uri2local } from '@/common/file';
|
import { uri2local } from '@/common/file';
|
||||||
import { FromSchema, JSONSchema } from 'json-schema-to-ts';
|
import { FromSchema, JSONSchema } from 'json-schema-to-ts';
|
||||||
|
import { MessageContext } from '@/onebot/api';
|
||||||
|
|
||||||
const SchemaData = {
|
const SchemaData = {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
@@ -29,14 +30,19 @@ export default class GoCQHTTPUploadGroupFile extends BaseAction<Payload, null> {
|
|||||||
file = `file://${file}`;
|
file = `file://${file}`;
|
||||||
}
|
}
|
||||||
const downloadResult = await uri2local(this.core.NapCatTempPath, file);
|
const downloadResult = await uri2local(this.core.NapCatTempPath, file);
|
||||||
|
const peer: Peer = {
|
||||||
|
chatType: ChatType.KCHATTYPEGROUP,
|
||||||
|
peerUid: payload.group_id.toString(),
|
||||||
|
};
|
||||||
if (!downloadResult.success) {
|
if (!downloadResult.success) {
|
||||||
throw new Error(downloadResult.errMsg);
|
throw new Error(downloadResult.errMsg);
|
||||||
}
|
}
|
||||||
const sendFileEle = await this.core.apis.FileApi.createValidSendFileElement(downloadResult.path, payload.name, payload.folder_id);
|
let msgContext: MessageContext = {
|
||||||
await this.obContext.apis.MsgApi.sendMsgWithOb11UniqueId({
|
peer: peer,
|
||||||
chatType: ChatType.KCHATTYPEGROUP,
|
deleteAfterSentFiles: []
|
||||||
peerUid: payload.group_id.toString(),
|
}
|
||||||
}, [sendFileEle], [], true);
|
const sendFileEle = await this.core.apis.FileApi.createValidSendFileElement(msgContext, downloadResult.path, payload.name, payload.folder_id);
|
||||||
|
await this.obContext.apis.MsgApi.sendMsgWithOb11UniqueId(peer, [sendFileEle], [], true);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -4,6 +4,8 @@ import { ChatType, Peer, SendFileElement } from '@/core/entities';
|
|||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
import { uri2local } from '@/common/file';
|
import { uri2local } from '@/common/file';
|
||||||
import { FromSchema, JSONSchema } from 'json-schema-to-ts';
|
import { FromSchema, JSONSchema } from 'json-schema-to-ts';
|
||||||
|
import { MessageContext } from '@/onebot/api';
|
||||||
|
import { ContextMode, createContext } from '../msg/SendMsg';
|
||||||
|
|
||||||
const SchemaData = {
|
const SchemaData = {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
@@ -42,7 +44,15 @@ export default class GoCQHTTPUploadPrivateFile extends BaseAction<Payload, null>
|
|||||||
if (!downloadResult.success) {
|
if (!downloadResult.success) {
|
||||||
throw new Error(downloadResult.errMsg);
|
throw new Error(downloadResult.errMsg);
|
||||||
}
|
}
|
||||||
const sendFileEle: SendFileElement = await this.core.apis.FileApi.createValidSendFileElement(downloadResult.path, payload.name);
|
|
||||||
|
let msgContext: MessageContext = {
|
||||||
|
peer: await createContext(this.core, {
|
||||||
|
user_id: payload.user_id.toString(),
|
||||||
|
group_id: undefined,
|
||||||
|
}, ContextMode.Private),
|
||||||
|
deleteAfterSentFiles: []
|
||||||
|
}
|
||||||
|
const sendFileEle: SendFileElement = await this.core.apis.FileApi.createValidSendFileElement(msgContext, downloadResult.path, payload.name);
|
||||||
await this.obContext.apis.MsgApi.sendMsgWithOb11UniqueId(await this.getPeer(payload), [sendFileEle], [], true);
|
await this.obContext.apis.MsgApi.sendMsgWithOb11UniqueId(await this.getPeer(payload), [sendFileEle], [], true);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@@ -3,6 +3,7 @@ import {
|
|||||||
OB11MessageDataType,
|
OB11MessageDataType,
|
||||||
OB11MessageMixType,
|
OB11MessageMixType,
|
||||||
OB11MessageNode,
|
OB11MessageNode,
|
||||||
|
OB11PostContext,
|
||||||
OB11PostSendMsg,
|
OB11PostSendMsg,
|
||||||
} from '@/onebot/types';
|
} from '@/onebot/types';
|
||||||
import { ActionName, BaseCheckResult } from '@/onebot/action/types';
|
import { ActionName, BaseCheckResult } from '@/onebot/action/types';
|
||||||
@@ -30,7 +31,7 @@ export function normalize(message: OB11MessageMixType, autoEscape = false): OB11
|
|||||||
) : Array.isArray(message) ? message : [message];
|
) : Array.isArray(message) ? message : [message];
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function createContext(core: NapCatCore, payload: OB11PostSendMsg, contextMode: ContextMode): Promise<Peer> {
|
export async function createContext(core: NapCatCore, payload: OB11PostContext, contextMode: ContextMode): Promise<Peer> {
|
||||||
// This function determines the type of message by the existence of user_id / group_id,
|
// This function determines the type of message by the existence of user_id / group_id,
|
||||||
// not message_type.
|
// not message_type.
|
||||||
// This redundant design of Ob11 here should be blamed.
|
// This redundant design of Ob11 here should be blamed.
|
||||||
|
@@ -460,6 +460,7 @@ export class OneBotMsgApi {
|
|||||||
// File service
|
// File service
|
||||||
[OB11MessageDataType.image]: async (sendMsg, context) => {
|
[OB11MessageDataType.image]: async (sendMsg, context) => {
|
||||||
const sendPicElement = await this.core.apis.FileApi.createValidSendPicElement(
|
const sendPicElement = await this.core.apis.FileApi.createValidSendPicElement(
|
||||||
|
context,
|
||||||
(await this.handleOb11FileLikeMessage(sendMsg, context)).path,
|
(await this.handleOb11FileLikeMessage(sendMsg, context)).path,
|
||||||
sendMsg.data.summary,
|
sendMsg.data.summary,
|
||||||
sendMsg.data.sub_type,
|
sendMsg.data.sub_type,
|
||||||
@@ -470,7 +471,7 @@ export class OneBotMsgApi {
|
|||||||
|
|
||||||
[OB11MessageDataType.file]: async (sendMsg, context) => {
|
[OB11MessageDataType.file]: async (sendMsg, context) => {
|
||||||
const { path, fileName } = await this.handleOb11FileLikeMessage(sendMsg, context);
|
const { path, fileName } = await this.handleOb11FileLikeMessage(sendMsg, context);
|
||||||
return await this.core.apis.FileApi.createValidSendFileElement(path, fileName);
|
return await this.core.apis.FileApi.createValidSendFileElement(context, path, fileName);
|
||||||
},
|
},
|
||||||
|
|
||||||
[OB11MessageDataType.video]: async (sendMsg, context) => {
|
[OB11MessageDataType.video]: async (sendMsg, context) => {
|
||||||
@@ -481,9 +482,7 @@ export class OneBotMsgApi {
|
|||||||
const uri2LocalRes = await uri2local(this.core.NapCatTempPath, thumb);
|
const uri2LocalRes = await uri2local(this.core.NapCatTempPath, thumb);
|
||||||
if (uri2LocalRes.success) thumb = uri2LocalRes.path;
|
if (uri2LocalRes.success) thumb = uri2LocalRes.path;
|
||||||
}
|
}
|
||||||
const videoEle = await this.core.apis.FileApi.createValidSendVideoElement(path, fileName, thumb);
|
const videoEle = await this.core.apis.FileApi.createValidSendVideoElement(context, path, fileName, thumb);
|
||||||
|
|
||||||
context.deleteAfterSentFiles.push(videoEle.videoElement.filePath);
|
|
||||||
return videoEle;
|
return videoEle;
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -805,7 +804,6 @@ export class OneBotMsgApi {
|
|||||||
}
|
}
|
||||||
const {
|
const {
|
||||||
path,
|
path,
|
||||||
isLocal,
|
|
||||||
fileName,
|
fileName,
|
||||||
errMsg,
|
errMsg,
|
||||||
success,
|
success,
|
||||||
@@ -816,9 +814,7 @@ export class OneBotMsgApi {
|
|||||||
throw Error('文件下载失败' + errMsg);
|
throw Error('文件下载失败' + errMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isLocal) { // 只删除http和base64转过来的文件
|
deleteAfterSentFiles.push(path);
|
||||||
deleteAfterSentFiles.push(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
return { path, fileName: inputdata.name ?? fileName };
|
return { path, fileName: inputdata.name ?? fileName };
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,8 @@
|
|||||||
import { NapCatCore } from '@/core';
|
import { NapCatCore } from '@/core';
|
||||||
|
import { profileLikeTip, ProfileLikeTipType } from '@/core/proto/ProfileLike';
|
||||||
|
|
||||||
import { NapCatOneBot11Adapter } from '@/onebot';
|
import { NapCatOneBot11Adapter } from '@/onebot';
|
||||||
|
import { OB11ProfileLikeEvent } from '../event/notice/OB11ProfileLikeEvent';
|
||||||
|
|
||||||
export class OneBotUserApi {
|
export class OneBotUserApi {
|
||||||
obContext: NapCatOneBot11Adapter;
|
obContext: NapCatOneBot11Adapter;
|
||||||
@@ -10,4 +12,20 @@ export class OneBotUserApi {
|
|||||||
this.obContext = obContext;
|
this.obContext = obContext;
|
||||||
this.core = core;
|
this.core = core;
|
||||||
}
|
}
|
||||||
|
async parseLikeEvent(wrappedBody: Uint8Array): Promise<OB11ProfileLikeEvent | undefined> {
|
||||||
|
const likeTip = profileLikeTip.decode(Uint8Array.from(wrappedBody.slice(12))) as unknown as ProfileLikeTipType;
|
||||||
|
this.core.context.logger.logDebug("收到点赞通知消息");
|
||||||
|
const likeMsg = likeTip.msg;
|
||||||
|
if (!likeMsg) return;
|
||||||
|
const detail = likeMsg.detail;
|
||||||
|
if (!detail) return;
|
||||||
|
const times = detail.txt.match(/\d+/) ?? "0";
|
||||||
|
return new OB11ProfileLikeEvent(
|
||||||
|
this.core,
|
||||||
|
Number(detail.uin),
|
||||||
|
detail.nickname,
|
||||||
|
parseInt(times[0], 10),
|
||||||
|
likeMsg.time,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
19
src/onebot/event/notice/OB11ProfileLikeEvent.ts
Normal file
19
src/onebot/event/notice/OB11ProfileLikeEvent.ts
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import { OB11BaseNoticeEvent } from './OB11BaseNoticeEvent';
|
||||||
|
import { NapCatCore } from '@/core';
|
||||||
|
|
||||||
|
export class OB11ProfileLikeEvent extends OB11BaseNoticeEvent {
|
||||||
|
notice_type = 'notify';
|
||||||
|
sub_type = 'profile_like';
|
||||||
|
operator_id: number;
|
||||||
|
operator_nick: string;
|
||||||
|
times: number;
|
||||||
|
time: number;
|
||||||
|
|
||||||
|
constructor(core: NapCatCore, operatorId: number, operatorNick: string, times: number, time: number) {
|
||||||
|
super(core);
|
||||||
|
this.operator_id = operatorId;
|
||||||
|
this.operator_nick = operatorNick;
|
||||||
|
this.times = times;
|
||||||
|
this.time = time;
|
||||||
|
}
|
||||||
|
}
|
@@ -43,7 +43,8 @@ import { OB11FriendRecallNoticeEvent } from '@/onebot/event/notice/OB11FriendRec
|
|||||||
import { OB11GroupRecallNoticeEvent } from '@/onebot/event/notice/OB11GroupRecallNoticeEvent';
|
import { OB11GroupRecallNoticeEvent } from '@/onebot/event/notice/OB11GroupRecallNoticeEvent';
|
||||||
import { LRUCache } from '@/common/lru-cache';
|
import { LRUCache } from '@/common/lru-cache';
|
||||||
import { NodeIKernelRecentContactListener } from '@/core/listeners/NodeIKernelRecentContactListener';
|
import { NodeIKernelRecentContactListener } from '@/core/listeners/NodeIKernelRecentContactListener';
|
||||||
|
import { OB11ProfileLikeEvent } from './event/notice/OB11ProfileLikeEvent';
|
||||||
|
import { profileLikeTip, ProfileLikeTipType, SysMessage, SysMessageType } from '@/core/proto/ProfileLike';
|
||||||
//OneBot实现类
|
//OneBot实现类
|
||||||
export class NapCatOneBot11Adapter {
|
export class NapCatOneBot11Adapter {
|
||||||
readonly core: NapCatCore;
|
readonly core: NapCatCore;
|
||||||
@@ -237,14 +238,18 @@ export class NapCatOneBot11Adapter {
|
|||||||
|
|
||||||
private initMsgListener() {
|
private initMsgListener() {
|
||||||
const msgListener = new NodeIKernelMsgListener();
|
const msgListener = new NodeIKernelMsgListener();
|
||||||
|
msgListener.onRecvSysMsg = async (msg) => {
|
||||||
/*
|
const sysMsg = SysMessage.decode(Uint8Array.from(msg)) as unknown as SysMessageType;
|
||||||
msgListener.onRecvSysMsg = async () => {
|
|
||||||
const sysMsg = SysMessage.fromBinary(Uint8Array.from(msg));
|
|
||||||
if (sysMsg.msgSpec.length === 0) {
|
if (sysMsg.msgSpec.length === 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const { msgType, subType, subSubType } = sysMsg.msgSpec[0];
|
const { msgType, subType, subSubType } = sysMsg.msgSpec[0];
|
||||||
|
if (msgType === 528 && subType === 39 && subSubType === 39) {
|
||||||
|
if (!sysMsg.bodyWrapper) return;
|
||||||
|
let event = await this.apis.UserApi.parseLikeEvent(sysMsg.bodyWrapper.wrappedBody);
|
||||||
|
if (event) await this.networkManager.emitEvent(event);
|
||||||
|
};
|
||||||
|
/*
|
||||||
if (msgType === 732 && subType === 16 && subSubType === 16) {
|
if (msgType === 732 && subType === 16 && subSubType === 16) {
|
||||||
const greyTip = GreyTipWrapper.fromBinary(Uint8Array.from(sysMsg.bodyWrapper!.wrappedBody.slice(7)));
|
const greyTip = GreyTipWrapper.fromBinary(Uint8Array.from(sysMsg.bodyWrapper!.wrappedBody.slice(7)));
|
||||||
if (greyTip.subTypeId === 36) {
|
if (greyTip.subTypeId === 36) {
|
||||||
@@ -265,8 +270,8 @@ export class NapCatOneBot11Adapter {
|
|||||||
eventOrEmpty && await this.networkManager.emitEvent(eventOrEmpty);
|
eventOrEmpty && await this.networkManager.emitEvent(eventOrEmpty);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
};
|
};
|
||||||
*/
|
|
||||||
|
|
||||||
msgListener.onInputStatusPush = async data => {
|
msgListener.onInputStatusPush = async data => {
|
||||||
const uin = await this.core.apis.UserApi.getUinByUidV2(data.fromUin);
|
const uin = await this.core.apis.UserApi.getUinByUidV2(data.fromUin);
|
||||||
|
@@ -208,3 +208,8 @@ export interface OB11PostSendMsg {
|
|||||||
messages?: OB11MessageMixType; // 兼容 go-cqhttp
|
messages?: OB11MessageMixType; // 兼容 go-cqhttp
|
||||||
auto_escape?: boolean | string
|
auto_escape?: boolean | string
|
||||||
}
|
}
|
||||||
|
export interface OB11PostContext {
|
||||||
|
message_type?: 'private' | 'group'
|
||||||
|
user_id?: string,
|
||||||
|
group_id?: string,
|
||||||
|
}
|
||||||
|
@@ -30,7 +30,7 @@ async function onSettingWindowCreated(view: Element) {
|
|||||||
SettingItem(
|
SettingItem(
|
||||||
'<span id="napcat-update-title">Napcat</span>',
|
'<span id="napcat-update-title">Napcat</span>',
|
||||||
undefined,
|
undefined,
|
||||||
SettingButton('V2.4.4', 'napcat-update-button', 'secondary'),
|
SettingButton('V2.4.6', 'napcat-update-button', 'secondary'),
|
||||||
),
|
),
|
||||||
]),
|
]),
|
||||||
SettingList([
|
SettingList([
|
||||||
|
@@ -164,7 +164,7 @@ async function onSettingWindowCreated(view) {
|
|||||||
SettingItem(
|
SettingItem(
|
||||||
'<span id="napcat-update-title">Napcat</span>',
|
'<span id="napcat-update-title">Napcat</span>',
|
||||||
void 0,
|
void 0,
|
||||||
SettingButton("V2.4.4", "napcat-update-button", "secondary")
|
SettingButton("V2.4.6", "napcat-update-button", "secondary")
|
||||||
)
|
)
|
||||||
]),
|
]),
|
||||||
SettingList([
|
SettingList([
|
||||||
|
Reference in New Issue
Block a user