Bot apps implementation

This commit is contained in:
Ilya Laktyushin
2023-02-28 23:25:35 +04:00
parent 4c6dd1e16d
commit 53d1cb856a
45 changed files with 1553 additions and 394 deletions

View File

@@ -71,6 +71,7 @@ public enum ParsedInternalPeerUrlParameter {
case channelMessage(Int32, Double?)
case replyThread(Int32, Int32)
case voiceChat(String?)
case appStart(String, String?)
}
public enum ParsedInternalUrl {
@@ -510,6 +511,19 @@ public func parseInternalUrl(query: String) -> ParsedInternalUrl? {
} else {
return .peer(.name(peerName), .channelMessage(value, timecode))
}
} else if pathComponents.count == 2 {
let appName = pathComponents[1]
var startApp: String?
if let queryItems = components.queryItems {
for queryItem in queryItems {
if let value = queryItem.value {
if queryItem.name == "startApp"{
startApp = value
}
}
}
}
return .peer(.name(peerName), .appStart(appName, startApp))
} else {
return nil
}
@@ -598,6 +612,20 @@ private func resolveInternalUrl(context: AccountContext, url: ParsedInternalUrl)
return .single(.peer(peer, .chat(textInputState: nil, subject: nil, peekData: nil)))
}
}
case let .appStart(name, payload):
return context.engine.messages.getBotApp(botId: peer.id, shortName: name, cached: false)
|> map(Optional.init)
|> `catch` { _ -> Signal<BotApp?, NoError> in
return .single(nil)
}
|> take(1)
|> mapToSignal { botApp -> Signal<ResolvedUrl?, NoError> in
if let botApp {
return .single(.peer(peer, .withBotApp(ChatControllerInitialBotAppStart(botApp: botApp, payload: payload, justInstalled: false))))
} else {
return .single(.peer(peer, .chat(textInputState: nil, subject: nil, peekData: nil)))
}
}
case let .channelMessage(id, timecode):
if let channel = peer as? TelegramChannel, channel.flags.contains(.isForum) {
let messageId = MessageId(peerId: channel.id, namespace: Namespaces.Message.Cloud, id: id)