95 lines
2.6 KiB
Kotlin
95 lines
2.6 KiB
Kotlin
package dev.inmo.tgbotapi.utils
|
|
|
|
import com.benasher44.uuid.uuid4
|
|
import dev.inmo.micro_utils.common.MPPFile
|
|
import dev.inmo.micro_utils.common.filename
|
|
import io.ktor.utils.io.*
|
|
import io.ktor.utils.io.core.ByteReadPacket
|
|
import io.ktor.utils.io.core.Input
|
|
import kotlinx.serialization.Serializable
|
|
|
|
/**
|
|
* Information about file for [StorageFile]
|
|
*
|
|
* @param contentType Raw type like "application/json"
|
|
* @param fileName This filename will be used in telegram system as name of file
|
|
*/
|
|
@Serializable
|
|
@Deprecated("Will be removed soon")
|
|
data class StorageFileInfo(
|
|
val fileName: String
|
|
) {
|
|
/**
|
|
* This methods is required for random generation of name for keeping warranties about unique file name
|
|
*/
|
|
fun generateCustomName() = "${uuid4()}.${fileName.fileExtension}"
|
|
}
|
|
|
|
/**
|
|
* Contains info about file, which potentially can be sent to telegram system.
|
|
*
|
|
* @param fileName Filename
|
|
* @param inputSource Lambda which able to allocate [Input] for uploading/manipulating data
|
|
*
|
|
* @see StorageFileInfo
|
|
* @see asStorageFile
|
|
*/
|
|
data class StorageFile(
|
|
val fileName: String,
|
|
private val inputSource: () -> Input
|
|
) {
|
|
val input: Input
|
|
get() = inputSource()
|
|
@Deprecated("This field will be removed soon. Use fileName instead of StorageFileInfo")
|
|
val storageFileInfo: StorageFileInfo
|
|
get() = StorageFileInfo(fileName)
|
|
|
|
/**
|
|
* This methods is required for random generation of name for keeping warranties about unique file name
|
|
*/
|
|
fun generateCustomName() = "${uuid4()}.${fileName.fileExtension}"
|
|
|
|
@Deprecated("This constructor will be removed soon. Use constructor with fileName instead of StorageFileInfo")
|
|
constructor(
|
|
storageFileInfo: StorageFileInfo,
|
|
inputSource: () -> Input
|
|
) : this(
|
|
storageFileInfo.fileName,
|
|
inputSource
|
|
)
|
|
}
|
|
|
|
@Suppress("NOTHING_TO_INLINE")
|
|
inline fun StorageFile(
|
|
fileName: String,
|
|
bytes: ByteArray
|
|
) = StorageFile(
|
|
fileName
|
|
) {
|
|
ByteReadPacket(bytes)
|
|
}
|
|
|
|
@Suppress("NOTHING_TO_INLINE")
|
|
suspend inline fun StorageFile(
|
|
fileName: String,
|
|
byteReadChannel: ByteReadChannel
|
|
) = StorageFile(
|
|
fileName,
|
|
inputSource = byteReadChannel.asInput().let { { it } }
|
|
)
|
|
|
|
@Suppress("NOTHING_TO_INLINE", "unused")
|
|
inline fun ByteArray.asStorageFile(
|
|
fileName: String
|
|
) = StorageFile(fileName, this)
|
|
|
|
@Suppress("NOTHING_TO_INLINE", "unused")
|
|
suspend inline fun ByteReadChannel.asStorageFile(
|
|
fileName: String
|
|
) = StorageFile(fileName, this)
|
|
|
|
@Suppress("NOTHING_TO_INLINE", "unused")
|
|
suspend inline fun ByteReadChannelAllocator.asStorageFile(
|
|
fileName: String
|
|
) = this.invoke().asStorageFile(fileName)
|