mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2025-07-19 12:03:37 +00:00
Merge branch 'NapNeko:main' into main
This commit is contained in:
@@ -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++;
|
||||||
|
@@ -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) {
|
||||||
|
@@ -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>;
|
||||||
|
|
||||||
|
@@ -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
|
||||||
}
|
}
|
||||||
|
@@ -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 {
|
||||||
|
@@ -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());
|
|
||||||
}
|
|
||||||
}
|
|
@@ -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),
|
||||||
|
@@ -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',
|
||||||
|
Reference in New Issue
Block a user