Integrate group chat moderation API

This commit is contained in:
Niels Andriesse 2019-09-02 16:42:08 +10:00
parent 749a9a93e9
commit f4bcb285af
3 changed files with 39 additions and 0 deletions

View File

@ -128,6 +128,7 @@ public class SQLCipherOpenHelper extends SQLiteOpenHelper {
db.execSQL(LokiAPIDatabase.getCreateGroupChatAuthTokenTableCommand());
db.execSQL(LokiAPIDatabase.getCreateLastMessageServerIDTableCommand());
db.execSQL(LokiAPIDatabase.getCreateLastDeletionServerIDTableCommand());
db.execSQL(LokiAPIDatabase.getCreateModerationPermissionTableCommand());
db.execSQL(LokiPreKeyBundleDatabase.getCreateTableCommand());
db.execSQL(LokiPreKeyRecordDatabase.getCreateTableCommand());
db.execSQL(LokiMessageDatabase.getCreateTableCommand());

View File

@ -43,6 +43,11 @@ class LokiAPIDatabase(context: Context, helper: SQLCipherOpenHelper) : Database(
private val lastDeletionServerIDCacheIndex = "loki_api_last_deletion_server_id_cache_index"
private val lastDeletionServerID = "last_deletion_server_id"
@JvmStatic val createLastDeletionServerIDTableCommand = "CREATE TABLE $lastDeletionServerIDCache ($lastDeletionServerIDCacheIndex STRING PRIMARY KEY, $lastDeletionServerID INTEGER DEFAULT 0);"
// Moderation permission cache
private val moderationPermissionCache = "loki_api_moderation_permission_cache"
private val moderationPermissionCacheIndex = "loki_api_moderation_permission_cache_index"
private val isModerator = "is_moderator"
@JvmStatic val createModerationPermissionTableCommand = "CREATE TABLE $moderationPermissionCache ($moderationPermissionCacheIndex STRING PRIMARY KEY, $isModerator INTEGER DEFAULT 0);"
}
override fun getSwarmCache(hexEncodedPublicKey: String): Set<LokiAPITarget>? {
@ -139,6 +144,21 @@ class LokiAPIDatabase(context: Context, helper: SQLCipherOpenHelper) : Database(
val row = wrap(mapOf( lastDeletionServerIDCacheIndex to index, lastDeletionServerID to newValue.toString() ))
database.insertOrUpdate(lastDeletionServerIDCache, row, "$lastDeletionServerIDCacheIndex = ?", wrap(index))
}
fun isModerator(group: Long, server: String): Boolean {
val database = databaseHelper.readableDatabase
val index = "$server.$group"
return database.get(moderationPermissionCache, "$moderationPermissionCacheIndex = ?", wrap(index)) { cursor ->
cursor.getInt(isModerator)
} == 1
}
fun setIsModerator(group: Long, server: String, newValue: Boolean) {
val database = databaseHelper.writableDatabase
val index = "$server.$group"
val row = wrap(mapOf( moderationPermissionCacheIndex to index, isModerator to (if (newValue) 1 else 0).toString() ))
database.insertOrUpdate(moderationPermissionCache, row, "$moderationPermissionCacheIndex = ?", wrap(index))
}
}
// region Convenience

View File

@ -44,21 +44,32 @@ class LokiGroupChatPoller(private val context: Context, private val group: LokiG
}
}
private val pollForModerationPermissionTask = object : Runnable {
override fun run() {
pollForModerationPermission()
handler.postDelayed(this, pollForModerationPermissionInterval)
}
}
companion object {
private val pollForNewMessagesInterval: Long = 4 * 1000
private val pollForDeletedMessagesInterval: Long = 20 * 1000
private val pollForModerationPermissionInterval: Long = 10 * 60 * 1000
}
fun startIfNeeded() {
if (hasStarted) return
pollForNewMessagesTask.run()
pollForDeletedMessagesTask.run()
pollForModerationPermissionTask.run()
hasStarted = true
}
fun stop() {
handler.removeCallbacks(pollForNewMessagesTask)
handler.removeCallbacks(pollForDeletedMessagesTask)
handler.removeCallbacks(pollForModerationPermissionTask)
hasStarted = false
}
@ -91,4 +102,11 @@ class LokiGroupChatPoller(private val context: Context, private val group: LokiG
Log.d("Loki", "Failed to get deleted messages for group chat with ID: ${group.serverID} on server: ${group.server}.")
}
}
private fun pollForModerationPermission() {
api.userHasModerationPermission(group.serverID, group.server).success { isModerator ->
val lokiAPIDatabase = DatabaseFactory.getLokiAPIDatabase(context)
lokiAPIDatabase.setIsModerator(group.serverID, group.server, isModerator)
}
}
}