diff --git a/manifest.json b/manifest.json index f7bc811..adf90a4 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "name": "LLOneBot", "slug": "LLOneBot", "description": "实现 OneBot 11 和 Satori 协议,用于 QQ 机器人开发", - "version": "4.2.2", + "version": "4.3.0", "icon": "./icon.webp", "authors": [ { diff --git a/src/main/main.ts b/src/main/main.ts index e2e751d..6ea0f55 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -35,6 +35,7 @@ import { NTQQWindowApi } from '../ntqqapi/api' import { existsSync, mkdirSync } from 'node:fs' +import { NTQQSystemApi } from '@/ntqqapi/api/system' declare module 'cordis' { interface Events { @@ -74,6 +75,7 @@ function onLoad() { ctx.plugin(NTQQWebApi) ctx.plugin(NTQQWindowApi) ctx.plugin(Database) + ctx.plugin(NTQQSystemApi) let started = false diff --git a/src/ntqqapi/api/friend.ts b/src/ntqqapi/api/friend.ts index f1ad644..2effc92 100644 --- a/src/ntqqapi/api/friend.ts +++ b/src/ntqqapi/api/friend.ts @@ -107,7 +107,8 @@ export class NTQQFriendApi extends Service { return ret.arkMsg } - async setBuddyRemark(uid: string, remark: string) { + async setBuddyRemark(uid: string, remark?: string) { + remark = remark ?? '' return await invoke('nodeIKernelBuddyService/setBuddyRemark', [{ remarkParams: { uid, remark } }]) @@ -122,4 +123,8 @@ export class NTQQFriendApi extends Service { } }]) } + + async setBuddyCategory(uid: string, categoryId: number) { + return await invoke('nodeIKernelBuddyService/setBuddyCategory', [{uid, categoryId}]) + } } diff --git a/src/ntqqapi/api/group.ts b/src/ntqqapi/api/group.ts index e6aacd2..102c819 100644 --- a/src/ntqqapi/api/group.ts +++ b/src/ntqqapi/api/group.ts @@ -22,6 +22,12 @@ declare module 'cordis' { } } +export enum GroupMsgMask { + ALLOW_NOTIFY = 1, // 允许提醒 + ALLOW_NOT_NOTIFY = 4, // 接受消息不提醒 + BOX_NOT_NOTIFY = 2, // 收进群助手不提醒 + NOT_ALLOW = 3, // 屏蔽 +} export class NTQQGroupApi extends Service { static inject = ['ntWindowApi'] @@ -341,4 +347,13 @@ export class NTQQGroupApi extends Service { [{ groupId }] ) } + + async setGroupMsgMask(groupCode: string, msgMask: GroupMsgMask){ + return await invoke('nodeIKernelGroupService/setGroupMsgMask', [{ groupCode, msgMask }]) + } + + async setGroupRemark(groupCode: string, groupRemark?: string) { + groupRemark = groupRemark ?? '' + return await invoke('nodeIKernelGroupService/modifyGroupRemark', [{ groupCode, groupRemark }]) + } } diff --git a/src/ntqqapi/api/system.ts b/src/ntqqapi/api/system.ts new file mode 100644 index 0000000..9b3239c --- /dev/null +++ b/src/ntqqapi/api/system.ts @@ -0,0 +1,39 @@ +import { Context, Service } from 'cordis' +import { invoke, NTClass } from '@/ntqqapi/ntcall' + +declare module 'cordis' { + interface Context { + ntSystemApi: NTQQSystemApi + } +} + +export class NTQQSystemApi extends Service { + static inject = ['ntUserApi'] + + constructor(protected ctx: Context) { + super(ctx, 'ntSystemApi', true) + } + + async restart(){ + // todo: 调用此接口后会将 NTQQ 设置里面的自动登录和无需手机确认打开,重启后将状态恢复到之前的状态 + + // 设置自动登录 + await this.setSettingAutoLogin(true) + // 退出账号 + invoke('quitAccount', [], { + className: NTClass.BUSINESS_API + }).then() + invoke('notifyQQClose', [{ type: 1 }], { className: NTClass.QQ_EX_API }).then() + // 等待登录界面,模拟点击登录按钮?还是直接调用登录方法? + } + + // 是否自动登录 + async getSettingAutoLogin(): Promise<boolean>{ + return invoke('nodeIKernelNodeMiscService/queryAutoRun', []) + } + async setSettingAutoLogin(state: boolean){ + await invoke('nodeIKernelSettingService/setNeedConfirmSwitch', [{state: 1}]) // 1:不需要手机确认,2:需要手机确认 + + await invoke('nodeIKernelSettingService/setAutoLoginSwitch', [{state}]) + } +} diff --git a/src/ntqqapi/hook.ts b/src/ntqqapi/hook.ts index 9443019..cf04bbb 100644 --- a/src/ntqqapi/hook.ts +++ b/src/ntqqapi/hook.ts @@ -28,7 +28,7 @@ export enum ReceiveCmdS { MEDIA_UPLOAD_COMPLETE = 'nodeIKernelMsgListener/onRichMediaUploadComplete', } -const logHook = false +const logHook = true const receiveHooks: Map<string, { method: ReceiveCmdS[] diff --git a/src/ntqqapi/ntcall.ts b/src/ntqqapi/ntcall.ts index 431937b..01268da 100644 --- a/src/ntqqapi/ntcall.ts +++ b/src/ntqqapi/ntcall.ts @@ -29,7 +29,8 @@ export enum NTClass { SKEY_API = 'ns-SkeyApi', GROUP_HOME_WORK = 'ns-GroupHomeWork', GROUP_ESSENCE = 'ns-GroupEssence', - NODE_STORE_API = 'ns-NodeStoreApi' + NODE_STORE_API = 'ns-NodeStoreApi', + QQ_EX_API = 'ns-QQEXApi', } export enum NTMethod { diff --git a/src/onebot11/action/index.ts b/src/onebot11/action/index.ts index 665698e..85c39d6 100644 --- a/src/onebot11/action/index.ts +++ b/src/onebot11/action/index.ts @@ -80,6 +80,11 @@ import { GetGroupFileSystemInfo } from './go-cqhttp/GetGroupFileSystemInfo' import { GetCredentials } from './system/GetCredentials' import { SetGroupSpecialTitle } from '@/onebot11/action/go-cqhttp/SetGroupSpecialTitle' import { SendGroupSign } from '@/onebot11/action/go-cqhttp/SendGroupSign' +import { SetRestart } from '@/onebot11/action/system/SetRestart' +import { SetFriendCategory } from '@/onebot11/action/llonebot/SetFriendCategory' +import { SetFriendRemark } from '@/onebot11/action/llonebot/SetFriendRemark' +import { SetGroupMsgMask } from '@/onebot11/action/llonebot/SetGroupMsgMask' +import { SetGroupRemark } from '@/onebot11/action/llonebot/SetGroupRemark' export function initActionMap(adapter: Adapter) { const actionHandlers = [ @@ -100,6 +105,10 @@ export function initActionMap(adapter: Adapter) { new GetRobotUinRange(adapter), new GroupPoke(adapter), new FriendPoke(adapter), + new SetFriendCategory(adapter), + new SetFriendRemark(adapter), + new SetGroupMsgMask(adapter), + new SetGroupRemark(adapter), // onebot11 new SendLike(adapter), new GetMsg(adapter), @@ -133,6 +142,7 @@ export function initActionMap(adapter: Adapter) { new ForwardFriendSingleMsg(adapter), new ForwardGroupSingleMsg(adapter), new GetCredentials(adapter), + new SetRestart(adapter), // go-cqhttp new GetEssenceMsgList(adapter), new GetGroupHonorInfo(adapter), diff --git a/src/onebot11/action/llonebot/SetFriendCategory.ts b/src/onebot11/action/llonebot/SetFriendCategory.ts new file mode 100644 index 0000000..c2ffe9c --- /dev/null +++ b/src/onebot11/action/llonebot/SetFriendCategory.ts @@ -0,0 +1,17 @@ +import { BaseAction } from '../BaseAction' +import { ActionName } from '../types' + +interface Payload { + user_id: string, + category_id: number +} + +export class SetFriendCategory extends BaseAction<Payload, null> { + actionName = ActionName.SetFriendCategory + + protected async _handle(payload: Payload): Promise<null> { + const uid = await this.ctx.ntUserApi.getUidByUin(payload.user_id.toString()) + if (!uid) throw new Error('无法获取好友信息') + return this.ctx.ntFriendApi.setBuddyCategory(uid, +payload.category_id) + } +} diff --git a/src/onebot11/action/llonebot/SetFriendRemark.ts b/src/onebot11/action/llonebot/SetFriendRemark.ts new file mode 100644 index 0000000..5083cbb --- /dev/null +++ b/src/onebot11/action/llonebot/SetFriendRemark.ts @@ -0,0 +1,17 @@ +import { BaseAction } from '../BaseAction' +import { ActionName } from '../types' + +interface Payload { + user_id: string, + remark?: string +} + +export class SetFriendRemark extends BaseAction<Payload, null> { + actionName = ActionName.SetFriendRemark + + protected async _handle(payload: Payload): Promise<null> { + const uid = await this.ctx.ntUserApi.getUidByUin(payload.user_id.toString()) + if (!uid) throw new Error('无法获取好友信息') + return this.ctx.ntFriendApi.setBuddyRemark(uid, payload.remark || '') + } +} diff --git a/src/onebot11/action/llonebot/SetGroupMsgMask.ts b/src/onebot11/action/llonebot/SetGroupMsgMask.ts new file mode 100644 index 0000000..dd1802a --- /dev/null +++ b/src/onebot11/action/llonebot/SetGroupMsgMask.ts @@ -0,0 +1,16 @@ +import { BaseAction } from '../BaseAction' +import { ActionName } from '../types' +import { GroupMsgMask } from '@/ntqqapi/api' + +interface Payload { + group_id: string, + mask: GroupMsgMask +} + +export class SetGroupMsgMask extends BaseAction<Payload, unknown> { + actionName = ActionName.SetGroupMsgMask + + protected async _handle(payload: Payload): Promise<unknown>{ + return this.ctx.ntGroupApi.setGroupMsgMask(payload.group_id.toString(), +payload.mask) + } +} diff --git a/src/onebot11/action/llonebot/SetGroupRemark.ts b/src/onebot11/action/llonebot/SetGroupRemark.ts new file mode 100644 index 0000000..d00d545 --- /dev/null +++ b/src/onebot11/action/llonebot/SetGroupRemark.ts @@ -0,0 +1,15 @@ +import { BaseAction } from '../BaseAction' +import { ActionName } from '../types' + +interface Payload { + group_id: string, + remark?: string +} + +export class SetGroupRemark extends BaseAction<Payload, unknown> { + actionName = ActionName.SetGroupRemark + + protected async _handle(payload: Payload): Promise<unknown>{ + return this.ctx.ntGroupApi.setGroupRemark(payload.group_id.toString(), payload.remark) + } +} diff --git a/src/onebot11/action/system/SetRestart.ts b/src/onebot11/action/system/SetRestart.ts new file mode 100644 index 0000000..72badaf --- /dev/null +++ b/src/onebot11/action/system/SetRestart.ts @@ -0,0 +1,10 @@ +import { BaseAction } from '@/onebot11/action/BaseAction' +import { ActionName } from '@/onebot11/action/types' + +export class SetRestart extends BaseAction<null, void> { + actionName = ActionName.SetRestart + + protected async _handle() { + await this.ctx.ntSystemApi.restart() + } +} diff --git a/src/onebot11/action/types.ts b/src/onebot11/action/types.ts index 126db44..7441789 100644 --- a/src/onebot11/action/types.ts +++ b/src/onebot11/action/types.ts @@ -29,6 +29,10 @@ export enum ActionName { GetRobotUinRange = 'get_robot_uin_range', GroupPoke = 'group_poke', FriendPoke = 'friend_poke', + SetFriendRemark = 'set_friend_remark', + SetFriendCategory = 'set_friend_category', + SetGroupMsgMask = 'set_group_msg_mask', + SetGroupRemark = 'set_group_remark', // onebot 11 SendLike = 'send_like', GetLoginInfo = 'get_login_info', @@ -47,6 +51,7 @@ export enum ActionName { SetGroupLeave = 'set_group_leave', GetVersionInfo = 'get_version_info', GetStatus = 'get_status', + SetRestart = 'set_restart', CanSendRecord = 'can_send_record', CanSendImage = 'can_send_image', SetGroupKick = 'set_group_kick', diff --git a/src/version.ts b/src/version.ts index 9c9f404..b92cf30 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1 +1 @@ -export const version = '4.2.2' +export const version = '4.3.0'