Files
Nekosu/app/src/main/java/ru/risdeveau/pixeldragon/api/User.kt
T

100 lines
3.1 KiB
Kotlin
Raw Normal View History

2025-02-21 14:44:48 +03:00
/*
2025-03-03 18:42:57 +03:00
* Created by sweetbread
2025-02-21 14:44:48 +03:00
* Copyright (c) 2025. All rights reserved.
*/
package ru.risdeveau.pixeldragon.api
import android.util.Log
import io.ktor.client.request.bearerAuth
import io.ktor.client.request.get
import io.ktor.client.request.post
import io.ktor.client.request.setBody
import io.ktor.client.statement.bodyAsText
import io.ktor.http.ContentType
import io.ktor.http.HttpStatusCode
import io.ktor.http.contentType
import org.json.JSONObject
2025-11-04 00:05:23 +03:00
import ru.risdeveau.pixeldragon.AccountData
2025-02-22 18:45:55 +03:00
import ru.risdeveau.pixeldragon.baseUrl
2025-02-21 14:44:48 +03:00
import ru.risdeveau.pixeldragon.client
import ru.risdeveau.pixeldragon.initCheck
import ru.risdeveau.pixeldragon.token
2025-11-04 00:05:23 +03:00
import splitties.experimental.ExperimentalSplittiesApi
2025-02-21 14:44:48 +03:00
import splitties.init.appCtx
2025-11-04 00:05:23 +03:00
import splitties.preferences.edit
2025-02-21 14:44:48 +03:00
data class Me (val userId: String, val deviceId: String)
2025-11-04 16:01:14 +03:00
data class UserProfile (val displayName: String, val avatarUrl: String, val other: JSONObject)
2025-02-21 14:44:48 +03:00
/**
* This func is to validate the token
*/
suspend fun getMe(): Me? {
2025-02-22 18:45:55 +03:00
val r = client.get("$baseUrl/account/whoami") { bearerAuth(token) }
2025-02-21 14:44:48 +03:00
if (r.status != HttpStatusCode.OK) {
Log.e("getMe", r.bodyAsText())
return null
}
val json = JSONObject(r.bodyAsText())
return Me(json.getString("user_id"), json.getString("device_id"))
}
2025-11-04 00:05:23 +03:00
@OptIn(ExperimentalSplittiesApi::class)
2025-03-03 18:42:57 +03:00
suspend fun login(server: String, login: String, pass: String): Boolean {
2025-11-04 00:05:23 +03:00
val hs = getHomeserver(server)!!
2025-03-03 18:42:57 +03:00
val pinfo = appCtx.packageManager.getPackageInfo(appCtx.packageName, 0)
2025-02-21 14:44:48 +03:00
val pattern = """
{
"type": "m.login.password",
"identifier": {
"type": "m.id.user"
},
"initial_device_display_name": "PixelDragon Android v${pinfo.versionName}"
}
""".trimIndent()
val json = JSONObject(pattern)
json.getJSONObject("identifier").put("user", login)
json.put("password", pass)
val r = try {
2025-11-04 00:05:23 +03:00
client.post("$hs/_matrix/client/v3/login") {
2025-02-21 14:44:48 +03:00
setBody(json.toString())
contentType(ContentType.Application.Json)
}
} catch (e: Exception) {
Log.e("login", e.toString())
return false
}
if (r.status != HttpStatusCode.OK) {
Log.e("login", r.bodyAsText())
return false // TODO: Inform a user of error code
}
val res = JSONObject(r.bodyAsText())
2025-11-04 00:05:23 +03:00
AccountData.edit {
token = res.getString("access_token")
homeserver = hs
}
2025-02-21 14:44:48 +03:00
return initCheck()
}
2025-11-04 16:01:14 +03:00
suspend fun getAccountData(user: String, state: String): JSONObject? {
val r = client.get("$baseUrl/user/$user/account_data/$state") { bearerAuth(token) }
if (r.status != HttpStatusCode.OK) return null
return JSONObject(r.bodyAsText())
}
suspend fun getUserProfile(userId: String): UserProfile? {
val r = client.get("$baseUrl/profile/$userId") { bearerAuth(token) }
if (r.status != HttpStatusCode.OK) return null
val json = JSONObject(r.bodyAsText())
val name = json.optString("displayname", ""); json.remove("displayname")
val avatar = json.optString("avatar_url", ""); json.remove("avatar_url")
return UserProfile(name, avatar, json)
}