Merge branch 'NapNeko:main' into main

This commit is contained in:
bietiaop
2025-01-24 21:13:57 +08:00
committed by GitHub
8 changed files with 77 additions and 44 deletions

View File

@@ -1,4 +1,4 @@
export type TaskExecutor<T> = (resolve: (value: T | PromiseLike<T>) => void, reject: (reason?: any) => void, onCancel: (callback: () => void) => void) => void; export type TaskExecutor<T> = (resolve: (value: T | PromiseLike<T>) => void, reject: (reason?: any) => void, onCancel: (callback: () => void) => void) => void | Promise<void>;
export class CancelableTask<T> { export class CancelableTask<T> {
private promise: Promise<T>; private promise: Promise<T>;
@@ -7,24 +7,30 @@ export class CancelableTask<T> {
private cancelListeners: Array<() => void> = []; private cancelListeners: Array<() => void> = [];
constructor(executor: TaskExecutor<T>) { constructor(executor: TaskExecutor<T>) {
this.promise = new Promise<T>((resolve, reject) => { this.promise = new Promise<T>(async (resolve, reject) => {
const onCancel = (callback: () => void) => { const onCancel = (callback: () => void) => {
this.cancelCallback = callback; this.cancelCallback = callback;
}; };
executor( try {
(value) => { await executor(
if (!this.isCanceled) { (value) => {
resolve(value); if (!this.isCanceled) {
} resolve(value);
}, }
(reason) => { },
if (!this.isCanceled) { (reason) => {
reject(reason); if (!this.isCanceled) {
} reject(reason);
}, }
onCancel },
); onCancel
);
} catch (error) {
if (!this.isCanceled) {
reject(error);
}
}
}); });
} }
@@ -68,9 +74,8 @@ export class CancelableTask<T> {
} }
} }
async function demoAwait() { async function demoAwait() {
const executor: TaskExecutor<number> = (resolve, reject, onCancel) => { const executor: TaskExecutor<number> = async (resolve, reject, onCancel) => {
let count = 0; let count = 0;
const intervalId = setInterval(() => { const intervalId = setInterval(() => {
count++; count++;

View File

@@ -9,10 +9,12 @@ import {
NapCatCore, NapCatCore,
GroupNotify, GroupNotify,
GroupInfoSource, GroupInfoSource,
ShutUpGroupMember,
} from '@/core'; } from '@/core';
import { isNumeric, solveAsyncProblem } from '@/common/helper'; import { isNumeric, solveAsyncProblem } from '@/common/helper';
import { LimitedHashTable } from '@/common/message-unique'; import { LimitedHashTable } from '@/common/message-unique';
import { NTEventWrapper } from '@/common/event'; import { NTEventWrapper } from '@/common/event';
import { CancelableTask, TaskExecutor } from '@/common/cancel-task';
export class NTQQGroupApi { export class NTQQGroupApi {
context: InstanceContext; context: InstanceContext;
@@ -58,9 +60,28 @@ export class NTQQGroupApi {
} }
async getGroupShutUpMemberList(groupCode: string) { async getGroupShutUpMemberList(groupCode: string) {
const data = this.core.eventWrapper.registerListen('NodeIKernelGroupListener/onShutUpMemberListChanged', (group_id) => group_id === groupCode, 1, 1000); const executor: TaskExecutor<ShutUpGroupMember[]> = async (resolve, reject, onCancel) => {
this.context.session.getGroupService().getGroupShutUpMemberList(groupCode); this.core.eventWrapper.registerListen(
return (await data)[1]; 'NodeIKernelGroupListener/onShutUpMemberListChanged',
(group_id) => group_id === groupCode,
1,
1000
).then((data) => {
resolve(data[1])
}).catch(reject);
onCancel(() => {
reject(new Error('Task was canceled'));
});
};
const task = new CancelableTask(executor);
this.context.session.getGroupService().getGroupShutUpMemberList(groupCode).then(e => {
if (e.result !== 0) {
task.cancel()
}
})
return await task.catch(() => []);
} }
async clearGroupNotifiesUnreadCount(doubt: boolean) { async clearGroupNotifiesUnreadCount(doubt: boolean) {

View File

@@ -251,7 +251,7 @@ export interface NodeIKernelGroupService {
setGroupShutUp(groupCode: string, shutUp: boolean): void; setGroupShutUp(groupCode: string, shutUp: boolean): void;
getGroupShutUpMemberList(groupCode: string): Promise<any>; getGroupShutUpMemberList(groupCode: string): Promise<GeneralCallResult>;
setMemberShutUp(groupCode: string, memberTimes: { uid: string, timeStamp: number }[]): Promise<void>; setMemberShutUp(groupCode: string, memberTimes: { uid: string, timeStamp: number }[]): Promise<void>;

View File

@@ -1,4 +1,4 @@
import { BuddyProfileLikeReq, GeneralCallResult } from '@/core'; import { BuddyProfileLikeReq, GeneralCallResult, NTVoteInfo } from '@/core';
export interface NodeIKernelProfileLikeService { export interface NodeIKernelProfileLikeService {
addKernelProfileLikeListener(listener: unknown): number; addKernelProfileLikeListener(listener: unknown): number;
@@ -9,7 +9,16 @@ export interface NodeIKernelProfileLikeService {
getBuddyProfileLike(req: BuddyProfileLikeReq): Promise<GeneralCallResult & { getBuddyProfileLike(req: BuddyProfileLikeReq): Promise<GeneralCallResult & {
info: { info: {
userLikeInfos: Array<any>, userLikeInfos: Array<{
voteInfo: {
total_count: number,
new_count: number,
new_nearby_count: number,
last_visit_time: number,
userInfos: Array<NTVoteInfo>
}
}>,
friendMaxVotes: number, friendMaxVotes: number,
start: number start: number
} }

View File

@@ -5,6 +5,25 @@ export enum NTSex {
GENDER_FEMALE = 2, GENDER_FEMALE = 2,
GENDER_PRIVACY = 255, GENDER_PRIVACY = 255,
} }
export interface NTVoteInfo {
age: number;
bAvailableCnt: number;
bTodayVotedCnt: number;
count: number;
customId: number;
gender: number;
giftCount: number;
isFriend: boolean;
isSvip: boolean;
isvip: boolean;
lastCharged: number;
latestTime: number;
nick: string;
src: number;
uid: string;
uin: number;
}
// 好友分类类型 // 好友分类类型
export interface BuddyCategoryType { export interface BuddyCategoryType {

View File

@@ -1,17 +0,0 @@
import { OneBotAction } from '@/onebot/action/OneBotAction';
import { ActionName } from '@/onebot/action/router';
import { Type, Static } from '@sinclair/typebox';
const SchemaData = Type.Object({
user_id: Type.Union([Type.Number(), Type.String()]),
});
type Payload = Static<typeof SchemaData>;
export class FetchUserProfileLike extends OneBotAction<Payload, any> {
actionName = ActionName.FetchUserProfileLike;
payloadSchema = SchemaData;
async _handle(payload: Payload) {
return await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString());
}
}

View File

@@ -66,7 +66,6 @@ import SetGroupPortrait from './go-cqhttp/SetGroupPortrait';
import { FetchCustomFace } from './extends/FetchCustomFace'; import { FetchCustomFace } from './extends/FetchCustomFace';
import GoCQHTTPUploadPrivateFile from './go-cqhttp/UploadPrivateFile'; import GoCQHTTPUploadPrivateFile from './go-cqhttp/UploadPrivateFile';
import { FetchEmojiLike } from './extends/FetchEmojiLike'; import { FetchEmojiLike } from './extends/FetchEmojiLike';
import { FetchUserProfileLike } from './extends/FetchUserProfileLike';
import { NapCatCore } from '@/core'; import { NapCatCore } from '@/core';
import { NapCatOneBot11Adapter } from '@/onebot'; import { NapCatOneBot11Adapter } from '@/onebot';
import { SetInputStatus } from './extends/SetInputStatus'; import { SetInputStatus } from './extends/SetInputStatus';
@@ -205,8 +204,6 @@ export function createActionMap(obContext: NapCatOneBot11Adapter, core: NapCatCo
new DeleteGroupFileFolder(obContext, core), new DeleteGroupFileFolder(obContext, core),
new GetGroupFileSystemInfo(obContext, core), new GetGroupFileSystemInfo(obContext, core),
new GetGroupFilesByFolder(obContext, core), new GetGroupFilesByFolder(obContext, core),
new GetGroupSystemMsg(obContext, core),
new FetchUserProfileLike(obContext, core),
new GetPacketStatus(obContext, core), new GetPacketStatus(obContext, core),
new GroupPoke(obContext, core), new GroupPoke(obContext, core),
new FriendPoke(obContext, core), new FriendPoke(obContext, core),

View File

@@ -122,7 +122,6 @@ export const ActionName = {
GetGroupInfoEx: 'get_group_info_ex', GetGroupInfoEx: 'get_group_info_ex',
GetGroupIgnoreAddRequest: 'get_group_ignore_add_request', GetGroupIgnoreAddRequest: 'get_group_ignore_add_request',
DelGroupNotice: '_del_group_notice', DelGroupNotice: '_del_group_notice',
FetchUserProfileLike: 'fetch_user_profile_like',
FriendPoke: 'friend_poke', FriendPoke: 'friend_poke',
GroupPoke: 'group_poke', GroupPoke: 'group_poke',
GetPacketStatus: 'nc_get_packet_status', GetPacketStatus: 'nc_get_packet_status',