diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index f8176a340..b17995e1a 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -424,12 +424,12 @@ class Account( fun isAcceptable(user: User): Boolean { return user !in hiddenUsers() // if user hasn't hided this author && user.reportsBy( userProfile() ).isEmpty() // if user has not reported this post - && user.reportsBy( userProfile().follows ).size < 5 + && user.reportAuthorsBy( userProfile().follows ).size < 5 } fun isAcceptableDirect(note: Note): Boolean { return note.reportsBy( userProfile() ).isEmpty() // if user has not reported this post - && note.reportsBy( userProfile().follows ).size < 5 // if it has 5 reports by reliable users + && note.reportAuthorsBy( userProfile().follows ).size < 5 // if it has 5 reports by reliable users } fun isAcceptable(note: Note): Boolean { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt index 6e33f183c..675815af5 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt @@ -47,7 +47,7 @@ class Note(val idHex: String) { private set var boosts = setOf() private set - var reports = setOf() + var reports = mapOf>() private set var zaps = mapOf() private set @@ -127,8 +127,13 @@ class Note(val idHex: String) { } fun addReport(note: Note) { - if (note !in reports) { - reports = reports + note + val author = note.author ?: return + + if (author !in reports.keys) { + reports = reports + Pair(author, setOf(note)) + liveReports.invalidateData() + } else { + reports = reports + Pair(author, (reports[author] ?: emptySet()) + note) liveReports.invalidateData() } } @@ -153,12 +158,18 @@ class Note(val idHex: String) { return boosts.any { it.author == user } } - fun reportsBy(user: User): List { - return reports.filter { it.author == user } + fun reportsBy(user: User): Set { + return reports[user] ?: emptySet() + } + + fun reportAuthorsBy(users: Set): List { + return reports.keys.filter { it in users } } fun reportsBy(users: Set): List { - return reports.filter { it.author in users } + return reportAuthorsBy(users).mapNotNull { + reports[it] + }.flatten() } fun zappedAmount(): BigDecimal { @@ -171,8 +182,10 @@ class Note(val idHex: String) { fun hasAnyReports(): Boolean { val dayAgo = Date().time / 1000 - 24*60*60 - return author?.reports?.filter { it.event?.createdAt ?: 0 > dayAgo }?.isNotEmpty() ?: false - || reports.isNotEmpty() + return reports.isNotEmpty() || + (author?.reports?.values?.filter { + it.firstOrNull { it.event?.createdAt ?: 0 > dayAgo } != null + }?.isNotEmpty() ?: false) } fun directlyCiteUsers(): Set { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt index 5bde472bc..1ad4f648e 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt @@ -48,7 +48,7 @@ class User(val pubkeyHex: String) { var taggedPosts = setOf() private set - var reports = setOf() + var reports = mapOf>() private set var zaps = mapOf() @@ -159,8 +159,13 @@ class User(val pubkeyHex: String) { } fun addReport(note: Note) { - if (note !in reports) { - reports = reports + note + val author = note.author ?: return + + if (author !in reports.keys) { + reports = reports + Pair(author, setOf(note)) + liveReports.invalidateData() + } else { + reports = reports + Pair(author, (reports[author] ?: emptySet()) + note) liveReports.invalidateData() } } @@ -183,12 +188,18 @@ class User(val pubkeyHex: String) { }.sumOf { it } } - fun reportsBy(user: User): List { - return reports.filter { it.author == user } + fun reportsBy(user: User): Set { + return reports[user] ?: emptySet() + } + + fun reportAuthorsBy(users: Set): List { + return reports.keys.filter { it in users } } fun reportsBy(users: Set): List { - return reports.filter { it.author in users } + return reportAuthorsBy(users).mapNotNull { + reports[it] + }.flatten() } @Synchronized @@ -271,10 +282,8 @@ class User(val pubkeyHex: String) { } fun hasReport(loggedIn: User, type: ReportEvent.ReportType): Boolean { - return reports.firstOrNull { - it.author == loggedIn - && it.event is ReportEvent - && (it.event as ReportEvent).reportType.contains(type) + return reports[loggedIn]?.firstOrNull() { + it.event is ReportEvent && (it.event as ReportEvent).reportType.contains(type) } != null }