feat: 添加新的好友时提示创建群

This commit is contained in:
Clansty 2022-03-27 19:24:56 +08:00
parent 3c2689f5ff
commit 0be37e981d
No known key found for this signature in database
GPG Key ID: 3A6BE8BAF2EDE134
3 changed files with 44 additions and 26 deletions

View File

@ -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);
};
}

View File

@ -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;

View File

@ -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<Buffer> {
return res.data;
}
export function getAvatar(roomId: number) {
return fetchFile(getAvatarUrl(roomId));
export function getAvatar(room: number | Friend | Group) {
return fetchFile(getAvatarUrl(room));
}