Skip to content

Commit

Permalink
Merge pull request #4753 from vector-im/feature/fre/tagged_events
Browse files Browse the repository at this point in the history
Support tagged events in Room Account Data (MSC2437)
  • Loading branch information
bmarty authored Jan 6, 2022
2 parents 3f9bea3 + 8d7b2ab commit b46b76c
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 0 deletions.
1 change: 1 addition & 0 deletions changelog.d/4753.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Support tagged events in Room Account Data (MSC2437)
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,5 @@ object RoomAccountDataTypes {
const val EVENT_TYPE_TAG = "m.tag"
const val EVENT_TYPE_FULLY_READ = "m.fully_read"
const val EVENT_TYPE_SPACE_ORDER = "org.matrix.msc3230.space_order" // m.space_order
const val EVENT_TYPE_TAGGED_EVENTS = "m.tagged_events"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
/*
* Copyright 2021 The Matrix.org Foundation C.I.C.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.matrix.android.sdk.internal.session.room.taggedevents

import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass

/**
* Keys are event IDs, values are event information.
*/
typealias TaggedEvent = Map<String, TaggedEventInfo>

/**
* Keys are tagged event names (eg. m.favourite), values are the related events.
*/
typealias TaggedEvents = Map<String, TaggedEvent>

/**
* Class used to parse the content of a m.tagged_events type event.
* This kind of event defines the tagged events in a room.
*
* The content of this event is a tags key whose value is an object mapping the name of each tag
* to another object. The JSON object associated with each tag is an object where the keys are the
* event IDs and values give information about the events.
*
* Ref: https://github.com/matrix-org/matrix-doc/pull/2437
*/
@JsonClass(generateAdapter = true)
data class TaggedEventsContent(
@Json(name = "tags")
var tags: TaggedEvents = emptyMap()
) {
val favouriteEvents
get() = tags[TAG_FAVOURITE].orEmpty()

val hiddenEvents
get() = tags[TAG_HIDDEN].orEmpty()

fun tagEvent(eventId: String, info: TaggedEventInfo, tag: String) {
val taggedEvents = tags[tag].orEmpty().plus(eventId to info)
tags = tags.plus(tag to taggedEvents)
}

fun untagEvent(eventId: String, tag: String) {
val taggedEvents = tags[tag]?.minus(eventId).orEmpty()
tags = tags.plus(tag to taggedEvents)
}

companion object {
const val TAG_FAVOURITE = "m.favourite"
const val TAG_HIDDEN = "m.hidden"
}
}

@JsonClass(generateAdapter = true)
data class TaggedEventInfo(
@Json(name = "keywords")
val keywords: List<String>? = null,

@Json(name = "origin_server_ts")
val originServerTs: Long? = null,

@Json(name = "tagged_at")
val taggedAt: Long? = null
)

0 comments on commit b46b76c

Please sign in to comment.