feat: 增加消息重发操作.
This commit is contained in:
parent
ba5566b594
commit
8214e80d59
@ -53,55 +53,71 @@ 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(
|
"""
|
||||||
"""
|
|
||||||
OneDrive 中转任务开始执行
|
OneDrive 中转任务开始执行
|
||||||
正在获取文件信息...(需要一些时间从 Telegram 服务器下载文件)
|
正在获取文件信息...(需要一些时间从 Telegram 服务器下载文件)
|
||||||
文件名: ${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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -126,7 +142,7 @@ class OneDriveTransferTaskExecutor(
|
|||||||
.build()
|
.build()
|
||||||
) {
|
) {
|
||||||
|
|
||||||
private val logger = KotlinLogging.logger { }
|
private val logger = KotlinLogging.logger { }
|
||||||
|
|
||||||
val threadStatusMap = ConcurrentHashMap<Int, OneDriveTransferWorkerProgress>()
|
val threadStatusMap = ConcurrentHashMap<Int, OneDriveTransferWorkerProgress>()
|
||||||
|
|
||||||
@ -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(
|
||||||
.withItem(DriveItemUploadableProperties())
|
DriveItemCreateUploadSessionParameterSet.newBuilder()
|
||||||
.build())
|
.withItem(DriveItemUploadableProperties())
|
||||||
|
.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) {
|
||||||
|
@ -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) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user