mirror of https://github.com/Nofated095/Q2TG.git
feat: 闪照
This commit is contained in:
parent
52c3d68b4c
commit
b9af098233
|
@ -0,0 +1,82 @@
|
|||
import Telegram from '../client/Telegram';
|
||||
import OicqClient from '../client/OicqClient';
|
||||
import { Api } from 'telegram';
|
||||
import db from '../providers/db';
|
||||
import { Button } from 'telegram/tl/custom/button';
|
||||
import { getLogger } from 'log4js';
|
||||
import { CustomFile } from 'telegram/client/uploads';
|
||||
import { fetchFile, getImageUrlByMd5 } from '../utils/urls';
|
||||
|
||||
const REGEX = /^\/start (file|flash)-(\d+)$/;
|
||||
|
||||
export default class FileAndFlashPhotoController {
|
||||
private readonly log = getLogger('FileController');
|
||||
|
||||
constructor(private readonly tgBot: Telegram,
|
||||
private readonly oicq: OicqClient) {
|
||||
tgBot.addNewMessageEventHandler(this.onTelegramMessage);
|
||||
}
|
||||
|
||||
private onTelegramMessage = async (message: Api.Message) => {
|
||||
if (!message.isPrivate || !message.message) return false;
|
||||
if (!REGEX.test(message.message)) return false;
|
||||
const exec = REGEX.exec(message.message);
|
||||
switch (exec[1]) {
|
||||
case 'file':
|
||||
await this.handleFile(message, Number(exec[2]));
|
||||
break;
|
||||
case 'flash':
|
||||
await this.handleFlashPhoto(message, Number(exec[2]));
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
private async handleFile(message: Api.Message, id: number) {
|
||||
try {
|
||||
const fileInfo = await db.file.findFirst({
|
||||
where: { id },
|
||||
});
|
||||
const downloadUrl = await this.oicq.getChat(Number(fileInfo.roomId)).getFileUrl(fileInfo.fileId);
|
||||
await message.reply({
|
||||
message: fileInfo.info,
|
||||
buttons: Button.url('⏬下载', downloadUrl),
|
||||
});
|
||||
}
|
||||
catch (e) {
|
||||
this.log.error('获取文件下载地址失败', e);
|
||||
await message.reply({
|
||||
message: `获取文件下载地址失败:${e.message}\n${e}`,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private async handleFlashPhoto(message: Api.Message, id: number) {
|
||||
try {
|
||||
const photoInfo = await db.flashPhoto.findFirst({
|
||||
where: { id },
|
||||
});
|
||||
const viewInfo = await db.flashPhotoView.findFirst({
|
||||
where: { flashPhotoId: id, viewerId: message.senderId.valueOf() },
|
||||
});
|
||||
if (viewInfo) {
|
||||
await message.reply({ message: '你已经查看过了' });
|
||||
return;
|
||||
}
|
||||
const file = await fetchFile(getImageUrlByMd5(photoInfo.photoMd5));
|
||||
const user = await this.tgBot.getChat(message.senderId);
|
||||
await user.sendSelfDestructingPhoto({},
|
||||
new CustomFile('photo.jpg', file.length, '', file),
|
||||
5);
|
||||
await db.flashPhotoView.create({
|
||||
data: { flashPhotoId: id, viewerId: message.senderId.valueOf() },
|
||||
});
|
||||
}
|
||||
catch (e) {
|
||||
this.log.error('获取闪照失败', e);
|
||||
await message.reply({
|
||||
message: `获取闪照失败:${e.message}\n${e}`,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,40 +0,0 @@
|
|||
import Telegram from '../client/Telegram';
|
||||
import OicqClient from '../client/OicqClient';
|
||||
import { Api } from 'telegram';
|
||||
import db from '../providers/db';
|
||||
import { Button } from 'telegram/tl/custom/button';
|
||||
import { getLogger } from 'log4js';
|
||||
|
||||
const GET_FILE_REGEX = /^\/start file-(\d+)$/;
|
||||
|
||||
export default class FileController {
|
||||
private readonly log = getLogger('FileController');
|
||||
|
||||
constructor(private readonly tgBot: Telegram,
|
||||
private readonly oicq: OicqClient) {
|
||||
tgBot.addNewMessageEventHandler(this.onTelegramMessage);
|
||||
}
|
||||
|
||||
private onTelegramMessage = async (message: Api.Message) => {
|
||||
if (!message.isPrivate || !message.message) return false;
|
||||
if (!GET_FILE_REGEX.test(message.message)) return false;
|
||||
const id = Number(GET_FILE_REGEX.exec(message.message)[1]);
|
||||
try {
|
||||
const fileInfo = await db.file.findFirst({
|
||||
where: { id },
|
||||
});
|
||||
const downloadUrl = await this.oicq.getChat(Number(fileInfo.roomId)).getFileUrl(fileInfo.fileId);
|
||||
await message.reply({
|
||||
message: fileInfo.info,
|
||||
buttons: Button.url('⏬下载', downloadUrl),
|
||||
});
|
||||
}
|
||||
catch (e) {
|
||||
this.log.error('获取文件下载地址失败', e);
|
||||
await message.reply({
|
||||
message: `获取文件下载地址失败:${e.message}\n${e}`,
|
||||
});
|
||||
}
|
||||
return true;
|
||||
};
|
||||
}
|
|
@ -5,7 +5,7 @@ import SetupController from './controllers/SetupController';
|
|||
import OicqClient from './client/OicqClient';
|
||||
import ConfigController from './controllers/ConfigController';
|
||||
import ForwardController from './controllers/ForwardController';
|
||||
import FileController from './controllers/FileController';
|
||||
import FileAndFlashPhotoController from './controllers/FileAndFlashPhotoController';
|
||||
|
||||
(async () => {
|
||||
configure({
|
||||
|
@ -50,5 +50,5 @@ import FileController from './controllers/FileController';
|
|||
}
|
||||
new ConfigController(tgBot, tgUser, oicq);
|
||||
new ForwardController(tgBot, tgUser, oicq);
|
||||
new FileController(tgBot, oicq);
|
||||
new FileAndFlashPhotoController(tgBot, oicq);
|
||||
})();
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import Telegram from '../client/Telegram';
|
||||
import OicqClient from '../client/OicqClient';
|
||||
import { Group, GroupMessageEvent, MessageRet, PrivateMessageEvent, Quotable, segment, Sendable } from 'oicq';
|
||||
import { Group, GroupMessageEvent, PrivateMessageEvent, Quotable, segment, Sendable } from 'oicq';
|
||||
import { Pair } from '../providers/forwardPairs';
|
||||
import { fetchFile, getBigFaceUrl, getImageUrlByMd5 } from '../utils/urls';
|
||||
import { FileLike, MarkupLike } from 'telegram/define';
|
||||
|
@ -67,8 +67,6 @@ export default class ForwardService {
|
|||
// 先获取 URL,要传给下面
|
||||
url = await pair.qq.getVideoUrl(elem.fid, elem.md5);
|
||||
case 'image':
|
||||
case 'flash':
|
||||
// TODO 闪照单独处理
|
||||
if ('url' in elem)
|
||||
url = elem.url;
|
||||
try {
|
||||
|
@ -80,6 +78,14 @@ export default class ForwardService {
|
|||
files.push(url);
|
||||
}
|
||||
break;
|
||||
case 'flash': {
|
||||
message += `[闪照]\n${config.workMode === 'group' ? '每人' : ''}只能查看一次`;
|
||||
const dbEntry = await db.flashPhoto.create({
|
||||
data: { photoMd5: (elem.file as string).substring(0, 32) },
|
||||
});
|
||||
button = Button.url('📸查看', `https://t.me/${this.tgBot.me.username}?start=flash-${dbEntry.id}`);
|
||||
break;
|
||||
}
|
||||
case 'file': {
|
||||
const extName = path.extname(elem.name);
|
||||
if (exts.images.includes(extName.toLowerCase())) {
|
||||
|
|
Loading…
Reference in New Issue