Merge remote-tracking branch 'origin/rainbowcat' into rainbowcat

This commit is contained in:
Clansty 2024-02-04 21:25:15 +08:00
commit 4df30e8705
No known key found for this signature in database
GPG Key ID: 3A6BE8BAF2EDE134
7 changed files with 66 additions and 59 deletions

View File

@ -42,7 +42,7 @@
"nodejs-base64": "^2.0.0",
"prisma": "5.8.0",
"prompts": "^2.4.2",
"quote-api": "https://github.com/Clansty/quote-api/archive/37a0e48a434b94bb04c04c7d86d9f0d2295df869.tar.gz",
"quote-api": "https://github.com/Clansty/quote-api/archive/014b21138afbbe0e12c91b00561414b1e851fc0f.tar.gz",
"sharp": "^0.33.2",
"silk-sdk": "^0.2.2",
"telegram": "https://github.com/clansty/gramjs/releases/download/2.19.10%2Brevert_media/telegram-2.19.10.tgz",

View File

@ -60,8 +60,8 @@ dependencies:
specifier: ^2.4.2
version: 2.4.2
quote-api:
specifier: https://github.com/Clansty/quote-api/archive/37a0e48a434b94bb04c04c7d86d9f0d2295df869.tar.gz
version: '@github.com/Clansty/quote-api/archive/37a0e48a434b94bb04c04c7d86d9f0d2295df869.tar.gz'
specifier: https://github.com/Clansty/quote-api/archive/014b21138afbbe0e12c91b00561414b1e851fc0f.tar.gz
version: '@github.com/Clansty/quote-api/archive/014b21138afbbe0e12c91b00561414b1e851fc0f.tar.gz'
sharp:
specifier: ^0.33.2
version: 0.33.2
@ -70,7 +70,7 @@ dependencies:
version: 0.2.2
telegram:
specifier: https://github.com/clansty/gramjs/releases/download/2.19.10%2Brevert_media/telegram-2.19.10.tgz
version: '@github.com/clansty/gramjs/releases/download/2.19.10%252Brevert_media/telegram-2.19.10.tgz'
version: '@github.com/clansty/gramjs/releases/download/2.19.10%25252Brevert_media/telegram-2.19.10.tgz'
tmp-promise:
specifier: ^3.0.3
version: 3.0.3
@ -3872,10 +3872,10 @@ packages:
resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==}
dev: false
'@github.com/Clansty/quote-api/archive/37a0e48a434b94bb04c04c7d86d9f0d2295df869.tar.gz':
resolution: {tarball: https://github.com/Clansty/quote-api/archive/37a0e48a434b94bb04c04c7d86d9f0d2295df869.tar.gz}
'@github.com/Clansty/quote-api/archive/014b21138afbbe0e12c91b00561414b1e851fc0f.tar.gz':
resolution: {tarball: https://github.com/Clansty/quote-api/archive/014b21138afbbe0e12c91b00561414b1e851fc0f.tar.gz}
name: quote-api
version: 0.12.2
version: 0.14.0
dependencies:
canvas: 2.11.2
dotenv: 7.0.0
@ -3903,7 +3903,7 @@ packages:
- utf-8-validate
dev: false
'@github.com/clansty/gramjs/releases/download/2.19.10%252Brevert_media/telegram-2.19.10.tgz':
'@github.com/clansty/gramjs/releases/download/2.19.10%25252Brevert_media/telegram-2.19.10.tgz':
resolution: {tarball: https://github.com/clansty/gramjs/releases/download/2.19.10%2Brevert_media/telegram-2.19.10.tgz}
name: telegram
version: 2.19.10

View File

@ -60,22 +60,23 @@ model QqBot {
}
model Message {
id Int @id @default(autoincrement())
qqRoomId BigInt @db.BigInt
qqSenderId BigInt @db.BigInt
time Int
brief String?
seq Int
rand BigInt @db.BigInt
pktnum Int
tgChatId BigInt @db.BigInt
tgMsgId Int
instanceId Int @default(0)
instance Instance @relation(fields: [instanceId], references: [id], onDelete: Cascade)
tgFileId BigInt? @db.BigInt
tgMessageText String?
nick String? // /抱 的时候会用到
tgSenderId BigInt? @db.BigInt
id Int @id @default(autoincrement())
qqRoomId BigInt @db.BigInt
qqSenderId BigInt @db.BigInt
time Int
brief String?
seq Int
rand BigInt @db.BigInt
pktnum Int
tgChatId BigInt @db.BigInt
tgMsgId Int
instanceId Int @default(0)
instance Instance @relation(fields: [instanceId], references: [id], onDelete: Cascade)
tgFileId BigInt? @db.BigInt
tgMessageText String?
nick String? // /抱 的时候会用到
tgSenderId BigInt? @db.BigInt
richHeaderUsed Boolean @default(false)
@@index([qqRoomId, qqSenderId, seq, rand, pktnum, time, instanceId])
@@index([tgChatId, tgMsgId, instanceId])

View File

@ -7,4 +7,11 @@ export default {
index = index % arr.length;
return arr[index];
},
tgColor(index: number) {
// https://github.com/telegramdesktop/tdesktop/blob/7049929a59176a996c4257d5a09df08b04ac3b22/Telegram/SourceFiles/ui/chat/chat_style.cpp#L1043
// https://github.com/LyoSU/quote-api/blob/master/utils/quote-generate.js#L163
const arr = [...new Intl.Segmenter().segment('❤️🧡💜💚🩵💙🩷')].map(x => x.segment);
index = index % arr.length;
return arr[index];
},
};

View File

@ -61,36 +61,32 @@ export default class ForwardController {
});
if (existed) return;
// 开始转发过程
let tgMessages: Api.Message | Api.Message[] = await this.forwardService.forwardFromQq(event, pair);
if (!tgMessages) return;
if (!Array.isArray(tgMessages)) {
tgMessages = [tgMessages];
}
for (const tgMessage of tgMessages) {
// 更新数据库
await db.message.create({
data: {
qqRoomId: pair.qqRoomId,
qqSenderId: event.sender.user_id,
time: event.time,
brief: event.raw_message,
seq: event.seq,
rand: event.rand,
pktnum: event.pktnum,
tgChatId: pair.tgId,
tgMsgId: tgMessage.id,
instanceId: this.instance.id,
tgMessageText: tgMessage.message,
tgFileId: forwardHelper.getMessageDocumentId(tgMessage),
nick: event.nickname,
tgSenderId: BigInt(this.tgBot.me.id.toString()),
},
});
await this.forwardService.addToZinc(pair.dbId, tgMessage.id, {
text: event.raw_message,
let { tgMessage, richHeaderUsed } = await this.forwardService.forwardFromQq(event, pair);
if (!tgMessage) return;
// 更新数据库
await db.message.create({
data: {
qqRoomId: pair.qqRoomId,
qqSenderId: event.sender.user_id,
time: event.time,
brief: event.raw_message,
seq: event.seq,
rand: event.rand,
pktnum: event.pktnum,
tgChatId: pair.tgId,
tgMsgId: tgMessage.id,
instanceId: this.instance.id,
tgMessageText: tgMessage.message,
tgFileId: forwardHelper.getMessageDocumentId(tgMessage),
nick: event.nickname,
});
}
tgSenderId: BigInt(this.tgBot.me.id.toString()),
richHeaderUsed,
},
});
await this.forwardService.addToZinc(pair.dbId, tgMessage.id, {
text: event.raw_message,
nick: event.nickname,
});
}
catch (e) {
this.log.error('处理 QQ 消息时遇到问题', e);

View File

@ -163,7 +163,7 @@ export default class {
title: message.nick,
photo: { url: getAvatarUrl(message.qqSenderId) },
};
if (message.qqRoomId > 0) {
if (message.qqRoomId > 0 || message.richHeaderUsed) {
quoteMessage.text = message.tgMessageText;
}
else if (message.tgMessageText.includes('\n')) {
@ -195,7 +195,7 @@ export default class {
photo = await convert.cachedBuffer(`${sender.photo.photoId.toString(16)}.jpg`, () => this.tgBot.downloadEntityPhoto(sender));
}
messageFrom = {
id: Number(message.tgSenderId),
id: sender.color || Number(message.tgSenderId),
name: message.nick,
title: message.nick,
username: sender.username,

View File

@ -387,6 +387,8 @@ export default class ForwardService {
richHeaderUsed = true;
const 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
@ -394,6 +396,7 @@ export default class ForwardService {
messageToSend.file = new Api.InputMediaWebPage({
url: url.toString(),
forceSmallMedia: true,
optional: true,
});
messageToSend.linkPreview = { showAboveText: true };
}
@ -412,7 +415,7 @@ export default class ForwardService {
}
catch (e) {
if (richHeaderUsed) {
this.log.warn('Rich Header 发送错误', messageToSend.file);
this.log.warn('Rich Header 发送错误', messageToSend.file, e);
delete messageToSend.file;
delete messageToSend.linkPreview;
message = messageHeader + (message && messageHeader ? '\n' : '') + message;
@ -427,7 +430,7 @@ export default class ForwardService {
}
tempFiles.forEach(it => it.cleanup());
return tgMessage;
return { tgMessage, richHeaderUsed };
}
catch (e) {
this.log.error('从 QQ 到 TG 的消息转发失败', e);
@ -436,7 +439,7 @@ export default class ForwardService {
}
catch {
}
return null;
return {};
}
}
@ -456,7 +459,7 @@ export default class ForwardService {
'') +
': \n';
if ((pair.flags | this.instance.flags) & flags.COLOR_EMOJI_PREFIX) {
messageHeader = emoji.color(message.senderId.toJSNumber()) + messageHeader;
messageHeader = emoji.tgColor((message.sender as Api.User)?.color || message.senderId.toJSNumber()) + messageHeader;
}
if (message.photo instanceof Api.Photo ||
// stickers 和以文件发送的图片都是这个