* 批量恢复置顶
(msg: Api.Message, chatId: any, messageIds: number[])
| 106 | await msg.edit({ text: "✅ 没有需要恢复的置顶消息", parseMode: "html" }); |
| 107 | return; |
| 108 | } |
| 109 | |
| 110 | await msg.edit({ |
| 111 | text: `🔄 正在恢复 ${messageIds.length} 条置顶消息...`, |
| 112 | parseMode: "html" |
| 113 | }); |
| 114 | |
| 115 | let successCount = 0; |
| 116 | let errorCount = 0; |
| 117 | const errors: string[] = []; |
| 118 | |
| 119 | for (let i = 0; i < messageIds.length; i++) { |
| 120 | const messageId = messageIds[i]; |
| 121 | |
| 122 | // 每3条更新一次进度 |
| 123 | if ((i + 1) % 3 === 0) { |
| 124 | await msg.edit({ |
| 125 | text: `🔄 正在恢复第 ${i + 1}/${messageIds.length} 条置顶消息...\n✅ 成功: ${successCount} ❌ 失败: ${errorCount}`, |
| 126 | parseMode: "html" |
| 127 | }); |
| 128 | } |
| 129 | |
| 130 | const success = await this.pinMessage(chatId, messageId); |
| 131 | if (success) { |
| 132 | successCount++; |
| 133 | } else { |
| 134 | errorCount++; |
| 135 | errors.push(`消息 ${messageId} 恢复失败`); |
| 136 | } |
| 137 | |
| 138 | // 延迟避免触发限制(减少到1秒) |
| 139 | await new Promise(resolve => setTimeout(resolve, 1000)); |
| 140 | } |
| 141 | |
| 142 | let resultText = `📊 <b>恢复完成</b>\n\n`; |
| 143 | resultText += `✅ 成功恢复: ${successCount} 条\n`; |
| 144 | resultText += `❌ 恢复失败: ${errorCount} 条`; |
| 145 | |
| 146 | if (errors.length > 0) { |
| 147 | resultText += `\n\n<b>失败详情:</b>\n`; |
| 148 | errors.slice(0, 3).forEach(error => { |
| 149 | resultText += `• ${htmlEscape(error)}\n`; |
| 150 | }); |
| 151 | if (errors.length > 3) { |
| 152 | resultText += `• ... 还有 ${errors.length - 3} 个错误`; |
| 153 | } |
| 154 | } |
| 155 | |
| 156 | await msg.edit({ text: resultText, parseMode: "html" }); |
| 157 | } |
| 158 | |
| 159 | /** |
| 160 | * 主命令处理器 |
| 161 | */ |
| 162 | private async handleRestorePin(msg: Api.Message): Promise<void> { |
| 163 | const client = await getGlobalClient(); |
| 164 | if (!client) { |
no test coverage detected