This commit is contained in:
Ali 2022-05-10 20:51:49 +04:00
parent 88d2546303
commit e321dc8173
4 changed files with 44 additions and 6 deletions

View File

@ -6861,6 +6861,7 @@ Sorry for the inconvenience.";
"Chat.NavigationNoChannels" = "You have no unread channels"; "Chat.NavigationNoChannels" = "You have no unread channels";
"Message.SponsoredLabel" = "sponsored"; "Message.SponsoredLabel" = "sponsored";
"Message.RecommendedLabel" = "recommended";
"Stickers.Favorites" = "Favorites"; "Stickers.Favorites" = "Favorites";
"Stickers.Recent" = "Recent"; "Stickers.Recent" = "Recent";

View File

@ -2,16 +2,23 @@ import Foundation
import Postbox import Postbox
public final class AdMessageAttribute: MessageAttribute { public final class AdMessageAttribute: MessageAttribute {
public enum MessageType {
case sponsored
case recommended
}
public enum MessageTarget { public enum MessageTarget {
case peer(id: EnginePeer.Id, message: EngineMessage.Id?, startParam: String?) case peer(id: EnginePeer.Id, message: EngineMessage.Id?, startParam: String?)
case join(title: String, joinHash: String) case join(title: String, joinHash: String)
} }
public let opaqueId: Data public let opaqueId: Data
public let messageType: MessageType
public let target: MessageTarget public let target: MessageTarget
public init(opaqueId: Data, target: MessageTarget) { public init(opaqueId: Data, messageType: MessageType, target: MessageTarget) {
self.opaqueId = opaqueId self.opaqueId = opaqueId
self.messageType = messageType
self.target = target self.target = target
} }

View File

@ -7,6 +7,7 @@ private class AdMessagesHistoryContextImpl {
final class CachedMessage: Equatable, Codable { final class CachedMessage: Equatable, Codable {
enum CodingKeys: String, CodingKey { enum CodingKeys: String, CodingKey {
case opaqueId case opaqueId
case messageType
case text case text
case textEntities case textEntities
case media case media
@ -15,6 +16,11 @@ private class AdMessagesHistoryContextImpl {
case startParam case startParam
} }
enum MessageType: Int32, Codable {
case sponsored = 0
case recommended = 1
}
enum Target: Equatable, Codable { enum Target: Equatable, Codable {
enum DecodingError: Error { enum DecodingError: Error {
case generic case generic
@ -58,6 +64,7 @@ private class AdMessagesHistoryContextImpl {
} }
public let opaqueId: Data public let opaqueId: Data
public let messageType: MessageType
public let text: String public let text: String
public let textEntities: [MessageTextEntity] public let textEntities: [MessageTextEntity]
public let media: [Media] public let media: [Media]
@ -67,6 +74,7 @@ private class AdMessagesHistoryContextImpl {
public init( public init(
opaqueId: Data, opaqueId: Data,
messageType: MessageType,
text: String, text: String,
textEntities: [MessageTextEntity], textEntities: [MessageTextEntity],
media: [Media], media: [Media],
@ -75,6 +83,7 @@ private class AdMessagesHistoryContextImpl {
startParam: String? startParam: String?
) { ) {
self.opaqueId = opaqueId self.opaqueId = opaqueId
self.messageType = messageType
self.text = text self.text = text
self.textEntities = textEntities self.textEntities = textEntities
self.media = media self.media = media
@ -87,7 +96,9 @@ private class AdMessagesHistoryContextImpl {
let container = try decoder.container(keyedBy: CodingKeys.self) let container = try decoder.container(keyedBy: CodingKeys.self)
self.opaqueId = try container.decode(Data.self, forKey: .opaqueId) self.opaqueId = try container.decode(Data.self, forKey: .opaqueId)
self.messageType = (try container.decodeIfPresent(MessageType.self, forKey: .messageType)) ?? .sponsored
self.text = try container.decode(String.self, forKey: .text) self.text = try container.decode(String.self, forKey: .text)
self.textEntities = try container.decode([MessageTextEntity].self, forKey: .textEntities) self.textEntities = try container.decode([MessageTextEntity].self, forKey: .textEntities)
@ -105,6 +116,7 @@ private class AdMessagesHistoryContextImpl {
var container = encoder.container(keyedBy: CodingKeys.self) var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(self.opaqueId, forKey: .opaqueId) try container.encode(self.opaqueId, forKey: .opaqueId)
try container.encode(self.messageType, forKey: .messageType)
try container.encode(self.text, forKey: .text) try container.encode(self.text, forKey: .text)
try container.encode(self.textEntities, forKey: .textEntities) try container.encode(self.textEntities, forKey: .textEntities)
@ -124,6 +136,9 @@ private class AdMessagesHistoryContextImpl {
if lhs.opaqueId != rhs.opaqueId { if lhs.opaqueId != rhs.opaqueId {
return false return false
} }
if lhs.messageType != rhs.messageType {
return false
}
if lhs.text != rhs.text { if lhs.text != rhs.text {
return false return false
} }
@ -160,7 +175,14 @@ private class AdMessagesHistoryContextImpl {
case let .invite(invite): case let .invite(invite):
target = .join(title: invite.title, joinHash: invite.joinHash) target = .join(title: invite.title, joinHash: invite.joinHash)
} }
attributes.append(AdMessageAttribute(opaqueId: self.opaqueId, target: target)) let mappedMessageType: AdMessageAttribute.MessageType
switch self.messageType {
case .sponsored:
mappedMessageType = .sponsored
case .recommended:
mappedMessageType = .recommended
}
attributes.append(AdMessageAttribute(opaqueId: self.opaqueId, messageType: mappedMessageType, target: target))
if !self.textEntities.isEmpty { if !self.textEntities.isEmpty {
let attribute = TextEntitiesMessageAttribute(entities: self.textEntities) let attribute = TextEntitiesMessageAttribute(entities: self.textEntities)
attributes.append(attribute) attributes.append(attribute)
@ -400,12 +422,14 @@ private class AdMessagesHistoryContextImpl {
for message in messages { for message in messages {
switch message { switch message {
case let .sponsoredMessage(_, randomId, fromId, chatInvite, chatInviteHash, channelPost, startParam, message, entities): case let .sponsoredMessage(flags, randomId, fromId, chatInvite, chatInviteHash, channelPost, startParam, message, entities):
var parsedEntities: [MessageTextEntity] = [] var parsedEntities: [MessageTextEntity] = []
if let entities = entities { if let entities = entities {
parsedEntities = messageTextEntitiesFromApiEntities(entities) parsedEntities = messageTextEntitiesFromApiEntities(entities)
} }
let isRecommended = (flags & (1 << 5)) != 0
let _ = chatInvite let _ = chatInvite
let _ = chatInviteHash let _ = chatInviteHash
@ -452,6 +476,7 @@ private class AdMessagesHistoryContextImpl {
if let target = target { if let target = target {
parsedMessages.append(CachedMessage( parsedMessages.append(CachedMessage(
opaqueId: randomId.makeData(), opaqueId: randomId.makeData(),
messageType: isRecommended ? .recommended : .sponsored,
text: message, text: message,
textEntities: parsedEntities, textEntities: parsedEntities,
media: [], media: [],

View File

@ -29,8 +29,13 @@ private func dateStringForDay(strings: PresentationStrings, dateTimeFormat: Pres
} }
func stringForMessageTimestampStatus(accountPeerId: PeerId, message: Message, dateTimeFormat: PresentationDateTimeFormat, nameDisplayOrder: PresentationPersonNameOrder, strings: PresentationStrings, format: MessageTimestampStatusFormat = .regular) -> String { func stringForMessageTimestampStatus(accountPeerId: PeerId, message: Message, dateTimeFormat: PresentationDateTimeFormat, nameDisplayOrder: PresentationPersonNameOrder, strings: PresentationStrings, format: MessageTimestampStatusFormat = .regular) -> String {
if message.adAttribute != nil { if let adAttribute = message.adAttribute {
return strings.Message_SponsoredLabel switch adAttribute.messageType {
case .sponsored:
return strings.Message_SponsoredLabel
case .recommended:
return strings.Message_RecommendedLabel
}
} }
let timestamp: Int32 let timestamp: Int32