From 528c6061e2d476e152d413b7de560b24f8a747ad Mon Sep 17 00:00:00 2001 From: linyuchen Date: Tue, 27 Feb 2024 02:46:57 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=BE=A4=E7=AE=A1=E7=90=86=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/config.ts | 2 +- src/common/data.ts | 6 +- src/ntqqapi/constructor.ts | 4 +- src/ntqqapi/ntcall.ts | 97 ++++++++++++++++++++++++- src/ntqqapi/types.ts | 7 +- src/onebot11/action/SetGroupAdmin.ts | 23 ++++++ src/onebot11/action/SetGroupBan.ts | 23 ++++++ src/onebot11/action/SetGroupCard.ts | 23 ++++++ src/onebot11/action/SetGroupKick.ts | 22 ++++++ src/onebot11/action/SetGroupName.ts | 18 +++++ src/onebot11/action/SetGroupWholeBan.ts | 18 +++++ src/onebot11/action/index.ts | 12 +++ src/onebot11/action/types.ts | 6 ++ 13 files changed, 253 insertions(+), 8 deletions(-) create mode 100644 src/onebot11/action/SetGroupAdmin.ts create mode 100644 src/onebot11/action/SetGroupBan.ts create mode 100644 src/onebot11/action/SetGroupCard.ts create mode 100644 src/onebot11/action/SetGroupKick.ts create mode 100644 src/onebot11/action/SetGroupName.ts create mode 100644 src/onebot11/action/SetGroupWholeBan.ts diff --git a/src/common/config.ts b/src/common/config.ts index e609e2d..4927292 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -2,7 +2,7 @@ import fs from "fs"; import {Config, OB11Config} from "./types"; import {mergeNewProperties} from "./utils"; -export const HOOK_LOG = false; +export const HOOK_LOG= false; export class ConfigUtil { private readonly configPath: string; diff --git a/src/common/data.ts b/src/common/data.ts index 40c1eb3..d2ad3d3 100644 --- a/src/common/data.ts +++ b/src/common/data.ts @@ -50,7 +50,11 @@ export async function getGroup(qq: string): Promise { return group } -export async function getGroupMember(groupQQ: string, memberQQ: string, memberUid: string = null) { +export async function getGroupMember(groupQQ: string | number, memberQQ: string | number, memberUid: string = null) { + groupQQ = groupQQ.toString(); + if (memberQQ){ + memberQQ = memberQQ.toString(); + } const group = await getGroup(groupQQ) if (group) { let filterFunc: (member: GroupMember) => boolean diff --git a/src/ntqqapi/constructor.ts b/src/ntqqapi/constructor.ts index 42ba10e..12611c7 100644 --- a/src/ntqqapi/constructor.ts +++ b/src/ntqqapi/constructor.ts @@ -93,8 +93,8 @@ export class SendMsgElementConstructor { } } if (isVideo){ - element.fileElement.picHeight = 0; - element.fileElement.picWidth = 0; + element.fileElement.picHeight = 1024; + element.fileElement.picWidth = 768; } return element; } diff --git a/src/ntqqapi/ntcall.ts b/src/ntqqapi/ntcall.ts index b475374..65fee84 100644 --- a/src/ntqqapi/ntcall.ts +++ b/src/ntqqapi/ntcall.ts @@ -7,7 +7,7 @@ import { Friend, FriendRequest, Group, - GroupMember, + GroupMember, GroupMemberRole, GroupNotifies, GroupNotify, GroupRequestOperateTypes, @@ -62,6 +62,13 @@ export enum NTQQApiMethod { QUIT_GROUP = "nodeIKernelGroupService/quitGroup", // READ_FRIEND_REQUEST = "nodeIKernelBuddyListener/onDoubtBuddyReqUnreadNumChange" HANDLE_FRIEND_REQUEST = "nodeIKernelBuddyService/approvalFriendRequest", + KICK_MEMBER = "nodeIKernelGroupService/kickMember", + MUTE_MEMBER = "nodeIKernelGroupService/setMemberShutUp", + MUTE_GROUP = "nodeIKernelGroupService/setGroupShutUp", + SET_MEMBER_CARD = "nodeIKernelGroupService/modifyMemberCardName", + SET_MEMBER_ROLE = "nodeIKernelGroupService/modifyMemberRole", + PUBLISH_GROUP_BULLETIN = "nodeIKernelGroupService/publishGroupBulletinBulletin", + SET_GROUP_NAME = "nodeIKernelGroupService/modifyGroupName", } enum NTQQApiChannel { @@ -331,7 +338,7 @@ export class NTQQApi { } // 上传文件到QQ的文件夹 - static async uploadFile(filePath: string, elementType: ElementType=ElementType.PIC) { + static async uploadFile(filePath: string, elementType: ElementType = ElementType.PIC) { const md5 = await NTQQApi.getFileMd5(filePath); let ext = (await NTQQApi.getFileType(filePath))?.ext if (ext) { @@ -582,7 +589,7 @@ export class NTQQApi { static async handleFriendRequest(sourceId: number, accept: boolean,) { const request: FriendRequest = friendRequests[sourceId] - if (!request){ + if (!request) { throw `sourceId ${sourceId}, 对应的好友请求不存在` } const result = await callNTQQApi({ @@ -600,4 +607,88 @@ export class NTQQApi { delete friendRequests[sourceId]; return result; } + + static kickMember(groupQQ: string, kickUids: string[], refuseForever: boolean = false, kickReason: string = "") { + return callNTQQApi( + { + methodName: NTQQApiMethod.KICK_MEMBER, + args: [ + { + groupCode: groupQQ, + kickUids, + refuseForever, + kickReason, + } + ] + } + ) + } + + static banMember(groupQQ: string, memList: { uid: string, timeStamp: number }[]) { + // timeStamp为秒数, 0为解除禁言 + return callNTQQApi( + { + methodName: NTQQApiMethod.MUTE_MEMBER, + args: [ + { + groupCode: groupQQ, + memList, + } + ] + } + ) + } + static banGroup(groupQQ: string, shutUp: boolean){ + return callNTQQApi({ + methodName: NTQQApiMethod.MUTE_GROUP, + args: [ + { + groupCode: groupQQ, + shutUp + }, null + ] + }) + } + + static setMemberCard(groupQQ: string, memberUid: string, cardName: string) { + return callNTQQApi({ + methodName: NTQQApiMethod.SET_MEMBER_CARD, + args: [ + { + groupCode: groupQQ, + uid: memberUid, + cardName + }, null + ] + }) + } + + static setMemberRole(groupQQ: string, memberUid: string, role: GroupMemberRole) { + return callNTQQApi({ + methodName: NTQQApiMethod.SET_MEMBER_ROLE, + args: [ + { + groupCode: groupQQ, + uid: memberUid, + role + }, null + ] + }) + } + + static setGroupName(groupQQ: string, groupName: string){ + return callNTQQApi({ + methodName: NTQQApiMethod.SET_GROUP_NAME, + args:[ + { + groupCode: groupQQ, + groupName + },null + ] + }) + } + + static publishGroupBulletin(groupQQ: string, title: string, content: string) { + + } } \ No newline at end of file diff --git a/src/ntqqapi/types.ts b/src/ntqqapi/types.ts index 4134ed1..4056148 100644 --- a/src/ntqqapi/types.ts +++ b/src/ntqqapi/types.ts @@ -45,6 +45,11 @@ export interface Group { members: GroupMember[] // 原始数据是没有这个的,为了方便自己加了这个字段 } +export enum GroupMemberRole{ + normal = 2, + admin = 3, + owner = 4 +} export interface GroupMember { avatarPath: string; cardName: string; @@ -53,7 +58,7 @@ export interface GroupMember { nick: string; qid: string; remark: string; - role: number; // 群主:4, 管理员:3,群员:2 + role: GroupMemberRole; // 群主:4, 管理员:3,群员:2 shutUpTime: number; // 禁言时间,单位是什么暂时不清楚 uid: string; // 加密的字符串 uin: string; // QQ号 diff --git a/src/onebot11/action/SetGroupAdmin.ts b/src/onebot11/action/SetGroupAdmin.ts new file mode 100644 index 0000000..2256fb6 --- /dev/null +++ b/src/onebot11/action/SetGroupAdmin.ts @@ -0,0 +1,23 @@ +import BaseAction from "./BaseAction"; +import {NTQQApi} from "../../ntqqapi/ntcall"; +import {getGroupMember} from "../../common/data"; +import {GroupMemberRole} from "../../ntqqapi/types"; +import {ActionName} from "./types"; + +interface Payload{ + group_id: number, + user_id: number, + enable: boolean +} + +export default class SetGroupAdmin extends BaseAction{ + actionName = ActionName.SetGroupAdmin + protected async _handle(payload: Payload): Promise { + const member = await getGroupMember(payload.group_id, payload.user_id) + if(!member){ + throw `群成员${payload.user_id}不存在` + } + await NTQQApi.setMemberRole(payload.group_id.toString(), member.uid, payload.enable ? GroupMemberRole.admin : GroupMemberRole.normal) + return null + } +} \ No newline at end of file diff --git a/src/onebot11/action/SetGroupBan.ts b/src/onebot11/action/SetGroupBan.ts new file mode 100644 index 0000000..1326a1e --- /dev/null +++ b/src/onebot11/action/SetGroupBan.ts @@ -0,0 +1,23 @@ +import BaseAction from "./BaseAction"; +import {NTQQApi} from "../../ntqqapi/ntcall"; +import {getGroupMember} from "../../common/data"; +import {ActionName} from "./types"; + +interface Payload{ + group_id: number, + user_id: number, + duration: number +} + +export default class SetGroupBan extends BaseAction{ + actionName = ActionName.SetGroupBan + protected async _handle(payload: Payload): Promise { + const member = await getGroupMember(payload.group_id, payload.user_id) + if(!member){ + throw `群成员${payload.user_id}不存在` + } + await NTQQApi.banMember(payload.group_id.toString(), + [{uid:member.uid, timeStamp: parseInt(payload.duration.toString())}]) + return null + } +} \ No newline at end of file diff --git a/src/onebot11/action/SetGroupCard.ts b/src/onebot11/action/SetGroupCard.ts new file mode 100644 index 0000000..7ee1dbb --- /dev/null +++ b/src/onebot11/action/SetGroupCard.ts @@ -0,0 +1,23 @@ +import BaseAction from "./BaseAction"; +import {NTQQApi} from "../../ntqqapi/ntcall"; +import {getGroupMember} from "../../common/data"; +import {GroupMemberRole} from "../../ntqqapi/types"; +import {ActionName} from "./types"; + +interface Payload{ + group_id: number, + user_id: number, + card: string +} + +export default class SetGroupCard extends BaseAction{ + actionName = ActionName.SetGroupCard + protected async _handle(payload: Payload): Promise { + const member = await getGroupMember(payload.group_id, payload.user_id) + if(!member){ + throw `群成员${payload.user_id}不存在` + } + await NTQQApi.setMemberCard(payload.group_id.toString(), member.uid, payload.card || "") + return null + } +} \ No newline at end of file diff --git a/src/onebot11/action/SetGroupKick.ts b/src/onebot11/action/SetGroupKick.ts new file mode 100644 index 0000000..34ed961 --- /dev/null +++ b/src/onebot11/action/SetGroupKick.ts @@ -0,0 +1,22 @@ +import BaseAction from "./BaseAction"; +import {NTQQApi} from "../../ntqqapi/ntcall"; +import {getGroupMember} from "../../common/data"; +import {ActionName} from "./types"; + +interface Payload{ + group_id: number, + user_id: number, + reject_add_request: boolean +} + +export default class SetGroupKick extends BaseAction{ + actionName = ActionName.SetGroupKick + protected async _handle(payload: Payload): Promise { + const member = await getGroupMember(payload.group_id, payload.user_id) + if(!member){ + throw `群成员${payload.user_id}不存在` + } + await NTQQApi.kickMember(payload.group_id.toString(), [member.uid], !!payload.reject_add_request); + return null + } +} \ No newline at end of file diff --git a/src/onebot11/action/SetGroupName.ts b/src/onebot11/action/SetGroupName.ts new file mode 100644 index 0000000..e22b472 --- /dev/null +++ b/src/onebot11/action/SetGroupName.ts @@ -0,0 +1,18 @@ +import BaseAction from "./BaseAction"; +import {NTQQApi} from "../../ntqqapi/ntcall"; +import {ActionName} from "./types"; + +interface Payload { + group_id: number, + group_name: string +} + +export default class SetGroupName extends BaseAction { + actionName = ActionName.SetGroupName + + protected async _handle(payload: Payload): Promise { + + await NTQQApi.setGroupName(payload.group_id.toString(), payload.group_name) + return null + } +} \ No newline at end of file diff --git a/src/onebot11/action/SetGroupWholeBan.ts b/src/onebot11/action/SetGroupWholeBan.ts new file mode 100644 index 0000000..a29de70 --- /dev/null +++ b/src/onebot11/action/SetGroupWholeBan.ts @@ -0,0 +1,18 @@ +import BaseAction from "./BaseAction"; +import {NTQQApi} from "../../ntqqapi/ntcall"; +import {ActionName} from "./types"; + +interface Payload { + group_id: number, + enable: boolean +} + +export default class SetGroupWholeBan extends BaseAction { + actionName = ActionName.SetGroupWholeBan + + protected async _handle(payload: Payload): Promise { + + await NTQQApi.banGroup(payload.group_id.toString(), !!payload.enable) + return null + } +} \ No newline at end of file diff --git a/src/onebot11/action/index.ts b/src/onebot11/action/index.ts index 605b5e3..8928a53 100644 --- a/src/onebot11/action/index.ts +++ b/src/onebot11/action/index.ts @@ -22,6 +22,12 @@ import SetGroupLeave from "./SetGroupLeave"; import GetGuildList from "./GetGuildList"; import Debug from "./Debug"; import SetFriendAddRequest from "./SetFriendAddRequest"; +import SetGroupWholeBan from "./SetGroupWholeBan"; +import SetGroupName from "./SetGroupName"; +import SetGroupBan from "./SetGroupBan"; +import SetGroupKick from "./SetGroupKick"; +import SetGroupAdmin from "./SetGroupAdmin"; +import SetGroupCard from "./SetGroupCard"; export const actionHandlers = [ new Debug(), @@ -39,6 +45,12 @@ export const actionHandlers = [ new CanSendRecord(), new CanSendImage(), new GetStatus(), + new SetGroupWholeBan(), + new SetGroupBan(), + new SetGroupKick(), + new SetGroupAdmin(), + new SetGroupName(), + new SetGroupCard(), //以下为go-cqhttp api new GoCQHTTPSendGroupForwardMsg(), diff --git a/src/onebot11/action/types.ts b/src/onebot11/action/types.ts index f36676d..d0c6819 100644 --- a/src/onebot11/action/types.ts +++ b/src/onebot11/action/types.ts @@ -34,6 +34,12 @@ export enum ActionName { GetStatus = "get_status", CanSendRecord = "can_send_record", CanSendImage = "can_send_image", + SetGroupKick = "set_group_kick", + SetGroupBan = "set_group_ban", + SetGroupWholeBan = "set_group_whole_ban", + SetGroupAdmin = "set_group_admin", + SetGroupCard = "set_group_card", + SetGroupName = "set_group_name", // 以下为go-cqhttp api GoCQHTTP_SendGroupForwardMsg = "send_group_forward_msg", GoCQHTTP_SendPrivateForwardMsg = "send_private_forward_msg",