Adds a second list of filtered Users that were automatically added and are not saved with the person's key
This commit is contained in:
@@ -58,6 +58,8 @@ class Account(
|
|||||||
var dontTranslateFrom: Set<String> = getLanguagesSpokenByUser(),
|
var dontTranslateFrom: Set<String> = getLanguagesSpokenByUser(),
|
||||||
var translateTo: String = Locale.getDefault().language
|
var translateTo: String = Locale.getDefault().language
|
||||||
) {
|
) {
|
||||||
|
var transientHiddenUsers: Set<String> = setOf()
|
||||||
|
|
||||||
fun userProfile(): User {
|
fun userProfile(): User {
|
||||||
return LocalCache.getOrCreateUser(loggedIn.pubKey.toHexKey())
|
return LocalCache.getOrCreateUser(loggedIn.pubKey.toHexKey())
|
||||||
}
|
}
|
||||||
@@ -67,7 +69,7 @@ class Account(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun hiddenUsers(): List<User> {
|
fun hiddenUsers(): List<User> {
|
||||||
return hiddenUsers.map { LocalCache.getOrCreateUser(it) }
|
return (hiddenUsers + transientHiddenUsers).map { LocalCache.getOrCreateUser(it) }
|
||||||
}
|
}
|
||||||
|
|
||||||
fun isWriteable(): Boolean {
|
fun isWriteable(): Boolean {
|
||||||
@@ -321,6 +323,7 @@ class Account(
|
|||||||
|
|
||||||
fun showUser(pubkeyHex: String) {
|
fun showUser(pubkeyHex: String) {
|
||||||
hiddenUsers = hiddenUsers - pubkeyHex
|
hiddenUsers = hiddenUsers - pubkeyHex
|
||||||
|
transientHiddenUsers = transientHiddenUsers - pubkeyHex
|
||||||
invalidateData(live)
|
invalidateData(live)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -411,6 +414,18 @@ class Account(
|
|||||||
reconnectIfRelaysHaveChanged()
|
reconnectIfRelaysHaveChanged()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
LocalCache.liveSpam.observeForever {
|
||||||
|
GlobalScope.launch(Dispatchers.IO) {
|
||||||
|
LocalCache.spamMessages.snapshot().values.forEach {
|
||||||
|
if (it !in hiddenUsers) {
|
||||||
|
val userToBlock = LocalCache.getOrCreateUser(it)
|
||||||
|
if (userToBlock != userProfile() && userToBlock !in userProfile().follows) {
|
||||||
|
transientHiddenUsers = transientHiddenUsers + it
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Observers line up here.
|
// Observers line up here.
|
||||||
|
|||||||
@@ -52,8 +52,8 @@ object LocalCache {
|
|||||||
val notes = ConcurrentHashMap<HexKey, Note>()
|
val notes = ConcurrentHashMap<HexKey, Note>()
|
||||||
val channels = ConcurrentHashMap<HexKey, Channel>()
|
val channels = ConcurrentHashMap<HexKey, Channel>()
|
||||||
|
|
||||||
val recentMessages = LruCache<Int, Int>(1000)
|
val recentMessages = LruCache<Int, String>(1000)
|
||||||
val spamMessages = LruCache<Int, Int>(1000)
|
val spamMessages = LruCache<Int, String>(1000)
|
||||||
|
|
||||||
fun checkGetOrCreateUser(key: HexKey): User? {
|
fun checkGetOrCreateUser(key: HexKey): User? {
|
||||||
return try {
|
return try {
|
||||||
@@ -120,16 +120,24 @@ object LocalCache {
|
|||||||
.format(DateTimeFormatter.ofPattern("uuuu MMM d hh:mm a"))
|
.format(DateTimeFormatter.ofPattern("uuuu MMM d hh:mm a"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Synchronized
|
||||||
fun isRepeatedMessageSpam(event: Event): Boolean {
|
fun isRepeatedMessageSpam(event: Event): Boolean {
|
||||||
|
val idHex = event.id.toHexKey()
|
||||||
|
// if already processed, return
|
||||||
|
if (notes[idHex] != null) return false
|
||||||
|
|
||||||
// double list strategy:
|
// double list strategy:
|
||||||
// if duplicated, it goes into spam. 1000 spam messages are saved into the spam list.
|
// if duplicated, it goes into spam. 1000 spam messages are saved into the spam list.
|
||||||
|
val hash = (event.content + event.tags.flatten().joinToString(",")).hashCode()
|
||||||
val hash = event.content.hashCode()
|
if (event.content.length > 50 && ((recentMessages[hash] != null && recentMessages[hash] != idHex) || spamMessages[hash] != null)) {
|
||||||
if (event.content.length > 50 && (recentMessages[hash] != null || spamMessages[hash] != null)) {
|
Log.w("Potential SPAM Message", "${event.id.toHex()} ${recentMessages[hash]} ${spamMessages[hash] != null} ${event.content.replace("\n", " | ")}")
|
||||||
spamMessages.put(hash, hash)
|
if (spamMessages.get(hash) == null) {
|
||||||
|
spamMessages.put(hash, event.pubKey.toHexKey())
|
||||||
|
liveSpam.invalidateData()
|
||||||
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
recentMessages.put(hash, hash)
|
recentMessages.put(hash, idHex)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -639,6 +647,7 @@ object LocalCache {
|
|||||||
|
|
||||||
// Observers line up here.
|
// Observers line up here.
|
||||||
val live: LocalCacheLiveData = LocalCacheLiveData(this)
|
val live: LocalCacheLiveData = LocalCacheLiveData(this)
|
||||||
|
val liveSpam: LocalCacheLiveData = LocalCacheLiveData(this)
|
||||||
|
|
||||||
private fun refreshObservers() {
|
private fun refreshObservers() {
|
||||||
live.invalidateData()
|
live.invalidateData()
|
||||||
|
|||||||
Reference in New Issue
Block a user