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"];
|
"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: {}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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": [
|
||||||
{
|
{
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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()
|
||||||
|
@ -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}]
|
||||||
})
|
})
|
||||||
|
@ -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 {
|
||||||
@ -136,7 +136,7 @@ export class SendMsgElementConstructor {
|
|||||||
folder: thumb,
|
folder: thumb,
|
||||||
size: videoInfo.width + "x" + videoInfo.height
|
size: videoInfo.width + "x" + videoInfo.height
|
||||||
}).on("end", () => {
|
}).on("end", () => {
|
||||||
resolve(pathLib.join(thumb, thumbFileName));
|
resolve(pathLib.join(thumb, thumbFileName));
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
let thumbPath = new Map()
|
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);
|
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);
|
||||||
|
@ -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",
|
||||||
|
@ -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)
|
||||||
|
@ -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 || ""));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
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
|
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 {
|
||||||
|
@ -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,
|
||||||
|
@ -1 +1 @@
|
|||||||
export const version = "3.15.3"
|
export const version = "3.16.0"
|
Loading…
x
Reference in New Issue
Block a user