Update API

This commit is contained in:
Isaac 2024-02-29 16:08:12 +04:00
parent c48cadbd78
commit d63d474854
5 changed files with 126 additions and 29 deletions

View File

@ -102,7 +102,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
dict[-944407322] = { return Api.BotMenuButton.parse_botMenuButton($0) }
dict[1113113093] = { return Api.BotMenuButton.parse_botMenuButtonCommands($0) }
dict[1966318984] = { return Api.BotMenuButton.parse_botMenuButtonDefault($0) }
dict[467254972] = { return Api.BusinessAwayMessage.parse_businessAwayMessage($0) }
dict[-283809188] = { return Api.BusinessAwayMessage.parse_businessAwayMessage($0) }
dict[-910564679] = { return Api.BusinessAwayMessageSchedule.parse_businessAwayMessageScheduleAlways($0) }
dict[-867328308] = { return Api.BusinessAwayMessageSchedule.parse_businessAwayMessageScheduleCustom($0) }
dict[-1007487743] = { return Api.BusinessAwayMessageSchedule.parse_businessAwayMessageScheduleOutsideWorkHours($0) }
@ -308,7 +308,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
dict[-459324] = { return Api.InputBotInlineResult.parse_inputBotInlineResultDocument($0) }
dict[1336154098] = { return Api.InputBotInlineResult.parse_inputBotInlineResultGame($0) }
dict[-1462213465] = { return Api.InputBotInlineResult.parse_inputBotInlineResultPhoto($0) }
dict[-307493900] = { return Api.InputBusinessAwayMessage.parse_inputBusinessAwayMessage($0) }
dict[-2094959136] = { return Api.InputBusinessAwayMessage.parse_inputBusinessAwayMessage($0) }
dict[26528571] = { return Api.InputBusinessGreetingMessage.parse_inputBusinessGreetingMessage($0) }
dict[1871393450] = { return Api.InputBusinessRecipients.parse_inputBusinessRecipients($0) }
dict[-212145112] = { return Api.InputChannel.parse_inputChannel($0) }

View File

@ -590,14 +590,15 @@ public extension Api {
}
public extension Api {
enum BusinessAwayMessage: TypeConstructorDescription {
case businessAwayMessage(shortcutId: Int32, schedule: Api.BusinessAwayMessageSchedule, recipients: Api.BusinessRecipients)
case businessAwayMessage(flags: Int32, shortcutId: Int32, schedule: Api.BusinessAwayMessageSchedule, recipients: Api.BusinessRecipients)
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
switch self {
case .businessAwayMessage(let shortcutId, let schedule, let recipients):
case .businessAwayMessage(let flags, let shortcutId, let schedule, let recipients):
if boxed {
buffer.appendInt32(467254972)
buffer.appendInt32(-283809188)
}
serializeInt32(flags, buffer: buffer, boxed: false)
serializeInt32(shortcutId, buffer: buffer, boxed: false)
schedule.serialize(buffer, true)
recipients.serialize(buffer, true)
@ -607,27 +608,30 @@ public extension Api {
public func descriptionFields() -> (String, [(String, Any)]) {
switch self {
case .businessAwayMessage(let shortcutId, let schedule, let recipients):
return ("businessAwayMessage", [("shortcutId", shortcutId as Any), ("schedule", schedule as Any), ("recipients", recipients as Any)])
case .businessAwayMessage(let flags, let shortcutId, let schedule, let recipients):
return ("businessAwayMessage", [("flags", flags as Any), ("shortcutId", shortcutId as Any), ("schedule", schedule as Any), ("recipients", recipients as Any)])
}
}
public static func parse_businessAwayMessage(_ reader: BufferReader) -> BusinessAwayMessage? {
var _1: Int32?
_1 = reader.readInt32()
var _2: Api.BusinessAwayMessageSchedule?
var _2: Int32?
_2 = reader.readInt32()
var _3: Api.BusinessAwayMessageSchedule?
if let signature = reader.readInt32() {
_2 = Api.parse(reader, signature: signature) as? Api.BusinessAwayMessageSchedule
_3 = Api.parse(reader, signature: signature) as? Api.BusinessAwayMessageSchedule
}
var _3: Api.BusinessRecipients?
var _4: Api.BusinessRecipients?
if let signature = reader.readInt32() {
_3 = Api.parse(reader, signature: signature) as? Api.BusinessRecipients
_4 = Api.parse(reader, signature: signature) as? Api.BusinessRecipients
}
let _c1 = _1 != nil
let _c2 = _2 != nil
let _c3 = _3 != nil
if _c1 && _c2 && _c3 {
return Api.BusinessAwayMessage.businessAwayMessage(shortcutId: _1!, schedule: _2!, recipients: _3!)
let _c4 = _4 != nil
if _c1 && _c2 && _c3 && _c4 {
return Api.BusinessAwayMessage.businessAwayMessage(flags: _1!, shortcutId: _2!, schedule: _3!, recipients: _4!)
}
else {
return nil

View File

@ -264,14 +264,15 @@ public extension Api {
}
public extension Api {
enum InputBusinessAwayMessage: TypeConstructorDescription {
case inputBusinessAwayMessage(shortcutId: Int32, schedule: Api.BusinessAwayMessageSchedule, recipients: Api.InputBusinessRecipients)
case inputBusinessAwayMessage(flags: Int32, shortcutId: Int32, schedule: Api.BusinessAwayMessageSchedule, recipients: Api.InputBusinessRecipients)
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
switch self {
case .inputBusinessAwayMessage(let shortcutId, let schedule, let recipients):
case .inputBusinessAwayMessage(let flags, let shortcutId, let schedule, let recipients):
if boxed {
buffer.appendInt32(-307493900)
buffer.appendInt32(-2094959136)
}
serializeInt32(flags, buffer: buffer, boxed: false)
serializeInt32(shortcutId, buffer: buffer, boxed: false)
schedule.serialize(buffer, true)
recipients.serialize(buffer, true)
@ -281,27 +282,30 @@ public extension Api {
public func descriptionFields() -> (String, [(String, Any)]) {
switch self {
case .inputBusinessAwayMessage(let shortcutId, let schedule, let recipients):
return ("inputBusinessAwayMessage", [("shortcutId", shortcutId as Any), ("schedule", schedule as Any), ("recipients", recipients as Any)])
case .inputBusinessAwayMessage(let flags, let shortcutId, let schedule, let recipients):
return ("inputBusinessAwayMessage", [("flags", flags as Any), ("shortcutId", shortcutId as Any), ("schedule", schedule as Any), ("recipients", recipients as Any)])
}
}
public static func parse_inputBusinessAwayMessage(_ reader: BufferReader) -> InputBusinessAwayMessage? {
var _1: Int32?
_1 = reader.readInt32()
var _2: Api.BusinessAwayMessageSchedule?
var _2: Int32?
_2 = reader.readInt32()
var _3: Api.BusinessAwayMessageSchedule?
if let signature = reader.readInt32() {
_2 = Api.parse(reader, signature: signature) as? Api.BusinessAwayMessageSchedule
_3 = Api.parse(reader, signature: signature) as? Api.BusinessAwayMessageSchedule
}
var _3: Api.InputBusinessRecipients?
var _4: Api.InputBusinessRecipients?
if let signature = reader.readInt32() {
_3 = Api.parse(reader, signature: signature) as? Api.InputBusinessRecipients
_4 = Api.parse(reader, signature: signature) as? Api.InputBusinessRecipients
}
let _c1 = _1 != nil
let _c2 = _2 != nil
let _c3 = _3 != nil
if _c1 && _c2 && _c3 {
return Api.InputBusinessAwayMessage.inputBusinessAwayMessage(shortcutId: _1!, schedule: _2!, recipients: _3!)
let _c4 = _4 != nil
if _c1 && _c2 && _c3 && _c4 {
return Api.InputBusinessAwayMessage.inputBusinessAwayMessage(flags: _1!, shortcutId: _2!, schedule: _3!, recipients: _4!)
}
else {
return nil

View File

@ -540,16 +540,19 @@ public final class TelegramBusinessAwayMessage: Codable, Equatable {
case shortcutId
case recipients
case schedule
case sendWhenOffline
}
public let shortcutId: Int32
public let recipients: TelegramBusinessRecipients
public let schedule: Schedule
public let sendWhenOffline: Bool
public init(shortcutId: Int32, recipients: TelegramBusinessRecipients, schedule: Schedule) {
public init(shortcutId: Int32, recipients: TelegramBusinessRecipients, schedule: Schedule, sendWhenOffline: Bool) {
self.shortcutId = shortcutId
self.recipients = recipients
self.schedule = schedule
self.sendWhenOffline = sendWhenOffline
}
public init(from decoder: Decoder) throws {
@ -558,6 +561,7 @@ public final class TelegramBusinessAwayMessage: Codable, Equatable {
self.shortcutId = try container.decode(Int32.self, forKey: .shortcutId)
self.recipients = try container.decode(TelegramBusinessRecipients.self, forKey: .recipients)
self.schedule = try container.decode(Schedule.self, forKey: .schedule)
self.sendWhenOffline = try container.decodeIfPresent(Bool.self, forKey: .sendWhenOffline) ?? false
}
public func encode(to encoder: Encoder) throws {
@ -566,6 +570,7 @@ public final class TelegramBusinessAwayMessage: Codable, Equatable {
try container.encode(self.shortcutId, forKey: .shortcutId)
try container.encode(self.recipients, forKey: .recipients)
try container.encode(self.schedule, forKey: .schedule)
try container.encode(self.sendWhenOffline, forKey: .sendWhenOffline)
}
public static func ==(lhs: TelegramBusinessAwayMessage, rhs: TelegramBusinessAwayMessage) -> Bool {
@ -582,6 +587,9 @@ public final class TelegramBusinessAwayMessage: Codable, Equatable {
if lhs.schedule != rhs.schedule {
return false
}
if lhs.sendWhenOffline != rhs.sendWhenOffline {
return false
}
return true
}
@ -590,7 +598,7 @@ public final class TelegramBusinessAwayMessage: Codable, Equatable {
extension TelegramBusinessAwayMessage {
convenience init(apiAwayMessage: Api.BusinessAwayMessage) {
switch apiAwayMessage {
case let .businessAwayMessage(shortcutId, schedule, recipients):
case let .businessAwayMessage(flags, shortcutId, schedule, recipients):
let mappedSchedule: Schedule
switch schedule {
case .businessAwayMessageScheduleAlways:
@ -601,10 +609,13 @@ extension TelegramBusinessAwayMessage {
mappedSchedule = .custom(beginTimestamp: startDate, endTimestamp: endDate)
}
let sendWhenOffline = (flags & (1 << 0)) != 0
self.init(
shortcutId: shortcutId,
recipients: TelegramBusinessRecipients(apiValue: recipients),
schedule: mappedSchedule
schedule: mappedSchedule,
sendWhenOffline: sendWhenOffline
)
}
}
@ -729,7 +740,13 @@ func _internal_updateBusinessAwayMessage(account: Account, awayMessage: Telegram
mappedSchedule = .businessAwayMessageScheduleCustom(startDate: beginTimestamp, endDate: endTimestamp)
}
var flags: Int32 = 0
if awayMessage.sendWhenOffline {
flags |= 1 << 0
}
mappedMessage = .inputBusinessAwayMessage(
flags: flags,
shortcutId: awayMessage.shortcutId,
schedule: mappedSchedule,
recipients: awayMessage.recipients.apiInputValue(additionalPeers: additionalPeers)

View File

@ -120,6 +120,7 @@ final class AutomaticBusinessMessageSetupScreenComponent: Component {
private let messagesSection = ComponentView<Empty>()
private let scheduleSection = ComponentView<Empty>()
private let customScheduleSection = ComponentView<Empty>()
private let sendWhenOfflineSection = ComponentView<Empty>()
private let accessSection = ComponentView<Empty>()
private let excludedSection = ComponentView<Empty>()
private let periodSection = ComponentView<Empty>()
@ -140,6 +141,8 @@ final class AutomaticBusinessMessageSetupScreenComponent: Component {
private var customScheduleStart: Date?
private var customScheduleEnd: Date?
private var sendWhenOffline: Bool = false
private var hasAccessToAllChatsByDefault: Bool = true
private var additionalPeerList = AdditionalPeerList(
categories: Set(),
@ -191,7 +194,7 @@ final class AutomaticBusinessMessageSetupScreenComponent: Component {
let presentationData = component.context.sharedContext.currentPresentationData.with { $0 }
if self.isOn {
if self.hasAccessToAllChatsByDefault && self.additionalPeerList.categories.isEmpty && self.additionalPeerList.peers.isEmpty {
if !self.hasAccessToAllChatsByDefault && self.additionalPeerList.categories.isEmpty && self.additionalPeerList.peers.isEmpty {
//TODO:localize
self.environment?.controller()?.present(standardTextAlertController(theme: AlertControllerTheme(presentationData: presentationData), title: nil, text: "No recipients selected. Reset?", actions: [
TextAlertAction(type: .genericAction, title: "Cancel", action: {
@ -285,7 +288,8 @@ final class AutomaticBusinessMessageSetupScreenComponent: Component {
awayMessage = TelegramBusinessAwayMessage(
shortcutId: currentShortcut.id,
recipients: recipients,
schedule: mappedSchedule
schedule: mappedSchedule,
sendWhenOffline: self.sendWhenOffline
)
}
let _ = component.context.engine.accountData.updateBusinessAwayMessage(awayMessage: awayMessage).startStandalone()
@ -601,6 +605,9 @@ final class AutomaticBusinessMessageSetupScreenComponent: Component {
if let awayMessage = component.initialData.awayMessage {
self.isOn = true
self.sendWhenOffline = awayMessage.sendWhenOffline
initialRecipients = awayMessage.recipients
switch awayMessage.schedule {
@ -1111,6 +1118,71 @@ final class AutomaticBusinessMessageSetupScreenComponent: Component {
}
}
if case .away = component.mode {
let sendWhenOfflineSectionSize = self.sendWhenOfflineSection.update(
transition: transition,
component: AnyComponent(ListSectionComponent(
theme: environment.theme,
header: nil,
footer: AnyComponent(MultilineTextComponent(
text: .markdown(
text: "Don't send the away message if you've recently been online.",
attributes: MarkdownAttributes(
body: MarkdownAttributeSet(font: Font.regular(presentationData.listsFontSize.itemListBaseHeaderFontSize), textColor: environment.theme.list.freeTextColor),
bold: MarkdownAttributeSet(font: Font.semibold(presentationData.listsFontSize.itemListBaseHeaderFontSize), textColor: environment.theme.list.freeTextColor),
link: MarkdownAttributeSet(font: Font.regular(presentationData.listsFontSize.itemListBaseHeaderFontSize), textColor: environment.theme.list.itemAccentColor),
linkAttribute: { _ in
return nil
}
)
),
maximumNumberOfLines: 0
)),
items: [
AnyComponentWithIdentity(id: 0, component: AnyComponent(ListActionItemComponent(
theme: environment.theme,
title: AnyComponent(VStack([
AnyComponentWithIdentity(id: AnyHashable(0), component: AnyComponent(MultilineTextComponent(
text: .plain(NSAttributedString(
string: "Only if Offline",
font: Font.regular(presentationData.listsFontSize.baseDisplaySize),
textColor: environment.theme.list.itemPrimaryTextColor
)),
maximumNumberOfLines: 1
))),
], alignment: .left, spacing: 2.0)),
leftIcon: nil,
accessory: .toggle(ListActionItemComponent.Toggle(
style: .regular,
isOn: self.sendWhenOffline,
action: { [weak self] value in
guard let self else {
return
}
self.sendWhenOffline = value
self.state?.updated(transition: .spring(duration: 0.4))
}
)),
action: nil
)))
]
)),
environment: {},
containerSize: CGSize(width: availableSize.width - sideInset * 2.0, height: 10000.0)
)
let sendWhenOfflineSectionFrame = CGRect(origin: CGPoint(x: sideInset, y: contentHeight + otherSectionsHeight), size: sendWhenOfflineSectionSize)
if let sendWhenOfflineSectionView = self.sendWhenOfflineSection.view {
if sendWhenOfflineSectionView.superview == nil {
sendWhenOfflineSectionView.layer.allowsGroupOpacity = true
self.scrollView.addSubview(sendWhenOfflineSectionView)
}
transition.setFrame(view: sendWhenOfflineSectionView, frame: sendWhenOfflineSectionFrame)
alphaTransition.setAlpha(view: sendWhenOfflineSectionView, alpha: self.isOn ? 1.0 : 0.0)
}
otherSectionsHeight += sendWhenOfflineSectionSize.height
otherSectionsHeight += sectionSpacing
}
//TODO:localize
let accessSectionSize = self.accessSection.update(
transition: transition,