mirror of
https://github.com/LLOneBot/LLOneBot.git
synced 2024-11-22 01:56:33 +00:00
refactor: member qq_level
This commit is contained in:
parent
60e0c9e4ba
commit
af8cf1882c
@ -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: {}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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": [
|
||||
{
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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}]
|
||||
})
|
||||
|
@ -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
28
src/ntqqapi/external/ccpoke/index.ts
vendored
Normal 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);
|
||||
})
|
||||
}
|
BIN
src/ntqqapi/external/ccpoke/poke-win32-x64.node
vendored
Normal file
BIN
src/ntqqapi/external/ccpoke/poke-win32-x64.node
vendored
Normal file
Binary file not shown.
@ -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);
|
||||
|
@ -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",
|
||||
|
@ -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)
|
||||
|
@ -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 || ""));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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,
|
||||
|
31
src/onebot11/event/notice/OB11PokeEvent.ts
Normal file
31
src/onebot11/event/notice/OB11PokeEvent.ts
Normal 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;
|
||||
}
|
||||
}
|
@ -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 {
|
||||
|
@ -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,
|
||||
|
@ -1 +1 @@
|
||||
export const version = "3.15.3"
|
||||
export const version = "3.16.0"
|
Loading…
x
Reference in New Issue
Block a user