commit f0df0045d6195b0f850439b646f9d9009dc1c125
parent a8c4c1ce3eaf3b548a8bf88f567b66c5cb5efa45
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date: Fri, 18 Aug 2023 00:55:30 +0200
mod database exp
Diffstat:
6 files changed, 162 insertions(+), 59 deletions(-)
diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/RemoteSideContext.kt b/app/src/main/kotlin/me/rhunk/snapenhance/RemoteSideContext.kt
@@ -9,6 +9,7 @@ import me.rhunk.snapenhance.bridge.wrapper.LocaleWrapper
import me.rhunk.snapenhance.bridge.wrapper.MappingsWrapper
import me.rhunk.snapenhance.core.config.ModConfig
import me.rhunk.snapenhance.download.DownloadTaskManager
+import me.rhunk.snapenhance.messaging.ModDatabase
import me.rhunk.snapenhance.ui.manager.data.InstallationSummary
import me.rhunk.snapenhance.ui.manager.data.ModMappingsInfo
import me.rhunk.snapenhance.ui.manager.data.SnapchatAppInfo
@@ -30,6 +31,7 @@ class RemoteSideContext(
val translation = LocaleWrapper()
val mappings = MappingsWrapper()
val downloadTaskManager = DownloadTaskManager()
+ val modDatabase = ModDatabase(this)
init {
runCatching {
@@ -41,6 +43,7 @@ class RemoteSideContext(
init(androidContext)
}
downloadTaskManager.init(androidContext)
+ modDatabase.init()
}.onFailure {
Logger.error("Failed to initialize RemoteSideContext", it)
}
diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/friends/FriendDatabase.kt b/app/src/main/kotlin/me/rhunk/snapenhance/friends/FriendDatabase.kt
@@ -1,48 +0,0 @@
-package me.rhunk.snapenhance.friends
-
-import android.database.sqlite.SQLiteDatabase
-import me.rhunk.snapenhance.RemoteSideContext
-import me.rhunk.snapenhance.util.SQLiteDatabaseHelper
-
-class FriendDatabase(
- private val context: RemoteSideContext,
-) {
- private lateinit var database: SQLiteDatabase
-
- fun init() {
- database = context.androidContext.openOrCreateDatabase("friends.db", 0, null)
- SQLiteDatabaseHelper.createTablesFromSchema(database, mapOf(
- "friends" to listOf(
- "userId VARCHAR PRIMARY KEY",
- "displayName VARCHAR",
- "mutable_username VARCHAR",
- "bitmojiId VARCHAR",
- "selfieId VARCHAR"
- ),
- "rules" to listOf(
- "userId VARCHAR PRIMARY KEY",
- "enabled BOOLEAN",
- "mode VARCHAR",
- "type VARCHAR"
- ),
- "streaks" to listOf(
- "userId VARCHAR PRIMARY KEY",
- "notify BOOLEAN",
- "expirationTimestamp BIGINT",
- "count INTEGER"
- ),
- "analytics_config" to listOf(
- "userId VARCHAR PRIMARY KEY",
- "modes VARCHAR"
- ),
- "analytics" to listOf(
- "hash VARCHAR PRIMARY KEY",
- "userId VARCHAR",
- "conversationId VARCHAR",
- "timestamp BIGINT",
- "eventName VARCHAR",
- "eventData VARCHAR"
- )
- ))
- }
-}-
\ No newline at end of file
diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/messaging/ModDatabase.kt b/app/src/main/kotlin/me/rhunk/snapenhance/messaging/ModDatabase.kt
@@ -0,0 +1,118 @@
+package me.rhunk.snapenhance.messaging
+
+import android.database.sqlite.SQLiteDatabase
+import me.rhunk.snapenhance.RemoteSideContext
+import me.rhunk.snapenhance.core.messaging.FriendStreaks
+import me.rhunk.snapenhance.core.messaging.MessagingRule
+import me.rhunk.snapenhance.core.messaging.Mode
+import me.rhunk.snapenhance.core.messaging.ObjectType
+import me.rhunk.snapenhance.database.objects.FriendInfo
+import me.rhunk.snapenhance.util.SQLiteDatabaseHelper
+import me.rhunk.snapenhance.util.getInteger
+import me.rhunk.snapenhance.util.getLongOrNull
+import me.rhunk.snapenhance.util.getStringOrNull
+import java.util.concurrent.Executors
+
+
+class ModDatabase(
+ private val context: RemoteSideContext,
+) {
+ private val executor = Executors.newSingleThreadExecutor()
+ private lateinit var database: SQLiteDatabase
+
+ fun init() {
+ database = context.androidContext.openOrCreateDatabase("main.db", 0, null)
+ SQLiteDatabaseHelper.createTablesFromSchema(database, mapOf(
+ "friends" to listOf(
+ "userId VARCHAR PRIMARY KEY",
+ "displayName VARCHAR",
+ "mutable_username VARCHAR",
+ "bitmojiId VARCHAR",
+ "selfieId VARCHAR"
+ ),
+ "rules" to listOf(
+ "id INTEGER PRIMARY KEY AUTOINCREMENT",
+ "objectType VARCHAR",
+ "targetUuid VARCHAR",
+ "enabled BOOLEAN",
+ "mode VARCHAR",
+ "subject VARCHAR"
+ ),
+ "streaks" to listOf(
+ "userId VARCHAR PRIMARY KEY",
+ "notify BOOLEAN",
+ "expirationTimestamp BIGINT",
+ "count INTEGER"
+ ),
+ "analytics_config" to listOf(
+ "userId VARCHAR PRIMARY KEY",
+ "modes VARCHAR"
+ ),
+ "analytics" to listOf(
+ "hash VARCHAR PRIMARY KEY",
+ "userId VARCHAR",
+ "conversationId VARCHAR",
+ "timestamp BIGINT",
+ "eventName VARCHAR",
+ "eventData VARCHAR"
+ )
+ ))
+ }
+
+ fun syncFriends(friends: List<FriendInfo>) {
+ executor.execute {
+ try {
+ friends.forEach { friend ->
+ database.execSQL("INSERT OR REPLACE INTO friends VALUES (?, ?, ?, ?, ?)", arrayOf(
+ friend.userId,
+ friend.displayName,
+ friend.username,
+ friend.bitmojiAvatarId,
+ friend.bitmojiSelfieId
+ ))
+ //sync streaks
+ if (friend.streakLength > 0) {
+ database.execSQL("INSERT OR REPLACE INTO streaks (userId, expirationTimestamp, count) VALUES (?, ?, ?)", arrayOf(
+ friend.userId,
+ friend.streakExpirationTimestamp,
+ friend.streakLength
+ ))
+ } else {
+ database.execSQL("DELETE FROM streaks WHERE userId = ?", arrayOf(friend.userId))
+ }
+ }
+ } catch (e: Exception) {
+ throw e
+ }
+ }
+ }
+
+ fun getRulesFromId(type: ObjectType, targetUuid: String): List<MessagingRule> {
+ return database.rawQuery("SELECT * FROM rules WHERE objectType = ? AND targetUuid = ?", arrayOf(type.name, targetUuid)).use { cursor ->
+ val rules = mutableListOf<MessagingRule>()
+ while (cursor.moveToNext()) {
+ rules.add(MessagingRule(
+ id = cursor.getInteger("id"),
+ objectType = ObjectType.valueOf(cursor.getStringOrNull("objectType")!!),
+ targetUuid = cursor.getStringOrNull("targetUuid")!!,
+ enabled = cursor.getInteger("enabled") == 1,
+ mode = Mode.valueOf(cursor.getStringOrNull("mode")!!),
+ subject = cursor.getStringOrNull("subject")!!
+ ))
+ }
+ rules
+ }
+ }
+
+ fun getFriendStreaks(userId: String): FriendStreaks? {
+ return database.rawQuery("SELECT * FROM streaks WHERE userId = ?", arrayOf(userId)).use { cursor ->
+ if (!cursor.moveToFirst()) return@use null
+ FriendStreaks(
+ userId = cursor.getStringOrNull("userId")!!,
+ notify = cursor.getInteger("notify") == 1,
+ expirationTimestamp = cursor.getLongOrNull("expirationTimestamp") ?: 0L,
+ count = cursor.getInteger("count")
+ )
+ }
+ }
+}+
\ No newline at end of file
diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/friends/FriendFeature.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/friends/FriendFeature.kt
@@ -1,9 +0,0 @@
-package me.rhunk.snapenhance.core.friends
-
-enum class FriendFeature(
- val value: String,
-) {
- DOWNLOAD("download"),
- STEALTH("stealth"),
- AUTO_SAVE("auto_save");
-}-
\ No newline at end of file
diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/messaging/EnumConversationFeature.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/messaging/EnumConversationFeature.kt
@@ -0,0 +1,10 @@
+package me.rhunk.snapenhance.core.messaging
+
+enum class EnumConversationFeature(
+ val value: String,
+ val objectType: ObjectType,
+) {
+ DOWNLOAD("download", ObjectType.USER),
+ STEALTH("stealth", ObjectType.CONVERSATION),
+ AUTO_SAVE("auto_save", ObjectType.CONVERSATION);
+}+
\ No newline at end of file
diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/messaging/ManagementObjects.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/messaging/ManagementObjects.kt
@@ -0,0 +1,28 @@
+package me.rhunk.snapenhance.core.messaging
+
+
+enum class Mode {
+ BLACKLIST,
+ WHITELIST
+}
+
+enum class ObjectType {
+ USER,
+ CONVERSATION
+}
+
+data class FriendStreaks(
+ val userId: String,
+ val notify: Boolean,
+ val expirationTimestamp: Long,
+ val count: Int
+)
+
+data class MessagingRule(
+ val id: Int,
+ val objectType: ObjectType,
+ val targetUuid: String,
+ val enabled: Boolean,
+ val mode: Mode?,
+ val subject: String
+)+
\ No newline at end of file