102 lines
4.1 KiB
Kotlin
102 lines
4.1 KiB
Kotlin
package org.session.libsession.messaging.utilities
|
|
|
|
import com.fasterxml.jackson.annotation.JsonSubTypes
|
|
import com.fasterxml.jackson.annotation.JsonTypeInfo
|
|
import com.fasterxml.jackson.core.JsonParseException
|
|
import org.session.libsession.messaging.messages.control.GroupUpdated
|
|
import org.session.libsignal.messages.SignalServiceGroup
|
|
import org.session.libsignal.utilities.JsonUtil
|
|
import org.session.libsignal.utilities.Log
|
|
import java.util.Collections
|
|
|
|
// class used to save update messages details
|
|
class UpdateMessageData () {
|
|
|
|
var kind: Kind? = null
|
|
|
|
//the annotations below are required for serialization. Any new Kind class MUST be declared as JsonSubTypes as well
|
|
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME)
|
|
@JsonSubTypes(
|
|
JsonSubTypes.Type(Kind.GroupCreation::class, name = "GroupCreation"),
|
|
JsonSubTypes.Type(Kind.GroupNameChange::class, name = "GroupNameChange"),
|
|
JsonSubTypes.Type(Kind.GroupMemberAdded::class, name = "GroupMemberAdded"),
|
|
JsonSubTypes.Type(Kind.GroupMemberRemoved::class, name = "GroupMemberRemoved"),
|
|
JsonSubTypes.Type(Kind.GroupMemberLeft::class, name = "GroupMemberLeft"),
|
|
JsonSubTypes.Type(Kind.OpenGroupInvitation::class, name = "OpenGroupInvitation")
|
|
)
|
|
sealed class Kind() {
|
|
class GroupCreation(): Kind()
|
|
class GroupNameChange(val name: String): Kind() {
|
|
constructor(): this("") //default constructor required for json serialization
|
|
}
|
|
class GroupMemberAdded(val updatedMembers: Collection<String>): Kind() {
|
|
constructor(): this(Collections.emptyList())
|
|
}
|
|
class GroupMemberRemoved(val updatedMembers: Collection<String>): Kind() {
|
|
constructor(): this(Collections.emptyList())
|
|
}
|
|
class GroupMemberLeft(): Kind()
|
|
class GroupMemberUpdated(val sessionIds: List<String>, val type: MemberUpdateType?): Kind() {
|
|
constructor(): this(emptyList(), null)
|
|
}
|
|
class OpenGroupInvitation(val groupUrl: String, val groupName: String): Kind() {
|
|
constructor(): this("", "")
|
|
}
|
|
}
|
|
|
|
sealed class MemberUpdateType {
|
|
data object ADDED: MemberUpdateType()
|
|
data object REMOVED: MemberUpdateType()
|
|
data object PROMOTED: MemberUpdateType()
|
|
}
|
|
|
|
constructor(kind: Kind): this() {
|
|
this.kind = kind
|
|
}
|
|
|
|
companion object {
|
|
val TAG = UpdateMessageData::class.simpleName
|
|
|
|
fun buildGroupUpdate(type: SignalServiceGroup.Type, name: String, members: Collection<String>): UpdateMessageData? {
|
|
return when(type) {
|
|
SignalServiceGroup.Type.CREATION -> UpdateMessageData(Kind.GroupCreation())
|
|
SignalServiceGroup.Type.NAME_CHANGE -> UpdateMessageData(Kind.GroupNameChange(name))
|
|
SignalServiceGroup.Type.MEMBER_ADDED -> UpdateMessageData(Kind.GroupMemberAdded(members))
|
|
SignalServiceGroup.Type.MEMBER_REMOVED -> UpdateMessageData(Kind.GroupMemberRemoved(members))
|
|
SignalServiceGroup.Type.QUIT -> UpdateMessageData(Kind.GroupMemberLeft())
|
|
else -> null
|
|
}
|
|
}
|
|
|
|
fun buildGroupUpdate(groupUpdated: GroupUpdated): UpdateMessageData? {
|
|
val inner = groupUpdated.inner
|
|
TODO()
|
|
// return when {
|
|
// inner.hasMemberChangeMessage() -> {
|
|
// val memberChange = inner.memberChangeMessage
|
|
// val type = memberChange.type
|
|
// memberChange.memberSessionIdsList
|
|
// }
|
|
// else -> null
|
|
// }
|
|
}
|
|
|
|
fun buildOpenGroupInvitation(url: String, name: String): UpdateMessageData {
|
|
return UpdateMessageData(Kind.OpenGroupInvitation(url, name))
|
|
}
|
|
|
|
fun fromJSON(json: String): UpdateMessageData? {
|
|
return try {
|
|
JsonUtil.fromJson(json, UpdateMessageData::class.java)
|
|
} catch (e: JsonParseException) {
|
|
Log.e(TAG, "${e.message}")
|
|
null
|
|
}
|
|
}
|
|
}
|
|
|
|
fun toJSON(): String {
|
|
return JsonUtil.toJson(this)
|
|
}
|
|
}
|