add CloudStorage support

This commit is contained in:
InsanusMokrassar 2023-09-23 00:15:58 +06:00
parent ccfb774f33
commit 1b1da33882
5 changed files with 121 additions and 0 deletions

View File

@ -177,6 +177,11 @@ val stickerKeywordLengthLimit = 0 .. 64
const val botActionActualityTime: Seconds = 5
val cloudStorageKeyLimit = 1 .. 128
val cloudStorageValueLimit = 0 .. 4096
val cloudStorageKeyRegex = Regex("[A-Za-z0-9_-]{${cloudStorageKeyLimit.first},${cloudStorageKeyLimit.last}}")
val cloudStorageValueRegex = Regex(".{${cloudStorageValueLimit.first},${cloudStorageValueLimit.last}}")
// Made as lazy for correct work in K/JS
val telegramInlineModeGifPermittedMimeTypes by lazy {
listOf(

View File

@ -1,6 +1,7 @@
package dev.inmo.tgbotapi.webapps
import dev.inmo.tgbotapi.utils.TelegramAPIUrlsKeeper
import dev.inmo.tgbotapi.webapps.cloud.CloudStorage
import dev.inmo.tgbotapi.webapps.haptic.HapticFeedback
import dev.inmo.tgbotapi.webapps.invoice.InvoiceClosedInfo
import dev.inmo.tgbotapi.webapps.popup.*
@ -49,6 +50,9 @@ external class WebApp {
@JsName("HapticFeedback")
val hapticFeedback: HapticFeedback
@JsName("CloudStorage")
val cloudStorage: CloudStorage
internal fun onEvent(type: String, callback: () -> Unit)
@JsName("onEvent")
internal fun onEventWithViewportChangedData(type: String, callback: (ViewportChangedData) -> Unit)

View File

@ -0,0 +1,85 @@
package dev.inmo.tgbotapi.webapps.cloud
external interface CloudStorage {
fun setItem(
key: CloudStorageKey,
value: CloudStorageValue,
callback: (e: Error?, success: Boolean?) -> Unit = definedExternally
): CloudStorage
fun getItem(
key: CloudStorageKey,
callback: (e: Error?, value: CloudStorageValue?) -> Unit
): CloudStorage
fun getItems(
key: Array<CloudStorageKey>,
callback: (e: Error?, values: Array<CloudStorageValue>?) -> Unit
): CloudStorage
fun removeItem(
key: CloudStorageKey,
callback: (e: Error?, success: Boolean?) -> Unit
): CloudStorage
fun removeItems(
key: Array<CloudStorageKey>,
callback: (e: Error?, success: Boolean?) -> Unit
): CloudStorage
fun getKeys(
callback: (e: Error?, success: Array<CloudStorageKey>?) -> Unit
): CloudStorage
}
private fun <T> resultsToResult(e: Error?, v: T?): Result<T> = when {
e != null -> Result.failure(e)
v != null -> Result.success(v)
else -> Result.failure(IllegalStateException("Both value and e"))
}
fun CloudStorage.set(
key: String,
value: String,
callback: (result: Result<Boolean>) -> Unit = {}
) = setItem(CloudStorageKey(key), CloudStorageValue(value)) { e, v -> callback(resultsToResult(e, v)) }
fun CloudStorage.get(
key: String,
callback: (result: Result<CloudStorageValue>) -> Unit
) = getItem(CloudStorageKey(key)) { e, v -> callback(resultsToResult(e, v)) }
fun CloudStorage.get(
key: String,
key2: String,
vararg otherKeys: String,
callback: (result: Result<Array<CloudStorageValue>>) -> Unit
) = getItems(
Array(2 + otherKeys.size) {
when (it) {
0 -> CloudStorageKey(key)
1 -> CloudStorageKey(key2)
else -> CloudStorageKey(otherKeys[it - 2])
}
}
) { e, v -> callback(resultsToResult(e, v)) }
fun CloudStorage.remove(
key: String,
callback: (result: Result<Boolean>) -> Unit
) = removeItem(CloudStorageKey(key)) { e, v -> callback(resultsToResult(e, v)) }
fun CloudStorage.remove(
key: String,
key2: String,
vararg otherKeys: String,
callback: (result: Result<Boolean>) -> Unit
) = removeItems(
Array(2 + otherKeys.size) {
when (it) {
0 -> CloudStorageKey(key)
1 -> CloudStorageKey(key2)
else -> CloudStorageKey(otherKeys[it - 2])
}
}
) { e, v -> callback(resultsToResult(e, v)) }
fun CloudStorage.keys(
callback: (result: Result<Array<CloudStorageKey>>) -> Unit
) = getKeys { e, v -> callback(resultsToResult(e, v)) }

View File

@ -0,0 +1,13 @@
package dev.inmo.tgbotapi.webapps.cloud
import dev.inmo.tgbotapi.types.cloudStorageKeyRegex
import kotlinx.serialization.Serializable
@Serializable
value class CloudStorageKey(val key: String) {
init {
require(key.matches(cloudStorageKeyRegex)) {
"'$key' must pass $cloudStorageKeyRegex in case you wish to use it as key for cloud storage operations"
}
}
}

View File

@ -0,0 +1,14 @@
package dev.inmo.tgbotapi.webapps.cloud
import dev.inmo.tgbotapi.types.cloudStorageKeyRegex
import dev.inmo.tgbotapi.types.cloudStorageValueRegex
import kotlinx.serialization.Serializable
@Serializable
value class CloudStorageValue(val value: String) {
init {
require(value.matches(cloudStorageValueRegex)) {
"'$value' must pass $cloudStorageValueRegex in case you wish to use it as key for cloud storage operations"
}
}
}