Skip to content

Commit

Permalink
feat: napcat spoiler
Browse files Browse the repository at this point in the history
  • Loading branch information
clansty committed Dec 11, 2024
1 parent 93eb3c4 commit 724d0c4
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 9 deletions.
26 changes: 25 additions & 1 deletion main/src/client/NapCatClient/client.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import { CreateQQClientParamsBase, Friend, FriendIncreaseEvent, Group, GroupMemberDecreaseEvent, GroupMemberIncreaseEvent, MessageEvent, MessageRecallEvent, PokeEvent, QQClient } from '../QQClient';
import { CreateQQClientParamsBase, Friend, FriendIncreaseEvent, Group, GroupMemberDecreaseEvent, GroupMemberIncreaseEvent, MessageEvent, MessageRecallEvent, PokeEvent, QQClient, SendableElem } from '../QQClient';
import random from '../../utils/random';
import { getLogger, Logger } from 'log4js';
import posthog from '../../models/posthog';
import type { Receive, WSReceiveHandler, WSSendParam, WSSendReturn } from 'node-napcat-ts';
import { NapCatFriend, NapCatGroup } from './entity';
import { napCatReceiveToMessageElem } from './convert';
import { NapCatFriendRequestEvent, NapCatGroupEvent, NapCatGroupInviteEvent } from './event';
import type { ImageElem } from '@icqqjs/icqq';

export interface CreateNapCatParams extends CreateQQClientParamsBase {
type: 'napcat';
Expand Down Expand Up @@ -230,4 +231,27 @@ export class NapCatClient extends QQClient {
public pickGroup(groupId: number): Promise<Group> {
return NapCatGroup.create(this, groupId);
}

override async createSpoilerImageEndpoint(image: ImageElem, nickname: string, title?: string): Promise<SendableElem[]> {
const res: SendableElem[] = [
{
type: 'node',
user_id: this.uin,
nickname,
message: image,
},
];
if (title) {
res.push({
type: 'node',
user_id: this.uin,
nickname,
message: {
type: 'text',
text: title,
}
});
}
return res;
}
}
18 changes: 18 additions & 0 deletions main/src/client/NapCatClient/convert.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,24 @@ export const messageElemToNapCatSendable = async (elem: SendableElem): Promise<{
} as any,
tempFiles,
};
case 'node': {
let message = elem.message;
if (!Array.isArray(message)) {
message = [message];
}
const forward = await Promise.all(message.map(it => messageElemToNapCatSendable(typeof it === 'string' ? { type: 'text', text: it } : it as SendableElem)));
return {
elem: {
type: 'node',
data: {
user_id: elem.user_id,
nickname: elem.nickname,
content: forward.map(it => it.elem),
},
} as any,
tempFiles: forward.flatMap(it => it.tempFiles),
};
}
case 'sface':
default:
throw new Error('不支持此元素');
Expand Down
33 changes: 28 additions & 5 deletions main/src/client/NapCatClient/entity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,27 @@ import posthog from '../../models/posthog';
import type { Send, WSSendReturn } from 'node-napcat-ts';
import { FileResult } from 'tmp-promise';

const createSpoilerExtra = (chain: Sendable) => {
if (!Array.isArray(chain)) throw new Error('喵喵喵?(!Array.isArray(chain))');
const rChain = chain.filter(it => typeof it === 'object' && it.type === 'node');
const last = rChain[rChain.length - 1];
const text = (typeof last.message === 'object' && !Array.isArray(last.message) && last.message.type === 'text') ? last.message.text : '';
const news = [{
text: 'Spoiler 图片',
}];
if (text) {
news.push({ text });
}
news.push({
text: '请谨慎查看',
});
return {
prompt: '[Spoiler 图片]',
summary: 'Powered by Q2TG',
source: `${rChain[0].nickname}:`,
};
};

export abstract class NapCatEntity implements QQEntity {
protected logger: Logger;

Expand Down Expand Up @@ -38,9 +59,9 @@ export abstract class NapCatEntity implements QQEntity {
}
}

protected abstract sendMsgImpl(message: Send[keyof Send][]): Promise<MessageRet>;
protected abstract sendMsgImpl(message: Send[keyof Send][], extra?: Record<string, any>): Promise<MessageRet>;

async sendMsg(content: Sendable, source?: Quotable): Promise<MessageRet> {
async sendMsg(content: Sendable, source?: Quotable, isSpoiler?: boolean): Promise<MessageRet> {
if (!Array.isArray(content)) {
content = [content];
}
Expand All @@ -67,7 +88,7 @@ export abstract class NapCatEntity implements QQEntity {
});
}

const ret = await this.sendMsgImpl(message);
const ret = await this.sendMsgImpl(message, isSpoiler ? createSpoilerExtra(content) : {});
tmpFiles.forEach(it => it.cleanup());
return ret;
}
Expand All @@ -88,9 +109,10 @@ abstract class NapCatUser extends NapCatEntity implements QQUser {
super(client);
}

protected async sendMsgImpl(message: Send[keyof Send][]): Promise<MessageRet> {
protected async sendMsgImpl(message: Send[keyof Send][], extra = {}): Promise<MessageRet> {
const data = await this.client.callApi('send_private_msg', {
user_id: this.uid,
...extra,
// @ts-ignore 库的问题
message,
});
Expand Down Expand Up @@ -183,9 +205,10 @@ export class NapCatGroup extends NapCatEntity implements Group {
return data;
}

protected async sendMsgImpl(message: Send[keyof Send][]): Promise<MessageRet> {
protected async sendMsgImpl(message: Send[keyof Send][], extra = {}): Promise<MessageRet> {
const data = await this.client.callApi('send_group_msg', {
group_id: this.gid,
...extra,
// @ts-ignore 库的问题
message,
});
Expand Down
6 changes: 3 additions & 3 deletions main/src/client/QQClient/entity.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import type { MessageElem, MessageRet, MfaceElem, Quotable } from '@icqqjs/icqq';
import { Gender, GroupRole } from '@icqqjs/icqq/lib/common';
import { AtElem, FaceElem, ImageElem, PttElem, TextElem, VideoElem } from '@icqqjs/icqq/lib/message/elements';
import { AtElem, FaceElem, ForwardNode, ImageElem, PttElem, TextElem, VideoElem } from '@icqqjs/icqq/lib/message/elements';

// 全平台支持的 Elem
export type SendableElem = TextElem | FaceElem | ImageElem | AtElem | PttElem | VideoElem | MfaceElem;
export type SendableElem = TextElem | FaceElem | ImageElem | AtElem | PttElem | VideoElem | MfaceElem | ForwardNode;
export type Sendable = SendableElem | string | (SendableElem | string)[];

export interface QQEntity {
Expand All @@ -16,7 +16,7 @@ export interface QQEntity {

recallMsg(seqOrMessageId: number, rand?: number, timeOrPktNum?: number): Promise<boolean>;

sendMsg(content: Sendable, source?: Quotable): Promise<MessageRet>;
sendMsg(content: Sendable, source?: Quotable, isSpoiler?: boolean): Promise<MessageRet>;

getFileUrl(fid: string): Promise<string>;
}
Expand Down

0 comments on commit 724d0c4

Please sign in to comment.