feat: 闪照

This commit is contained in:
Clansty 2022-03-04 18:50:11 +08:00
parent 52c3d68b4c
commit b9af098233
No known key found for this signature in database
GPG Key ID: 05F8479BA63A8E92
4 changed files with 93 additions and 45 deletions

View File

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

View File

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

View File

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

View File

@ -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())) {