feat: 增加管理员状态指令.
This commit is contained in:
parent
095394ce62
commit
4429997989
@ -25,13 +25,20 @@ import java.util.concurrent.*
|
|||||||
|
|
||||||
object OneDriveTransferCenter {
|
object OneDriveTransferCenter {
|
||||||
|
|
||||||
private val executor =
|
val executor =
|
||||||
OneDriveTransferTaskExecutor(1, DefaultOneDriveTransferCallback, ArrayBlockingQueue(100))
|
OneDriveTransferTaskExecutor(1, DefaultOneDriveTransferCallback, ArrayBlockingQueue(100))
|
||||||
|
|
||||||
fun submitUploadTask(task: OneDriveTransferTask) {
|
fun submitUploadTask(task: OneDriveTransferTask) {
|
||||||
executor.submitTransferTask(task)
|
executor.submitTransferTask(task)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun getQueueingTaskCount(): Int = executor.taskQueue.size
|
||||||
|
|
||||||
|
fun getProcessingTasks(): Map<Int, OneDriveTransferWorkerProgress> =
|
||||||
|
Collections.unmodifiableMap(executor.threadStatusMap)
|
||||||
|
|
||||||
|
fun getProcessThreadNum(): Int = executor.threadNum
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
object DefaultOneDriveTransferCallback : OneDriveTransferCallback {
|
object DefaultOneDriveTransferCallback : OneDriveTransferCallback {
|
||||||
@ -194,10 +201,10 @@ interface OneDriveTransferCallback {
|
|||||||
* @param chunkSize 上传块大小的倍率, 实际上传块大小为 320 KiB * chunkSize.
|
* @param chunkSize 上传块大小的倍率, 实际上传块大小为 320 KiB * chunkSize.
|
||||||
*/
|
*/
|
||||||
class OneDriveTransferTaskExecutor(
|
class OneDriveTransferTaskExecutor(
|
||||||
threadNum: Int,
|
val threadNum: Int,
|
||||||
private val callback: OneDriveTransferCallback,
|
private val callback: OneDriveTransferCallback,
|
||||||
private val taskQueue: BlockingQueue<OneDriveTransferTask>,
|
val taskQueue: BlockingQueue<OneDriveTransferTask>,
|
||||||
private val chunkSize: Int = 96
|
private val chunkSize: Int = 26
|
||||||
) : ThreadPoolExecutor(
|
) : ThreadPoolExecutor(
|
||||||
threadNum, threadNum, 0, TimeUnit.SECONDS,
|
threadNum, threadNum, 0, TimeUnit.SECONDS,
|
||||||
ArrayBlockingQueue(50),
|
ArrayBlockingQueue(50),
|
||||||
@ -248,6 +255,7 @@ class OneDriveTransferTaskExecutor(
|
|||||||
}
|
}
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
logger.warn(e) { "OneDrive 中转任务执行失败: ${e.message}" }
|
logger.warn(e) { "OneDrive 中转任务执行失败: ${e.message}" }
|
||||||
|
progress.status = OneDriveTransferStatus.FAILURE
|
||||||
callback.onTransferFailure(task, progress.apply {
|
callback.onTransferFailure(task, progress.apply {
|
||||||
this.exception = e
|
this.exception = e
|
||||||
})
|
})
|
||||||
@ -261,6 +269,7 @@ class OneDriveTransferTaskExecutor(
|
|||||||
private fun doTransferFile(task: OneDriveTransferTask, progress: OneDriveTransferWorkerProgress) {
|
private fun doTransferFile(task: OneDriveTransferTask, progress: OneDriveTransferWorkerProgress) {
|
||||||
var tempFile: org.telegram.telegrambots.meta.api.objects.File
|
var tempFile: org.telegram.telegrambots.meta.api.objects.File
|
||||||
logger.debug { "开始获取文件信息..." }
|
logger.debug { "开始获取文件信息..." }
|
||||||
|
progress.status = OneDriveTransferStatus.GETTING_FILE_INFO
|
||||||
var retryCount = 0
|
var retryCount = 0
|
||||||
val maxRetryCount = 100
|
val maxRetryCount = 100
|
||||||
while (true) {
|
while (true) {
|
||||||
@ -296,6 +305,8 @@ class OneDriveTransferTaskExecutor(
|
|||||||
logger.warn(e) { "OneDrive 中转任务成功获取文件信息回调失败: ${e.message}" }
|
logger.warn(e) { "OneDrive 中转任务成功获取文件信息回调失败: ${e.message}" }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
progress.status = OneDriveTransferStatus.CREATING_UPLOAD_SESSION
|
||||||
|
|
||||||
val graphClient = task.service.createGraphClient(task.tgUserId)
|
val graphClient = task.service.createGraphClient(task.tgUserId)
|
||||||
val drive = graphClient.drives(task.onedriveId).buildRequest().get()
|
val drive = graphClient.drives(task.onedriveId).buildRequest().get()
|
||||||
?: throw IllegalStateException("无法获取 OneDrive 驱动器.")
|
?: throw IllegalStateException("无法获取 OneDrive 驱动器.")
|
||||||
@ -308,11 +319,13 @@ class OneDriveTransferTaskExecutor(
|
|||||||
|
|
||||||
if (file.fileSize < 4 * 1024 * 1024) {
|
if (file.fileSize < 4 * 1024 * 1024) {
|
||||||
val fileBytes = getFileStream(task.bot, file.filePath).readAllBytes()
|
val fileBytes = getFileStream(task.bot, file.filePath).readAllBytes()
|
||||||
|
progress.status = OneDriveTransferStatus.UPLOADING
|
||||||
val driveItem = graphClient.drives(task.onedriveId).root().itemWithPath(filePath).content()
|
val driveItem = graphClient.drives(task.onedriveId).root().itemWithPath(filePath).content()
|
||||||
.buildRequest()
|
.buildRequest()
|
||||||
.put(fileBytes)
|
.put(fileBytes)
|
||||||
progress.driveItem = driveItem
|
progress.driveItem = driveItem
|
||||||
progress.progress.set(1.0)
|
progress.progress.set(1.0)
|
||||||
|
progress.status = OneDriveTransferStatus.SUCCESS
|
||||||
} else {
|
} else {
|
||||||
val uploadSession = graphClient.drives(task.onedriveId).root().itemWithPath(filePath)
|
val uploadSession = graphClient.drives(task.onedriveId).root().itemWithPath(filePath)
|
||||||
.createUploadSession(
|
.createUploadSession(
|
||||||
@ -340,8 +353,11 @@ class OneDriveTransferTaskExecutor(
|
|||||||
file.fileSize,
|
file.fileSize,
|
||||||
DriveItem::class.java
|
DriveItem::class.java
|
||||||
)
|
)
|
||||||
|
progress.status = OneDriveTransferStatus.UPLOADING
|
||||||
val uploadResult = largeFileUploadTask.upload(ONCE_CHUNK_SIZE * chunkSize, null, progressCallback)
|
val uploadResult = largeFileUploadTask.upload(ONCE_CHUNK_SIZE * chunkSize, null, progressCallback)
|
||||||
progress.driveItem = uploadResult.responseBody
|
progress.driveItem = uploadResult.responseBody
|
||||||
|
progress.progress.set(1.0)
|
||||||
|
progress.status = OneDriveTransferStatus.SUCCESS
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -480,11 +496,21 @@ class OneDriveTransferTaskExecutor(
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum class OneDriveTransferStatus {
|
||||||
|
QUEUING,
|
||||||
|
GETTING_FILE_INFO,
|
||||||
|
CREATING_UPLOAD_SESSION,
|
||||||
|
UPLOADING,
|
||||||
|
SUCCESS,
|
||||||
|
FAILURE
|
||||||
|
}
|
||||||
|
|
||||||
data class OneDriveTransferWorkerProgress(
|
data class OneDriveTransferWorkerProgress(
|
||||||
val currentTask: OneDriveTransferTask,
|
val currentTask: OneDriveTransferTask,
|
||||||
val progress: AtomicDouble = AtomicDouble(),
|
val progress: AtomicDouble = AtomicDouble(),
|
||||||
var driveItem: DriveItem? = null,
|
var driveItem: DriveItem? = null,
|
||||||
var exception: Exception? = null
|
var exception: Exception? = null,
|
||||||
|
var status: OneDriveTransferStatus = OneDriveTransferStatus.QUEUING
|
||||||
)
|
)
|
||||||
|
|
||||||
data class OneDriveTransferTask(
|
data class OneDriveTransferTask(
|
||||||
@ -495,5 +521,6 @@ data class OneDriveTransferTask(
|
|||||||
val onedriveId: String,
|
val onedriveId: String,
|
||||||
val storagePath: String,
|
val storagePath: String,
|
||||||
val extra: MutableMap<String, Any> = mutableMapOf(),
|
val extra: MutableMap<String, Any> = mutableMapOf(),
|
||||||
val createdAt: Date = Date()
|
val createdAt: Date = Date(),
|
||||||
|
var retryCount: Int = 0
|
||||||
)
|
)
|
||||||
|
@ -369,6 +369,39 @@ class OneDriveTransferExtension(val bot: BaseAbilityBot, val dataFolder: File) :
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
fun adminStatus(): Ability = Ability.builder()
|
||||||
|
.named("status")
|
||||||
|
.info("查看当前中转状态.(仅限管理员)")
|
||||||
|
.privacy(Privacy.CREATOR)
|
||||||
|
.locality(Locality.USER)
|
||||||
|
.action {
|
||||||
|
val processingTasks = OneDriveTransferCenter.getProcessingTasks()
|
||||||
|
val msg = StringBuilder(
|
||||||
|
"""
|
||||||
|
当前排队任务数:${OneDriveTransferCenter.getQueueingTaskCount()}
|
||||||
|
当前处理任务数:${processingTasks.size} / ${OneDriveTransferCenter.executor.threadNum}
|
||||||
|
--------------------------------------------------------------
|
||||||
|
""".trimIndent()
|
||||||
|
).append('\n')
|
||||||
|
for (workerId in 0..<OneDriveTransferCenter.executor.threadNum) {
|
||||||
|
val task = processingTasks[workerId]
|
||||||
|
if (task == null) {
|
||||||
|
msg.append("Worker $workerId: 空闲\n")
|
||||||
|
} else {
|
||||||
|
msg.append(
|
||||||
|
"Worker $workerId: [${task.status}] ${
|
||||||
|
String.format(
|
||||||
|
"%.3f",
|
||||||
|
task.progress.get()
|
||||||
|
)
|
||||||
|
}% ${task.currentTask.document.fileSize} Bytes\n"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
it.bot().silent().send(msg.toString(), it.chatId())
|
||||||
|
}
|
||||||
|
.build()
|
||||||
|
|
||||||
private fun AbilityBuilder.named(name: String): AbilityBuilder {
|
private fun AbilityBuilder.named(name: String): AbilityBuilder {
|
||||||
return if (config.useCommandPrefix) {
|
return if (config.useCommandPrefix) {
|
||||||
name("odt_$name")
|
name("odt_$name")
|
||||||
|
Loading…
Reference in New Issue
Block a user