2022-12-23 12:00:04 +00:00
|
|
|
import Telegram from '../client/Telegram';
|
|
|
|
import OicqClient from '../client/OicqClient';
|
|
|
|
import ForwardService from '../services/ForwardService';
|
2022-04-07 06:28:09 +00:00
|
|
|
import {
|
|
|
|
Friend,
|
|
|
|
FriendPokeEvent,
|
|
|
|
GroupMessageEvent,
|
|
|
|
GroupPokeEvent,
|
|
|
|
MemberIncreaseEvent,
|
|
|
|
PrivateMessageEvent,
|
2022-12-23 12:00:04 +00:00
|
|
|
} from 'oicq';
|
|
|
|
import db from '../models/db';
|
|
|
|
import { Api } from 'telegram';
|
|
|
|
import { getLogger, Logger } from 'log4js';
|
|
|
|
import Instance from '../models/Instance';
|
|
|
|
import { getAvatar } from '../utils/urls';
|
|
|
|
import { CustomFile } from 'telegram/client/uploads';
|
|
|
|
import forwardHelper from '../helpers/forwardHelper';
|
2022-12-26 04:15:44 +00:00
|
|
|
import helper from '../helpers/forwardHelper';
|
2022-02-24 10:27:06 +00:00
|
|
|
|
|
|
|
export default class ForwardController {
|
|
|
|
private readonly forwardService: ForwardService;
|
2022-03-07 10:14:45 +00:00
|
|
|
private readonly log: Logger;
|
2022-02-24 10:27:06 +00:00
|
|
|
|
2022-10-17 13:19:24 +00:00
|
|
|
constructor(
|
|
|
|
private readonly instance: Instance,
|
|
|
|
private readonly tgBot: Telegram,
|
|
|
|
private readonly tgUser: Telegram,
|
2022-12-23 12:00:04 +00:00
|
|
|
private readonly oicq: OicqClient,
|
2022-10-17 13:19:24 +00:00
|
|
|
) {
|
2022-03-07 10:14:45 +00:00
|
|
|
this.log = getLogger(`ForwardController - ${instance.id}`);
|
2022-03-17 10:15:37 +00:00
|
|
|
this.forwardService = new ForwardService(this.instance, tgBot, oicq);
|
2022-03-07 10:05:14 +00:00
|
|
|
oicq.addNewMessageEventHandler(this.onQqMessage);
|
2022-12-23 12:00:04 +00:00
|
|
|
oicq.on('notice.group.increase', this.onQqGroupMemberIncrease);
|
|
|
|
oicq.on('notice.friend.poke', this.onQqPoke);
|
|
|
|
oicq.on('notice.group.poke', this.onQqPoke);
|
2022-03-07 10:05:14 +00:00
|
|
|
tgBot.addNewMessageEventHandler(this.onTelegramMessage);
|
|
|
|
tgBot.addEditedMessageEventHandler(this.onTelegramMessage);
|
2022-12-23 12:00:04 +00:00
|
|
|
instance.workMode === 'group' && tgBot.addChannelParticipantEventHandler(this.onTelegramParticipant);
|
2022-02-24 10:27:06 +00:00
|
|
|
}
|
|
|
|
|
2022-03-01 13:11:14 +00:00
|
|
|
private onQqMessage = async (event: PrivateMessageEvent | GroupMessageEvent) => {
|
2022-03-05 04:27:49 +00:00
|
|
|
try {
|
2022-12-23 12:00:04 +00:00
|
|
|
const target = event.message_type === 'private' ? event.friend : event.group;
|
2022-03-07 10:05:14 +00:00
|
|
|
const pair = this.instance.forwardPairs.find(target);
|
2022-03-05 04:27:49 +00:00
|
|
|
if (!pair) return;
|
2022-08-14 04:09:30 +00:00
|
|
|
if (!pair.enable) return;
|
2022-10-17 13:19:24 +00:00
|
|
|
if (pair.disableQ2TG) return;
|
2022-10-12 05:50:22 +00:00
|
|
|
const tgMessage = await this.forwardService.forwardFromQq(event, pair);
|
|
|
|
if (tgMessage) {
|
2022-03-05 04:27:49 +00:00
|
|
|
// 更新数据库
|
|
|
|
await db.message.create({
|
|
|
|
data: {
|
|
|
|
qqRoomId: pair.qqRoomId,
|
|
|
|
qqSenderId: event.user_id,
|
|
|
|
time: event.time,
|
|
|
|
brief: event.raw_message,
|
|
|
|
seq: event.seq,
|
|
|
|
rand: event.rand,
|
|
|
|
pktnum: event.pktnum,
|
2022-03-05 07:26:37 +00:00
|
|
|
tgChatId: pair.tgId,
|
2022-03-05 04:27:49 +00:00
|
|
|
tgMsgId: tgMessage.id,
|
2022-03-07 11:41:59 +00:00
|
|
|
instanceId: this.instance.id,
|
2022-12-23 12:00:04 +00:00
|
|
|
tgMessageText: tgMessage.message,
|
|
|
|
tgFileId: forwardHelper.getMessageDocumentId(tgMessage),
|
2022-12-26 04:15:44 +00:00
|
|
|
nick: event.nickname,
|
|
|
|
tgSenderId: BigInt(this.tgBot.me.id.toString()),
|
2022-03-05 04:27:49 +00:00
|
|
|
},
|
|
|
|
});
|
|
|
|
}
|
2022-12-23 12:00:04 +00:00
|
|
|
}
|
|
|
|
catch (e) {
|
|
|
|
this.log.error('处理 QQ 消息时遇到问题', e);
|
2022-02-26 10:15:40 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
private onTelegramMessage = async (message: Api.Message) => {
|
2022-03-05 07:26:37 +00:00
|
|
|
try {
|
2022-03-17 03:24:02 +00:00
|
|
|
if (message.senderId?.eq(this.instance.botMe.id)) return true;
|
2022-03-07 10:05:14 +00:00
|
|
|
const pair = this.instance.forwardPairs.find(message.chat);
|
2022-03-05 09:58:07 +00:00
|
|
|
if (!pair) return false;
|
2022-08-14 04:09:30 +00:00
|
|
|
if (!pair.enable) return;
|
2022-10-17 13:19:24 +00:00
|
|
|
if (pair.disableTG2Q) return;
|
2022-03-13 05:57:45 +00:00
|
|
|
const qqMessagesSent = await this.forwardService.forwardFromTelegram(message, pair);
|
|
|
|
if (qqMessagesSent) {
|
2022-03-05 04:27:49 +00:00
|
|
|
// 更新数据库
|
2022-03-13 05:57:45 +00:00
|
|
|
for (const qqMessageSent of qqMessagesSent) {
|
|
|
|
await db.message.create({
|
|
|
|
data: {
|
|
|
|
qqRoomId: pair.qqRoomId,
|
|
|
|
qqSenderId: this.oicq.uin,
|
|
|
|
time: qqMessageSent.time,
|
|
|
|
brief: qqMessageSent.brief,
|
|
|
|
seq: qqMessageSent.seq,
|
|
|
|
rand: qqMessageSent.rand,
|
|
|
|
pktnum: 1,
|
|
|
|
tgChatId: pair.tgId,
|
|
|
|
tgMsgId: message.id,
|
|
|
|
instanceId: this.instance.id,
|
2022-12-23 12:00:04 +00:00
|
|
|
tgMessageText: message.message,
|
|
|
|
tgFileId: forwardHelper.getMessageDocumentId(message),
|
2022-12-26 04:15:44 +00:00
|
|
|
nick: helper.getUserDisplayName(message.sender),
|
|
|
|
tgSenderId: BigInt(message.senderId.toString()),
|
2022-03-13 05:57:45 +00:00
|
|
|
},
|
|
|
|
});
|
|
|
|
}
|
2022-03-05 04:27:49 +00:00
|
|
|
}
|
2022-12-23 12:00:04 +00:00
|
|
|
}
|
|
|
|
catch (e) {
|
|
|
|
this.log.error('处理 Telegram 消息时遇到问题', e);
|
2022-02-24 10:27:06 +00:00
|
|
|
}
|
|
|
|
};
|
2022-04-07 05:32:15 +00:00
|
|
|
|
|
|
|
private onQqGroupMemberIncrease = async (event: MemberIncreaseEvent) => {
|
|
|
|
try {
|
|
|
|
const pair = this.instance.forwardPairs.find(event.group);
|
|
|
|
if (!pair?.joinNotice) return false;
|
|
|
|
const avatar = await getAvatar(event.user_id);
|
|
|
|
await pair.tg.sendMessage({
|
2022-12-23 12:00:04 +00:00
|
|
|
file: new CustomFile('avatar.png', avatar.length, '', avatar),
|
2022-04-07 05:32:15 +00:00
|
|
|
message: `<b>${event.nickname}</b> (<code>${event.user_id}</code>) <i>加入了本群</i>`,
|
|
|
|
silent: true,
|
|
|
|
});
|
2022-12-23 12:00:04 +00:00
|
|
|
}
|
|
|
|
catch (e) {
|
|
|
|
this.log.error('处理 QQ 群成员增加事件时遇到问题', e);
|
2022-04-07 05:32:15 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
private onTelegramParticipant = async (event: Api.UpdateChannelParticipant) => {
|
|
|
|
try {
|
|
|
|
const pair = this.instance.forwardPairs.find(event.channelId);
|
|
|
|
if (!pair?.joinNotice) return false;
|
2022-10-17 13:19:24 +00:00
|
|
|
if (
|
|
|
|
!(event.newParticipant instanceof Api.ChannelParticipantAdmin) &&
|
|
|
|
!(event.newParticipant instanceof Api.ChannelParticipantCreator) &&
|
|
|
|
!(event.newParticipant instanceof Api.ChannelParticipant)
|
|
|
|
)
|
2022-04-07 05:32:15 +00:00
|
|
|
return false;
|
|
|
|
const member = await this.tgBot.getChat(event.newParticipant.userId);
|
|
|
|
await pair.qq.sendMsg(`${forwardHelper.getUserDisplayName(member.entity)} 加入了本群`);
|
2022-12-23 12:00:04 +00:00
|
|
|
}
|
|
|
|
catch (e) {
|
|
|
|
this.log.error('处理 TG 群成员增加事件时遇到问题', e);
|
2022-04-07 05:32:15 +00:00
|
|
|
}
|
|
|
|
};
|
2022-04-07 06:28:09 +00:00
|
|
|
|
|
|
|
private onQqPoke = async (event: FriendPokeEvent | GroupPokeEvent) => {
|
2022-12-23 12:00:04 +00:00
|
|
|
const target = event.notice_type === 'friend' ? event.friend : event.group;
|
2022-04-07 06:28:09 +00:00
|
|
|
const pair = this.instance.forwardPairs.find(target);
|
|
|
|
if (!pair?.poke) return;
|
|
|
|
let operatorName: string, targetName: string;
|
|
|
|
if (target instanceof Friend) {
|
|
|
|
if (event.operator_id === target.user_id) {
|
|
|
|
operatorName = target.remark || target.nickname;
|
2022-12-23 12:00:04 +00:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
operatorName = '你';
|
2022-04-07 06:28:09 +00:00
|
|
|
}
|
|
|
|
if (event.operator_id === event.target_id) {
|
2022-12-23 12:00:04 +00:00
|
|
|
targetName = '自己';
|
|
|
|
}
|
|
|
|
else if (event.target_id === target.user_id) {
|
2022-04-07 06:28:09 +00:00
|
|
|
targetName = target.remark || target.nickname;
|
|
|
|
}
|
2022-12-23 12:00:04 +00:00
|
|
|
else {
|
|
|
|
targetName = '你';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
2022-04-07 06:28:09 +00:00
|
|
|
const operator = target.pickMember(event.operator_id);
|
|
|
|
await operator.renew();
|
|
|
|
operatorName = operator.card || operator.info.nickname;
|
|
|
|
if (event.operator_id === event.target_id) {
|
2022-12-23 12:00:04 +00:00
|
|
|
targetName = '自己';
|
|
|
|
}
|
|
|
|
else {
|
2022-04-07 06:28:09 +00:00
|
|
|
const targetUser = target.pickMember(event.target_id);
|
|
|
|
await targetUser.renew();
|
|
|
|
targetName = targetUser.card || targetUser.info.nickname;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
await pair.tg.sendMessage({
|
|
|
|
message: `<i><b>${operatorName}</b>${event.action}<b>${targetName}</b>${event.suffix}</i>`,
|
|
|
|
silent: true,
|
|
|
|
});
|
|
|
|
};
|
2022-02-24 10:27:06 +00:00
|
|
|
}
|