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"];
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 = {
@ -16,20 +16,24 @@ let config = {
emptyOutDir: true,
lib: {
formats: ["cjs"],
entry: { "main": "src/main/main.ts" },
entry: {"main": "src/main/main.ts"},
},
rollupOptions: {
external,
input: "src/main/main.ts",
}
},
resolve:{
resolve: {
alias: {
'./lib-cov/fluent-ffmpeg': './lib/fluent-ffmpeg'
},
},
plugins: [cp({ targets: [...external.map(genCpModule),
{ src: './manifest.json', dest: 'dist' }, {src: './icon.jpg', dest: 'dist' }]
plugins: [cp({
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: {
@ -39,15 +43,14 @@ let config = {
emptyOutDir: true,
lib: {
formats: ["cjs"],
entry: { "preload": "src/preload.ts" },
entry: {"preload": "src/preload.ts"},
},
rollupOptions: {
// external: externalAll,
input: "src/preload.ts",
}
},
resolve:{
}
resolve: {}
},
renderer: {
// vite config options
@ -56,15 +59,14 @@ let config = {
emptyOutDir: true,
lib: {
formats: ["es"],
entry: { "renderer": "src/renderer/index.ts" },
entry: {"renderer": "src/renderer/index.ts"},
},
rollupOptions: {
// external: externalAll,
input: "src/renderer/index.ts",
}
},
resolve:{
}
resolve: {}
}
}

View File

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

View File

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

View File

@ -37,6 +37,8 @@ import {dbUtil} from "../common/db";
import {setConfig} from "./setConfig";
import {NTQQUserApi} from "../ntqqapi/api/user";
import {NTQQGroupApi} from "../ntqqapi/api/group";
import {registerPokeHandler} from "../ntqqapi/external/ccpoke";
import {OB11FriendPokeEvent, OB11GroupPokeEvent} from "../onebot11/event/notice/OB11PokeEvent";
let running = false;
@ -124,6 +126,16 @@ function onLoad() {
}
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) => {
try {
await postReceiveMsg(payload.msgList);
@ -297,6 +309,7 @@ function onLoad() {
async function start() {
log("llonebot pid", process.pid)
startTime = Date.now();
startReceiveHook().then();
NTQQGroupApi.getGroups(true).then()

View File

@ -15,7 +15,9 @@ export interface Peer {
export class NTQQMsgApi {
static async activateGroupChat(groupCode: string) {
return await callNTQQApi({
// await this.fetchRecentContact();
// await sleep(500);
return await callNTQQApi<GeneralCallResult>({
methodName: NTQQApiMethod.ADD_ACTIVE_CHAT,
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);
if (fileSize === 0) {
throw "文件异常大小为0";
@ -78,7 +78,7 @@ export class SendMsgElementConstructor {
fileUuid: "",
fileSubId: "",
thumbFileSize: 0,
summary: "",
summary,
};
return {
@ -136,7 +136,7 @@ export class SendMsgElementConstructor {
folder: thumb,
size: videoInfo.width + "x" + videoInfo.height
}).on("end", () => {
resolve(pathLib.join(thumb, thumbFileName));
resolve(pathLib.join(thumb, thumbFileName));
});
})
let thumbPath = new Map()

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);
}
let activatedGroups: string[] = [];
async function updateGroups(_groups: Group[], needUpdate: boolean = true) {
for (let group of _groups) {
log("update group", group)
NTQQMsgApi.activateGroupChat(group.groupCode).then()
// log("update group", group)
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);
if (existGroup) {
Object.assign(existGroup, group);

View File

@ -17,6 +17,7 @@ export enum NTQQApiClass {
export enum NTQQApiMethod {
RECENT_CONTACT = "nodeIKernelRecentContactService/fetchAndSubscribeABatchOfRecentContact",
ADD_ACTIVE_CHAT = "nodeIKernelMsgService/getAioFirstViewLatestMsgsAndAddActiveChat", // 激活群助手内的聊天窗口,这样才能收到消息
ADD_ACTIVE_CHAT_2 = "nodeIKernelMsgService/getMsgsIncludeSelfAndAddActiveChat",
LIKE_FRIEND = "nodeIKernelProfileLikeService/setBuddyProfileLike",
SELF_INFO = "fetchAuthData",
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())
if (member) {
if (isNull(member.sex)){
log("获取群成员详细信息")
let info = (await NTQQUserApi.getUserDetailInfo(member.uid))
log("群成员详细信息结果", info)
Object.assign(member, info);
}
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转过来的文件
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) {
log("发送文件", path, payloadFileName || fileName)
sendElements.push(await SendMsgElementConstructor.file(path, payloadFileName || fileName));
} else if (sendMsg.type === OB11MessageDataType.video) {
log("发送视频", path, payloadFileName || fileName)
sendElements.push(await SendMsgElementConstructor.video(path, payloadFileName || fileName));
} else {
sendElements.push(await constructorMap[sendMsg.type](path));
} else if (sendMsg.type === OB11MessageDataType.voice) {
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),
age: 0,
area: "",
level: member.qqLevel && calcQQLevel(member.qqLevel) || 0,
level: 0,
qq_level: member.qqLevel && calcQQLevel(member.qqLevel) || 0,
join_time: 0, // 暂时没法获取
last_sent_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
last_sent_time?: number
level?: number
qq_level?: number
role?: OB11GroupMemberRole
title?: string
area?: string
@ -121,6 +122,9 @@ interface OB11MessageFileBase {
export interface OB11MessageImage extends OB11MessageFileBase {
type: OB11MessageDataType.image
data: OB11MessageFileBase['data'] & {
summary ? : string; // 图片摘要
}
}
export interface OB11MessageRecord extends OB11MessageFileBase {

View File

@ -90,8 +90,8 @@ async function onSettingWindowCreated(view: Element) {
], 'ob11.messagePostFormat', config.ob11.messagePostFormat),
),
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>`,
SettingButton('选择', 'config-ffmpeg-select'),
'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('选择ffmpeg', 'config-ffmpeg-select'),
),
SettingItem(
'', null,

View File

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