mirror of https://github.com/oxen-io/session-ios
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
3.3 KiB
Swift
107 lines
3.3 KiB
Swift
// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
|
|
|
|
import Foundation
|
|
import GRDB
|
|
import SessionUtilitiesKit
|
|
|
|
public extension VisibleMessage {
|
|
struct VMReaction: Codable {
|
|
/// This is the timestamp (in milliseconds since epoch) when the interaction this reaction belongs to was sent
|
|
public var timestamp: UInt64
|
|
|
|
/// This is the public key of the sender of the interaction this reaction belongs to
|
|
public var publicKey: String
|
|
|
|
/// This is the emoji for the reaction
|
|
public var emoji: String
|
|
|
|
/// This is the behaviour for the reaction
|
|
public var kind: Kind
|
|
|
|
public var isValid: Bool { true }
|
|
|
|
// MARK: - Kind
|
|
|
|
public enum Kind: Int, Codable {
|
|
case react
|
|
case remove
|
|
|
|
var description: String {
|
|
switch self {
|
|
case .react: return "react" // stringlint:disable
|
|
case .remove: return "remove" // stringlint:disable
|
|
}
|
|
}
|
|
|
|
// MARK: - Initialization
|
|
|
|
init(protoAction: SNProtoDataMessageReaction.SNProtoDataMessageReactionAction) {
|
|
switch protoAction {
|
|
case .react: self = .react
|
|
case .remove: self = .remove
|
|
}
|
|
}
|
|
|
|
// MARK: - Proto Conversion
|
|
|
|
func toProto() -> SNProtoDataMessageReaction.SNProtoDataMessageReactionAction {
|
|
switch self {
|
|
case .react: return .react
|
|
case .remove: return .remove
|
|
}
|
|
}
|
|
}
|
|
|
|
// MARK: - Initialization
|
|
|
|
public init(timestamp: UInt64, publicKey: String, emoji: String, kind: Kind) {
|
|
self.timestamp = timestamp
|
|
self.publicKey = publicKey
|
|
self.emoji = emoji
|
|
self.kind = kind
|
|
}
|
|
|
|
// MARK: - Proto Conversion
|
|
|
|
public static func fromProto(_ proto: SNProtoDataMessageReaction) -> VMReaction? {
|
|
guard let emoji: String = proto.emoji else { return nil }
|
|
|
|
return VMReaction(
|
|
timestamp: proto.id,
|
|
publicKey: proto.author,
|
|
emoji: emoji,
|
|
kind: Kind(protoAction: proto.action)
|
|
)
|
|
}
|
|
|
|
public func toProto() -> SNProtoDataMessageReaction? {
|
|
let reactionProto = SNProtoDataMessageReaction.builder(
|
|
id: self.timestamp,
|
|
author: self.publicKey,
|
|
action: self.kind.toProto()
|
|
)
|
|
reactionProto.setEmoji(self.emoji)
|
|
|
|
do {
|
|
return try reactionProto.build()
|
|
} catch {
|
|
SNLog("Couldn't construct quote proto from: \(self).")
|
|
return nil
|
|
}
|
|
}
|
|
|
|
// MARK: - Description
|
|
|
|
public var description: String {
|
|
"""
|
|
Reaction(
|
|
timestamp: \(timestamp),
|
|
publicKey: \(publicKey),
|
|
emoji: \(emoji),
|
|
kind: \(kind.description)
|
|
)
|
|
"""
|
|
}
|
|
}
|
|
}
|