mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2025-09-26 03:26:30 +02:00
Merge remote-tracking branch 'origin/HEAD'
This commit is contained in:
@@ -16,6 +16,10 @@ object ChannelFeedFilter: FeedFilter<Note>() {
|
|||||||
|
|
||||||
// returns the last Note of each user.
|
// returns the last Note of each user.
|
||||||
override fun feed(): List<Note> {
|
override fun feed(): List<Note> {
|
||||||
return channel.notes?.values?.filter { account.isAcceptable(it) }?.sortedBy { it.createdAt() }?.reversed() ?: emptyList()
|
return channel.notes
|
||||||
|
?.values
|
||||||
|
?.filter { account.isAcceptable(it) }
|
||||||
|
?.sortedBy { it.createdAt() }
|
||||||
|
?.reversed() ?: emptyList()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -21,8 +21,13 @@ object ChatroomFeedFilter: FeedFilter<Note>() {
|
|||||||
|
|
||||||
if (myAccount == null || myUser == null) return emptyList()
|
if (myAccount == null || myUser == null) return emptyList()
|
||||||
|
|
||||||
val messages = myAccount.userProfile().privateChatrooms[myUser] ?: return emptyList()
|
val messages = myAccount
|
||||||
|
.userProfile()
|
||||||
|
.privateChatrooms[myUser] ?: return emptyList()
|
||||||
|
|
||||||
return messages.roomMessages.filter { myAccount.isAcceptable(it) }.sortedBy { it.createdAt() }.reversed()
|
return messages.roomMessages
|
||||||
|
.filter { myAccount.isAcceptable(it) }
|
||||||
|
.sortedBy { it.createdAt() }
|
||||||
|
.reversed()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -15,19 +15,24 @@ object ChatroomListKnownFeedFilter: FeedFilter<Note>() {
|
|||||||
me.hasSentMessagesTo(it) && account.isAcceptable(it)
|
me.hasSentMessagesTo(it) && account.isAcceptable(it)
|
||||||
}
|
}
|
||||||
|
|
||||||
val privateMessages = messagingWith.mapNotNull {
|
val privateMessages = messagingWith.mapNotNull { it ->
|
||||||
privateChatrooms[it]?.roomMessages?.sortedBy {
|
privateChatrooms[it]
|
||||||
it.createdAt()
|
?.roomMessages
|
||||||
}?.lastOrNull {
|
?.sortedBy { it.createdAt() }
|
||||||
it.event != null
|
?.lastOrNull { it.event != null }
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val publicChannels = account.followingChannels().map {
|
val publicChannels = account.followingChannels().map { it ->
|
||||||
it.notes.values.filter { account.isAcceptable(it) }.sortedBy { it.createdAt() }.lastOrNull { it.event != null }
|
it.notes.values
|
||||||
|
.filter { account.isAcceptable(it) }
|
||||||
|
.sortedBy { it.createdAt() }
|
||||||
|
.lastOrNull { it.event != null }
|
||||||
}
|
}
|
||||||
|
|
||||||
return (privateMessages + publicChannels).filterNotNull().sortedBy { it.createdAt() }.reversed()
|
return (privateMessages + publicChannels)
|
||||||
|
.filterNotNull()
|
||||||
|
.sortedBy { it.createdAt() }
|
||||||
|
.reversed()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -15,15 +15,15 @@ object ChatroomListNewFeedFilter: FeedFilter<Note>() {
|
|||||||
!me.hasSentMessagesTo(it) && account.isAcceptable(it)
|
!me.hasSentMessagesTo(it) && account.isAcceptable(it)
|
||||||
}
|
}
|
||||||
|
|
||||||
val privateMessages = messagingWith.mapNotNull {
|
val privateMessages = messagingWith.mapNotNull { it ->
|
||||||
privateChatrooms[it]?.roomMessages?.sortedBy {
|
privateChatrooms[it]
|
||||||
it.createdAt()
|
?.roomMessages
|
||||||
}?.lastOrNull {
|
?.sortedBy { it.createdAt() }
|
||||||
it.event != null
|
?.lastOrNull { it.event != null }
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return privateMessages.sortedBy { it.createdAt() }.reversed()
|
return privateMessages
|
||||||
|
.sortedBy { it.createdAt() }
|
||||||
|
.reversed()
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
|
||||||
|
@@ -11,9 +11,9 @@ abstract class FeedFilter<T>() {
|
|||||||
feed().take(1000)
|
feed().take(1000)
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.d("Time","${this.javaClass.simpleName} Feed in ${elapsed} with ${feed.size} objects")
|
Log.d("Time", "${this.javaClass.simpleName} Feed in ${elapsed} with ${feed.size} objects")
|
||||||
return feed
|
return feed
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract fun feed(): List<T>
|
abstract fun feed(): List<T>
|
||||||
}
|
}
|
||||||
|
@@ -17,12 +17,12 @@ object GlobalFeedFilter: FeedFilter<Note>() {
|
|||||||
}
|
}
|
||||||
.filter {
|
.filter {
|
||||||
// does not show events already in the public chat list
|
// does not show events already in the public chat list
|
||||||
(it.channel() == null || it.channel() !in account.followingChannels())
|
(it.channel() == null || it.channel() !in account.followingChannels())
|
||||||
// does not show people the user already follows
|
// does not show people the user already follows
|
||||||
&& (it.author !in account.userProfile().follows)
|
&& (it.author !in account.userProfile().follows)
|
||||||
}
|
}
|
||||||
.filter { account.isAcceptable(it) }
|
.filter { account.isAcceptable(it) }
|
||||||
.sortedBy { it.createdAt() }
|
.sortedBy { it.createdAt() }
|
||||||
.reversed()
|
.reversed()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -7,4 +7,4 @@ object HiddenAccountsFeedFilter: FeedFilter<User>() {
|
|||||||
lateinit var account: Account
|
lateinit var account: Account
|
||||||
|
|
||||||
override fun feed() = account.hiddenUsers()
|
override fun feed() = account.hiddenUsers()
|
||||||
}
|
}
|
||||||
|
@@ -23,4 +23,4 @@ object HomeConversationsFeedFilter: FeedFilter<Note>() {
|
|||||||
.sortedBy { it.createdAt() }
|
.sortedBy { it.createdAt() }
|
||||||
.reversed()
|
.reversed()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -14,7 +14,7 @@ object HomeNewThreadFeedFilter: FeedFilter<Note>() {
|
|||||||
val user = account.userProfile()
|
val user = account.userProfile()
|
||||||
|
|
||||||
val notes = LocalCache.notes.values
|
val notes = LocalCache.notes.values
|
||||||
.filter {
|
.filter { it ->
|
||||||
(it.event is TextNoteEvent || it.event is RepostEvent || it.event is LongTextNoteEvent)
|
(it.event is TextNoteEvent || it.event is RepostEvent || it.event is LongTextNoteEvent)
|
||||||
&& it.author in user.follows
|
&& it.author in user.follows
|
||||||
// && account.isAcceptable(it) // This filter follows only. No need to check if acceptable
|
// && account.isAcceptable(it) // This filter follows only. No need to check if acceptable
|
||||||
@@ -23,7 +23,7 @@ object HomeNewThreadFeedFilter: FeedFilter<Note>() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val longFormNotes = LocalCache.addressables.values
|
val longFormNotes = LocalCache.addressables.values
|
||||||
.filter {
|
.filter { it ->
|
||||||
(it.event is TextNoteEvent || it.event is RepostEvent || it.event is LongTextNoteEvent)
|
(it.event is TextNoteEvent || it.event is RepostEvent || it.event is LongTextNoteEvent)
|
||||||
&& it.author in user.follows
|
&& it.author in user.follows
|
||||||
// && account.isAcceptable(it) // This filter follows only. No need to check if acceptable
|
// && account.isAcceptable(it) // This filter follows only. No need to check if acceptable
|
||||||
@@ -35,4 +35,4 @@ object HomeNewThreadFeedFilter: FeedFilter<Note>() {
|
|||||||
.sortedBy { it.createdAt() }
|
.sortedBy { it.createdAt() }
|
||||||
.reversed()
|
.reversed()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -2,68 +2,41 @@ package com.vitorpamplona.amethyst.ui.dal
|
|||||||
|
|
||||||
import com.vitorpamplona.amethyst.model.Account
|
import com.vitorpamplona.amethyst.model.Account
|
||||||
import com.vitorpamplona.amethyst.model.Note
|
import com.vitorpamplona.amethyst.model.Note
|
||||||
import com.vitorpamplona.amethyst.service.model.ChannelCreateEvent
|
import com.vitorpamplona.amethyst.service.model.*
|
||||||
import com.vitorpamplona.amethyst.service.model.ChannelMetadataEvent
|
|
||||||
import com.vitorpamplona.amethyst.service.model.LnZapRequestEvent
|
|
||||||
import com.vitorpamplona.amethyst.service.model.ReactionEvent
|
|
||||||
import com.vitorpamplona.amethyst.service.model.RepostEvent
|
|
||||||
import com.vitorpamplona.amethyst.service.model.TextNoteEvent
|
|
||||||
|
|
||||||
object NotificationFeedFilter: FeedFilter<Note>() {
|
object NotificationFeedFilter: FeedFilter<Note>() {
|
||||||
lateinit var account: Account
|
lateinit var account: Account
|
||||||
|
|
||||||
override fun feed(): List<Note> {
|
override fun feed(): List<Note> {
|
||||||
return account.userProfile().taggedPosts
|
return account.userProfile()
|
||||||
|
.taggedPosts
|
||||||
|
.asSequence()
|
||||||
.filter {
|
.filter {
|
||||||
it.author == null
|
it.author == null
|
||||||
|| (!account.isHidden(it.author!!) && it.author != account.userProfile())
|
|| (!account.isHidden(it.author!!) && it.author != account.userProfile())
|
||||||
}
|
}
|
||||||
.filter {
|
.filter {
|
||||||
it.event !is ChannelCreateEvent
|
it.event !is ChannelCreateEvent
|
||||||
&& it.event !is ChannelMetadataEvent
|
&& it.event !is ChannelMetadataEvent
|
||||||
&& it.event !is LnZapRequestEvent
|
&& it.event !is LnZapRequestEvent
|
||||||
}
|
}
|
||||||
.filter {
|
.filter { it ->
|
||||||
it.event !is TextNoteEvent
|
it.event !is TextNoteEvent
|
||||||
||
|
|| it.replyTo?.any { it.author == account.userProfile() } == true
|
||||||
(
|
|| account.userProfile() in it.directlyCiteUsers()
|
||||||
it.event is TextNoteEvent
|
|
||||||
&&
|
|
||||||
(
|
|
||||||
it.replyTo?.any { it.author == account.userProfile() } == true
|
|
||||||
||
|
|
||||||
account.userProfile() in it.directlyCiteUsers()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
.filter {
|
.filter {
|
||||||
it.event !is ReactionEvent
|
it.event !is ReactionEvent
|
||||||
||
|
|| it.replyTo?.lastOrNull()?.author == account.userProfile()
|
||||||
(
|
|| account.userProfile() in it.directlyCiteUsers()
|
||||||
it.event is ReactionEvent
|
|
||||||
&&
|
|
||||||
(
|
|
||||||
it.replyTo?.lastOrNull()?.author == account.userProfile()
|
|
||||||
||
|
|
||||||
account.userProfile() in it.directlyCiteUsers()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
.filter {
|
.filter {
|
||||||
it.event !is RepostEvent
|
it.event !is RepostEvent
|
||||||
||
|
|| it.replyTo?.lastOrNull()?.author == account.userProfile()
|
||||||
(
|
|| account.userProfile() in it.directlyCiteUsers()
|
||||||
it.event is RepostEvent
|
|
||||||
&&
|
|
||||||
(
|
|
||||||
it.replyTo?.lastOrNull()?.author == account.userProfile()
|
|
||||||
||
|
|
||||||
account.userProfile() in it.directlyCiteUsers()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.sortedBy { it.createdAt() }
|
.sortedBy { it.createdAt() }
|
||||||
|
.toList()
|
||||||
.reversed()
|
.reversed()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -18,4 +18,4 @@ object ThreadFeedFilter: FeedFilter<Note>() {
|
|||||||
fun loadThread(noteId: String?) {
|
fun loadThread(noteId: String?) {
|
||||||
this.noteId = noteId
|
this.noteId = noteId
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -18,7 +18,6 @@ object UserProfileConversationsFeedFilter: FeedFilter<Note>() {
|
|||||||
return user?.notes
|
return user?.notes
|
||||||
?.filter { account?.isAcceptable(it) == true && !it.isNewThread() }
|
?.filter { account?.isAcceptable(it) == true && !it.isNewThread() }
|
||||||
?.sortedBy { it.createdAt() }
|
?.sortedBy { it.createdAt() }
|
||||||
?.reversed()
|
?.reversed() ?: emptyList()
|
||||||
?: emptyList()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -14,6 +14,7 @@ object UserProfileFollowersFeedFilter: FeedFilter<User>() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun feed(): List<User> {
|
override fun feed(): List<User> {
|
||||||
return user?.followers?.filter { account.isAcceptable(it) } ?: emptyList()
|
return user?.followers
|
||||||
|
?.filter { account.isAcceptable(it) } ?: emptyList()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -14,6 +14,8 @@ object UserProfileFollowsFeedFilter: FeedFilter<User>() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun feed(): List<User> {
|
override fun feed(): List<User> {
|
||||||
return user?.follows?.filter { account.isAcceptable(it) }?.reversed() ?: emptyList()
|
return user?.follows
|
||||||
|
?.filter { account.isAcceptable(it) }
|
||||||
|
?.reversed() ?: emptyList()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -17,10 +17,10 @@ object UserProfileNewThreadFeedFilter: FeedFilter<Note>() {
|
|||||||
override fun feed(): List<Note> {
|
override fun feed(): List<Note> {
|
||||||
val longFormNotes = LocalCache.addressables.values.filter { it.author == user }
|
val longFormNotes = LocalCache.addressables.values.filter { it.author == user }
|
||||||
|
|
||||||
return user?.notes?.plus(longFormNotes)
|
return user?.notes
|
||||||
|
?.plus(longFormNotes)
|
||||||
?.filter { account?.isAcceptable(it) == true && it.isNewThread() }
|
?.filter { account?.isAcceptable(it) == true && it.isNewThread() }
|
||||||
?.sortedBy { it.createdAt() }
|
?.sortedBy { it.createdAt() }
|
||||||
?.reversed()
|
?.reversed() ?: emptyList()
|
||||||
?: emptyList()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -12,6 +12,10 @@ object UserProfileReportsFeedFilter: FeedFilter<Note>() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun feed(): List<Note> {
|
override fun feed(): List<Note> {
|
||||||
return user?.reports?.values?.flatten()?.sortedBy { it.createdAt() }?.reversed() ?: emptyList()
|
return user?.reports
|
||||||
|
?.values
|
||||||
|
?.flatten()
|
||||||
|
?.sortedBy { it.createdAt() }
|
||||||
|
?.reversed() ?: emptyList()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -5,14 +5,18 @@ import com.vitorpamplona.amethyst.model.Note
|
|||||||
import com.vitorpamplona.amethyst.model.User
|
import com.vitorpamplona.amethyst.model.User
|
||||||
import com.vitorpamplona.amethyst.service.model.LnZapEvent
|
import com.vitorpamplona.amethyst.service.model.LnZapEvent
|
||||||
|
|
||||||
object UserProfileZapsFeedFilter: FeedFilter<Pair<Note,Note>>() {
|
object UserProfileZapsFeedFilter: FeedFilter<Pair<Note, Note>>() {
|
||||||
var user: User? = null
|
var user: User? = null
|
||||||
|
|
||||||
fun loadUserProfile(userId: String) {
|
fun loadUserProfile(userId: String) {
|
||||||
user = LocalCache.checkGetOrCreateUser(userId)
|
user = LocalCache.checkGetOrCreateUser(userId)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun feed(): List<Pair<Note,Note>> {
|
override fun feed(): List<Pair<Note, Note>> {
|
||||||
return (user?.zaps?.filter { it.value != null }?.toList()?.sortedBy { (it.second?.event as? LnZapEvent)?.amount }?.reversed() ?: emptyList()) as List<Pair<Note, Note>>
|
return (user?.zaps
|
||||||
|
?.filter { it.value != null }
|
||||||
|
?.toList()
|
||||||
|
?.sortedBy { (it.second?.event as? LnZapEvent)?.amount }
|
||||||
|
?.reversed() ?: emptyList()) as List<Pair<Note, Note>>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user