
com.github.stormbit.sdk.utils.Utils.kt Maven / Gradle / Ivy
@file:Suppress("unused", "UNCHECKED_CAST", "RegExpRedundantEscape")
package com.github.stormbit.sdk.utils
import com.github.stormbit.sdk.callbacks.Callback
import com.github.stormbit.sdk.clients.Client
import com.github.stormbit.sdk.objects.Chat
import com.github.stormbit.sdk.utils.Utils.Companion.EnumDescriptor
import com.github.stormbit.sdk.utils.vkapi.Auth
import com.github.stormbit.sdk.utils.vkapi.methods.Address
import com.github.stormbit.sdk.utils.vkapi.methods.Attachment
import com.github.stormbit.sdk.utils.vkapi.methods.Media
import com.google.gson.*
import com.google.gson.internal.LinkedTreeMap
import com.google.gson.reflect.TypeToken
import com.google.gson.stream.JsonReader
import com.google.gson.stream.JsonToken
import com.google.gson.stream.JsonWriter
import io.ktor.util.date.*
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.ClassSerialDescriptorBuilder
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.descriptors.buildClassSerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.json.Json
import java.io.*
import java.net.HttpURLConnection
import java.net.URL
import java.net.URLConnection
import java.net.URLEncoder
import java.util.*
import java.util.concurrent.CopyOnWriteArrayList
import kotlin.collections.HashMap
import kotlin.collections.set
import kotlin.reflect.KClass
internal class CustomizedObjectTypeAdapter : TypeAdapter() {
private val delegate = Gson().getAdapter(Any::class.java)
@Throws(IOException::class)
override fun write(out: JsonWriter, value: Any?) {
delegate.write(out, value)
}
companion object {
val FACTORY = object : TypeAdapterFactory {
override fun create(gson: Gson, type: TypeToken): TypeAdapter? {
return if (MutableMap::class.java.isAssignableFrom(type.rawType)) {
(CustomizedObjectTypeAdapter() as TypeAdapter)
} else null
}
}
}
@Throws(IOException::class)
override fun read(reader: JsonReader): Any? {
return when (reader.peek()) {
JsonToken.BEGIN_ARRAY -> {
val list: MutableList = ArrayList()
reader.beginArray()
while (reader.hasNext()) {
list.add(read(reader))
}
reader.endArray()
list
}
JsonToken.BEGIN_OBJECT -> {
val map: MutableMap = LinkedTreeMap()
reader.beginObject()
while (reader.hasNext()) {
map[reader.nextName()] = read(reader)
}
reader.endObject()
map
}
JsonToken.STRING -> reader.nextString()
JsonToken.NUMBER -> {
//return in.nextDouble();
val n = reader.nextString()
if (n.indexOf('.') != -1) {
n.toDouble()
} else n.toLong()
}
JsonToken.BOOLEAN -> reader.nextBoolean()
JsonToken.NULL -> {
reader.nextNull()
null
}
else -> throw IllegalStateException()
}
}
}
internal val json = Json {
encodeDefaults = false
ignoreUnknownKeys = true
isLenient = false
allowStructuredMapKeys = true
prettyPrint = false
useArrayPolymorphism = false
}
private val adapter = CustomizedObjectTypeAdapter()
val gson = GsonBuilder()
.serializeNulls()
.registerTypeAdapterFactory(CustomizedObjectTypeAdapter.FACTORY)
.setPrettyPrinting().create()
class Utils {
companion object {
val hashes = JsonObject()
const val version = 5.122
const val userApiUrl = "https://vk.com/dev"
val RE_CAPTCHAID = Regex("onLoginCaptcha\\('(\\d+)'")
val AUTH_HASH = Regex("\\{.*?act: 'a_authcheck_code'.+?hash: '([a-z_0-9]+)'.*\\}")
/**
* Analog method of 'shift()' method from javascript
*
* @return First element of list, and then remove it
*/
fun CopyOnWriteArrayList.shift(): T? {
if (this.size > 0) {
val item = this[0]
this.removeAt(0)
return item
}
return null
}
/**
* @param photos JSONArray with photo objects
* @return URL of biggest image file
*/
fun getBiggestPhotoUrl(photos: JsonArray): String {
val currentBiggestPhoto: String
val sizes: MutableMap = HashMap()
for (obj in photos) {
if (obj is JsonObject) {
val width = obj.getInt("width")
val url = obj.getString("url")
sizes[width] = url
}
}
currentBiggestPhoto = sizes.getValue(Collections.max(sizes.keys))
return currentBiggestPhoto
}
fun Boolean.asInt(): Int {
return if (this) 1 else 0
}
fun toJsonObject(string: String): JsonObject = JsonParser.parseString(string).asJsonObject
fun toJsonObject(map: Map?): JsonObject = gson.toJsonTree(map).asJsonObject
fun String.callSync(client: Client, params: JsonObject?): JsonObject = client.api.callSync(this, params)
fun String.callSync(client: Client, vararg params: Any?): JsonObject = client.api.callSync(this, *params)
fun String.call(client: Client, params: JsonObject?, callback: Callback) = client.api.call(this, params, callback)
fun String.call(client: Client, callback: Callback, vararg params: Any?) = client.api.call(this, callback, *params)
fun JsonObject.map(): Map {
val type = object : TypeToken
© 2015 - 2025 Weber Informatics LLC | Privacy Policy