feat: QQ 群内发送 at 时在 tg 消息中创建一个链接

This commit is contained in:
Clansty 2024-03-16 09:19:01 +08:00
parent f3ee2b92a2
commit d5cdf7625f
2 changed files with 16 additions and 16 deletions

View File

@ -6,6 +6,8 @@ import { Entity } from 'telegram/define';
import { ForwardMessage } from 'icqq';
import { Api } from 'telegram';
import { imageSize } from 'image-size';
import env from '../models/env';
import { md5B64 } from '../utils/hashing';
const log = getLogger('ForwardHelper');
@ -30,7 +32,7 @@ export default {
|| dimensions.width + dimensions.height > 10000
) {
// 让 Telegram 服务器下载
return url
return url;
}
}
if (allowWebp) {
@ -192,4 +194,11 @@ export default {
}
return null;
},
generateRichHeaderUrl(apiKey: string, userId: number, messageHeader = '') {
const url = new URL(`${env.WEB_ENDPOINT}/richHeader/${apiKey}/${userId}`);
// 防止群名片刷新慢
messageHeader && url.searchParams.set('hash', md5B64(messageHeader).substring(0, 10));
return url.toString();
},
};

View File

@ -169,6 +169,10 @@ export default class ForwardService {
case 'at': {
if (event.source?.user_id === elem.qq || event.source?.user_id === this.oicq.uin)
break;
if (env.WEB_ENDPOINT && typeof elem.qq === 'number') {
message += `<a href="${helper.generateRichHeaderUrl(pair.apiKey, elem.qq)}">[<i>${helper.htmlEscape(elem.text)}</i>]</a>`;
break;
}
}
case 'face':
case 'sface': {
@ -382,27 +386,14 @@ export default class ForwardService {
else if (files.length) {
messageToSend.file = files;
}
else if (event.message_type === 'group' && (pair.flags | this.instance.flags) & flags.RICH_HEADER) {
else if (event.message_type === 'group' && (pair.flags | this.instance.flags) & flags.RICH_HEADER && env.WEB_ENDPOINT) {
// 没有文件时才能显示链接预览
richHeaderUsed = true;
let url: URL;
if (env.WEB_ENDPOINT) {
url = new URL(`${env.WEB_ENDPOINT}/richHeader/${pair.apiKey}/${event.sender.user_id}`);
// 防止群名片刷新慢
url.searchParams.set('hash', md5B64(messageHeader).substring(0, 10));
}
else {
url = new URL('https://q2tg-header.clansty.workers.dev');
url.searchParams.set('name', sender);
url.searchParams.set('title', 'title' in event.sender ? event.sender.title : '');
url.searchParams.set('role', 'role' in event.sender ? event.sender.role : '');
url.searchParams.set('id', event.sender.user_id.toString());
}
// https://github.com/tdlib/td/blob/437c2d0c6e0ad104022d5ad86ddc8aedc41cb7a8/td/telegram/MessageContent.cpp#L2575
// https://github.com/tdlib/td/blob/437c2d0c6e0ad104022d5ad86ddc8aedc41cb7a8/td/generate/scheme/telegram_api.tl#L1841
// https://github.com/gram-js/gramjs/pull/633
messageToSend.file = new Api.InputMediaWebPage({
url: url.toString(),
url: helper.generateRichHeaderUrl(pair.apiKey, event.sender.user_id, messageHeader),
forceSmallMedia: true,
optional: true,
});