(msg: Api.Message)
| 223 | |
| 224 | if (isPrivate) { |
| 225 | await (msg as any).delete({ revoke: true }); // 双向删除 |
| 226 | } else { |
| 227 | await msg.delete(); // 普通删除 |
| 228 | } |
| 229 | } catch {} |
| 230 | } |
| 231 | |
| 232 | // 文字转语音主处理 |
| 233 | async function tts(msg: Api.Message) { |
| 234 | const userId = msg.senderId?.toString(); |
| 235 | if (!userId) return; |
| 236 | const userData = await loadUserData(); |
| 237 | const cfg = userData.users[userId]; |
| 238 | if (!cfg || !cfg.apiKey) { |
| 239 | await msg.edit({ text: `❌ 请先设置 API Key (${mainPrefix}tk)` }); |
| 240 | return; |
| 241 | } |
| 242 | |
| 243 | const parts = msg.text?.split(/\s+/).slice(1) || []; |
| 244 | |
| 245 | // fm 设置封面 |
| 246 | if (parts[0] === "fm" && parts[1]) { |
| 247 | userData.covers![cfg.defaultRole] = parts[1]; |
| 248 | await saveUserData(userData); |
| 249 | await msg.edit({ text: `✅ 已为角色 ${cfg.defaultRole} 设置封面` }); |
| 250 | return; |
| 251 | } |
| 252 | |
| 253 | // 音乐模式:歌曲名 歌手 [专辑名] 文本 |
| 254 | if (parts.length >= 3) { |
| 255 | const title = parts[0]; |
| 256 | const artist = parts[1]; |
| 257 | let album = cfg.defaultRole; |
| 258 | let text = ""; |
| 259 | if (parts.length >= 4) { album = parts[2]; text = parts.slice(3).join(" "); } |
| 260 | else { text = parts.slice(2).join(" "); } |
| 261 | |
| 262 | const cover = userData.covers?.[cfg.defaultRole]; |
| 263 | |
| 264 | // 优先被你回复的那条消息 |
| 265 | const rep = msg.replyTo?.replyToMsgId ? await safeGetReplyMessage(msg) : null; |
| 266 | const replyToId = rep?.id ?? msg.id; |
| 267 | |
| 268 | const file = await generateMusic(cleanTextForTTS(text), cfg.defaultRoleId, cfg.apiKey, { title, artist, album, cover }); |
| 269 | if (file) { |
| 270 | await msg.client?.sendFile(msg.peerId, { |
| 271 | file, |
| 272 | caption: `${title} - ${artist}`, |
| 273 | replyTo: replyToId, |
| 274 | attributes: [ |
| 275 | new (Api as any).DocumentAttributeAudio({ |
| 276 | duration: 0, |
| 277 | title, |
| 278 | performer: artist, |
| 279 | }), |
| 280 | ], |
| 281 | }); |
| 282 | try { await fs.unlink(file); } catch {} |
nothing calls this directly
no test coverage detected