Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

104 changes: 60 additions & 44 deletions app/src/main/java/com/frischar/fantareal/data/memory/MemoryService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,16 @@ package com.frischar.fantareal.data.memory

import com.frischar.fantareal.core.AppJson
import com.frischar.fantareal.domain.memory.LongTermMemory
import kotlinx.serialization.json.*
import java.util.UUID
import kotlinx.serialization.json.JsonArray
import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.JsonPrimitive
import kotlinx.serialization.json.add
import kotlinx.serialization.json.buildJsonArray
import kotlinx.serialization.json.buildJsonObject
import kotlinx.serialization.json.contentOrNull
import kotlinx.serialization.json.put

class MemoryService {
fun parseMemories(jsonText: String): List<LongTermMemory> {
Expand All @@ -16,29 +24,32 @@ class MemoryService {
val parsed = mutableListOf<LongTermMemory>()

if (root is JsonArray) {
for (el in root) {
if (el is JsonObject) {
parseMemory(el)?.let(parsed::add)
for (element in root) {
if (element is JsonObject) {
parseMemory(element)?.let(parsed::add)
}
}
} else if (root is JsonObject) {
val itemsArr = root["items"]
if (itemsArr is JsonArray) {
for (el in itemsArr) {
if (el is JsonObject) {
parseMemory(el)?.let(parsed::add)
val items = root["items"]
if (items is JsonArray) {
for (element in items) {
if (element is JsonObject) {
parseMemory(element)?.let(parsed::add)
}
}
} else if (root.containsKey("data") && root["data"] is JsonObject) {
val dataObj = root["data"] as? JsonObject
val mesExample = (dataObj?.get("mes_example") as? JsonPrimitive)?.contentOrNull
val dataObject = root["data"] as? JsonObject
val mesExample = (dataObject?.get("mes_example") as? JsonPrimitive)?.contentOrNull
if (!mesExample.isNullOrBlank()) {
parsed.add(LongTermMemory(
id = UUID.randomUUID().toString(),
text = mesExample,
tags = listOf("mes_example"),
createdAt = System.currentTimeMillis()
))
parsed.add(
LongTermMemory(
id = UUID.randomUUID().toString(),
title = "\u793a\u4f8b\u5bf9\u8bdd",
text = mesExample,
tags = listOf("mes_example"),
createdAt = System.currentTimeMillis()
)
)
}
} else {
parseMemory(root)?.let(parsed::add)
Expand All @@ -50,46 +61,51 @@ class MemoryService {

private fun parseMemory(obj: JsonObject): LongTermMemory? {
val id = (obj["id"] as? JsonPrimitive)?.contentOrNull ?: UUID.randomUUID().toString()
val title = (obj["title"] as? JsonPrimitive)?.contentOrNull ?: ""
val title = (obj["title"] as? JsonPrimitive)?.contentOrNull?.trim().orEmpty()
val content = (obj["content"] as? JsonPrimitive)?.contentOrNull
?: (obj["text"] as? JsonPrimitive)?.contentOrNull
?: ""
val tags = obj["tags"]?.let {
if (it is JsonArray) {
it.mapNotNull { t -> (t as? JsonPrimitive)?.contentOrNull?.trim()?.takeIf(String::isNotBlank) }
} else if (it is JsonPrimitive) {
it.contentOrNull
?.split(",", ",", "、", "|")
?.map { tag -> tag.trim() }
?.filter { tag -> tag.isNotBlank() }
} else null
} ?: emptyList()

// Use title + notes + content as the combined memory text
val notes = (obj["notes"] as? JsonPrimitive)?.contentOrNull ?: ""
val combinedContent = buildString {
if (title.isNotBlank()) append(title).append(": ")
append(content)
if (notes.isNotBlank()) append(" (").append(notes).append(")")
}
if (combinedContent.isBlank()) return null
val notes = (obj["notes"] as? JsonPrimitive)?.contentOrNull?.trim().orEmpty()
val tags = parseTags(obj["tags"])

if (content.isBlank() && title.isBlank() && notes.isBlank()) return null

return LongTermMemory(
id = id,
text = combinedContent,
title = title,
text = content.trim().ifBlank { notes.ifBlank { title } },
notes = notes,
tags = tags,
createdAt = System.currentTimeMillis()
)
}

private fun parseTags(value: JsonElement?): List<String> {
return when (value) {
is JsonArray -> value.mapNotNull { item ->
(item as? JsonPrimitive)?.contentOrNull?.trim()?.takeIf { it.isNotBlank() }
}
is JsonPrimitive -> value.contentOrNull
?.split(",", "\uFF0C", "\u3001", "|")
?.map { it.trim() }
?.filter { it.isNotBlank() }
.orEmpty()
else -> emptyList()
}
}

fun exportToJson(memories: List<LongTermMemory>): String {
val jsonArray = buildJsonArray {
memories.forEach { mem ->
add(buildJsonObject {
put("id", mem.id)
put("content", mem.text)
put("tags", buildJsonArray { mem.tags.forEach { add(it) } })
})
memories.forEach { memory ->
add(
buildJsonObject {
put("id", memory.id)
put("title", memory.title)
put("content", memory.text)
put("notes", memory.notes)
put("tags", buildJsonArray { memory.tags.forEach { add(it) } })
}
)
}
}
val root = buildJsonObject {
Expand Down
Loading
Loading