Add reaction privacy

This commit is contained in:
Isaac 2025-01-31 21:06:17 +04:00
parent 2da0f6fcc4
commit 18db7a1a58
19 changed files with 494 additions and 206 deletions

View File

@ -715,6 +715,9 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
dict[-1282352120] = { return Api.PageRelatedArticle.parse_pageRelatedArticle($0) } dict[-1282352120] = { return Api.PageRelatedArticle.parse_pageRelatedArticle($0) }
dict[878078826] = { return Api.PageTableCell.parse_pageTableCell($0) } dict[878078826] = { return Api.PageTableCell.parse_pageTableCell($0) }
dict[-524237339] = { return Api.PageTableRow.parse_pageTableRow($0) } dict[-524237339] = { return Api.PageTableRow.parse_pageTableRow($0) }
dict[520887001] = { return Api.PaidReactionPrivacy.parse_paidReactionPrivacyAnonymous($0) }
dict[543872158] = { return Api.PaidReactionPrivacy.parse_paidReactionPrivacyDefault($0) }
dict[-596837136] = { return Api.PaidReactionPrivacy.parse_paidReactionPrivacyPeer($0) }
dict[982592842] = { return Api.PasswordKdfAlgo.parse_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow($0) } dict[982592842] = { return Api.PasswordKdfAlgo.parse_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow($0) }
dict[-732254058] = { return Api.PasswordKdfAlgo.parse_passwordKdfAlgoUnknown($0) } dict[-732254058] = { return Api.PasswordKdfAlgo.parse_passwordKdfAlgoUnknown($0) }
dict[-368917890] = { return Api.PaymentCharge.parse_paymentCharge($0) } dict[-368917890] = { return Api.PaymentCharge.parse_paymentCharge($0) }
@ -914,7 +917,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
dict[1301522832] = { return Api.SponsoredMessage.parse_sponsoredMessage($0) } dict[1301522832] = { return Api.SponsoredMessage.parse_sponsoredMessage($0) }
dict[1124938064] = { return Api.SponsoredMessageReportOption.parse_sponsoredMessageReportOption($0) } dict[1124938064] = { return Api.SponsoredMessageReportOption.parse_sponsoredMessageReportOption($0) }
dict[46953416] = { return Api.StarGift.parse_starGift($0) } dict[46953416] = { return Api.StarGift.parse_starGift($0) }
dict[-218202550] = { return Api.StarGift.parse_starGiftUnique($0) } dict[1549979985] = { return Api.StarGift.parse_starGiftUnique($0) }
dict[-1809377438] = { return Api.StarGiftAttribute.parse_starGiftAttributeBackdrop($0) } dict[-1809377438] = { return Api.StarGiftAttribute.parse_starGiftAttributeBackdrop($0) }
dict[970559507] = { return Api.StarGiftAttribute.parse_starGiftAttributeModel($0) } dict[970559507] = { return Api.StarGiftAttribute.parse_starGiftAttributeModel($0) }
dict[-524291476] = { return Api.StarGiftAttribute.parse_starGiftAttributeOriginalDetails($0) } dict[-524291476] = { return Api.StarGiftAttribute.parse_starGiftAttributeOriginalDetails($0) }
@ -1068,7 +1071,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
dict[1753886890] = { return Api.Update.parse_updateNewStickerSet($0) } dict[1753886890] = { return Api.Update.parse_updateNewStickerSet($0) }
dict[405070859] = { return Api.Update.parse_updateNewStoryReaction($0) } dict[405070859] = { return Api.Update.parse_updateNewStoryReaction($0) }
dict[-1094555409] = { return Api.Update.parse_updateNotifySettings($0) } dict[-1094555409] = { return Api.Update.parse_updateNotifySettings($0) }
dict[1372224236] = { return Api.Update.parse_updatePaidReactionPrivacy($0) } dict[-1955438642] = { return Api.Update.parse_updatePaidReactionPrivacy($0) }
dict[-337610926] = { return Api.Update.parse_updatePeerBlocked($0) } dict[-337610926] = { return Api.Update.parse_updatePeerBlocked($0) }
dict[-1147422299] = { return Api.Update.parse_updatePeerHistoryTTL($0) } dict[-1147422299] = { return Api.Update.parse_updatePeerHistoryTTL($0) }
dict[-1263546448] = { return Api.Update.parse_updatePeerLocated($0) } dict[-1263546448] = { return Api.Update.parse_updatePeerLocated($0) }
@ -1940,6 +1943,8 @@ public extension Api {
_1.serialize(buffer, boxed) _1.serialize(buffer, boxed)
case let _1 as Api.PageTableRow: case let _1 as Api.PageTableRow:
_1.serialize(buffer, boxed) _1.serialize(buffer, boxed)
case let _1 as Api.PaidReactionPrivacy:
_1.serialize(buffer, boxed)
case let _1 as Api.PasswordKdfAlgo: case let _1 as Api.PasswordKdfAlgo:
_1.serialize(buffer, boxed) _1.serialize(buffer, boxed)
case let _1 as Api.PaymentCharge: case let _1 as Api.PaymentCharge:

View File

@ -334,6 +334,68 @@ public extension Api {
} }
} }
public extension Api {
indirect enum PaidReactionPrivacy: TypeConstructorDescription {
case paidReactionPrivacyAnonymous
case paidReactionPrivacyDefault
case paidReactionPrivacyPeer(peer: Api.InputPeer)
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
switch self {
case .paidReactionPrivacyAnonymous:
if boxed {
buffer.appendInt32(520887001)
}
break
case .paidReactionPrivacyDefault:
if boxed {
buffer.appendInt32(543872158)
}
break
case .paidReactionPrivacyPeer(let peer):
if boxed {
buffer.appendInt32(-596837136)
}
peer.serialize(buffer, true)
break
}
}
public func descriptionFields() -> (String, [(String, Any)]) {
switch self {
case .paidReactionPrivacyAnonymous:
return ("paidReactionPrivacyAnonymous", [])
case .paidReactionPrivacyDefault:
return ("paidReactionPrivacyDefault", [])
case .paidReactionPrivacyPeer(let peer):
return ("paidReactionPrivacyPeer", [("peer", peer as Any)])
}
}
public static func parse_paidReactionPrivacyAnonymous(_ reader: BufferReader) -> PaidReactionPrivacy? {
return Api.PaidReactionPrivacy.paidReactionPrivacyAnonymous
}
public static func parse_paidReactionPrivacyDefault(_ reader: BufferReader) -> PaidReactionPrivacy? {
return Api.PaidReactionPrivacy.paidReactionPrivacyDefault
}
public static func parse_paidReactionPrivacyPeer(_ reader: BufferReader) -> PaidReactionPrivacy? {
var _1: Api.InputPeer?
if let signature = reader.readInt32() {
_1 = Api.parse(reader, signature: signature) as? Api.InputPeer
}
let _c1 = _1 != nil
if _c1 {
return Api.PaidReactionPrivacy.paidReactionPrivacyPeer(peer: _1!)
}
else {
return nil
}
}
}
}
public extension Api { public extension Api {
enum PasswordKdfAlgo: TypeConstructorDescription { enum PasswordKdfAlgo: TypeConstructorDescription {
case passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow(salt1: Buffer, salt2: Buffer, g: Int32, p: Buffer) case passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow(salt1: Buffer, salt2: Buffer, g: Int32, p: Buffer)
@ -1332,87 +1394,3 @@ public extension Api {
} }
} }
public extension Api {
enum PhoneCallDiscardReason: TypeConstructorDescription {
case phoneCallDiscardReasonAllowGroupCall(encryptedKey: Buffer)
case phoneCallDiscardReasonBusy
case phoneCallDiscardReasonDisconnect
case phoneCallDiscardReasonHangup
case phoneCallDiscardReasonMissed
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
switch self {
case .phoneCallDiscardReasonAllowGroupCall(let encryptedKey):
if boxed {
buffer.appendInt32(-1344096199)
}
serializeBytes(encryptedKey, buffer: buffer, boxed: false)
break
case .phoneCallDiscardReasonBusy:
if boxed {
buffer.appendInt32(-84416311)
}
break
case .phoneCallDiscardReasonDisconnect:
if boxed {
buffer.appendInt32(-527056480)
}
break
case .phoneCallDiscardReasonHangup:
if boxed {
buffer.appendInt32(1471006352)
}
break
case .phoneCallDiscardReasonMissed:
if boxed {
buffer.appendInt32(-2048646399)
}
break
}
}
public func descriptionFields() -> (String, [(String, Any)]) {
switch self {
case .phoneCallDiscardReasonAllowGroupCall(let encryptedKey):
return ("phoneCallDiscardReasonAllowGroupCall", [("encryptedKey", encryptedKey as Any)])
case .phoneCallDiscardReasonBusy:
return ("phoneCallDiscardReasonBusy", [])
case .phoneCallDiscardReasonDisconnect:
return ("phoneCallDiscardReasonDisconnect", [])
case .phoneCallDiscardReasonHangup:
return ("phoneCallDiscardReasonHangup", [])
case .phoneCallDiscardReasonMissed:
return ("phoneCallDiscardReasonMissed", [])
}
}
public static func parse_phoneCallDiscardReasonAllowGroupCall(_ reader: BufferReader) -> PhoneCallDiscardReason? {
var _1: Buffer?
_1 = parseBytes(reader)
let _c1 = _1 != nil
if _c1 {
return Api.PhoneCallDiscardReason.phoneCallDiscardReasonAllowGroupCall(encryptedKey: _1!)
}
else {
return nil
}
}
public static func parse_phoneCallDiscardReasonBusy(_ reader: BufferReader) -> PhoneCallDiscardReason? {
return Api.PhoneCallDiscardReason.phoneCallDiscardReasonBusy
}
public static func parse_phoneCallDiscardReasonDisconnect(_ reader: BufferReader) -> PhoneCallDiscardReason? {
return Api.PhoneCallDiscardReason.phoneCallDiscardReasonDisconnect
}
public static func parse_phoneCallDiscardReasonHangup(_ reader: BufferReader) -> PhoneCallDiscardReason? {
return Api.PhoneCallDiscardReason.phoneCallDiscardReasonHangup
}
public static func parse_phoneCallDiscardReasonMissed(_ reader: BufferReader) -> PhoneCallDiscardReason? {
return Api.PhoneCallDiscardReason.phoneCallDiscardReasonMissed
}
}
}

View File

@ -1,3 +1,87 @@
public extension Api {
enum PhoneCallDiscardReason: TypeConstructorDescription {
case phoneCallDiscardReasonAllowGroupCall(encryptedKey: Buffer)
case phoneCallDiscardReasonBusy
case phoneCallDiscardReasonDisconnect
case phoneCallDiscardReasonHangup
case phoneCallDiscardReasonMissed
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
switch self {
case .phoneCallDiscardReasonAllowGroupCall(let encryptedKey):
if boxed {
buffer.appendInt32(-1344096199)
}
serializeBytes(encryptedKey, buffer: buffer, boxed: false)
break
case .phoneCallDiscardReasonBusy:
if boxed {
buffer.appendInt32(-84416311)
}
break
case .phoneCallDiscardReasonDisconnect:
if boxed {
buffer.appendInt32(-527056480)
}
break
case .phoneCallDiscardReasonHangup:
if boxed {
buffer.appendInt32(1471006352)
}
break
case .phoneCallDiscardReasonMissed:
if boxed {
buffer.appendInt32(-2048646399)
}
break
}
}
public func descriptionFields() -> (String, [(String, Any)]) {
switch self {
case .phoneCallDiscardReasonAllowGroupCall(let encryptedKey):
return ("phoneCallDiscardReasonAllowGroupCall", [("encryptedKey", encryptedKey as Any)])
case .phoneCallDiscardReasonBusy:
return ("phoneCallDiscardReasonBusy", [])
case .phoneCallDiscardReasonDisconnect:
return ("phoneCallDiscardReasonDisconnect", [])
case .phoneCallDiscardReasonHangup:
return ("phoneCallDiscardReasonHangup", [])
case .phoneCallDiscardReasonMissed:
return ("phoneCallDiscardReasonMissed", [])
}
}
public static func parse_phoneCallDiscardReasonAllowGroupCall(_ reader: BufferReader) -> PhoneCallDiscardReason? {
var _1: Buffer?
_1 = parseBytes(reader)
let _c1 = _1 != nil
if _c1 {
return Api.PhoneCallDiscardReason.phoneCallDiscardReasonAllowGroupCall(encryptedKey: _1!)
}
else {
return nil
}
}
public static func parse_phoneCallDiscardReasonBusy(_ reader: BufferReader) -> PhoneCallDiscardReason? {
return Api.PhoneCallDiscardReason.phoneCallDiscardReasonBusy
}
public static func parse_phoneCallDiscardReasonDisconnect(_ reader: BufferReader) -> PhoneCallDiscardReason? {
return Api.PhoneCallDiscardReason.phoneCallDiscardReasonDisconnect
}
public static func parse_phoneCallDiscardReasonHangup(_ reader: BufferReader) -> PhoneCallDiscardReason? {
return Api.PhoneCallDiscardReason.phoneCallDiscardReasonHangup
}
public static func parse_phoneCallDiscardReasonMissed(_ reader: BufferReader) -> PhoneCallDiscardReason? {
return Api.PhoneCallDiscardReason.phoneCallDiscardReasonMissed
}
}
}
public extension Api { public extension Api {
enum PhoneCallProtocol: TypeConstructorDescription { enum PhoneCallProtocol: TypeConstructorDescription {
case phoneCallProtocol(flags: Int32, minLayer: Int32, maxLayer: Int32, libraryVersions: [String]) case phoneCallProtocol(flags: Int32, minLayer: Int32, maxLayer: Int32, libraryVersions: [String])

View File

@ -575,7 +575,7 @@ public extension Api {
public extension Api { public extension Api {
enum StarGift: TypeConstructorDescription { enum StarGift: TypeConstructorDescription {
case starGift(flags: Int32, id: Int64, sticker: Api.Document, stars: Int64, availabilityRemains: Int32?, availabilityTotal: Int32?, convertStars: Int64, firstSaleDate: Int32?, lastSaleDate: Int32?, upgradeStars: Int64?) case starGift(flags: Int32, id: Int64, sticker: Api.Document, stars: Int64, availabilityRemains: Int32?, availabilityTotal: Int32?, convertStars: Int64, firstSaleDate: Int32?, lastSaleDate: Int32?, upgradeStars: Int64?)
case starGiftUnique(flags: Int32, id: Int64, title: String, slug: String, num: Int32, ownerId: Api.Peer?, ownerName: String?, ownerAddress: String?, attributes: [Api.StarGiftAttribute], availabilityIssued: Int32, availabilityTotal: Int32) case starGiftUnique(flags: Int32, id: Int64, title: String, slug: String, num: Int32, ownerId: Api.Peer?, ownerName: String?, ownerAddress: String?, attributes: [Api.StarGiftAttribute], availabilityIssued: Int32, availabilityTotal: Int32, giftAddress: String?)
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
switch self { switch self {
@ -594,9 +594,9 @@ public extension Api {
if Int(flags) & Int(1 << 1) != 0 {serializeInt32(lastSaleDate!, buffer: buffer, boxed: false)} if Int(flags) & Int(1 << 1) != 0 {serializeInt32(lastSaleDate!, buffer: buffer, boxed: false)}
if Int(flags) & Int(1 << 3) != 0 {serializeInt64(upgradeStars!, buffer: buffer, boxed: false)} if Int(flags) & Int(1 << 3) != 0 {serializeInt64(upgradeStars!, buffer: buffer, boxed: false)}
break break
case .starGiftUnique(let flags, let id, let title, let slug, let num, let ownerId, let ownerName, let ownerAddress, let attributes, let availabilityIssued, let availabilityTotal): case .starGiftUnique(let flags, let id, let title, let slug, let num, let ownerId, let ownerName, let ownerAddress, let attributes, let availabilityIssued, let availabilityTotal, let giftAddress):
if boxed { if boxed {
buffer.appendInt32(-218202550) buffer.appendInt32(1549979985)
} }
serializeInt32(flags, buffer: buffer, boxed: false) serializeInt32(flags, buffer: buffer, boxed: false)
serializeInt64(id, buffer: buffer, boxed: false) serializeInt64(id, buffer: buffer, boxed: false)
@ -613,6 +613,7 @@ public extension Api {
} }
serializeInt32(availabilityIssued, buffer: buffer, boxed: false) serializeInt32(availabilityIssued, buffer: buffer, boxed: false)
serializeInt32(availabilityTotal, buffer: buffer, boxed: false) serializeInt32(availabilityTotal, buffer: buffer, boxed: false)
if Int(flags) & Int(1 << 3) != 0 {serializeString(giftAddress!, buffer: buffer, boxed: false)}
break break
} }
} }
@ -621,8 +622,8 @@ public extension Api {
switch self { switch self {
case .starGift(let flags, let id, let sticker, let stars, let availabilityRemains, let availabilityTotal, let convertStars, let firstSaleDate, let lastSaleDate, let upgradeStars): case .starGift(let flags, let id, let sticker, let stars, let availabilityRemains, let availabilityTotal, let convertStars, let firstSaleDate, let lastSaleDate, let upgradeStars):
return ("starGift", [("flags", flags as Any), ("id", id as Any), ("sticker", sticker as Any), ("stars", stars as Any), ("availabilityRemains", availabilityRemains as Any), ("availabilityTotal", availabilityTotal as Any), ("convertStars", convertStars as Any), ("firstSaleDate", firstSaleDate as Any), ("lastSaleDate", lastSaleDate as Any), ("upgradeStars", upgradeStars as Any)]) return ("starGift", [("flags", flags as Any), ("id", id as Any), ("sticker", sticker as Any), ("stars", stars as Any), ("availabilityRemains", availabilityRemains as Any), ("availabilityTotal", availabilityTotal as Any), ("convertStars", convertStars as Any), ("firstSaleDate", firstSaleDate as Any), ("lastSaleDate", lastSaleDate as Any), ("upgradeStars", upgradeStars as Any)])
case .starGiftUnique(let flags, let id, let title, let slug, let num, let ownerId, let ownerName, let ownerAddress, let attributes, let availabilityIssued, let availabilityTotal): case .starGiftUnique(let flags, let id, let title, let slug, let num, let ownerId, let ownerName, let ownerAddress, let attributes, let availabilityIssued, let availabilityTotal, let giftAddress):
return ("starGiftUnique", [("flags", flags as Any), ("id", id as Any), ("title", title as Any), ("slug", slug as Any), ("num", num as Any), ("ownerId", ownerId as Any), ("ownerName", ownerName as Any), ("ownerAddress", ownerAddress as Any), ("attributes", attributes as Any), ("availabilityIssued", availabilityIssued as Any), ("availabilityTotal", availabilityTotal as Any)]) return ("starGiftUnique", [("flags", flags as Any), ("id", id as Any), ("title", title as Any), ("slug", slug as Any), ("num", num as Any), ("ownerId", ownerId as Any), ("ownerName", ownerName as Any), ("ownerAddress", ownerAddress as Any), ("attributes", attributes as Any), ("availabilityIssued", availabilityIssued as Any), ("availabilityTotal", availabilityTotal as Any), ("giftAddress", giftAddress as Any)])
} }
} }
@ -693,6 +694,8 @@ public extension Api {
_10 = reader.readInt32() _10 = reader.readInt32()
var _11: Int32? var _11: Int32?
_11 = reader.readInt32() _11 = reader.readInt32()
var _12: String?
if Int(_1!) & Int(1 << 3) != 0 {_12 = parseString(reader) }
let _c1 = _1 != nil let _c1 = _1 != nil
let _c2 = _2 != nil let _c2 = _2 != nil
let _c3 = _3 != nil let _c3 = _3 != nil
@ -704,8 +707,9 @@ public extension Api {
let _c9 = _9 != nil let _c9 = _9 != nil
let _c10 = _10 != nil let _c10 = _10 != nil
let _c11 = _11 != nil let _c11 = _11 != nil
if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 { let _c12 = (Int(_1!) & Int(1 << 3) == 0) || _12 != nil
return Api.StarGift.starGiftUnique(flags: _1!, id: _2!, title: _3!, slug: _4!, num: _5!, ownerId: _6, ownerName: _7, ownerAddress: _8, attributes: _9!, availabilityIssued: _10!, availabilityTotal: _11!) if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 && _c12 {
return Api.StarGift.starGiftUnique(flags: _1!, id: _2!, title: _3!, slug: _4!, num: _5!, ownerId: _6, ownerName: _7, ownerAddress: _8, attributes: _9!, availabilityIssued: _10!, availabilityTotal: _11!, giftAddress: _12)
} }
else { else {
return nil return nil

View File

@ -1069,7 +1069,7 @@ public extension Api {
case updateNewStickerSet(stickerset: Api.messages.StickerSet) case updateNewStickerSet(stickerset: Api.messages.StickerSet)
case updateNewStoryReaction(storyId: Int32, peer: Api.Peer, reaction: Api.Reaction) case updateNewStoryReaction(storyId: Int32, peer: Api.Peer, reaction: Api.Reaction)
case updateNotifySettings(peer: Api.NotifyPeer, notifySettings: Api.PeerNotifySettings) case updateNotifySettings(peer: Api.NotifyPeer, notifySettings: Api.PeerNotifySettings)
case updatePaidReactionPrivacy(private: Api.Bool) case updatePaidReactionPrivacy(private: Api.PaidReactionPrivacy)
case updatePeerBlocked(flags: Int32, peerId: Api.Peer) case updatePeerBlocked(flags: Int32, peerId: Api.Peer)
case updatePeerHistoryTTL(flags: Int32, peer: Api.Peer, ttlPeriod: Int32?) case updatePeerHistoryTTL(flags: Int32, peer: Api.Peer, ttlPeriod: Int32?)
case updatePeerLocated(peers: [Api.PeerLocated]) case updatePeerLocated(peers: [Api.PeerLocated])
@ -1912,7 +1912,7 @@ public extension Api {
break break
case .updatePaidReactionPrivacy(let `private`): case .updatePaidReactionPrivacy(let `private`):
if boxed { if boxed {
buffer.appendInt32(1372224236) buffer.appendInt32(-1955438642)
} }
`private`.serialize(buffer, true) `private`.serialize(buffer, true)
break break
@ -4305,9 +4305,9 @@ public extension Api {
} }
} }
public static func parse_updatePaidReactionPrivacy(_ reader: BufferReader) -> Update? { public static func parse_updatePaidReactionPrivacy(_ reader: BufferReader) -> Update? {
var _1: Api.Bool? var _1: Api.PaidReactionPrivacy?
if let signature = reader.readInt32() { if let signature = reader.readInt32() {
_1 = Api.parse(reader, signature: signature) as? Api.Bool _1 = Api.parse(reader, signature: signature) as? Api.PaidReactionPrivacy
} }
let _c1 = _1 != nil let _c1 = _1 != nil
if _c1 { if _c1 {

View File

@ -8152,9 +8152,9 @@ public extension Api.functions.messages {
} }
} }
public extension Api.functions.messages { public extension Api.functions.messages {
static func sendPaidReaction(flags: Int32, peer: Api.InputPeer, msgId: Int32, count: Int32, randomId: Int64, `private`: Api.Bool?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.Updates>) { static func sendPaidReaction(flags: Int32, peer: Api.InputPeer, msgId: Int32, count: Int32, randomId: Int64, `private`: Api.PaidReactionPrivacy?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.Updates>) {
let buffer = Buffer() let buffer = Buffer()
buffer.appendInt32(-1646877061) buffer.appendInt32(1488702288)
serializeInt32(flags, buffer: buffer, boxed: false) serializeInt32(flags, buffer: buffer, boxed: false)
peer.serialize(buffer, true) peer.serialize(buffer, true)
serializeInt32(msgId, buffer: buffer, boxed: false) serializeInt32(msgId, buffer: buffer, boxed: false)
@ -8664,9 +8664,9 @@ public extension Api.functions.messages {
} }
} }
public extension Api.functions.messages { public extension Api.functions.messages {
static func togglePaidReactionPrivacy(peer: Api.InputPeer, msgId: Int32, `private`: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.Bool>) { static func togglePaidReactionPrivacy(peer: Api.InputPeer, msgId: Int32, `private`: Api.PaidReactionPrivacy) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.Bool>) {
let buffer = Buffer() let buffer = Buffer()
buffer.appendInt32(-2070228073) buffer.appendInt32(1129874869)
peer.serialize(buffer, true) peer.serialize(buffer, true)
serializeInt32(msgId, buffer: buffer, boxed: false) serializeInt32(msgId, buffer: buffer, boxed: false)
`private`.serialize(buffer, true) `private`.serialize(buffer, true)

View File

@ -131,7 +131,7 @@ enum AccountStateMutationOperation {
case UpdateRevenueBalances(peerId: PeerId, balances: RevenueStats.Balances) case UpdateRevenueBalances(peerId: PeerId, balances: RevenueStats.Balances)
case UpdateStarsBalance(peerId: PeerId, balance: Api.StarsAmount) case UpdateStarsBalance(peerId: PeerId, balance: Api.StarsAmount)
case UpdateStarsRevenueStatus(peerId: PeerId, status: StarsRevenueStats.Balances) case UpdateStarsRevenueStatus(peerId: PeerId, status: StarsRevenueStats.Balances)
case UpdateStarsReactionsAreAnonymousByDefault(isAnonymous: Bool) case UpdateStarsReactionsDefaultPrivacy(privacy: TelegramPaidReactionPrivacy)
case ReportMessageDelivery([MessageId]) case ReportMessageDelivery([MessageId])
} }
@ -699,8 +699,8 @@ struct AccountMutableState {
self.addOperation(.UpdateStarsRevenueStatus(peerId: peerId, status: status)) self.addOperation(.UpdateStarsRevenueStatus(peerId: peerId, status: status))
} }
mutating func updateStarsReactionsAreAnonymousByDefault(isAnonymous: Bool) { mutating func updateStarsReactionsDefaultPrivacy(privacy: TelegramPaidReactionPrivacy) {
self.addOperation(.UpdateStarsReactionsAreAnonymousByDefault(isAnonymous: isAnonymous)) self.addOperation(.UpdateStarsReactionsDefaultPrivacy(privacy: privacy))
} }
mutating func addReportMessageDelivery(messageIds: [MessageId]) { mutating func addReportMessageDelivery(messageIds: [MessageId]) {
@ -709,7 +709,7 @@ struct AccountMutableState {
mutating func addOperation(_ operation: AccountStateMutationOperation) { mutating func addOperation(_ operation: AccountStateMutationOperation) {
switch operation { switch operation {
case .DeleteMessages, .DeleteMessagesWithGlobalIds, .EditMessage, .UpdateMessagePoll, .UpdateMessageReactions, .UpdateMedia, .ReadOutbox, .ReadGroupFeedInbox, .MergePeerPresences, .UpdateSecretChat, .AddSecretMessages, .ReadSecretOutbox, .AddPeerInputActivity, .UpdateCachedPeerData, .UpdatePinnedItemIds, .UpdatePinnedSavedItemIds, .UpdatePinnedTopic, .UpdatePinnedTopicOrder, .ReadMessageContents, .UpdateMessageImpressionCount, .UpdateMessageForwardsCount, .UpdateInstalledStickerPacks, .UpdateRecentGifs, .UpdateChatInputState, .UpdateCall, .AddCallSignalingData, .UpdateLangPack, .UpdateMinAvailableMessage, .UpdatePeerChatUnreadMark, .UpdateIsContact, .UpdatePeerChatInclusion, .UpdatePeersNearby, .UpdateTheme, .UpdateWallpaper, .SyncChatListFilters, .UpdateChatListFilterOrder, .UpdateChatListFilter, .UpdateReadThread, .UpdateGroupCallParticipants, .UpdateGroupCall, .UpdateMessagesPinned, .UpdateAutoremoveTimeout, .UpdateAttachMenuBots, .UpdateAudioTranscription, .UpdateConfig, .UpdateExtendedMedia, .ResetForumTopic, .UpdateStory, .UpdateReadStories, .UpdateStoryStealthMode, .UpdateStorySentReaction, .UpdateNewAuthorization, .UpdateRevenueBalances, .UpdateStarsBalance, .UpdateStarsRevenueStatus, .UpdateStarsReactionsAreAnonymousByDefault, .ReportMessageDelivery: case .DeleteMessages, .DeleteMessagesWithGlobalIds, .EditMessage, .UpdateMessagePoll, .UpdateMessageReactions, .UpdateMedia, .ReadOutbox, .ReadGroupFeedInbox, .MergePeerPresences, .UpdateSecretChat, .AddSecretMessages, .ReadSecretOutbox, .AddPeerInputActivity, .UpdateCachedPeerData, .UpdatePinnedItemIds, .UpdatePinnedSavedItemIds, .UpdatePinnedTopic, .UpdatePinnedTopicOrder, .ReadMessageContents, .UpdateMessageImpressionCount, .UpdateMessageForwardsCount, .UpdateInstalledStickerPacks, .UpdateRecentGifs, .UpdateChatInputState, .UpdateCall, .AddCallSignalingData, .UpdateLangPack, .UpdateMinAvailableMessage, .UpdatePeerChatUnreadMark, .UpdateIsContact, .UpdatePeerChatInclusion, .UpdatePeersNearby, .UpdateTheme, .UpdateWallpaper, .SyncChatListFilters, .UpdateChatListFilterOrder, .UpdateChatListFilter, .UpdateReadThread, .UpdateGroupCallParticipants, .UpdateGroupCall, .UpdateMessagesPinned, .UpdateAutoremoveTimeout, .UpdateAttachMenuBots, .UpdateAudioTranscription, .UpdateConfig, .UpdateExtendedMedia, .ResetForumTopic, .UpdateStory, .UpdateReadStories, .UpdateStoryStealthMode, .UpdateStorySentReaction, .UpdateNewAuthorization, .UpdateRevenueBalances, .UpdateStarsBalance, .UpdateStarsRevenueStatus, .UpdateStarsReactionsDefaultPrivacy, .ReportMessageDelivery:
break break
case let .AddMessages(messages, location): case let .AddMessages(messages, location):
for message in messages { for message in messages {

View File

@ -215,12 +215,40 @@ public func mergedMessageReactions(attributes: [MessageAttribute], isTags: Bool)
if let index = topPeers.firstIndex(where: { $0.isMy }) { if let index = topPeers.firstIndex(where: { $0.isMy }) {
topPeers[index].count += pendingStars.count topPeers[index].count += pendingStars.count
} else { } else {
topPeers.append(ReactionsMessageAttribute.TopPeer(peerId: pendingStars.accountPeerId, count: pendingStars.count, isTop: false, isMy: true, isAnonymous: pendingStars.isAnonymous)) let isAnonymous: Bool
let topPeerId: PeerId?
switch pendingStars.privacy {
case .anonymous:
isAnonymous = true
topPeerId = pendingStars.accountPeerId
case .default:
isAnonymous = false
topPeerId = pendingStars.accountPeerId
case let .peer(peerId):
isAnonymous = false
topPeerId = peerId
}
topPeers.append(ReactionsMessageAttribute.TopPeer(peerId: topPeerId, count: pendingStars.count, isTop: false, isMy: true, isAnonymous: isAnonymous))
} }
reactions.insert(MessageReaction(value: .stars, count: updatedCount, chosenOrder: -1), at: 0) reactions.insert(MessageReaction(value: .stars, count: updatedCount, chosenOrder: -1), at: 0)
return ReactionsMessageAttribute(canViewList: current?.canViewList ?? false, isTags: current?.isTags ?? isTags, reactions: reactions, recentPeers: result.recentPeers, topPeers: topPeers) return ReactionsMessageAttribute(canViewList: current?.canViewList ?? false, isTags: current?.isTags ?? isTags, reactions: reactions, recentPeers: result.recentPeers, topPeers: topPeers)
} else { } else {
return ReactionsMessageAttribute(canViewList: current?.canViewList ?? false, isTags: current?.isTags ?? isTags, reactions: [MessageReaction(value: .stars, count: pendingStars.count, chosenOrder: -1)], recentPeers: [], topPeers: [ReactionsMessageAttribute.TopPeer(peerId: pendingStars.accountPeerId, count: pendingStars.count, isTop: false, isMy: true, isAnonymous: pendingStars.isAnonymous)]) let isAnonymous: Bool
let topPeerId: PeerId?
switch pendingStars.privacy {
case .anonymous:
isAnonymous = true
topPeerId = pendingStars.accountPeerId
case .default:
isAnonymous = false
topPeerId = pendingStars.accountPeerId
case let .peer(peerId):
isAnonymous = false
topPeerId = peerId
}
return ReactionsMessageAttribute(canViewList: current?.canViewList ?? false, isTags: current?.isTags ?? isTags, reactions: [MessageReaction(value: .stars, count: pendingStars.count, chosenOrder: -1)], recentPeers: [], topPeers: [ReactionsMessageAttribute.TopPeer(peerId: topPeerId, count: pendingStars.count, isTop: false, isMy: true, isAnonymous: isAnonymous)])
} }
} else { } else {
return result return result

View File

@ -1803,8 +1803,34 @@ private func finalStateWithUpdatesAndServerTime(accountPeerId: PeerId, postbox:
updatedState.updateStarsBalance(peerId: accountPeerId, balance: balance) updatedState.updateStarsBalance(peerId: accountPeerId, balance: balance)
case let .updateStarsRevenueStatus(peer, status): case let .updateStarsRevenueStatus(peer, status):
updatedState.updateStarsRevenueStatus(peerId: peer.peerId, status: StarsRevenueStats.Balances(apiStarsRevenueStatus: status)) updatedState.updateStarsRevenueStatus(peerId: peer.peerId, status: StarsRevenueStats.Balances(apiStarsRevenueStatus: status))
case let .updatePaidReactionPrivacy(isPrivate): case let .updatePaidReactionPrivacy(privacy):
updatedState.updateStarsReactionsAreAnonymousByDefault(isAnonymous: isPrivate == .boolTrue) let mappedPrivacy: TelegramPaidReactionPrivacy
switch privacy {
case .paidReactionPrivacyDefault:
mappedPrivacy = .default
case .paidReactionPrivacyAnonymous:
mappedPrivacy = .anonymous
case let .paidReactionPrivacyPeer(peer):
let peerId: PeerId
switch peer {
case let .inputPeerChannel(channelId, _):
peerId = PeerId(namespace: Namespaces.Peer.CloudChannel, id: PeerId.Id._internalFromInt64Value(channelId))
case let .inputPeerChannelFromMessage(_, _, channelId):
peerId = PeerId(namespace: Namespaces.Peer.CloudChannel, id: PeerId.Id._internalFromInt64Value(channelId))
case let .inputPeerChat(chatId):
peerId = PeerId(namespace: Namespaces.Peer.CloudGroup, id: PeerId.Id._internalFromInt64Value(chatId))
case .inputPeerEmpty:
peerId = accountPeerId
case .inputPeerSelf:
peerId = accountPeerId
case let .inputPeerUser(userId, _):
peerId = PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(userId))
case let .inputPeerUserFromMessage(_, _, userId):
peerId = PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(userId))
}
mappedPrivacy = .peer(peerId)
}
updatedState.updateStarsReactionsDefaultPrivacy(privacy: mappedPrivacy)
default: default:
break break
} }
@ -3296,7 +3322,7 @@ private func optimizedOperations(_ operations: [AccountStateMutationOperation])
var currentAddQuickReplyMessages: OptimizeAddMessagesState? var currentAddQuickReplyMessages: OptimizeAddMessagesState?
for operation in operations { for operation in operations {
switch operation { switch operation {
case .DeleteMessages, .DeleteMessagesWithGlobalIds, .EditMessage, .UpdateMessagePoll, .UpdateMessageReactions, .UpdateMedia, .MergeApiChats, .MergeApiUsers, .MergePeerPresences, .UpdatePeer, .ReadInbox, .ReadOutbox, .ReadGroupFeedInbox, .ResetReadState, .ResetIncomingReadState, .UpdatePeerChatUnreadMark, .ResetMessageTagSummary, .UpdateNotificationSettings, .UpdateGlobalNotificationSettings, .UpdateSecretChat, .AddSecretMessages, .ReadSecretOutbox, .AddPeerInputActivity, .UpdateCachedPeerData, .UpdatePinnedItemIds, .UpdatePinnedSavedItemIds, .UpdatePinnedTopic, .UpdatePinnedTopicOrder, .ReadMessageContents, .UpdateMessageImpressionCount, .UpdateMessageForwardsCount, .UpdateInstalledStickerPacks, .UpdateRecentGifs, .UpdateChatInputState, .UpdateCall, .AddCallSignalingData, .UpdateLangPack, .UpdateMinAvailableMessage, .UpdateIsContact, .UpdatePeerChatInclusion, .UpdatePeersNearby, .UpdateTheme, .SyncChatListFilters, .UpdateChatListFilter, .UpdateChatListFilterOrder, .UpdateReadThread, .UpdateMessagesPinned, .UpdateGroupCallParticipants, .UpdateGroupCall, .UpdateAutoremoveTimeout, .UpdateAttachMenuBots, .UpdateAudioTranscription, .UpdateConfig, .UpdateExtendedMedia, .ResetForumTopic, .UpdateStory, .UpdateReadStories, .UpdateStoryStealthMode, .UpdateStorySentReaction, .UpdateNewAuthorization, .UpdateWallpaper, .UpdateRevenueBalances, .UpdateStarsBalance, .UpdateStarsRevenueStatus, .UpdateStarsReactionsAreAnonymousByDefault, .ReportMessageDelivery: case .DeleteMessages, .DeleteMessagesWithGlobalIds, .EditMessage, .UpdateMessagePoll, .UpdateMessageReactions, .UpdateMedia, .MergeApiChats, .MergeApiUsers, .MergePeerPresences, .UpdatePeer, .ReadInbox, .ReadOutbox, .ReadGroupFeedInbox, .ResetReadState, .ResetIncomingReadState, .UpdatePeerChatUnreadMark, .ResetMessageTagSummary, .UpdateNotificationSettings, .UpdateGlobalNotificationSettings, .UpdateSecretChat, .AddSecretMessages, .ReadSecretOutbox, .AddPeerInputActivity, .UpdateCachedPeerData, .UpdatePinnedItemIds, .UpdatePinnedSavedItemIds, .UpdatePinnedTopic, .UpdatePinnedTopicOrder, .ReadMessageContents, .UpdateMessageImpressionCount, .UpdateMessageForwardsCount, .UpdateInstalledStickerPacks, .UpdateRecentGifs, .UpdateChatInputState, .UpdateCall, .AddCallSignalingData, .UpdateLangPack, .UpdateMinAvailableMessage, .UpdateIsContact, .UpdatePeerChatInclusion, .UpdatePeersNearby, .UpdateTheme, .SyncChatListFilters, .UpdateChatListFilter, .UpdateChatListFilterOrder, .UpdateReadThread, .UpdateMessagesPinned, .UpdateGroupCallParticipants, .UpdateGroupCall, .UpdateAutoremoveTimeout, .UpdateAttachMenuBots, .UpdateAudioTranscription, .UpdateConfig, .UpdateExtendedMedia, .ResetForumTopic, .UpdateStory, .UpdateReadStories, .UpdateStoryStealthMode, .UpdateStorySentReaction, .UpdateNewAuthorization, .UpdateWallpaper, .UpdateRevenueBalances, .UpdateStarsBalance, .UpdateStarsRevenueStatus, .UpdateStarsReactionsDefaultPrivacy, .ReportMessageDelivery:
if let currentAddMessages = currentAddMessages, !currentAddMessages.messages.isEmpty { if let currentAddMessages = currentAddMessages, !currentAddMessages.messages.isEmpty {
result.append(.AddMessages(currentAddMessages.messages, currentAddMessages.location)) result.append(.AddMessages(currentAddMessages.messages, currentAddMessages.location))
} }
@ -3434,7 +3460,7 @@ func replayFinalState(
var updatedRevenueBalances: [PeerId: RevenueStats.Balances] = [:] var updatedRevenueBalances: [PeerId: RevenueStats.Balances] = [:]
var updatedStarsBalance: [PeerId: StarsAmount] = [:] var updatedStarsBalance: [PeerId: StarsAmount] = [:]
var updatedStarsRevenueStatus: [PeerId: StarsRevenueStats.Balances] = [:] var updatedStarsRevenueStatus: [PeerId: StarsRevenueStats.Balances] = [:]
var updatedStarsReactionsAreAnonymousByDefault: Bool? var updatedStarsReactionsDefaultPrivacy: TelegramPaidReactionPrivacy?
var reportMessageDelivery = Set<MessageId>() var reportMessageDelivery = Set<MessageId>()
var holesFromPreviousStateMessageIds: [MessageId] = [] var holesFromPreviousStateMessageIds: [MessageId] = []
@ -4868,8 +4894,8 @@ func replayFinalState(
updatedStarsBalance[peerId] = StarsAmount(apiAmount: balance) updatedStarsBalance[peerId] = StarsAmount(apiAmount: balance)
case let .UpdateStarsRevenueStatus(peerId, status): case let .UpdateStarsRevenueStatus(peerId, status):
updatedStarsRevenueStatus[peerId] = status updatedStarsRevenueStatus[peerId] = status
case let .UpdateStarsReactionsAreAnonymousByDefault(value): case let .UpdateStarsReactionsDefaultPrivacy(value):
updatedStarsReactionsAreAnonymousByDefault = value updatedStarsReactionsDefaultPrivacy = value
case let .ReportMessageDelivery(messageIds): case let .ReportMessageDelivery(messageIds):
reportMessageDelivery = Set(messageIds) reportMessageDelivery = Set(messageIds)
} }
@ -5366,8 +5392,8 @@ func replayFinalState(
} }
} }
if let updatedStarsReactionsAreAnonymousByDefault { if let updatedStarsReactionsDefaultPrivacy {
_internal_setStarsReactionDefaultToPrivate(isPrivate: updatedStarsReactionsAreAnonymousByDefault, transaction: transaction) _internal_setStarsReactionDefaultPrivacy(privacy: updatedStarsReactionsDefaultPrivacy, transaction: transaction)
} }
return AccountReplayedFinalState( return AccountReplayedFinalState(

View File

@ -172,10 +172,10 @@ public func updateMessageReactionsInteractively(account: Account, messageIds: [M
|> ignoreValues |> ignoreValues
} }
func _internal_sendStarsReactionsInteractively(account: Account, messageId: MessageId, count: Int, isAnonymous: Bool?) -> Signal<Bool, NoError> { func _internal_sendStarsReactionsInteractively(account: Account, messageId: MessageId, count: Int, privacy: TelegramPaidReactionPrivacy?) -> Signal<TelegramPaidReactionPrivacy, NoError> {
return account.postbox.transaction { transaction -> Bool in return account.postbox.transaction { transaction -> TelegramPaidReactionPrivacy in
transaction.setPendingMessageAction(type: .sendStarsReaction, id: messageId, action: SendStarsReactionsAction(randomId: Int64.random(in: Int64.min ... Int64.max))) transaction.setPendingMessageAction(type: .sendStarsReaction, id: messageId, action: SendStarsReactionsAction(randomId: Int64.random(in: Int64.min ... Int64.max)))
var resolvedIsAnonymousValue = false var resolvedPrivacyValue: TelegramPaidReactionPrivacy = .default
transaction.updateMessage(messageId, update: { currentMessage in transaction.updateMessage(messageId, update: { currentMessage in
var storeForwardInfo: StoreMessageForwardInfo? var storeForwardInfo: StoreMessageForwardInfo?
if let forwardInfo = currentMessage.forwardInfo { if let forwardInfo = currentMessage.forwardInfo {
@ -183,36 +183,36 @@ func _internal_sendStarsReactionsInteractively(account: Account, messageId: Mess
} }
var mappedCount = Int32(count) var mappedCount = Int32(count)
var attributes = currentMessage.attributes var attributes = currentMessage.attributes
var resolvedIsAnonymous = _internal_getStarsReactionDefaultToPrivate(transaction: transaction) var resolvedPrivacy = _internal_getStarsReactionDefaultPrivacy(transaction: transaction)
for attribute in attributes { for attribute in attributes {
if let attribute = attribute as? ReactionsMessageAttribute { if let attribute = attribute as? ReactionsMessageAttribute {
if let myReaction = attribute.topPeers.first(where: { $0.isMy }) { if let myReaction = attribute.topPeers.first(where: { $0.isMy }) {
resolvedIsAnonymous = myReaction.isAnonymous resolvedPrivacy = myReaction.isAnonymous ? .anonymous : .default
} }
} }
} }
loop: for j in 0 ..< attributes.count { loop: for j in 0 ..< attributes.count {
if let current = attributes[j] as? PendingStarsReactionsMessageAttribute { if let current = attributes[j] as? PendingStarsReactionsMessageAttribute {
mappedCount += current.count mappedCount += current.count
resolvedIsAnonymous = current.isAnonymous resolvedPrivacy = current.privacy
attributes.remove(at: j) attributes.remove(at: j)
break loop break loop
} }
} }
if let isAnonymous { if let privacy {
resolvedIsAnonymous = isAnonymous resolvedPrivacy = privacy
_internal_setStarsReactionDefaultToPrivate(isPrivate: isAnonymous, transaction: transaction) _internal_setStarsReactionDefaultPrivacy(privacy: privacy, transaction: transaction)
} }
attributes.append(PendingStarsReactionsMessageAttribute(accountPeerId: account.peerId, count: mappedCount, isAnonymous: resolvedIsAnonymous)) attributes.append(PendingStarsReactionsMessageAttribute(accountPeerId: account.peerId, count: mappedCount, privacy: resolvedPrivacy))
resolvedIsAnonymousValue = resolvedIsAnonymous resolvedPrivacyValue = resolvedPrivacy
return .update(StoreMessage(id: currentMessage.id, globallyUniqueId: currentMessage.globallyUniqueId, groupingKey: currentMessage.groupingKey, threadId: currentMessage.threadId, timestamp: currentMessage.timestamp, flags: StoreMessageFlags(currentMessage.flags), tags: currentMessage.tags, globalTags: currentMessage.globalTags, localTags: currentMessage.localTags, forwardInfo: storeForwardInfo, authorId: currentMessage.author?.id, text: currentMessage.text, attributes: attributes, media: currentMessage.media)) return .update(StoreMessage(id: currentMessage.id, globallyUniqueId: currentMessage.globallyUniqueId, groupingKey: currentMessage.groupingKey, threadId: currentMessage.threadId, timestamp: currentMessage.timestamp, flags: StoreMessageFlags(currentMessage.flags), tags: currentMessage.tags, globalTags: currentMessage.globalTags, localTags: currentMessage.localTags, forwardInfo: storeForwardInfo, authorId: currentMessage.author?.id, text: currentMessage.text, attributes: attributes, media: currentMessage.media))
}) })
return resolvedIsAnonymousValue return resolvedPrivacyValue
} }
} }
@ -244,9 +244,9 @@ func _internal_forceSendPendingSendStarsReaction(account: Account, messageId: Me
return .complete() return .complete()
} }
func _internal_updateStarsReactionIsAnonymous(account: Account, messageId: MessageId, isAnonymous: Bool) -> Signal<Never, NoError> { func _internal_updateStarsReactionPrivacy(account: Account, messageId: MessageId, privacy: TelegramPaidReactionPrivacy) -> Signal<Never, NoError> {
return account.postbox.transaction { transaction -> Api.InputPeer? in return account.postbox.transaction { transaction -> (Api.InputPeer?, Api.InputPeer?) in
_internal_setStarsReactionDefaultToPrivate(isPrivate: isAnonymous, transaction: transaction) _internal_setStarsReactionDefaultPrivacy(privacy: privacy, transaction: transaction)
transaction.updateMessage(messageId, update: { currentMessage in transaction.updateMessage(messageId, update: { currentMessage in
var storeForwardInfo: StoreMessageForwardInfo? var storeForwardInfo: StoreMessageForwardInfo?
@ -258,7 +258,17 @@ func _internal_updateStarsReactionIsAnonymous(account: Account, messageId: Messa
if let attribute = attributes[j] as? ReactionsMessageAttribute { if let attribute = attributes[j] as? ReactionsMessageAttribute {
var updatedTopPeers = attribute.topPeers var updatedTopPeers = attribute.topPeers
if let index = updatedTopPeers.firstIndex(where: { $0.isMy }) { if let index = updatedTopPeers.firstIndex(where: { $0.isMy }) {
updatedTopPeers[index].isAnonymous = isAnonymous switch privacy {
case .anonymous:
updatedTopPeers[index].isAnonymous = true
updatedTopPeers[index].peerId = nil
case .default:
updatedTopPeers[index].isAnonymous = false
updatedTopPeers[index].peerId = account.peerId
case let .peer(peerId):
updatedTopPeers[index].isAnonymous = false
updatedTopPeers[index].peerId = peerId
}
} }
attributes[j] = ReactionsMessageAttribute(canViewList: attribute.canViewList, isTags: attribute.isTags, reactions: attribute.reactions, recentPeers: attribute.recentPeers, topPeers: updatedTopPeers) attributes[j] = ReactionsMessageAttribute(canViewList: attribute.canViewList, isTags: attribute.isTags, reactions: attribute.reactions, recentPeers: attribute.recentPeers, topPeers: updatedTopPeers)
} }
@ -266,14 +276,35 @@ func _internal_updateStarsReactionIsAnonymous(account: Account, messageId: Messa
return .update(StoreMessage(id: currentMessage.id, globallyUniqueId: currentMessage.globallyUniqueId, groupingKey: currentMessage.groupingKey, threadId: currentMessage.threadId, timestamp: currentMessage.timestamp, flags: StoreMessageFlags(currentMessage.flags), tags: currentMessage.tags, globalTags: currentMessage.globalTags, localTags: currentMessage.localTags, forwardInfo: storeForwardInfo, authorId: currentMessage.author?.id, text: currentMessage.text, attributes: attributes, media: currentMessage.media)) return .update(StoreMessage(id: currentMessage.id, globallyUniqueId: currentMessage.globallyUniqueId, groupingKey: currentMessage.groupingKey, threadId: currentMessage.threadId, timestamp: currentMessage.timestamp, flags: StoreMessageFlags(currentMessage.flags), tags: currentMessage.tags, globalTags: currentMessage.globalTags, localTags: currentMessage.localTags, forwardInfo: storeForwardInfo, authorId: currentMessage.author?.id, text: currentMessage.text, attributes: attributes, media: currentMessage.media))
}) })
return transaction.getPeer(messageId.peerId).flatMap(apiInputPeer) var privacyPeerId: PeerId?
if case let .peer(peerId) = privacy {
privacyPeerId = peerId
}
return (
transaction.getPeer(messageId.peerId).flatMap(apiInputPeer),
privacyPeerId.flatMap { privacyPeerId in transaction.getPeer(privacyPeerId).flatMap(apiInputPeer) }
)
} }
|> mapToSignal { inputPeer -> Signal<Never, NoError> in |> mapToSignal { inputPeer, inputPrivacyPeer -> Signal<Never, NoError> in
guard let inputPeer else { guard let inputPeer else {
return .complete() return .complete()
} }
return account.network.request(Api.functions.messages.togglePaidReactionPrivacy(peer: inputPeer, msgId: messageId.id, private: isAnonymous ? .boolTrue : .boolFalse)) let mappedPrivacy: Api.PaidReactionPrivacy
switch privacy {
case .anonymous:
mappedPrivacy = .paidReactionPrivacyAnonymous
case .default:
mappedPrivacy = .paidReactionPrivacyDefault
case .peer:
guard let inputPrivacyPeer else {
return .complete()
}
mappedPrivacy = .paidReactionPrivacyPeer(peer: inputPrivacyPeer)
}
return account.network.request(Api.functions.messages.togglePaidReactionPrivacy(peer: inputPeer, msgId: messageId.id, private: mappedPrivacy))
|> `catch` { _ -> Signal<Api.Bool, NoError> in |> `catch` { _ -> Signal<Api.Bool, NoError> in
return .single(.boolFalse) return .single(.boolFalse)
} }
@ -369,7 +400,7 @@ private func requestUpdateMessageReaction(postbox: Postbox, network: Network, st
} }
private func requestSendStarsReaction(postbox: Postbox, network: Network, stateManager: AccountStateManager, messageId: MessageId) -> Signal<Never, RequestUpdateMessageReactionError> { private func requestSendStarsReaction(postbox: Postbox, network: Network, stateManager: AccountStateManager, messageId: MessageId) -> Signal<Never, RequestUpdateMessageReactionError> {
return postbox.transaction { transaction -> (Peer, Int32, Bool)? in return postbox.transaction { transaction -> (Peer, Int32, Api.PaidReactionPrivacy)? in
guard let peer = transaction.getPeer(messageId.peerId) else { guard let peer = transaction.getPeer(messageId.peerId) else {
return nil return nil
} }
@ -377,19 +408,32 @@ private func requestSendStarsReaction(postbox: Postbox, network: Network, stateM
return nil return nil
} }
var count: Int32 = 0 var count: Int32 = 0
var isAnonymous = false var privacy: Api.PaidReactionPrivacy = .paidReactionPrivacyDefault
for attribute in message.attributes { for attribute in message.attributes {
if let attribute = attribute as? PendingStarsReactionsMessageAttribute { if let attribute = attribute as? PendingStarsReactionsMessageAttribute {
count += attribute.count count += attribute.count
isAnonymous = attribute.isAnonymous
let mappedPrivacy: Api.PaidReactionPrivacy
switch attribute.privacy {
case .anonymous:
mappedPrivacy = .paidReactionPrivacyAnonymous
case .default:
mappedPrivacy = .paidReactionPrivacyDefault
case let .peer(peerId):
guard let inputPrivacyPeer = transaction.getPeer(peerId).flatMap(apiInputPeer) else {
return nil
}
mappedPrivacy = .paidReactionPrivacyPeer(peer: inputPrivacyPeer)
}
privacy = mappedPrivacy
break break
} }
} }
return (peer, count, isAnonymous) return (peer, count, privacy)
} }
|> castError(RequestUpdateMessageReactionError.self) |> castError(RequestUpdateMessageReactionError.self)
|> mapToSignal { peerAndValue in |> mapToSignal { peerAndValue in
guard let (peer, count, isAnonymous) = peerAndValue else { guard let (peer, count, privacy) = peerAndValue else {
return .fail(.generic) return .fail(.generic)
} }
guard let inputPeer = apiInputPeer(peer) else { guard let inputPeer = apiInputPeer(peer) else {
@ -407,7 +451,7 @@ private func requestSendStarsReaction(postbox: Postbox, network: Network, stateM
var flags: Int32 = 0 var flags: Int32 = 0
flags |= 1 << 0 flags |= 1 << 0
let signal: Signal<Never, RequestUpdateMessageReactionError> = network.request(Api.functions.messages.sendPaidReaction(flags: flags, peer: inputPeer, msgId: messageId.id, count: count, randomId: Int64(bitPattern: randomId), private: isAnonymous ? .boolTrue : .boolFalse)) let signal: Signal<Never, RequestUpdateMessageReactionError> = network.request(Api.functions.messages.sendPaidReaction(flags: flags, peer: inputPeer, msgId: messageId.id, count: count, randomId: Int64(bitPattern: randomId), private: privacy))
|> mapError { _ -> RequestUpdateMessageReactionError in |> mapError { _ -> RequestUpdateMessageReactionError in
return .generic return .generic
} }
@ -1031,10 +1075,29 @@ func _internal_updateDefaultReaction(account: Account, reaction: MessageReaction
} }
struct StarsReactionDefaultToPrivateData: Codable { struct StarsReactionDefaultToPrivateData: Codable {
var isPrivate: Bool private enum CodingKeys: String, CodingKey {
case isPrivate = "isPrivate"
case privacy = "p"
}
init(isPrivate: Bool) { var privacy: TelegramPaidReactionPrivacy
self.isPrivate = isPrivate
init(privacy: TelegramPaidReactionPrivacy) {
self.privacy = privacy
}
init(from decoder: any Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
if let privacy = try container.decodeIfPresent(TelegramPaidReactionPrivacy.self, forKey: .privacy) {
self.privacy = privacy
} else {
self.privacy = try container.decode(Bool.self, forKey: .isPrivate) ? .anonymous : .default
}
}
func encode(to encoder: any Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(self.privacy, forKey: .privacy)
} }
static func key() -> ValueBoxKey { static func key() -> ValueBoxKey {
@ -1044,15 +1107,15 @@ struct StarsReactionDefaultToPrivateData: Codable {
} }
} }
func _internal_getStarsReactionDefaultToPrivate(transaction: Transaction) -> Bool { func _internal_getStarsReactionDefaultPrivacy(transaction: Transaction) -> TelegramPaidReactionPrivacy {
guard let value = transaction.retrieveItemCacheEntry(id: ItemCacheEntryId(collectionId: Namespaces.CachedItemCollection.starsReactionDefaultToPrivate, key: StarsReactionDefaultToPrivateData.key()))?.get(StarsReactionDefaultToPrivateData.self) else { guard let value = transaction.retrieveItemCacheEntry(id: ItemCacheEntryId(collectionId: Namespaces.CachedItemCollection.starsReactionDefaultToPrivate, key: StarsReactionDefaultToPrivateData.key()))?.get(StarsReactionDefaultToPrivateData.self) else {
return false return .default
} }
return value.isPrivate return value.privacy
} }
func _internal_setStarsReactionDefaultToPrivate(isPrivate: Bool, transaction: Transaction) { func _internal_setStarsReactionDefaultPrivacy(privacy: TelegramPaidReactionPrivacy, transaction: Transaction) {
guard let entry = CodableEntry(StarsReactionDefaultToPrivateData(isPrivate: isPrivate)) else { guard let entry = CodableEntry(StarsReactionDefaultToPrivateData(privacy: privacy)) else {
return return
} }
transaction.putItemCacheEntry(id: ItemCacheEntryId(collectionId: Namespaces.CachedItemCollection.starsReactionDefaultToPrivate, key: StarsReactionDefaultToPrivateData.key()), entry: entry) transaction.putItemCacheEntry(id: ItemCacheEntryId(collectionId: Namespaces.CachedItemCollection.starsReactionDefaultToPrivate, key: StarsReactionDefaultToPrivateData.key()), entry: entry)

View File

@ -565,7 +565,7 @@ public final class PendingReactionsMessageAttribute: MessageAttribute {
public final class PendingStarsReactionsMessageAttribute: MessageAttribute { public final class PendingStarsReactionsMessageAttribute: MessageAttribute {
public let accountPeerId: PeerId? public let accountPeerId: PeerId?
public let count: Int32 public let count: Int32
public let isAnonymous: Bool public let privacy: TelegramPaidReactionPrivacy
public var associatedPeerIds: [PeerId] { public var associatedPeerIds: [PeerId] {
var peerIds: [PeerId] = [] var peerIds: [PeerId] = []
@ -575,16 +575,21 @@ public final class PendingStarsReactionsMessageAttribute: MessageAttribute {
return peerIds return peerIds
} }
public init(accountPeerId: PeerId?, count: Int32, isAnonymous: Bool) { public init(accountPeerId: PeerId?, count: Int32, privacy: TelegramPaidReactionPrivacy) {
self.accountPeerId = accountPeerId self.accountPeerId = accountPeerId
self.count = count self.count = count
self.isAnonymous = isAnonymous self.privacy = privacy
} }
required public init(decoder: PostboxDecoder) { required public init(decoder: PostboxDecoder) {
self.accountPeerId = decoder.decodeOptionalInt64ForKey("ap").flatMap(PeerId.init) self.accountPeerId = decoder.decodeOptionalInt64ForKey("ap").flatMap(PeerId.init)
self.count = decoder.decodeInt32ForKey("cnt", orElse: 1) self.count = decoder.decodeInt32ForKey("cnt", orElse: 1)
self.isAnonymous = decoder.decodeBoolForKey("anon", orElse: false)
if let privacy = decoder.decode(TelegramPaidReactionPrivacy.self, forKey: "priv") {
self.privacy = privacy
} else {
self.privacy = decoder.decodeBoolForKey("anon", orElse: false) ? .anonymous : .default
}
} }
public func encode(_ encoder: PostboxEncoder) { public func encode(_ encoder: PostboxEncoder) {
@ -594,6 +599,6 @@ public final class PendingStarsReactionsMessageAttribute: MessageAttribute {
encoder.encodeNil(forKey: "ap") encoder.encodeNil(forKey: "ap")
} }
encoder.encodeInt32(self.count, forKey: "cnt") encoder.encodeInt32(self.count, forKey: "cnt")
encoder.encodeBool(self.isAnonymous, forKey: "anon") encoder.encodeCodable(self.privacy, forKey: "priv")
} }
} }

View File

@ -2279,8 +2279,8 @@ public extension TelegramEngine.EngineData.Item {
} }
} }
public struct StarsReactionDefaultToPrivate: TelegramEngineDataItem, PostboxViewDataItem { public struct StarsReactionDefaultPrivacy: TelegramEngineDataItem, PostboxViewDataItem {
public typealias Result = Bool public typealias Result = TelegramPaidReactionPrivacy
public init() { public init() {
} }
@ -2291,9 +2291,9 @@ public extension TelegramEngine.EngineData.Item {
func extract(view: PostboxView) -> Result { func extract(view: PostboxView) -> Result {
if let value = (view as? CachedItemView)?.value?.get(StarsReactionDefaultToPrivateData.self) { if let value = (view as? CachedItemView)?.value?.get(StarsReactionDefaultToPrivateData.self) {
return value.isPrivate return value.privacy
} else { } else {
return false return .default
} }
} }
} }

View File

@ -337,8 +337,8 @@ public extension TelegramEngine {
).startStandalone() ).startStandalone()
} }
public func sendStarsReaction(id: EngineMessage.Id, count: Int, isAnonymous: Bool?) -> Signal<Bool, NoError> { public func sendStarsReaction(id: EngineMessage.Id, count: Int, privacy: TelegramPaidReactionPrivacy?) -> Signal<TelegramPaidReactionPrivacy, NoError> {
return _internal_sendStarsReactionsInteractively(account: self.account, messageId: id, count: count, isAnonymous: isAnonymous) return _internal_sendStarsReactionsInteractively(account: self.account, messageId: id, count: count, privacy: privacy)
} }
public func cancelPendingSendStarsReaction(id: EngineMessage.Id) { public func cancelPendingSendStarsReaction(id: EngineMessage.Id) {
@ -349,8 +349,8 @@ public extension TelegramEngine {
let _ = _internal_forceSendPendingSendStarsReaction(account: self.account, messageId: id).startStandalone() let _ = _internal_forceSendPendingSendStarsReaction(account: self.account, messageId: id).startStandalone()
} }
public func updateStarsReactionIsAnonymous(id: EngineMessage.Id, isAnonymous: Bool) -> Signal<Never, NoError> { public func updateStarsReactionPrivacy(id: EngineMessage.Id, privacy: TelegramPaidReactionPrivacy) -> Signal<Never, NoError> {
return _internal_updateStarsReactionIsAnonymous(account: self.account, messageId: id, isAnonymous: isAnonymous) return _internal_updateStarsReactionPrivacy(account: self.account, messageId: id, privacy: privacy)
} }
public func requestChatContextResults(botId: PeerId, peerId: PeerId, query: String, location: Signal<(Double, Double)?, NoError> = .single(nil), offset: String, incompleteResults: Bool = false, staleCachedResults: Bool = false) -> Signal<RequestChatContextResultsResult?, RequestChatContextResultsError> { public func requestChatContextResults(botId: PeerId, peerId: PeerId, query: String, location: Signal<(Double, Double)?, NoError> = .single(nil), offset: String, incompleteResults: Bool = false, staleCachedResults: Bool = false) -> Signal<RequestChatContextResultsResult?, RequestChatContextResultsError> {

View File

@ -615,7 +615,7 @@ extension StarGift {
return nil return nil
} }
self = .generic(StarGift.Gift(id: id, file: file, price: stars, convertStars: convertStars, availability: availability, soldOut: soldOut, flags: flags, upgradeStars: upgradeStars)) self = .generic(StarGift.Gift(id: id, file: file, price: stars, convertStars: convertStars, availability: availability, soldOut: soldOut, flags: flags, upgradeStars: upgradeStars))
case let .starGiftUnique(_, id, title, slug, num, ownerPeerId, ownerName, ownerAddress, attributes, availabilityIssued, availabilityTotal): case let .starGiftUnique(_, id, title, slug, num, ownerPeerId, ownerName, ownerAddress, attributes, availabilityIssued, availabilityTotal, _):
let owner: StarGift.UniqueGift.Owner let owner: StarGift.UniqueGift.Owner
if let ownerAddress { if let ownerAddress {
owner = .address(ownerAddress) owner = .address(ownerAddress)

View File

@ -95,6 +95,42 @@ public final class TelegramResolvedMessageLink {
} }
} }
public enum TelegramPaidReactionPrivacy: Equatable, Codable {
case `default`
case anonymous
case peer(PeerId)
enum CodingKeys: String, CodingKey {
case `default` = "d"
case anonymous = "a"
case peer = "p"
}
public init(from decoder: any Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
if try container.decodeNil(forKey: .default) {
self = .default
} else if try container.decodeNil(forKey: .anonymous) {
self = .anonymous
} else {
let peerId = PeerId(try container.decode(Int64.self, forKey: .peer))
self = .peer(peerId)
}
}
public func encode(to encoder: any Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
switch self {
case .default:
try container.encodeNil(forKey: .default)
case .anonymous:
try container.encodeNil(forKey: .anonymous)
case let .peer(peerId):
try container.encode(peerId.toInt64(), forKey: .peer)
}
}
}
public extension TelegramEngine { public extension TelegramEngine {
enum NextUnreadChannelLocation: Equatable { enum NextUnreadChannelLocation: Equatable {
case same case same
@ -1650,9 +1686,9 @@ public extension TelegramEngine {
} }
} }
public func setStarsReactionDefaultToPrivate(isPrivate: Bool) { public func setStarsReactionDefaultPrivacy(privacy: TelegramPaidReactionPrivacy) {
let _ = self.account.postbox.transaction({ transaction in let _ = self.account.postbox.transaction({ transaction in
_internal_setStarsReactionDefaultToPrivate(isPrivate: isPrivate, transaction: transaction) _internal_setStarsReactionDefaultPrivacy(privacy: privacy, transaction: transaction)
}).startStandalone() }).startStandalone()
} }

View File

@ -822,7 +822,6 @@ private final class ChatSendStarsScreenComponent: Component {
let context: AccountContext let context: AccountContext
let peer: EnginePeer let peer: EnginePeer
let myPeer: EnginePeer let myPeer: EnginePeer
let sendAsPeer: EnginePeer
let channelsForPublicReaction: [EnginePeer] let channelsForPublicReaction: [EnginePeer]
let messageId: EngineMessage.Id let messageId: EngineMessage.Id
let maxAmount: Int let maxAmount: Int
@ -830,13 +829,12 @@ private final class ChatSendStarsScreenComponent: Component {
let currentSentAmount: Int? let currentSentAmount: Int?
let topPeers: [ChatSendStarsScreen.TopPeer] let topPeers: [ChatSendStarsScreen.TopPeer]
let myTopPeer: ChatSendStarsScreen.TopPeer? let myTopPeer: ChatSendStarsScreen.TopPeer?
let completion: (Int64, Bool, Bool, ChatSendStarsScreen.TransitionOut) -> Void let completion: (Int64, TelegramPaidReactionPrivacy, Bool, ChatSendStarsScreen.TransitionOut) -> Void
init( init(
context: AccountContext, context: AccountContext,
peer: EnginePeer, peer: EnginePeer,
myPeer: EnginePeer, myPeer: EnginePeer,
sendAsPeer: EnginePeer,
channelsForPublicReaction: [EnginePeer], channelsForPublicReaction: [EnginePeer],
messageId: EngineMessage.Id, messageId: EngineMessage.Id,
maxAmount: Int, maxAmount: Int,
@ -844,12 +842,11 @@ private final class ChatSendStarsScreenComponent: Component {
currentSentAmount: Int?, currentSentAmount: Int?,
topPeers: [ChatSendStarsScreen.TopPeer], topPeers: [ChatSendStarsScreen.TopPeer],
myTopPeer: ChatSendStarsScreen.TopPeer?, myTopPeer: ChatSendStarsScreen.TopPeer?,
completion: @escaping (Int64, Bool, Bool, ChatSendStarsScreen.TransitionOut) -> Void completion: @escaping (Int64, TelegramPaidReactionPrivacy, Bool, ChatSendStarsScreen.TransitionOut) -> Void
) { ) {
self.context = context self.context = context
self.peer = peer self.peer = peer
self.myPeer = myPeer self.myPeer = myPeer
self.sendAsPeer = sendAsPeer
self.channelsForPublicReaction = channelsForPublicReaction self.channelsForPublicReaction = channelsForPublicReaction
self.messageId = messageId self.messageId = messageId
self.maxAmount = maxAmount self.maxAmount = maxAmount
@ -870,9 +867,6 @@ private final class ChatSendStarsScreenComponent: Component {
if lhs.myPeer != rhs.myPeer { if lhs.myPeer != rhs.myPeer {
return false return false
} }
if lhs.sendAsPeer != rhs.sendAsPeer {
return false
}
if lhs.channelsForPublicReaction != rhs.channelsForPublicReaction { if lhs.channelsForPublicReaction != rhs.channelsForPublicReaction {
return false return false
} }
@ -991,6 +985,12 @@ private final class ChatSendStarsScreenComponent: Component {
} }
} }
private enum PrivacyPeer: Equatable {
case account
case anonymous
case peer(EnginePeer)
}
final class View: UIView, UIScrollViewDelegate { final class View: UIView, UIScrollViewDelegate {
private let dimView: UIView private let dimView: UIView
private let backgroundLayer: SimpleLayer private let backgroundLayer: SimpleLayer
@ -1041,7 +1041,7 @@ private final class ChatSendStarsScreenComponent: Component {
private var amount: Amount = Amount(realValue: 1, maxRealValue: 1000, maxSliderValue: 1000, isLogarithmic: true) private var amount: Amount = Amount(realValue: 1, maxRealValue: 1000, maxSliderValue: 1000, isLogarithmic: true)
private var didChangeAmount: Bool = false private var didChangeAmount: Bool = false
private var isAnonymous: Bool = false private var privacyPeer: PrivacyPeer = .account
private var cachedStarImage: (UIImage, PresentationTheme)? private var cachedStarImage: (UIImage, PresentationTheme)?
private var cachedCloseImage: UIImage? private var cachedCloseImage: UIImage?
@ -1386,7 +1386,25 @@ private final class ChatSendStarsScreenComponent: Component {
if self.currentMyPeer != peer { if self.currentMyPeer != peer {
self.currentMyPeer = peer self.currentMyPeer = peer
let _ = component.context.engine.peers.updatePeerSendAsPeer(peerId: component.peer.id, sendAs: peer.id).startStandalone() if peer.id == component.context.account.peerId {
self.privacyPeer = .account
} else {
self.privacyPeer = .peer(peer)
}
if component.myTopPeer != nil {
let mappedPrivacy: TelegramPaidReactionPrivacy
switch self.privacyPeer {
case .account:
mappedPrivacy = .default
case .anonymous:
mappedPrivacy = .anonymous
case let .peer(peer):
mappedPrivacy = .peer(peer.id)
}
let _ = component.context.engine.messages.updateStarsReactionPrivacy(id: component.messageId, privacy: mappedPrivacy).startStandalone()
}
} }
self.state?.updated(transition: .immediate) self.state?.updated(transition: .immediate)
@ -1421,7 +1439,16 @@ private final class ChatSendStarsScreenComponent: Component {
} }
self.amount = Amount(realValue: 50, maxRealValue: component.maxAmount, maxSliderValue: 999, isLogarithmic: isLogarithmic) self.amount = Amount(realValue: 50, maxRealValue: component.maxAmount, maxSliderValue: 999, isLogarithmic: isLogarithmic)
if let myTopPeer = component.myTopPeer { if let myTopPeer = component.myTopPeer {
self.isAnonymous = myTopPeer.isAnonymous if myTopPeer.isAnonymous {
self.privacyPeer = .anonymous
} else if myTopPeer.peer?.id == component.context.account.peerId {
self.privacyPeer = .account
} else if let peer = myTopPeer.peer {
self.privacyPeer = .peer(peer)
self.currentMyPeer = peer
} else {
self.privacyPeer = .account
}
} }
if let starsContext = component.context.starsContext { if let starsContext = component.context.starsContext {
@ -1439,8 +1466,7 @@ private final class ChatSendStarsScreenComponent: Component {
}) })
} }
//TODO:wip-release self.channelsForPublicReactionDisposable = (component.context.engine.peers.channelsForPublicReaction(useLocalCache: false)
/*self.channelsForPublicReactionDisposable = (component.context.engine.peers.channelsForPublicReaction(useLocalCache: false)
|> deliverOnMainQueue).startStrict(next: { [weak self] peers in |> deliverOnMainQueue).startStrict(next: { [weak self] peers in
guard let self else { guard let self else {
return return
@ -1449,7 +1475,7 @@ private final class ChatSendStarsScreenComponent: Component {
self.channelsForPublicReaction = peers self.channelsForPublicReaction = peers
self.state?.updated(transition: .immediate) self.state?.updated(transition: .immediate)
} }
})*/ })
} }
self.component = component self.component = component
@ -1861,9 +1887,19 @@ private final class ChatSendStarsScreenComponent: Component {
} }
myCount += myCountAddition myCount += myCountAddition
if myCount != 0 { if myCount != 0 {
var topPeer: EnginePeer?
switch self.privacyPeer {
case .anonymous:
topPeer = nil
case .account:
topPeer = component.myPeer
case let .peer(peer):
topPeer = peer
}
mappedTopPeers.append(ChatSendStarsScreen.TopPeer( mappedTopPeers.append(ChatSendStarsScreen.TopPeer(
randomIndex: -1, randomIndex: -1,
peer: self.isAnonymous ? nil : currentMyPeer, peer: topPeer,
isMy: true, isMy: true,
count: myCount count: myCount
)) ))
@ -2021,7 +2057,7 @@ private final class ChatSendStarsScreenComponent: Component {
content: AnyComponent(HStack([ content: AnyComponent(HStack([
AnyComponentWithIdentity(id: AnyHashable(0), component: AnyComponent(CheckComponent( AnyComponentWithIdentity(id: AnyHashable(0), component: AnyComponent(CheckComponent(
theme: checkTheme, theme: checkTheme,
selected: !self.isAnonymous selected: self.privacyPeer != .anonymous
))), ))),
AnyComponentWithIdentity(id: AnyHashable(1), component: AnyComponent(MultilineTextComponent( AnyComponentWithIdentity(id: AnyHashable(1), component: AnyComponent(MultilineTextComponent(
text: .plain(NSAttributedString(string: environment.strings.SendStarReactions_ShowMyselfInTop, font: Font.regular(16.0), textColor: environment.theme.list.itemPrimaryTextColor)) text: .plain(NSAttributedString(string: environment.strings.SendStarReactions_ShowMyselfInTop, font: Font.regular(16.0), textColor: environment.theme.list.itemPrimaryTextColor))
@ -2034,11 +2070,33 @@ private final class ChatSendStarsScreenComponent: Component {
guard let self, let component = self.component else { guard let self, let component = self.component else {
return return
} }
self.isAnonymous = !self.isAnonymous
switch self.privacyPeer {
case .anonymous:
if let currentMyPeer = self.currentMyPeer {
if currentMyPeer.id == component.context.account.peerId {
self.privacyPeer = .account
} else {
self.privacyPeer = .peer(currentMyPeer)
}
}
default:
self.privacyPeer = .anonymous
}
self.state?.updated(transition: .easeInOut(duration: 0.2)) self.state?.updated(transition: .easeInOut(duration: 0.2))
if component.myTopPeer != nil { if component.myTopPeer != nil {
let _ = component.context.engine.messages.updateStarsReactionIsAnonymous(id: component.messageId, isAnonymous: self.isAnonymous).startStandalone() let mappedPrivacy: TelegramPaidReactionPrivacy
switch self.privacyPeer {
case .account:
mappedPrivacy = .default
case .anonymous:
mappedPrivacy = .anonymous
case let .peer(peer):
mappedPrivacy = .peer(peer.id)
}
let _ = component.context.engine.messages.updateStarsReactionPrivacy(id: component.messageId, privacy: mappedPrivacy).startStandalone()
} }
}, },
animateAlpha: false, animateAlpha: false,
@ -2132,9 +2190,19 @@ private final class ChatSendStarsScreenComponent: Component {
isBecomingTop = true isBecomingTop = true
} }
let mappedPrivacy: TelegramPaidReactionPrivacy
switch self.privacyPeer {
case .account:
mappedPrivacy = .default
case .anonymous:
mappedPrivacy = .anonymous
case let .peer(peer):
mappedPrivacy = .peer(peer.id)
}
component.completion( component.completion(
Int64(self.amount.realValue), Int64(self.amount.realValue),
self.isAnonymous, mappedPrivacy,
isBecomingTop, isBecomingTop,
ChatSendStarsScreen.TransitionOut( ChatSendStarsScreen.TransitionOut(
sourceView: badgeView.badgeIcon sourceView: badgeView.badgeIcon
@ -2248,7 +2316,6 @@ public class ChatSendStarsScreen: ViewControllerComponentContainer {
public final class InitialData { public final class InitialData {
fileprivate let peer: EnginePeer fileprivate let peer: EnginePeer
fileprivate let myPeer: EnginePeer fileprivate let myPeer: EnginePeer
fileprivate let sendAsPeer: EnginePeer
fileprivate let channelsForPublicReaction: [EnginePeer] fileprivate let channelsForPublicReaction: [EnginePeer]
fileprivate let messageId: EngineMessage.Id fileprivate let messageId: EngineMessage.Id
fileprivate let balance: StarsAmount? fileprivate let balance: StarsAmount?
@ -2259,7 +2326,6 @@ public class ChatSendStarsScreen: ViewControllerComponentContainer {
fileprivate init( fileprivate init(
peer: EnginePeer, peer: EnginePeer,
myPeer: EnginePeer, myPeer: EnginePeer,
sendAsPeer: EnginePeer,
channelsForPublicReaction: [EnginePeer], channelsForPublicReaction: [EnginePeer],
messageId: EngineMessage.Id, messageId: EngineMessage.Id,
balance: StarsAmount?, balance: StarsAmount?,
@ -2269,7 +2335,6 @@ public class ChatSendStarsScreen: ViewControllerComponentContainer {
) { ) {
self.peer = peer self.peer = peer
self.myPeer = myPeer self.myPeer = myPeer
self.sendAsPeer = sendAsPeer
self.channelsForPublicReaction = channelsForPublicReaction self.channelsForPublicReaction = channelsForPublicReaction
self.messageId = messageId self.messageId = messageId
self.balance = balance self.balance = balance
@ -2344,7 +2409,7 @@ public class ChatSendStarsScreen: ViewControllerComponentContainer {
private var presenceDisposable: Disposable? private var presenceDisposable: Disposable?
public init(context: AccountContext, initialData: InitialData, completion: @escaping (Int64, Bool, Bool, TransitionOut) -> Void) { public init(context: AccountContext, initialData: InitialData, completion: @escaping (Int64, TelegramPaidReactionPrivacy, Bool, TransitionOut) -> Void) {
self.context = context self.context = context
var maxAmount = 2500 var maxAmount = 2500
@ -2356,7 +2421,6 @@ public class ChatSendStarsScreen: ViewControllerComponentContainer {
context: context, context: context,
peer: initialData.peer, peer: initialData.peer,
myPeer: initialData.myPeer, myPeer: initialData.myPeer,
sendAsPeer: initialData.sendAsPeer,
channelsForPublicReaction: initialData.channelsForPublicReaction, channelsForPublicReaction: initialData.channelsForPublicReaction,
messageId: initialData.messageId, messageId: initialData.messageId,
maxAmount: maxAmount, maxAmount: maxAmount,
@ -2420,10 +2484,7 @@ public class ChatSendStarsScreen: ViewControllerComponentContainer {
topPeers = Array(topPeers.prefix(3)) topPeers = Array(topPeers.prefix(3))
} }
//TODO:wip-release let channelsForPublicReaction = context.engine.peers.channelsForPublicReaction(useLocalCache: true)
//let channelsForPublicReaction = context.engine.peers.channelsForPublicReaction(useLocalCache: true)
let channelsForPublicReaction: Signal<[EnginePeer], NoError> = .single([])
let sendAsPeer: Signal<EnginePeer?, NoError> = .single(nil)
return combineLatest( return combineLatest(
context.engine.data.get( context.engine.data.get(
@ -2432,10 +2493,9 @@ public class ChatSendStarsScreen: ViewControllerComponentContainer {
EngineDataMap(allPeerIds.map(TelegramEngine.EngineData.Item.Peer.Peer.init(id:))) EngineDataMap(allPeerIds.map(TelegramEngine.EngineData.Item.Peer.Peer.init(id:)))
), ),
balance, balance,
sendAsPeer,
channelsForPublicReaction channelsForPublicReaction
) )
|> map { peerAndTopPeerMap, balance, sendAsPeer, channelsForPublicReaction -> InitialData? in |> map { peerAndTopPeerMap, balance, channelsForPublicReaction -> InitialData? in
let (peer, myPeer, topPeerMap) = peerAndTopPeerMap let (peer, myPeer, topPeerMap) = peerAndTopPeerMap
guard let peer, let myPeer else { guard let peer, let myPeer else {
return nil return nil
@ -2445,7 +2505,6 @@ public class ChatSendStarsScreen: ViewControllerComponentContainer {
return InitialData( return InitialData(
peer: peer, peer: peer,
myPeer: myPeer, myPeer: myPeer,
sendAsPeer: sendAsPeer ?? myPeer,
channelsForPublicReaction: channelsForPublicReaction, channelsForPublicReaction: channelsForPublicReaction,
messageId: messageId, messageId: messageId,
balance: balance, balance: balance,

View File

@ -457,12 +457,12 @@ extension ChatControllerImpl {
return return
} }
let _ = (strongSelf.context.engine.messages.sendStarsReaction(id: message.id, count: 1, isAnonymous: nil) let _ = (strongSelf.context.engine.messages.sendStarsReaction(id: message.id, count: 1, privacy: nil)
|> deliverOnMainQueue).startStandalone(next: { isAnonymous in |> deliverOnMainQueue).startStandalone(next: { privacy in
guard let strongSelf = self else { guard let strongSelf = self else {
return return
} }
strongSelf.displayOrUpdateSendStarsUndo(messageId: message.id, count: 1, isAnonymous: isAnonymous) strongSelf.displayOrUpdateSendStarsUndo(messageId: message.id, count: 1, privacy: privacy)
}) })
}) })
} else { } else {

View File

@ -1787,12 +1787,12 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
return return
} }
let _ = (strongSelf.context.engine.messages.sendStarsReaction(id: message.id, count: 1, isAnonymous: nil) let _ = (strongSelf.context.engine.messages.sendStarsReaction(id: message.id, count: 1, privacy: nil)
|> deliverOnMainQueue).startStandalone(next: { isAnonymous in |> deliverOnMainQueue).startStandalone(next: { privacy in
guard let strongSelf = self else { guard let strongSelf = self else {
return return
} }
strongSelf.displayOrUpdateSendStarsUndo(messageId: message.id, count: 1, isAnonymous: isAnonymous) strongSelf.displayOrUpdateSendStarsUndo(messageId: message.id, count: 1, privacy: privacy)
}) })
}) })
} else { } else {

View File

@ -391,7 +391,7 @@ extension ChatControllerImpl {
return return
} }
HapticFeedback().tap() HapticFeedback().tap()
self.push(ChatSendStarsScreen(context: self.context, initialData: initialData, completion: { [weak self] amount, isAnonymous, isBecomingTop, transitionOut in self.push(ChatSendStarsScreen(context: self.context, initialData: initialData, completion: { [weak self] amount, privacy, isBecomingTop, transitionOut in
guard let self, amount > 0 else { guard let self, amount > 0 else {
return return
} }
@ -485,14 +485,14 @@ extension ChatControllerImpl {
} }
} }
let _ = self.context.engine.messages.sendStarsReaction(id: message.id, count: Int(amount), isAnonymous: isAnonymous).startStandalone() let _ = self.context.engine.messages.sendStarsReaction(id: message.id, count: Int(amount), privacy: privacy).startStandalone()
self.displayOrUpdateSendStarsUndo(messageId: message.id, count: Int(amount), isAnonymous: isAnonymous) self.displayOrUpdateSendStarsUndo(messageId: message.id, count: Int(amount), privacy: privacy)
})) }))
}) })
}) })
} }
func displayOrUpdateSendStarsUndo(messageId: EngineMessage.Id, count: Int, isAnonymous: Bool) { func displayOrUpdateSendStarsUndo(messageId: EngineMessage.Id, count: Int, privacy: TelegramPaidReactionPrivacy) {
if self.currentSendStarsUndoMessageId != messageId { if self.currentSendStarsUndoMessageId != messageId {
if let current = self.currentSendStarsUndoController { if let current = self.currentSendStarsUndoController {
self.currentSendStarsUndoController = nil self.currentSendStarsUndoController = nil
@ -507,7 +507,7 @@ extension ChatControllerImpl {
} }
let title: String let title: String
if isAnonymous { if case .anonymous = privacy {
title = self.presentationData.strings.Chat_ToastStarsSent_AnonymousTitle(Int32(self.currentSendStarsUndoCount)) title = self.presentationData.strings.Chat_ToastStarsSent_AnonymousTitle(Int32(self.currentSendStarsUndoCount))
} else { } else {
title = self.presentationData.strings.Chat_ToastStarsSent_Title(Int32(self.currentSendStarsUndoCount)) title = self.presentationData.strings.Chat_ToastStarsSent_Title(Int32(self.currentSendStarsUndoCount))