refactor: member qq_level

This commit is contained in:
linyuchen 2024-03-17 15:33:56 +08:00
parent 60e0c9e4ba
commit af8cf1882c
17 changed files with 122 additions and 32 deletions

View File

@ -6,7 +6,7 @@ const external = ["silk-wasm", "ws",
"module-error", "catering", "node-gyp-build"]; "module-error", "catering", "node-gyp-build"];
function genCpModule(module: string) { function genCpModule(module: string) {
return { src: `./node_modules/${module}`, dest: `dist/node_modules/${module}`, flatten: false } return {src: `./node_modules/${module}`, dest: `dist/node_modules/${module}`, flatten: false}
} }
let config = { let config = {
@ -16,20 +16,24 @@ let config = {
emptyOutDir: true, emptyOutDir: true,
lib: { lib: {
formats: ["cjs"], formats: ["cjs"],
entry: { "main": "src/main/main.ts" }, entry: {"main": "src/main/main.ts"},
}, },
rollupOptions: { rollupOptions: {
external, external,
input: "src/main/main.ts", input: "src/main/main.ts",
} }
}, },
resolve:{ resolve: {
alias: { alias: {
'./lib-cov/fluent-ffmpeg': './lib/fluent-ffmpeg' './lib-cov/fluent-ffmpeg': './lib/fluent-ffmpeg'
}, },
}, },
plugins: [cp({ targets: [...external.map(genCpModule), plugins: [cp({
{ src: './manifest.json', dest: 'dist' }, {src: './icon.jpg', dest: 'dist' }] targets: [
...external.map(genCpModule),
{src: './manifest.json', dest: 'dist'}, {src: './icon.jpg', dest: 'dist'},
{src: './src/ntqqapi/external/ccpoke/poke-win32-x64.node', dest: 'dist/main/ccpoke/'},
]
})] })]
}, },
preload: { preload: {
@ -39,15 +43,14 @@ let config = {
emptyOutDir: true, emptyOutDir: true,
lib: { lib: {
formats: ["cjs"], formats: ["cjs"],
entry: { "preload": "src/preload.ts" }, entry: {"preload": "src/preload.ts"},
}, },
rollupOptions: { rollupOptions: {
// external: externalAll, // external: externalAll,
input: "src/preload.ts", input: "src/preload.ts",
} }
}, },
resolve:{ resolve: {}
}
}, },
renderer: { renderer: {
// vite config options // vite config options
@ -56,15 +59,14 @@ let config = {
emptyOutDir: true, emptyOutDir: true,
lib: { lib: {
formats: ["es"], formats: ["es"],
entry: { "renderer": "src/renderer/index.ts" }, entry: {"renderer": "src/renderer/index.ts"},
}, },
rollupOptions: { rollupOptions: {
// external: externalAll, // external: externalAll,
input: "src/renderer/index.ts", input: "src/renderer/index.ts",
} }
}, },
resolve:{ resolve: {}
}
} }
} }

View File

@ -1,10 +1,10 @@
{ {
"manifest_version": 4, "manifest_version": 4,
"type": "extension", "type": "extension",
"name": "LLOneBot v3.15.3", "name": "LLOneBot v3.16.0",
"slug": "LLOneBot", "slug": "LLOneBot",
"description": "LiteLoaderQQNT的OneBotApi,不支持商店在线更新", "description": "LiteLoaderQQNT的OneBotApi,不支持商店在线更新",
"version": "3.15.3", "version": "3.16.0",
"icon": "./icon.jpg", "icon": "./icon.jpg",
"authors": [ "authors": [
{ {

View File

@ -2,7 +2,7 @@ import fs from "fs";
import {Config, OB11Config} from './types'; import {Config, OB11Config} from './types';
import {mergeNewProperties} from "./utils"; import {mergeNewProperties} from "./utils";
export const HOOK_LOG = true; export const HOOK_LOG = false;
export const ALLOW_SEND_TEMP_MSG = false; export const ALLOW_SEND_TEMP_MSG = false;

View File

@ -37,6 +37,8 @@ import {dbUtil} from "../common/db";
import {setConfig} from "./setConfig"; import {setConfig} from "./setConfig";
import {NTQQUserApi} from "../ntqqapi/api/user"; import {NTQQUserApi} from "../ntqqapi/api/user";
import {NTQQGroupApi} from "../ntqqapi/api/group"; import {NTQQGroupApi} from "../ntqqapi/api/group";
import {registerPokeHandler} from "../ntqqapi/external/ccpoke";
import {OB11FriendPokeEvent, OB11GroupPokeEvent} from "../onebot11/event/notice/OB11PokeEvent";
let running = false; let running = false;
@ -124,6 +126,16 @@ function onLoad() {
} }
async function startReceiveHook() { async function startReceiveHook() {
registerPokeHandler((id, isGroup) => {
log(`收到戳一戳消息了!是否群聊:${isGroup}id:${id}`)
let pokeEvent: OB11FriendPokeEvent | OB11GroupPokeEvent;
if (isGroup) {
pokeEvent = new OB11GroupPokeEvent(parseInt(id));
}else{
pokeEvent = new OB11FriendPokeEvent(parseInt(id));
}
postOB11Event(pokeEvent);
})
registerReceiveHook<{ msgList: Array<RawMessage> }>([ReceiveCmdS.NEW_MSG, ReceiveCmdS.NEW_ACTIVE_MSG], async (payload) => { registerReceiveHook<{ msgList: Array<RawMessage> }>([ReceiveCmdS.NEW_MSG, ReceiveCmdS.NEW_ACTIVE_MSG], async (payload) => {
try { try {
await postReceiveMsg(payload.msgList); await postReceiveMsg(payload.msgList);
@ -297,6 +309,7 @@ function onLoad() {
async function start() { async function start() {
log("llonebot pid", process.pid) log("llonebot pid", process.pid)
startTime = Date.now(); startTime = Date.now();
startReceiveHook().then(); startReceiveHook().then();
NTQQGroupApi.getGroups(true).then() NTQQGroupApi.getGroups(true).then()

View File

@ -15,7 +15,9 @@ export interface Peer {
export class NTQQMsgApi { export class NTQQMsgApi {
static async activateGroupChat(groupCode: string) { static async activateGroupChat(groupCode: string) {
return await callNTQQApi({ // await this.fetchRecentContact();
// await sleep(500);
return await callNTQQApi<GeneralCallResult>({
methodName: NTQQApiMethod.ADD_ACTIVE_CHAT, methodName: NTQQApiMethod.ADD_ACTIVE_CHAT,
args: [{peer:{peerUid: groupCode, chatType: ChatType.group}, cnt: 20}] args: [{peer:{peerUid: groupCode, chatType: ChatType.group}, cnt: 20}]
}) })

View File

@ -59,7 +59,7 @@ export class SendMsgElementConstructor {
} }
} }
static async pic(picPath: string): Promise<SendPicElement> { static async pic(picPath: string, summary: string = ""): Promise<SendPicElement> {
const {md5, fileName, path, fileSize} = await NTQQFileApi.uploadFile(picPath, ElementType.PIC); const {md5, fileName, path, fileSize} = await NTQQFileApi.uploadFile(picPath, ElementType.PIC);
if (fileSize === 0) { if (fileSize === 0) {
throw "文件异常大小为0"; throw "文件异常大小为0";
@ -78,7 +78,7 @@ export class SendMsgElementConstructor {
fileUuid: "", fileUuid: "",
fileSubId: "", fileSubId: "",
thumbFileSize: 0, thumbFileSize: 0,
summary: "", summary,
}; };
return { return {

28
src/ntqqapi/external/ccpoke/index.ts vendored Normal file
View File

@ -0,0 +1,28 @@
import {log} from "../../../common/utils";
let pokeEngine: any = null
type PokeHandler = (id: string, isGroup: boolean)=>void
let pokeRecords: Record<string, number> = {}
export function registerPokeHandler(handler: PokeHandler){
if(!pokeEngine){
try {
pokeEngine = require("./ccpoke/poke-win32-x64.node")
pokeEngine.performHooks();
}catch (e) {
log("戳一戳引擎加载失败", e)
return
}
}
pokeEngine.setHandlerForPokeHook((id: string, isGroup: boolean)=>{
let existTime = pokeRecords[id]
if (existTime){
if (Date.now() - existTime < 1500){
return
}
}
pokeRecords[id] = Date.now()
handler(id, isGroup);
})
}

Binary file not shown.

View File

@ -144,10 +144,20 @@ export function removeReceiveHook(id: string) {
receiveHooks.splice(index, 1); receiveHooks.splice(index, 1);
} }
let activatedGroups: string[] = [];
async function updateGroups(_groups: Group[], needUpdate: boolean = true) { async function updateGroups(_groups: Group[], needUpdate: boolean = true) {
for (let group of _groups) { for (let group of _groups) {
log("update group", group) // log("update group", group)
NTQQMsgApi.activateGroupChat(group.groupCode).then() if (!activatedGroups.includes(group.groupCode)) {
NTQQMsgApi.activateGroupChat(group.groupCode).then((r) => {
activatedGroups.push(group.groupCode);
// log(`激活群聊天窗口${group.groupName}(${group.groupCode})`, r)
// if (r.result !== 0) {
// setTimeout(() => NTQQMsgApi.activateGroupChat(group.groupCode).then(r => log(`再次激活群聊天窗口${group.groupName}(${group.groupCode})`, r)), 500);
// }else {
// }
}).catch(log)
}
let existGroup = groups.find(g => g.groupCode == group.groupCode); let existGroup = groups.find(g => g.groupCode == group.groupCode);
if (existGroup) { if (existGroup) {
Object.assign(existGroup, group); Object.assign(existGroup, group);

View File

@ -17,6 +17,7 @@ export enum NTQQApiClass {
export enum NTQQApiMethod { export enum NTQQApiMethod {
RECENT_CONTACT = "nodeIKernelRecentContactService/fetchAndSubscribeABatchOfRecentContact", RECENT_CONTACT = "nodeIKernelRecentContactService/fetchAndSubscribeABatchOfRecentContact",
ADD_ACTIVE_CHAT = "nodeIKernelMsgService/getAioFirstViewLatestMsgsAndAddActiveChat", // 激活群助手内的聊天窗口,这样才能收到消息 ADD_ACTIVE_CHAT = "nodeIKernelMsgService/getAioFirstViewLatestMsgsAndAddActiveChat", // 激活群助手内的聊天窗口,这样才能收到消息
ADD_ACTIVE_CHAT_2 = "nodeIKernelMsgService/getMsgsIncludeSelfAndAddActiveChat",
LIKE_FRIEND = "nodeIKernelProfileLikeService/setBuddyProfileLike", LIKE_FRIEND = "nodeIKernelProfileLikeService/setBuddyProfileLike",
SELF_INFO = "fetchAuthData", SELF_INFO = "fetchAuthData",
FRIENDS = "nodeIKernelBuddyService/getBuddyList", FRIENDS = "nodeIKernelBuddyService/getBuddyList",

View File

@ -19,7 +19,9 @@ class GetGroupMemberInfo extends BaseAction<PayloadType, OB11GroupMember> {
const member = await getGroupMember(payload.group_id.toString(), payload.user_id.toString()) const member = await getGroupMember(payload.group_id.toString(), payload.user_id.toString())
if (member) { if (member) {
if (isNull(member.sex)){ if (isNull(member.sex)){
log("获取群成员详细信息")
let info = (await NTQQUserApi.getUserDetailInfo(member.uid)) let info = (await NTQQUserApi.getUserDetailInfo(member.uid))
log("群成员详细信息结果", info)
Object.assign(member, info); Object.assign(member, info);
} }
return OB11Constructor.groupMember(payload.group_id.toString(), member) return OB11Constructor.groupMember(payload.group_id.toString(), member)

View File

@ -417,20 +417,16 @@ export class SendMsg extends BaseAction<OB11PostSendMsg, ReturnDataType> {
if (!isLocal) { // 只删除http和base64转过来的文件 if (!isLocal) { // 只删除http和base64转过来的文件
deleteAfterSentFiles.push(path) deleteAfterSentFiles.push(path)
} }
const constructorMap = {
[OB11MessageDataType.image]: SendMsgElementConstructor.pic,
[OB11MessageDataType.voice]: SendMsgElementConstructor.ptt,
[OB11MessageDataType.video]: SendMsgElementConstructor.video,
[OB11MessageDataType.file]: SendMsgElementConstructor.file,
}
if (sendMsg.type === OB11MessageDataType.file) { if (sendMsg.type === OB11MessageDataType.file) {
log("发送文件", path, payloadFileName || fileName) log("发送文件", path, payloadFileName || fileName)
sendElements.push(await SendMsgElementConstructor.file(path, payloadFileName || fileName)); sendElements.push(await SendMsgElementConstructor.file(path, payloadFileName || fileName));
} else if (sendMsg.type === OB11MessageDataType.video) { } else if (sendMsg.type === OB11MessageDataType.video) {
log("发送视频", path, payloadFileName || fileName) log("发送视频", path, payloadFileName || fileName)
sendElements.push(await SendMsgElementConstructor.video(path, payloadFileName || fileName)); sendElements.push(await SendMsgElementConstructor.video(path, payloadFileName || fileName));
} else { } else if (sendMsg.type === OB11MessageDataType.voice) {
sendElements.push(await constructorMap[sendMsg.type](path)); sendElements.push(await SendMsgElementConstructor.ptt(path));
}else if (sendMsg.type === OB11MessageDataType.image) {
sendElements.push(await SendMsgElementConstructor.pic(path, sendMsg.data.summary || ""));
} }
} }
} }

View File

@ -344,7 +344,8 @@ export class OB11Constructor {
sex: OB11Constructor.sex(member.sex), sex: OB11Constructor.sex(member.sex),
age: 0, age: 0,
area: "", area: "",
level: member.qqLevel && calcQQLevel(member.qqLevel) || 0, level: 0,
qq_level: member.qqLevel && calcQQLevel(member.qqLevel) || 0,
join_time: 0, // 暂时没法获取 join_time: 0, // 暂时没法获取
last_sent_time: 0, // 暂时没法获取 last_sent_time: 0, // 暂时没法获取
title_expire_time: 0, title_expire_time: 0,

View File

@ -0,0 +1,31 @@
import {OB11BaseNoticeEvent} from "./OB11BaseNoticeEvent";
import {selfInfo} from "../../../common/data";
import {OB11BaseEvent} from "../OB11BaseEvent";
class OB11PokeEvent extends OB11BaseNoticeEvent{
notice_type = "notify"
sub_type = "poke"
target_id = parseInt(selfInfo.uin)
user_id: number
}
export class OB11FriendPokeEvent extends OB11PokeEvent{
sender_id: number
constructor(user_id: number) {
super();
this.user_id = user_id;
this.sender_id = user_id;
}
}
export class OB11GroupPokeEvent extends OB11PokeEvent{
group_id: number
constructor(group_id: number, user_id: number=0) {
super();
this.group_id = group_id;
this.target_id = user_id;
this.user_id = user_id;
}
}

View File

@ -29,6 +29,7 @@ export interface OB11GroupMember {
join_time?: number join_time?: number
last_sent_time?: number last_sent_time?: number
level?: number level?: number
qq_level?: number
role?: OB11GroupMemberRole role?: OB11GroupMemberRole
title?: string title?: string
area?: string area?: string
@ -121,6 +122,9 @@ interface OB11MessageFileBase {
export interface OB11MessageImage extends OB11MessageFileBase { export interface OB11MessageImage extends OB11MessageFileBase {
type: OB11MessageDataType.image type: OB11MessageDataType.image
data: OB11MessageFileBase['data'] & {
summary ? : string; // 图片摘要
}
} }
export interface OB11MessageRecord extends OB11MessageFileBase { export interface OB11MessageRecord extends OB11MessageFileBase {

View File

@ -90,8 +90,8 @@ async function onSettingWindowCreated(view: Element) {
], 'ob11.messagePostFormat', config.ob11.messagePostFormat), ], 'ob11.messagePostFormat', config.ob11.messagePostFormat),
), ),
SettingItem( SettingItem(
'ffmpeg 路径发送语音、视频需要同时保证ffprobe和ffmpeg在一起', `配置可参考 <a href="javascript:LiteLoader.api.openExternal(\'https://llonebot.github.io/zh-CN/guide/voice\');">官方文档</a> <span id="config-ffmpeg-path-text"> 路径:${!isEmpty(config.ffmpeg) ? config.ffmpeg : '未指定'}</span>`, 'ffmpeg 路径发送语音、视频需要同时保证ffprobe和ffmpeg在一起', ` <a href="javascript:LiteLoader.api.openExternal(\'https://llonebot.github.io/zh-CN/guide/ffmpeg\');">下载地址</a> <span id="config-ffmpeg-path-text">, 路径:${!isEmpty(config.ffmpeg) ? config.ffmpeg : '未指定'}</span>`,
SettingButton('选择', 'config-ffmpeg-select'), SettingButton('选择ffmpeg', 'config-ffmpeg-select'),
), ),
SettingItem( SettingItem(
'', null, '', null,

View File

@ -1 +1 @@
export const version = "3.15.3" export const version = "3.16.0"