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

View File

@@ -9,10 +9,12 @@ import {
NapCatCore,
GroupNotify,
GroupInfoSource,
ShutUpGroupMember,
} from '@/core';
import { isNumeric, solveAsyncProblem } from '@/common/helper';
import { LimitedHashTable } from '@/common/message-unique';
import { NTEventWrapper } from '@/common/event';
import { CancelableTask, TaskExecutor } from '@/common/cancel-task';
export class NTQQGroupApi {
context: InstanceContext;
@@ -58,9 +60,28 @@ export class NTQQGroupApi {
}
async getGroupShutUpMemberList(groupCode: string) {
const data = this.core.eventWrapper.registerListen('NodeIKernelGroupListener/onShutUpMemberListChanged', (group_id) => group_id === groupCode, 1, 1000);
this.context.session.getGroupService().getGroupShutUpMemberList(groupCode);
return (await data)[1];
const executor: TaskExecutor<ShutUpGroupMember[]> = async (resolve, reject, onCancel) => {
this.core.eventWrapper.registerListen(
'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) {

View File

@@ -251,7 +251,7 @@ export interface NodeIKernelGroupService {
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>;

View File

@@ -1,4 +1,4 @@
import { BuddyProfileLikeReq, GeneralCallResult } from '@/core';
import { BuddyProfileLikeReq, GeneralCallResult, NTVoteInfo } from '@/core';
export interface NodeIKernelProfileLikeService {
addKernelProfileLikeListener(listener: unknown): number;
@@ -9,7 +9,16 @@ export interface NodeIKernelProfileLikeService {
getBuddyProfileLike(req: BuddyProfileLikeReq): Promise<GeneralCallResult & {
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,
start: number
}

View File

@@ -5,6 +5,25 @@ export enum NTSex {
GENDER_FEMALE = 2,
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 {

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

View File

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