feat: 增加消息重发操作.

This commit is contained in:
LamGC 2024-01-11 08:50:33 +08:00
parent ba5566b594
commit 8214e80d59
Signed by: LamGC
GPG Key ID: 6C5AE2A913941E1D
2 changed files with 97 additions and 29 deletions

View File

@ -53,8 +53,7 @@ object DefaultOneDriveTransferCallback : OneDriveTransferCallback {
} }
override fun onTransferStart(progress: OneDriveTransferWorkerProgress) { override fun onTransferStart(progress: OneDriveTransferWorkerProgress) {
progress.currentTask.bot.execute( val newMessage = EditMessageText.builder()
EditMessageText.builder()
.chatId(progress.currentTask.extra["chatId"].toString().toLong()) .chatId(progress.currentTask.extra["chatId"].toString().toLong())
.messageId(progress.currentTask.extra["messageId"].toString().toInt()) .messageId(progress.currentTask.extra["messageId"].toString().toInt())
.text( .text(
@ -64,44 +63,61 @@ object DefaultOneDriveTransferCallback : OneDriveTransferCallback {
文件名 ${progress.currentTask.document.fileName} 文件名 ${progress.currentTask.document.fileName}
""".trimIndent() """.trimIndent()
) )
.build() .build().orSendMessage(progress.currentTask.bot, progress.currentTask.extra["messageId"].toString().toInt())
) if (newMessage != null) {
progress.currentTask.extra["messageId"] = newMessage.messageId
}
} }
override fun onProgress(progress: OneDriveTransferWorkerProgress) { override fun onProgress(progress: OneDriveTransferWorkerProgress) {
progress.currentTask.bot.execute(EditMessageText.builder() val newMessage = EditMessageText.builder()
.chatId(progress.currentTask.extra["chatId"].toString().toLong()) .chatId(progress.currentTask.extra["chatId"].toString().toLong())
.messageId(progress.currentTask.extra["messageId"].toString().toInt()) .messageId(progress.currentTask.extra["messageId"].toString().toInt())
.text(""" .text(
"""
OneDrive 中转任务执行中 OneDrive 中转任务执行中
文件名 ${progress.currentTask.document.fileName} 文件名 ${progress.currentTask.document.fileName}
进度${String.format("%.3f", progress.progress.get() * 100)}% 进度${String.format("%.3f", progress.progress.get() * 100)}%
""".trimIndent()) """.trimIndent()
.build()) )
.build().orSendMessage(progress.currentTask.bot, progress.currentTask.extra["messageId"].toString().toInt())
if (newMessage != null) {
progress.currentTask.extra["messageId"] = newMessage.messageId
}
} }
override fun onTransferFailure(task: OneDriveTransferTask, progress: OneDriveTransferWorkerProgress) { override fun onTransferFailure(task: OneDriveTransferTask, progress: OneDriveTransferWorkerProgress) {
task.bot.execute(EditMessageText.builder() val newMessage = EditMessageText.builder()
.chatId(task.extra["chatId"].toString().toLong()) .chatId(task.extra["chatId"].toString().toLong())
.messageId(task.extra["messageId"].toString().toInt()) .messageId(task.extra["messageId"].toString().toInt())
.text(""" .text(
"""
OneDrive 中转任务执行失败 OneDrive 中转任务执行失败
文件名 ${task.document.fileName} 文件名 ${task.document.fileName}
错误信息${progress.exception?.message} 错误信息${progress.exception?.message}
""".trimIndent()) """.trimIndent()
.build()) )
.build().orSendMessage(progress.currentTask.bot, progress.currentTask.extra["messageId"].toString().toInt())
if (newMessage != null) {
progress.currentTask.extra["messageId"] = newMessage.messageId
}
} }
override fun onTransferSuccess(task: OneDriveTransferTask, progress: OneDriveTransferWorkerProgress) { override fun onTransferSuccess(task: OneDriveTransferTask, progress: OneDriveTransferWorkerProgress) {
task.bot.execute(EditMessageText.builder() val newMessage = EditMessageText.builder()
.chatId(task.extra["chatId"].toString().toLong()) .chatId(task.extra["chatId"].toString().toLong())
.messageId(task.extra["messageId"].toString().toInt()) .messageId(task.extra["messageId"].toString().toInt())
.text(""" .text(
"""
OneDrive 中转任务执行成功 OneDrive 中转任务执行成功
文件名 ${task.document.fileName} 文件名 ${task.document.fileName}
OneDrive 文件路径${progress.driveItem?.webUrl} OneDrive 文件路径${progress.driveItem?.webUrl}
""".trimIndent()) """.trimIndent()
.build()) )
.build().orSendMessage(progress.currentTask.bot, progress.currentTask.extra["messageId"].toString().toInt())
if (newMessage != null) {
progress.currentTask.extra["messageId"] = newMessage.messageId
}
} }
} }
@ -202,7 +218,8 @@ class OneDriveTransferTaskExecutor(
logger.debug { "成功获取文件信息:$tempFile" } logger.debug { "成功获取文件信息:$tempFile" }
val graphClient = task.service.createGraphClient(task.tgUserId) val graphClient = task.service.createGraphClient(task.tgUserId)
val drive = graphClient.drives(task.onedriveId).buildRequest().get() ?: throw IllegalStateException("无法获取 OneDrive 驱动器.") val drive = graphClient.drives(task.onedriveId).buildRequest().get()
?: throw IllegalStateException("无法获取 OneDrive 驱动器.")
if (file.fileSize > drive.quota!!.remaining!!) { if (file.fileSize > drive.quota!!.remaining!!) {
throw IllegalStateException("OneDrive 剩余空间不足.") throw IllegalStateException("OneDrive 剩余空间不足.")
} }
@ -219,9 +236,11 @@ class OneDriveTransferTaskExecutor(
progress.progress.set(1.0) progress.progress.set(1.0)
} else { } else {
val uploadSession = graphClient.drives(task.onedriveId).root().itemWithPath(filePath) val uploadSession = graphClient.drives(task.onedriveId).root().itemWithPath(filePath)
.createUploadSession(DriveItemCreateUploadSessionParameterSet.newBuilder() .createUploadSession(
DriveItemCreateUploadSessionParameterSet.newBuilder()
.withItem(DriveItemUploadableProperties()) .withItem(DriveItemUploadableProperties())
.build()) .build()
)
.buildRequest() .buildRequest()
.post() ?: throw IllegalStateException("无法创建 OneDrive 上传会话.") .post() ?: throw IllegalStateException("无法创建 OneDrive 上传会话.")
val progressCallback = IProgressCallback { current, max -> val progressCallback = IProgressCallback { current, max ->
@ -261,13 +280,22 @@ class OneDriveTransferTaskExecutor(
return bot.downloadFileAsStream(filePath) return bot.downloadFileAsStream(filePath)
} }
private fun checkAndGetPath(graphClient: GraphServiceClient<Request>, driveId: String, storagePath: String, originFileName: String): String { private fun checkAndGetPath(
graphClient: GraphServiceClient<Request>,
driveId: String,
storagePath: String,
originFileName: String
): String {
val folderPath = checkAndCreateFolder(graphClient, driveId, storagePath) val folderPath = checkAndCreateFolder(graphClient, driveId, storagePath)
val fileName = checkFileName(graphClient, driveId, folderPath, originFileName) val fileName = checkFileName(graphClient, driveId, folderPath, originFileName)
return "$folderPath$fileName" return "$folderPath$fileName"
} }
private fun checkAndCreateFolder(graphClient: GraphServiceClient<Request>, driveId: String, folderPath: String): String { private fun checkAndCreateFolder(
graphClient: GraphServiceClient<Request>,
driveId: String,
folderPath: String
): String {
if (folderPath.trim() == "/") { if (folderPath.trim() == "/") {
return "" return ""
} }
@ -332,7 +360,12 @@ class OneDriveTransferTaskExecutor(
return currentPath.trimStart('/') return currentPath.trimStart('/')
} }
private fun checkFileName(graphClient: GraphServiceClient<Request>, driveId: String, folderPath: String, fileName: String): String { private fun checkFileName(
graphClient: GraphServiceClient<Request>,
driveId: String,
folderPath: String,
fileName: String
): String {
try { try {
graphClient.drives(driveId).root().itemWithPath("$folderPath$fileName").buildRequest().get() graphClient.drives(driveId).root().itemWithPath("$folderPath$fileName").buildRequest().get()
} catch (e: GraphServiceException) { } catch (e: GraphServiceException) {

View File

@ -1,6 +1,12 @@
package net.lamgc.scext.onedrive_transfer package net.lamgc.scext.onedrive_transfer
import com.google.common.cache.Cache import com.google.common.cache.Cache
import org.telegram.abilitybots.api.bot.BaseAbilityBot
import org.telegram.telegrambots.meta.api.methods.send.SendMessage
import org.telegram.telegrambots.meta.api.methods.updatingmessages.DeleteMessage
import org.telegram.telegrambots.meta.api.methods.updatingmessages.EditMessageText
import org.telegram.telegrambots.meta.api.objects.Message
import org.telegram.telegrambots.meta.exceptions.TelegramApiRequestException
import java.net.URL import java.net.URL
import java.net.URLDecoder import java.net.URLDecoder
@ -27,3 +33,32 @@ fun Cache<String, String>.putToken(value: String, tokenLength: Int = 16, tokenPr
put(token, value) put(token, value)
return "$tokenPrefix$token" return "$tokenPrefix$token"
} }
fun EditMessageText.orSendMessage(bot: BaseAbilityBot, replyMessageId: Int, tryRemove: Boolean = true): Message? {
try {
bot.execute(this)
return null
} catch (e: TelegramApiRequestException) {
if (e.errorCode != 400 || e.apiResponse != "message can't be edited") {
throw e
}
return bot.execute(
SendMessage.builder()
.replyToMessageId(replyMessageId)
.chatId(chatId.toString())
.text(text)
.build()
)
} finally {
if (tryRemove) {
try {
bot.execute(
DeleteMessage.builder()
.messageId(messageId)
.build()
)
} catch (_: Exception) {
}
}
}
}