Update API

This commit is contained in:
Ilya Laktyushin 2023-02-10 14:12:55 +04:00
parent 88dd028371
commit c60d85373b
8 changed files with 154 additions and 52 deletions

View File

@ -11,18 +11,39 @@ enum StickerVerificationStatus {
public class ImportStickerPack { public class ImportStickerPack {
public enum StickerPackType { public enum StickerPackType {
case image public enum ContentType {
case animation case image
case video case animation
case video
var importType: CreateStickerSetType {
switch self { var importType: CreateStickerSetType.ContentType {
switch self {
case .image: case .image:
return .image return .image
case .animation: case .animation:
return .animation return .animation
case .video: case .video:
return .video return .video
}
}
}
case stickers(content: ContentType)
case emoji(content: ContentType, textColored: Bool)
var contentType: StickerPackType.ContentType {
switch self {
case let .stickers(content), let .emoji(content, _):
return content
}
}
var importType: CreateStickerSetType {
switch self {
case let .stickers(content):
return .stickers(content: content.importType)
case let .emoji(content, textColored):
return .emoji(content: content.importType, textColored: textColored)
} }
} }
} }
@ -51,12 +72,14 @@ public class ImportStickerPack {
let content: Content let content: Content
let emojis: [String] let emojis: [String]
let keywords: String
let uuid: UUID let uuid: UUID
var resource: MediaResource? var resource: MediaResource?
init(content: Content, emojis: [String], uuid: UUID = UUID()) { init(content: Content, emojis: [String], keywords: String, uuid: UUID = UUID()) {
self.content = content self.content = content
self.emojis = emojis self.emojis = emojis
self.keywords = keywords
self.uuid = uuid self.uuid = uuid
} }
@ -88,13 +111,25 @@ public class ImportStickerPack {
self.software = json["software"] as? String ?? "" self.software = json["software"] as? String ?? ""
let isAnimated = json["isAnimated"] as? Bool ?? false let isAnimated = json["isAnimated"] as? Bool ?? false
let isVideo = json["isVideo"] as? Bool ?? false let isVideo = json["isVideo"] as? Bool ?? false
let isEmoji = json["isEmoji"] as? Bool ?? false
let isTextColored = json["isTextColored"] as? Bool ?? false
let type: StickerPackType let type: StickerPackType
if isAnimated { if isEmoji {
type = .animation if isAnimated {
} else if isVideo { type = .emoji(content: .animation, textColored: isTextColored)
type = .video } else if isVideo {
type = .emoji(content: .video, textColored: isTextColored)
} else {
type = .emoji(content: .image, textColored: isTextColored)
}
} else { } else {
type = .image if isAnimated {
type = .stickers(content: .animation)
} else if isVideo {
type = .stickers(content: .video)
} else {
type = .stickers(content: .image)
}
} }
self.type = type self.type = type
@ -102,23 +137,23 @@ public class ImportStickerPack {
if let dataString = sticker["data"] as? String, let mimeType = sticker["mimeType"] as? String, let data = Data(base64Encoded: dataString) { if let dataString = sticker["data"] as? String, let mimeType = sticker["mimeType"] as? String, let data = Data(base64Encoded: dataString) {
var content: Sticker.Content? var content: Sticker.Content?
switch mimeType.lowercased() { switch mimeType.lowercased() {
case "image/png": case "image/png":
if case .image = type { if case .image = type.contentType {
content = .image(data) content = .image(data)
} }
case "application/x-tgsticker": case "application/x-tgsticker":
if case .animation = type { if case .animation = type.contentType {
content = .animation(data) content = .animation(data)
} }
case "video/webm", "image/webp", "image/gif": case "video/webm", "image/webp", "image/gif":
if case .video = type { if case .video = type.contentType {
content = .video(data, mimeType) content = .video(data, mimeType)
} }
default: default:
break break
} }
if let content = content { if let content = content {
return Sticker(content: content, emojis: sticker["emojis"] as? [String] ?? []) return Sticker(content: content, emojis: sticker["emojis"] as? [String] ?? [], keywords: sticker["keywords"] as? String ?? "")
} }
} }
return nil return nil

View File

@ -79,7 +79,7 @@ public final class ImportStickerPackController: ViewController, StandalonePresen
Queue.mainQueue().after(0.1) { Queue.mainQueue().after(0.1) {
self.controllerNode.updateStickerPack(self.stickerPack, verifiedStickers: Set(), declinedStickers: Set(), uploadedStickerResources: [:]) self.controllerNode.updateStickerPack(self.stickerPack, verifiedStickers: Set(), declinedStickers: Set(), uploadedStickerResources: [:])
if case .image = self.stickerPack.type { if case .image = self.stickerPack.type.contentType {
} else { } else {
let _ = (self.context.account.postbox.loadedPeerWithId(self.context.account.peerId) let _ = (self.context.account.postbox.loadedPeerWithId(self.context.account.peerId)
|> deliverOnMainQueue).start(next: { [weak self] peer in |> deliverOnMainQueue).start(next: { [weak self] peer in

View File

@ -605,9 +605,9 @@ final class ImportStickerPackControllerNode: ViewControllerTracingNode, UIScroll
if let localResource = item.stickerItem.resource { if let localResource = item.stickerItem.resource {
self.context.account.postbox.mediaBox.copyResourceData(from: localResource.id, to: resource.id) self.context.account.postbox.mediaBox.copyResourceData(from: localResource.id, to: resource.id)
} }
stickers.append(ImportSticker(resource: resource, emojis: item.stickerItem.emojis, dimensions: dimensions, mimeType: item.stickerItem.mimeType)) stickers.append(ImportSticker(resource: resource, emojis: item.stickerItem.emojis, dimensions: dimensions, mimeType: item.stickerItem.mimeType, keywords: item.stickerItem.keywords))
} else if let resource = item.stickerItem.resource { } else if let resource = item.stickerItem.resource {
stickers.append(ImportSticker(resource: resource, emojis: item.stickerItem.emojis, dimensions: dimensions, mimeType: item.stickerItem.mimeType)) stickers.append(ImportSticker(resource: resource, emojis: item.stickerItem.emojis, dimensions: dimensions, mimeType: item.stickerItem.mimeType, keywords: item.stickerItem.keywords))
} }
} }
var thumbnailSticker: ImportSticker? var thumbnailSticker: ImportSticker?
@ -618,7 +618,7 @@ final class ImportStickerPackControllerNode: ViewControllerTracingNode, UIScroll
} }
let resource = LocalFileMediaResource(fileId: Int64.random(in: Int64.min ... Int64.max)) let resource = LocalFileMediaResource(fileId: Int64.random(in: Int64.min ... Int64.max))
self.context.account.postbox.mediaBox.storeResourceData(resource.id, data: thumbnail.data) self.context.account.postbox.mediaBox.storeResourceData(resource.id, data: thumbnail.data)
thumbnailSticker = ImportSticker(resource: resource, emojis: [], dimensions: dimensions, mimeType: thumbnail.mimeType) thumbnailSticker = ImportSticker(resource: resource, emojis: [], dimensions: dimensions, mimeType: thumbnail.mimeType, keywords: thumbnail.keywords)
} }
let firstStickerItem = thumbnailSticker ?? stickers.first let firstStickerItem = thumbnailSticker ?? stickers.first
@ -636,7 +636,7 @@ final class ImportStickerPackControllerNode: ViewControllerTracingNode, UIScroll
if let (_, _, count) = strongSelf.progress { if let (_, _, count) = strongSelf.progress {
strongSelf.progress = (1.0, count, count) strongSelf.progress = (1.0, count, count)
var animated = false var animated = false
if case .image = stickerPack.type { if case .image = stickerPack.type.contentType {
animated = true animated = true
} }
strongSelf.radialStatus.transitionToState(.progress(color: strongSelf.presentationData.theme.list.itemAccentColor, lineWidth: 6.0, value: 1.0, cancelEnabled: false, animateRotation: false), animated: animated, synchronous: true, completion: {}) strongSelf.radialStatus.transitionToState(.progress(color: strongSelf.presentationData.theme.list.itemAccentColor, lineWidth: 6.0, value: 1.0, cancelEnabled: false, animateRotation: false), animated: animated, synchronous: true, completion: {})
@ -804,7 +804,7 @@ final class ImportStickerPackControllerNode: ViewControllerTracingNode, UIScroll
} }
self.pendingItems = updatedItems self.pendingItems = updatedItems
if case .image = stickerPack.type { if case .image = stickerPack.type.contentType {
} else { } else {
self.stickerPackReady = stickerPack.stickers.count == (verifiedStickers.count + declinedStickers.count) && updatedItems.count > 0 self.stickerPackReady = stickerPack.stickers.count == (verifiedStickers.count + declinedStickers.count) && updatedItems.count > 0
} }

View File

@ -379,7 +379,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
dict[-1645763991] = { return Api.InputStickerSet.parse_inputStickerSetID($0) } dict[-1645763991] = { return Api.InputStickerSet.parse_inputStickerSetID($0) }
dict[-930399486] = { return Api.InputStickerSet.parse_inputStickerSetPremiumGifts($0) } dict[-930399486] = { return Api.InputStickerSet.parse_inputStickerSetPremiumGifts($0) }
dict[-2044933984] = { return Api.InputStickerSet.parse_inputStickerSetShortName($0) } dict[-2044933984] = { return Api.InputStickerSet.parse_inputStickerSetShortName($0) }
dict[-6249322] = { return Api.InputStickerSetItem.parse_inputStickerSetItem($0) } dict[853188252] = { return Api.InputStickerSetItem.parse_inputStickerSetItem($0) }
dict[70813275] = { return Api.InputStickeredMedia.parse_inputStickeredMediaDocument($0) } dict[70813275] = { return Api.InputStickeredMedia.parse_inputStickeredMediaDocument($0) }
dict[1251549527] = { return Api.InputStickeredMedia.parse_inputStickeredMediaPhoto($0) } dict[1251549527] = { return Api.InputStickeredMedia.parse_inputStickeredMediaPhoto($0) }
dict[1634697192] = { return Api.InputStorePaymentPurpose.parse_inputStorePaymentGiftPremium($0) } dict[1634697192] = { return Api.InputStorePaymentPurpose.parse_inputStorePaymentGiftPremium($0) }

View File

@ -392,26 +392,27 @@ public extension Api {
} }
public extension Api { public extension Api {
enum InputStickerSetItem: TypeConstructorDescription { enum InputStickerSetItem: TypeConstructorDescription {
case inputStickerSetItem(flags: Int32, document: Api.InputDocument, emoji: String, maskCoords: Api.MaskCoords?) case inputStickerSetItem(flags: Int32, document: Api.InputDocument, emoji: String, maskCoords: Api.MaskCoords?, keywords: String?)
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
switch self { switch self {
case .inputStickerSetItem(let flags, let document, let emoji, let maskCoords): case .inputStickerSetItem(let flags, let document, let emoji, let maskCoords, let keywords):
if boxed { if boxed {
buffer.appendInt32(-6249322) buffer.appendInt32(853188252)
} }
serializeInt32(flags, buffer: buffer, boxed: false) serializeInt32(flags, buffer: buffer, boxed: false)
document.serialize(buffer, true) document.serialize(buffer, true)
serializeString(emoji, buffer: buffer, boxed: false) serializeString(emoji, buffer: buffer, boxed: false)
if Int(flags) & Int(1 << 0) != 0 {maskCoords!.serialize(buffer, true)} if Int(flags) & Int(1 << 0) != 0 {maskCoords!.serialize(buffer, true)}
if Int(flags) & Int(1 << 1) != 0 {serializeString(keywords!, buffer: buffer, boxed: false)}
break break
} }
} }
public func descriptionFields() -> (String, [(String, Any)]) { public func descriptionFields() -> (String, [(String, Any)]) {
switch self { switch self {
case .inputStickerSetItem(let flags, let document, let emoji, let maskCoords): case .inputStickerSetItem(let flags, let document, let emoji, let maskCoords, let keywords):
return ("inputStickerSetItem", [("flags", flags as Any), ("document", document as Any), ("emoji", emoji as Any), ("maskCoords", maskCoords as Any)]) return ("inputStickerSetItem", [("flags", flags as Any), ("document", document as Any), ("emoji", emoji as Any), ("maskCoords", maskCoords as Any), ("keywords", keywords as Any)])
} }
} }
@ -428,12 +429,15 @@ public extension Api {
if Int(_1!) & Int(1 << 0) != 0 {if let signature = reader.readInt32() { if Int(_1!) & Int(1 << 0) != 0 {if let signature = reader.readInt32() {
_4 = Api.parse(reader, signature: signature) as? Api.MaskCoords _4 = Api.parse(reader, signature: signature) as? Api.MaskCoords
} } } }
var _5: String?
if Int(_1!) & Int(1 << 1) != 0 {_5 = 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
let _c4 = (Int(_1!) & Int(1 << 0) == 0) || _4 != nil let _c4 = (Int(_1!) & Int(1 << 0) == 0) || _4 != nil
if _c1 && _c2 && _c3 && _c4 { let _c5 = (Int(_1!) & Int(1 << 1) == 0) || _5 != nil
return Api.InputStickerSetItem.inputStickerSetItem(flags: _1!, document: _2!, emoji: _3!, maskCoords: _4) if _c1 && _c2 && _c3 && _c4 && _c5 {
return Api.InputStickerSetItem.inputStickerSetItem(flags: _1!, document: _2!, emoji: _3!, maskCoords: _4, keywords: _5)
} }
else { else {
return nil return nil

View File

@ -7919,6 +7919,25 @@ public extension Api.functions.stickers {
}) })
} }
} }
public extension Api.functions.stickers {
static func changeSticker(flags: Int32, sticker: Api.InputDocument, emoji: String?, maskCoords: Api.MaskCoords?, keywords: String?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.messages.StickerSet>) {
let buffer = Buffer()
buffer.appendInt32(-179077444)
serializeInt32(flags, buffer: buffer, boxed: false)
sticker.serialize(buffer, true)
if Int(flags) & Int(1 << 0) != 0 {serializeString(emoji!, buffer: buffer, boxed: false)}
if Int(flags) & Int(1 << 1) != 0 {maskCoords!.serialize(buffer, true)}
if Int(flags) & Int(1 << 2) != 0 {serializeString(keywords!, buffer: buffer, boxed: false)}
return (FunctionDescription(name: "stickers.changeSticker", parameters: [("flags", String(describing: flags)), ("sticker", String(describing: sticker)), ("emoji", String(describing: emoji)), ("maskCoords", String(describing: maskCoords)), ("keywords", String(describing: keywords))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.StickerSet? in
let reader = BufferReader(buffer)
var result: Api.messages.StickerSet?
if let signature = reader.readInt32() {
result = Api.parse(reader, signature: signature) as? Api.messages.StickerSet
}
return result
})
}
}
public extension Api.functions.stickers { public extension Api.functions.stickers {
static func changeStickerPosition(sticker: Api.InputDocument, position: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.messages.StickerSet>) { static func changeStickerPosition(sticker: Api.InputDocument, position: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.messages.StickerSet>) {
let buffer = Buffer() let buffer = Buffer()
@ -7991,12 +8010,30 @@ public extension Api.functions.stickers {
} }
} }
public extension Api.functions.stickers { public extension Api.functions.stickers {
static func setStickerSetThumb(stickerset: Api.InputStickerSet, thumb: Api.InputDocument) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.messages.StickerSet>) { static func renameStickerSet(stickerset: Api.InputStickerSet, title: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.messages.StickerSet>) {
let buffer = Buffer() let buffer = Buffer()
buffer.appendInt32(-1707717072) buffer.appendInt32(306912256)
stickerset.serialize(buffer, true) stickerset.serialize(buffer, true)
thumb.serialize(buffer, true) serializeString(title, buffer: buffer, boxed: false)
return (FunctionDescription(name: "stickers.setStickerSetThumb", parameters: [("stickerset", String(describing: stickerset)), ("thumb", String(describing: thumb))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.StickerSet? in return (FunctionDescription(name: "stickers.renameStickerSet", parameters: [("stickerset", String(describing: stickerset)), ("title", String(describing: title))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.StickerSet? in
let reader = BufferReader(buffer)
var result: Api.messages.StickerSet?
if let signature = reader.readInt32() {
result = Api.parse(reader, signature: signature) as? Api.messages.StickerSet
}
return result
})
}
}
public extension Api.functions.stickers {
static func setStickerSetThumb(flags: Int32, stickerset: Api.InputStickerSet, thumb: Api.InputDocument?, thumbDocumentId: Int64?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.messages.StickerSet>) {
let buffer = Buffer()
buffer.appendInt32(-1486204014)
serializeInt32(flags, buffer: buffer, boxed: false)
stickerset.serialize(buffer, true)
if Int(flags) & Int(1 << 0) != 0 {thumb!.serialize(buffer, true)}
if Int(flags) & Int(1 << 1) != 0 {serializeInt64(thumbDocumentId!, buffer: buffer, boxed: false)}
return (FunctionDescription(name: "stickers.setStickerSetThumb", parameters: [("flags", String(describing: flags)), ("stickerset", String(describing: stickerset)), ("thumb", String(describing: thumb)), ("thumbDocumentId", String(describing: thumbDocumentId))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.StickerSet? in
let reader = BufferReader(buffer) let reader = BufferReader(buffer)
var result: Api.messages.StickerSet? var result: Api.messages.StickerSet?
if let signature = reader.readInt32() { if let signature = reader.readInt32() {

View File

@ -210,7 +210,7 @@ public class BoxedMessage: NSObject {
public class Serialization: NSObject, MTSerialization { public class Serialization: NSObject, MTSerialization {
public func currentLayer() -> UInt { public func currentLayer() -> UInt {
return 152 return 153
} }
public func parseMessage(_ data: Data!) -> Any! { public func parseMessage(_ data: Data!) -> Any! {

View File

@ -81,12 +81,14 @@ public struct ImportSticker {
let emojis: [String] let emojis: [String]
public let dimensions: PixelDimensions public let dimensions: PixelDimensions
public let mimeType: String public let mimeType: String
public let keywords: String
public init(resource: MediaResource, emojis: [String], dimensions: PixelDimensions, mimeType: String) { public init(resource: MediaResource, emojis: [String], dimensions: PixelDimensions, mimeType: String, keywords: String) {
self.resource = resource self.resource = resource
self.emojis = emojis self.emojis = emojis
self.dimensions = dimensions self.dimensions = dimensions
self.mimeType = mimeType self.mimeType = mimeType
self.keywords = keywords
} }
} }
@ -96,9 +98,21 @@ public enum CreateStickerSetStatus {
} }
public enum CreateStickerSetType { public enum CreateStickerSetType {
case image public enum ContentType {
case animation case image
case video case animation
case video
}
case stickers(content: ContentType)
case emoji(content: ContentType, textColored: Bool)
var contentType: ContentType {
switch self {
case let .stickers(content), let .emoji(content, _):
return content
}
}
} }
func _internal_createStickerSet(account: Account, title: String, shortName: String, stickers: [ImportSticker], thumbnail: ImportSticker?, type: CreateStickerSetType, software: String?) -> Signal<CreateStickerSetStatus, CreateStickerSetError> { func _internal_createStickerSet(account: Account, title: String, shortName: String, stickers: [ImportSticker], thumbnail: ImportSticker?, type: CreateStickerSetType, software: String?) -> Signal<CreateStickerSetStatus, CreateStickerSetError> {
@ -133,7 +147,7 @@ func _internal_createStickerSet(account: Account, title: String, shortName: Stri
} }
if resources.count == stickers.count { if resources.count == stickers.count {
var flags: Int32 = 0 var flags: Int32 = 0
switch type { switch type.contentType {
case .animation: case .animation:
flags |= (1 << 1) flags |= (1 << 1)
case .video: case .video:
@ -141,12 +155,24 @@ func _internal_createStickerSet(account: Account, title: String, shortName: Stri
default: default:
break break
} }
if case let .emoji(_, textColored) = type {
flags |= (1 << 5)
if textColored {
flags |= (1 << 6)
}
}
var inputStickers: [Api.InputStickerSetItem] = [] var inputStickers: [Api.InputStickerSetItem] = []
let stickerDocuments = thumbnail != nil ? resources.dropLast() : resources let stickerDocuments = thumbnail != nil ? resources.dropLast() : resources
for i in 0 ..< stickerDocuments.count { for i in 0 ..< stickerDocuments.count {
let sticker = stickers[i] let sticker = stickers[i]
let resource = resources[i] let resource = resources[i]
inputStickers.append(.inputStickerSetItem(flags: 0, document: .inputDocument(id: resource.fileId, accessHash: resource.accessHash, fileReference: Buffer(data: resource.fileReference ?? Data())), emoji: sticker.emojis.first ?? "", maskCoords: nil))
var flags: Int32 = 0
if sticker.keywords.count > 0 {
flags |= (1 << 1)
}
inputStickers.append(.inputStickerSetItem(flags: flags, document: .inputDocument(id: resource.fileId, accessHash: resource.accessHash, fileReference: Buffer(data: resource.fileReference ?? Data())), emoji: sticker.emojis.first ?? "", maskCoords: nil, keywords: sticker.keywords))
} }
var thumbnailDocument: Api.InputDocument? var thumbnailDocument: Api.InputDocument?
if thumbnail != nil, let resource = resources.last { if thumbnail != nil, let resource = resources.last {