Merge commit '6179c3a939aab6b713328d477e68fd27a5ed2f17'

This commit is contained in:
Ali 2023-04-10 22:29:38 +04:00
commit b85183ad39
11 changed files with 80 additions and 24 deletions

View File

@ -17,8 +17,25 @@ extension ReplyMarkupButton {
self.init(title: text, titleWhenForwarded: nil, action: .requestMap) self.init(title: text, titleWhenForwarded: nil, action: .requestMap)
case let .keyboardButtonRequestPhone(text): case let .keyboardButtonRequestPhone(text):
self.init(title: text, titleWhenForwarded: nil, action: .requestPhone) self.init(title: text, titleWhenForwarded: nil, action: .requestPhone)
case let .keyboardButtonSwitchInline(flags, text, query, _): case let .keyboardButtonSwitchInline(flags, text, query, types):
self.init(title: text, titleWhenForwarded: nil, action: .switchInline(samePeer: (flags & (1 << 0)) != 0, query: query)) var peerTypes = ReplyMarkupButtonAction.PeerTypes()
if let types = types {
for type in types {
switch type {
case .inlineQueryPeerTypePM:
peerTypes.insert(.users)
case .inlineQueryPeerTypeBotPM:
peerTypes.insert(.bots)
case .inlineQueryPeerTypeBroadcast:
peerTypes.insert(.channels)
case .inlineQueryPeerTypeChat, .inlineQueryPeerTypeMegagroup:
peerTypes.insert(.groups)
case .inlineQueryPeerTypeSameBotPM:
break
}
}
}
self.init(title: text, titleWhenForwarded: nil, action: .switchInline(samePeer: (flags & (1 << 0)) != 0, query: query, peerTypes: peerTypes))
case let .keyboardButtonUrl(text, url): case let .keyboardButtonUrl(text, url):
self.init(title: text, titleWhenForwarded: nil, action: .url(url)) self.init(title: text, titleWhenForwarded: nil, action: .url(url))
case let .keyboardButtonGame(text): case let .keyboardButtonGame(text):

View File

@ -181,12 +181,50 @@ public enum ReplyMarkupButtonRequestPeerType: Codable, Equatable {
} }
public enum ReplyMarkupButtonAction: PostboxCoding, Equatable { public enum ReplyMarkupButtonAction: PostboxCoding, Equatable {
public struct PeerTypes: OptionSet {
public var rawValue: Int32
public init(rawValue: Int32) {
self.rawValue = rawValue
}
public init() {
self.rawValue = 0
}
public static let users = PeerTypes(rawValue: 1 << 0)
public static let bots = PeerTypes(rawValue: 1 << 1)
public static let channels = PeerTypes(rawValue: 1 << 2)
public static let groups = PeerTypes(rawValue: 1 << 3)
public var requestPeerTypes: [ReplyMarkupButtonRequestPeerType]? {
if self.isEmpty {
return nil
}
var types: [ReplyMarkupButtonRequestPeerType] = []
if self.contains(.users) {
types.append(.user(.init(isBot: false, isPremium: nil)))
}
if self.contains(.bots) {
types.append(.user(.init(isBot: true, isPremium: nil)))
}
if self.contains(.channels) {
types.append(.channel(.init(isCreator: false, hasUsername: nil, userAdminRights: nil, botAdminRights: nil)))
}
if self.contains(.groups) {
types.append(.group(.init(isCreator: false, hasUsername: nil, isForum: nil, botParticipant: false, userAdminRights: nil, botAdminRights: nil)))
}
return types
}
}
case text case text
case url(String) case url(String)
case callback(requiresPassword: Bool, data: MemoryBuffer) case callback(requiresPassword: Bool, data: MemoryBuffer)
case requestPhone case requestPhone
case requestMap case requestMap
case switchInline(samePeer: Bool, query: String) case switchInline(samePeer: Bool, query: String, peerTypes: PeerTypes)
case openWebApp case openWebApp
case payment case payment
case urlAuth(url: String, buttonId: Int32) case urlAuth(url: String, buttonId: Int32)
@ -208,7 +246,7 @@ public enum ReplyMarkupButtonAction: PostboxCoding, Equatable {
case 4: case 4:
self = .requestMap self = .requestMap
case 5: case 5:
self = .switchInline(samePeer: decoder.decodeInt32ForKey("s", orElse: 0) != 0, query: decoder.decodeStringForKey("q", orElse: "")) self = .switchInline(samePeer: decoder.decodeInt32ForKey("s", orElse: 0) != 0, query: decoder.decodeStringForKey("q", orElse: ""), peerTypes: PeerTypes(rawValue: decoder.decodeInt32ForKey("pt", orElse: 0)))
case 6: case 6:
self = .openWebApp self = .openWebApp
case 7: case 7:
@ -243,10 +281,11 @@ public enum ReplyMarkupButtonAction: PostboxCoding, Equatable {
encoder.encodeInt32(3, forKey: "v") encoder.encodeInt32(3, forKey: "v")
case .requestMap: case .requestMap:
encoder.encodeInt32(4, forKey: "v") encoder.encodeInt32(4, forKey: "v")
case let .switchInline(samePeer, query): case let .switchInline(samePeer, query, peerTypes):
encoder.encodeInt32(5, forKey: "v") encoder.encodeInt32(5, forKey: "v")
encoder.encodeInt32(samePeer ? 1 : 0, forKey: "s") encoder.encodeInt32(samePeer ? 1 : 0, forKey: "s")
encoder.encodeString(query, forKey: "q") encoder.encodeString(query, forKey: "q")
encoder.encodeInt32(peerTypes.rawValue, forKey: "pt")
case .openWebApp: case .openWebApp:
encoder.encodeInt32(6, forKey: "v") encoder.encodeInt32(6, forKey: "v")
case .payment: case .payment:

View File

@ -105,7 +105,7 @@ public final class ChatControllerInteraction {
public let sendBotContextResultAsGif: (ChatContextResultCollection, ChatContextResult, UIView, CGRect, Bool, Bool) -> Bool public let sendBotContextResultAsGif: (ChatContextResultCollection, ChatContextResult, UIView, CGRect, Bool, Bool) -> Bool
public let requestMessageActionCallback: (MessageId, MemoryBuffer?, Bool, Bool) -> Void public let requestMessageActionCallback: (MessageId, MemoryBuffer?, Bool, Bool) -> Void
public let requestMessageActionUrlAuth: (String, MessageActionUrlSubject) -> Void public let requestMessageActionUrlAuth: (String, MessageActionUrlSubject) -> Void
public let activateSwitchInline: (PeerId?, String) -> Void public let activateSwitchInline: (PeerId?, String, ReplyMarkupButtonAction.PeerTypes?) -> Void
public let openUrl: (String, Bool, Bool?, Message?) -> Void public let openUrl: (String, Bool, Bool?, Message?) -> Void
public let shareCurrentLocation: () -> Void public let shareCurrentLocation: () -> Void
public let shareAccountContact: () -> Void public let shareAccountContact: () -> Void
@ -217,7 +217,7 @@ public final class ChatControllerInteraction {
sendBotContextResultAsGif: @escaping (ChatContextResultCollection, ChatContextResult, UIView, CGRect, Bool, Bool) -> Bool, sendBotContextResultAsGif: @escaping (ChatContextResultCollection, ChatContextResult, UIView, CGRect, Bool, Bool) -> Bool,
requestMessageActionCallback: @escaping (MessageId, MemoryBuffer?, Bool, Bool) -> Void, requestMessageActionCallback: @escaping (MessageId, MemoryBuffer?, Bool, Bool) -> Void,
requestMessageActionUrlAuth: @escaping (String, MessageActionUrlSubject) -> Void, requestMessageActionUrlAuth: @escaping (String, MessageActionUrlSubject) -> Void,
activateSwitchInline: @escaping (PeerId?, String) -> Void, activateSwitchInline: @escaping (PeerId?, String, ReplyMarkupButtonAction.PeerTypes?) -> Void,
openUrl: @escaping (String, Bool, Bool?, Message?) -> Void, openUrl: @escaping (String, Bool, Bool?, Message?) -> Void,
shareCurrentLocation: @escaping () -> Void, shareCurrentLocation: @escaping () -> Void,
shareAccountContact: @escaping () -> Void, shareAccountContact: @escaping () -> Void,

View File

@ -391,7 +391,7 @@ final class ChatButtonKeyboardInputNode: ChatInputNode {
if let message = self.message { if let message = self.message {
self.controllerInteraction.requestMessageActionCallback(message.id, data, false, requiresPassword) self.controllerInteraction.requestMessageActionCallback(message.id, data, false, requiresPassword)
} }
case let .switchInline(samePeer, query): case let .switchInline(samePeer, query, _):
if let message = message { if let message = message {
var botPeer: Peer? var botPeer: Peer?

View File

@ -2512,7 +2512,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
} }
})) }))
} }
}, activateSwitchInline: { [weak self] peerId, inputString in }, activateSwitchInline: { [weak self] peerId, inputString, peerTypes in
guard let strongSelf = self else { guard let strongSelf = self else {
return return
} }
@ -2536,7 +2536,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
} }
}) })
} else { } else {
strongSelf.openPeer(peer: nil, navigation: .chat(textInputState: ChatTextInputState(inputText: NSAttributedString(string: inputString)), subject: nil, peekData: nil), fromMessage: nil) strongSelf.openPeer(peer: nil, navigation: .chat(textInputState: ChatTextInputState(inputText: NSAttributedString(string: inputString)), subject: nil, peekData: nil), fromMessage: nil, peerTypes: peerTypes)
} }
} }
}, openUrl: { [weak self] url, concealed, _, message in }, openUrl: { [weak self] url, concealed, _, message in
@ -4226,12 +4226,12 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
if let strongSelf = self { if let strongSelf = self {
completion() completion()
controller?.dismiss() controller?.dismiss()
strongSelf.controllerInteraction?.activateSwitchInline(peer.id, "@\(botAddress) \(query)") strongSelf.controllerInteraction?.activateSwitchInline(peer.id, "@\(botAddress) \(query)", nil)
} }
} }
strongSelf.push(controller) strongSelf.push(controller)
} else { } else {
strongSelf.controllerInteraction?.activateSwitchInline(peerId, "@\(botAddress) \(query)") strongSelf.controllerInteraction?.activateSwitchInline(peerId, "@\(botAddress) \(query)", nil)
} }
} }
}, getNavigationController: { [weak self] in }, getNavigationController: { [weak self] in
@ -12873,12 +12873,12 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
if let strongSelf = self { if let strongSelf = self {
completion() completion()
controller?.dismiss() controller?.dismiss()
strongSelf.controllerInteraction?.activateSwitchInline(peer.id, "@\(botAddress) \(query)") strongSelf.controllerInteraction?.activateSwitchInline(peer.id, "@\(botAddress) \(query)", nil)
} }
} }
strongSelf.push(controller) strongSelf.push(controller)
} else { } else {
strongSelf.controllerInteraction?.activateSwitchInline(peerId, "@\(botAddress) \(query)") strongSelf.controllerInteraction?.activateSwitchInline(peerId, "@\(botAddress) \(query)", nil)
} }
} }
}, completion: { [weak self] in }, completion: { [weak self] in
@ -16716,7 +16716,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
}) })
} }
private func openPeer(peer: EnginePeer?, navigation: ChatControllerInteractionNavigateToPeer, fromMessage: MessageReference?, fromReactionMessageId: MessageId? = nil, expandAvatar: Bool = false) { private func openPeer(peer: EnginePeer?, navigation: ChatControllerInteractionNavigateToPeer, fromMessage: MessageReference?, fromReactionMessageId: MessageId? = nil, expandAvatar: Bool = false, peerTypes: ReplyMarkupButtonAction.PeerTypes? = nil) {
let _ = self.presentVoiceMessageDiscardAlert(action: { let _ = self.presentVoiceMessageDiscardAlert(action: {
if case let .peer(currentPeerId) = self.chatLocation, peer?.id == currentPeerId { if case let .peer(currentPeerId) = self.chatLocation, peer?.id == currentPeerId {
switch navigation { switch navigation {
@ -16815,7 +16815,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
break break
case let .chat(textInputState, _, _): case let .chat(textInputState, _, _):
if let textInputState = textInputState { if let textInputState = textInputState {
let controller = self.context.sharedContext.makePeerSelectionController(PeerSelectionControllerParams(context: self.context, updatedPresentationData: self.updatedPresentationData, selectForumThreads: true)) let controller = self.context.sharedContext.makePeerSelectionController(PeerSelectionControllerParams(context: self.context, updatedPresentationData: self.updatedPresentationData, requestPeerType: peerTypes.flatMap { $0.requestPeerTypes }, selectForumThreads: true))
controller.peerSelected = { [weak self, weak controller] peer, threadId in controller.peerSelected = { [weak self, weak controller] peer, threadId in
let peerId = peer.id let peerId = peer.id

View File

@ -860,7 +860,7 @@ public class ChatMessageItemView: ListViewItemNode, ChatMessageItemNodeProtocol
item.controllerInteraction.requestMessageActionCallback(item.message.id, nil, true, false) item.controllerInteraction.requestMessageActionCallback(item.message.id, nil, true, false)
case let .callback(requiresPassword, data): case let .callback(requiresPassword, data):
item.controllerInteraction.requestMessageActionCallback(item.message.id, data, false, requiresPassword) item.controllerInteraction.requestMessageActionCallback(item.message.id, data, false, requiresPassword)
case let .switchInline(samePeer, query): case let .switchInline(samePeer, query, peerTypes):
var botPeer: Peer? var botPeer: Peer?
var found = false var found = false
@ -881,7 +881,7 @@ public class ChatMessageItemView: ListViewItemNode, ChatMessageItemNodeProtocol
peerId = item.message.id.peerId peerId = item.message.id.peerId
} }
if let botPeer = botPeer, let addressName = botPeer.addressName { if let botPeer = botPeer, let addressName = botPeer.addressName {
item.controllerInteraction.activateSwitchInline(peerId, "@\(addressName) \(query)") item.controllerInteraction.activateSwitchInline(peerId, "@\(addressName) \(query)", peerTypes)
} }
case .payment: case .payment:
item.controllerInteraction.openCheckoutOrReceipt(item.message.id) item.controllerInteraction.openCheckoutOrReceipt(item.message.id)

View File

@ -863,7 +863,7 @@ final class ChatPinnedMessageTitlePanelNode: ChatTitleAccessoryPanelNode {
controllerInteraction.requestMessageActionCallback(message.id, nil, true, false) controllerInteraction.requestMessageActionCallback(message.id, nil, true, false)
case let .callback(requiresPassword, data): case let .callback(requiresPassword, data):
controllerInteraction.requestMessageActionCallback(message.id, data, false, requiresPassword) controllerInteraction.requestMessageActionCallback(message.id, data, false, requiresPassword)
case let .switchInline(samePeer, query): case let .switchInline(samePeer, query, peerTypes):
var botPeer: Peer? var botPeer: Peer?
var found = false var found = false
@ -884,7 +884,7 @@ final class ChatPinnedMessageTitlePanelNode: ChatTitleAccessoryPanelNode {
peerId = message.id.peerId peerId = message.id.peerId
} }
if let botPeer = botPeer, let addressName = botPeer.addressName { if let botPeer = botPeer, let addressName = botPeer.addressName {
controllerInteraction.activateSwitchInline(peerId, "@\(addressName) \(query)") controllerInteraction.activateSwitchInline(peerId, "@\(addressName) \(query)", peerTypes)
} }
case .payment: case .payment:
controllerInteraction.openCheckoutOrReceipt(message.id) controllerInteraction.openCheckoutOrReceipt(message.id)

View File

@ -274,7 +274,7 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode {
}, openMessageContextActions: { _, _, _, _ in }, openMessageContextActions: { _, _, _, _ in
}, navigateToMessage: { _, _ in }, navigateToMessageStandalone: { _ in }, navigateToMessage: { _, _ in }, navigateToMessageStandalone: { _ in
}, navigateToThreadMessage: { _, _, _ in }, navigateToThreadMessage: { _, _, _ in
}, tapMessage: nil, clickThroughMessage: { }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { _, _, _, _, _, _, _, _, _ in return false }, sendEmoji: { _, _, _ in }, sendGif: { _, _, _, _, _ in return false }, sendBotContextResultAsGif: { _, _, _, _, _, _ in return false }, requestMessageActionCallback: { _, _, _, _ in }, requestMessageActionUrlAuth: { _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { [weak self] url, _, _, _ in }, tapMessage: nil, clickThroughMessage: { }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { _, _, _, _, _, _, _, _, _ in return false }, sendEmoji: { _, _, _ in }, sendGif: { _, _, _, _, _ in return false }, sendBotContextResultAsGif: { _, _, _, _, _, _ in return false }, requestMessageActionCallback: { _, _, _, _ in }, requestMessageActionUrlAuth: { _, _ in }, activateSwitchInline: { _, _, _ in }, openUrl: { [weak self] url, _, _, _ in
self?.openUrl(url) self?.openUrl(url)
}, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { [weak self] message, associatedData in }, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { [weak self] message, associatedData in
if let strongSelf = self, let navigationController = strongSelf.getNavigationController() { if let strongSelf = self, let navigationController = strongSelf.getNavigationController() {

View File

@ -97,7 +97,7 @@ final class OverlayAudioPlayerControllerNode: ViewControllerTracingNode, UIGestu
return false return false
}, requestMessageActionCallback: { _, _, _, _ in }, requestMessageActionCallback: { _, _, _, _ in
}, requestMessageActionUrlAuth: { _, _ in }, requestMessageActionUrlAuth: { _, _ in
}, activateSwitchInline: { _, _ in }, activateSwitchInline: { _, _, _ in
}, openUrl: { _, _, _, _ in }, openUrl: { _, _, _, _ in
}, shareCurrentLocation: { }, shareCurrentLocation: {
}, shareAccountContact: { }, shareAccountContact: {

View File

@ -2678,7 +2678,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate
return false return false
}, requestMessageActionCallback: { _, _, _, _ in }, requestMessageActionCallback: { _, _, _, _ in
}, requestMessageActionUrlAuth: { _, _ in }, requestMessageActionUrlAuth: { _, _ in
}, activateSwitchInline: { _, _ in }, activateSwitchInline: { _, _, _ in
}, openUrl: { [weak self] url, concealed, external, _ in }, openUrl: { [weak self] url, concealed, external, _ in
guard let strongSelf = self else { guard let strongSelf = self else {
return return

View File

@ -1457,7 +1457,7 @@ public final class SharedAccountContextImpl: SharedAccountContext {
clickThroughMessage?() clickThroughMessage?()
}, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { _, _, _, _, _, _, _, _, _ in return false }, sendEmoji: { _, _, _ in }, sendGif: { _, _, _, _, _ in return false }, sendBotContextResultAsGif: { _, _, _, _, _, _ in }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { _, _, _, _, _, _, _, _, _ in return false }, sendEmoji: { _, _, _ in }, sendGif: { _, _, _, _, _ in return false }, sendBotContextResultAsGif: { _, _, _, _, _, _ in
return false return false
}, requestMessageActionCallback: { _, _, _, _ in }, requestMessageActionUrlAuth: { _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { _, _, _, _ in }, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { _, _ in }, openWallpaper: { _ in }, openTheme: { _ in }, openHashtag: { _, _ in }, updateInputState: { _ in }, updateInputMode: { _ in }, openMessageShareMenu: { _ in }, requestMessageActionCallback: { _, _, _, _ in }, requestMessageActionUrlAuth: { _, _ in }, activateSwitchInline: { _, _, _ in }, openUrl: { _, _, _, _ in }, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { _, _ in }, openWallpaper: { _ in }, openTheme: { _ in }, openHashtag: { _, _ in }, updateInputState: { _ in }, updateInputMode: { _ in }, openMessageShareMenu: { _ in
}, presentController: { _, _ in }, presentController: { _, _ in
}, presentControllerInCurrent: { _, _ in }, presentControllerInCurrent: { _, _ in
}, navigationController: { }, navigationController: {