diff --git a/src/controllers/ConfigController.ts b/src/controllers/ConfigController.ts index 44c7ff6..97c1408 100644 --- a/src/controllers/ConfigController.ts +++ b/src/controllers/ConfigController.ts @@ -3,7 +3,7 @@ import Telegram from '../client/Telegram'; import OicqClient from '../client/OicqClient'; import ConfigService from '../services/ConfigService'; import regExps from '../constants/regExps'; -import { GroupMessageEvent, MemberIncreaseEvent, PrivateMessageEvent } from 'oicq'; +import { FriendIncreaseEvent, GroupMessageEvent, MemberIncreaseEvent, PrivateMessageEvent } from 'oicq'; import Instance from '../models/Instance'; import { getLogger, Logger } from 'log4js'; @@ -23,6 +23,7 @@ export default class ConfigController { tgBot.addChannelParticipantEventHandler(this.handleChannelParticipant); oicq.addNewMessageEventHandler(this.handleQqMessage); this.instance.workMode === 'personal' && oicq.on('notice.group.increase', this.handleMemberIncrease); + this.instance.workMode === 'personal' && oicq.on('notice.friend.increase', this.handleFriendIncrease); this.instance.workMode === 'personal' && this.configService.setupFilter(); } @@ -124,8 +125,13 @@ export default class ConfigController { }; private handleMemberIncrease = async (event: MemberIncreaseEvent) => { - if (event.user_id !== this.oicq.uin || await this.instance.forwardPairs.find(event.group)) return; + if (event.user_id !== this.oicq.uin || this.instance.forwardPairs.find(event.group)) return; // 是新群并且是自己加入了 - await this.configService.promptNewGroup(event.group); + await this.configService.promptNewQqChat(event.group); + }; + + private handleFriendIncrease = async (event: FriendIncreaseEvent) => { + if (this.instance.forwardPairs.find(event.friend)) return; + await this.configService.promptNewQqChat(event.friend); }; } diff --git a/src/services/ConfigService.ts b/src/services/ConfigService.ts index 7517265..ce95740 100644 --- a/src/services/ConfigService.ts +++ b/src/services/ConfigService.ts @@ -11,6 +11,7 @@ import { md5 } from '../utils/hashing'; import TelegramChat from '../client/TelegramChat'; import Instance from '../models/Instance'; import getAboutText from '../utils/getAboutText'; +import random from '../utils/random'; const DEFAULT_FILTER_ID = 114; // 514 @@ -122,28 +123,30 @@ export default class ConfigService { /** * - * @param roomId + * @param room * @param title * @param status 传入 false 的话就不显示状态信息,可以传入一条已有消息覆盖 * @param chat */ - public async createGroupAndLink(roomId: number, title?: string, status: boolean | Api.Message = true, chat?: TelegramChat) { - this.log.info(`创建群组并关联:${roomId}`); - const qEntity = this.oicq.getChat(roomId); + public async createGroupAndLink(room: number | Friend | Group, title?: string, status: boolean | Api.Message = true, chat?: TelegramChat) { + this.log.info(`创建群组并关联:${room}`); + if (typeof room === 'number') { + room = this.oicq.getChat(room); + } if (!title) { // TS 这边不太智能 - if (qEntity instanceof Friend) { - title = qEntity.remark || qEntity.nickname; + if (room instanceof Friend) { + title = room.remark || room.nickname; } else { - title = qEntity.name; + title = room.name; } } let isFinish = false; try { // 状态信息 if (status === true) { - const avatar = await getAvatar(roomId); + const avatar = await getAvatar(room); const statusReceiver = chat || await this.owner; status = await statusReceiver.sendMessage({ message: '正在创建 Telegram 群…', @@ -156,7 +159,7 @@ export default class ConfigService { if (!chat) { // 创建群聊,拿到的是 user 的 chat - chat = await this.tgUser.createChat(title, await getAboutText(qEntity, false)); + chat = await this.tgUser.createChat(title, await getAboutText(room, false)); // 添加机器人 status && await status.edit({ text: '正在添加机器人…' }); @@ -184,7 +187,7 @@ export default class ConfigService { await chat.hidePeerSettingsBar(); // 对于私聊,默认解除静音 - if (roomId > 0) { + if (room instanceof Friend) { status && await status.edit({ text: '正在解除静音…' }); await chat.setNotificationSettings({ silent: false, showPreviews: true }); } @@ -192,12 +195,12 @@ export default class ConfigService { // 关联写入数据库 const chatForBot = await this.tgBot.getChat(chat.id); status && await status.edit({ text: '正在写数据库…' }); - const dbPair = await this.instance.forwardPairs.add(qEntity, chatForBot); + const dbPair = await this.instance.forwardPairs.add(room, chatForBot); isFinish = true; // 更新头像 status && await status.edit({ text: '正在更新头像…' }); - const avatar = await getAvatar(roomId); + const avatar = await getAvatar(room); const avatarHash = md5(avatar); await chatForBot.setProfilePhoto(avatar); await db.avatarCache.create({ @@ -220,14 +223,16 @@ export default class ConfigService { } } - public async promptNewGroup(group: Group) { + public async promptNewQqChat(chat: Group | Friend) { const message = await (await this.owner).sendMessage({ - message: '你加入了一个新的群:\n' + - await getAboutText(group, true) + '\n' + + message: '你' + + (chat instanceof Group ? '加入了一个新的群' : '增加了一' + random.pick('位', '个', '只', '头') + '好友') + + ':\n' + + await getAboutText(chat, true) + '\n' + '要创建关联群吗', buttons: Button.inline('创建', this.tgBot.registerCallback(async () => { await message.delete({ revoke: true }); - this.createGroupAndLink(-group.group_id, group.name); + this.createGroupAndLink(chat, chat instanceof Group ? chat.name : chat.remark || chat.nickname); })), }); return message; diff --git a/src/utils/urls.ts b/src/utils/urls.ts index 8d3ca7f..e986ddd 100644 --- a/src/utils/urls.ts +++ b/src/utils/urls.ts @@ -1,10 +1,17 @@ import axios from 'axios'; +import { Friend, Group } from 'oicq'; -export function getAvatarUrl(roomId: number): string { - if (!roomId) return ''; - return roomId < 0 ? - `https://p.qlogo.cn/gh/${-roomId}/${-roomId}/0` : - `https://q1.qlogo.cn/g?b=qq&nk=${roomId}&s=0`; +export function getAvatarUrl(room: number | Friend | Group): string { + if (!room) return ''; + if (room instanceof Friend) { + room = room.user_id; + } + if (room instanceof Group) { + room = room.group_id; + } + return room < 0 ? + `https://p.qlogo.cn/gh/${-room}/${-room}/0` : + `https://q1.qlogo.cn/g?b=qq&nk=${room}&s=0`; } export function getImageUrlByMd5(md5: string) { @@ -22,6 +29,6 @@ export async function fetchFile(url: string): Promise { return res.data; } -export function getAvatar(roomId: number) { - return fetchFile(getAvatarUrl(roomId)); +export function getAvatar(room: number | Friend | Group) { + return fetchFile(getAvatarUrl(room)); }