Merge branch 'master' of gitlab.com:peter-iakovlev/telegram-ios

This commit is contained in:
Ilya Laktyushin
2025-02-22 19:17:46 +04:00
63 changed files with 2927 additions and 671 deletions

View File

@@ -2,6 +2,8 @@ import Foundation
import Postbox
import TelegramApi
import SwiftSignalKit
import FlatBuffers
import FlatSerialization
public enum CachedPeerAutoremoveTimeout: Equatable, PostboxCoding {
public struct Value: Equatable, PostboxCoding {
@@ -261,6 +263,16 @@ public enum PeerNameColor: Hashable {
return value
}
}
public init(flatBuffersObject: TelegramCore_PeerNameColor) throws {
self.init(rawValue: flatBuffersObject.value)
}
public func encodeToFlatBuffers(builder: inout FlatBufferBuilder) -> Offset {
let start = TelegramCore_PeerNameColor.startPeerNameColor(&builder)
TelegramCore_PeerNameColor.add(value: self.rawValue, &builder)
return TelegramCore_PeerNameColor.endPeerNameColor(&builder, start: start)
}
}
public struct PeerEmojiStatus: Equatable, Codable {
@@ -320,6 +332,68 @@ public struct PeerEmojiStatus: Equatable, Codable {
try container.encode(textColor, forKey: .textColor)
}
}
public init(flatBuffersObject: TelegramCore_PeerEmojiStatusContent) throws {
switch flatBuffersObject.valueType {
case .peeremojistatuscontentemoji:
guard let emoji = flatBuffersObject.value(type: TelegramCore_PeerEmojiStatusContentEmoji.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .emoji(fileId: emoji.fileId)
case .peeremojistatuscontentstargift:
guard let starGift = flatBuffersObject.value(type: TelegramCore_PeerEmojiStatusContentStarGift.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .starGift(
id: starGift.id,
fileId: starGift.fileId,
title: starGift.title,
slug: starGift.slug,
patternFileId: starGift.patternFileId,
innerColor: starGift.innerColor,
outerColor: starGift.outerColor,
patternColor: starGift.patternColor,
textColor: starGift.textColor
)
case .none_:
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
}
public func encodeToFlatBuffers(builder: inout FlatBufferBuilder) -> Offset {
let valueType: TelegramCore_PeerEmojiStatusContent_Value
let valueOffset: Offset
switch self {
case let .emoji(fileId):
valueType = .peeremojistatuscontentemoji
let start = TelegramCore_PeerEmojiStatusContentEmoji.startPeerEmojiStatusContentEmoji(&builder)
TelegramCore_PeerEmojiStatusContentEmoji.add(fileId: fileId, &builder)
valueOffset = TelegramCore_PeerEmojiStatusContentEmoji.endPeerEmojiStatusContentEmoji(&builder, start: start)
case let .starGift(id, fileId, title, slug, patternFileId, innerColor, outerColor, patternColor, textColor):
valueType = .peeremojistatuscontentstargift
let titleOffset = builder.create(string: title)
let slugOffset = builder.create(string: slug)
let start = TelegramCore_PeerEmojiStatusContentStarGift.startPeerEmojiStatusContentStarGift(&builder)
TelegramCore_PeerEmojiStatusContentStarGift.add(id: id, &builder)
TelegramCore_PeerEmojiStatusContentStarGift.add(fileId: fileId, &builder)
TelegramCore_PeerEmojiStatusContentStarGift.add(title: titleOffset, &builder)
TelegramCore_PeerEmojiStatusContentStarGift.add(slug: slugOffset, &builder)
TelegramCore_PeerEmojiStatusContentStarGift.add(patternFileId: patternFileId, &builder)
TelegramCore_PeerEmojiStatusContentStarGift.add(innerColor: innerColor, &builder)
TelegramCore_PeerEmojiStatusContentStarGift.add(outerColor: outerColor, &builder)
TelegramCore_PeerEmojiStatusContentStarGift.add(patternColor: patternColor, &builder)
TelegramCore_PeerEmojiStatusContentStarGift.add(textColor: textColor, &builder)
valueOffset = TelegramCore_PeerEmojiStatusContentStarGift.endPeerEmojiStatusContentStarGift(&builder, start: start)
}
let start = TelegramCore_PeerEmojiStatusContent.startPeerEmojiStatusContent(&builder)
TelegramCore_PeerEmojiStatusContent.add(valueType: valueType, &builder)
TelegramCore_PeerEmojiStatusContent.add(value: valueOffset, &builder)
return TelegramCore_PeerEmojiStatusContent.endPeerEmojiStatusContent(&builder, start: start)
}
}
public var content: Content
public var expirationDate: Int32?
@@ -348,6 +422,20 @@ public struct PeerEmojiStatus: Equatable, Codable {
try container.encode(self.content, forKey: .content)
try container.encodeIfPresent(self.expirationDate, forKey: .expirationDate)
}
public init(flatBuffersObject: TelegramCore_PeerEmojiStatus) throws {
self.content = try Content(flatBuffersObject: flatBuffersObject.content)
self.expirationDate = flatBuffersObject.expirationDate == Int32.min ? nil : flatBuffersObject.expirationDate
}
public func encodeToFlatBuffers(builder: inout FlatBufferBuilder) -> Offset {
let contentOffset = self.content.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_PeerEmojiStatus.startPeerEmojiStatus(&builder)
TelegramCore_PeerEmojiStatus.add(content: contentOffset, &builder)
TelegramCore_PeerEmojiStatus.add(expirationDate: self.expirationDate ?? Int32.min, &builder)
return TelegramCore_PeerEmojiStatus.endPeerEmojiStatus(&builder, start: start)
}
}
extension PeerEmojiStatus {

View File

@@ -961,7 +961,7 @@ public final class WallpaperDataResource: TelegramMediaResource {
public func TelegramMediaResource_parse(flatBuffersData data: Data) throws -> TelegramMediaResource {
var byteBuffer = ByteBuffer(data: data)
let flatBuffersObject: TelegramCore_TelegramMediaResource = getRoot(byteBuffer: &byteBuffer)
let flatBuffersObject: TelegramCore_TelegramMediaResource = FlatBuffers_getRoot(byteBuffer: &byteBuffer)
return try TelegramMediaResource_parse(flatBuffersObject: flatBuffersObject)
}
@@ -970,7 +970,7 @@ public func TelegramMediaResource_parse(flatBuffersObject: TelegramCore_Telegram
switch flatBuffersObject.valueType {
case .telegrammediaresourceCloudfilemediaresource:
guard let value = flatBuffersObject.value(type: TelegramCore_TelegramMediaResource_CloudFileMediaResource.self) else {
throw FlatBuffersError.missingRequiredField
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
return CloudFileMediaResource(
datacenterId: Int(value.datacenterId),
@@ -982,7 +982,7 @@ public func TelegramMediaResource_parse(flatBuffersObject: TelegramCore_Telegram
)
case .telegrammediaresourceClouddocumentsizemediaresource:
guard let value = flatBuffersObject.value(type: TelegramCore_TelegramMediaResource_CloudDocumentSizeMediaResource.self) else {
throw FlatBuffersError.missingRequiredField
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
return CloudDocumentSizeMediaResource(
datacenterId: value.datacenterId,
@@ -993,7 +993,7 @@ public func TelegramMediaResource_parse(flatBuffersObject: TelegramCore_Telegram
)
case .telegrammediaresourceCloudphotosizemediaresource:
guard let value = flatBuffersObject.value(type: TelegramCore_TelegramMediaResource_CloudPhotoSizeMediaResource.self) else {
throw FlatBuffersError.missingRequiredField
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
return CloudPhotoSizeMediaResource(
datacenterId: value.datacenterId,
@@ -1005,7 +1005,7 @@ public func TelegramMediaResource_parse(flatBuffersObject: TelegramCore_Telegram
)
case .telegrammediaresourceCloudpeerphotosizemediaresource:
guard let value = flatBuffersObject.value(type: TelegramCore_TelegramMediaResource_CloudPeerPhotoSizeMediaResource.self) else {
throw FlatBuffersError.missingRequiredField
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
let sizeSpec: CloudPeerPhotoSizeSpec
switch value.sizeSpec {
@@ -1023,7 +1023,7 @@ public func TelegramMediaResource_parse(flatBuffersObject: TelegramCore_Telegram
)
case .telegrammediaresourceCloudstickerpackthumbnailmediaresource:
guard let value = flatBuffersObject.value(type: TelegramCore_TelegramMediaResource_CloudStickerPackThumbnailMediaResource.self) else {
throw FlatBuffersError.missingRequiredField
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
return CloudStickerPackThumbnailMediaResource(
datacenterId: value.datacenterId,
@@ -1033,7 +1033,7 @@ public func TelegramMediaResource_parse(flatBuffersObject: TelegramCore_Telegram
)
case .telegrammediaresourceClouddocumentmediaresource:
guard let value = flatBuffersObject.value(type: TelegramCore_TelegramMediaResource_CloudDocumentMediaResource.self) else {
throw FlatBuffersError.missingRequiredField
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
return CloudDocumentMediaResource(
datacenterId: Int(value.datacenterId),
@@ -1045,7 +1045,7 @@ public func TelegramMediaResource_parse(flatBuffersObject: TelegramCore_Telegram
)
case .telegrammediaresourceLocalfilemediaresource:
guard let value = flatBuffersObject.value(type: TelegramCore_TelegramMediaResource_LocalFileMediaResource.self) else {
throw FlatBuffersError.missingRequiredField
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
return LocalFileMediaResource(
fileId: value.fileId,
@@ -1053,7 +1053,7 @@ public func TelegramMediaResource_parse(flatBuffersObject: TelegramCore_Telegram
isSecretRelated: value.isSecretRelated
)
case .none_:
throw FlatBuffersError.missingRequiredField
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
}
@@ -1094,9 +1094,10 @@ public func TelegramMediaResource_serialize(resource: TelegramMediaResource, fla
return TelegramCore_TelegramMediaResource.createTelegramMediaResource(&builder, valueType: .telegrammediaresourceClouddocumentsizemediaresource, valueOffset: offset)
case let resource as CloudPhotoSizeMediaResource:
let sizeSpecOffset = builder.create(string: resource.sizeSpec)
let start = TelegramCore_TelegramMediaResource_CloudPhotoSizeMediaResource.startTelegramMediaResource_CloudPhotoSizeMediaResource(&builder)
let fileReferenceOffset = resource.fileReference.flatMap { builder.createVector(bytes: $0) }
let start = TelegramCore_TelegramMediaResource_CloudPhotoSizeMediaResource.startTelegramMediaResource_CloudPhotoSizeMediaResource(&builder)
TelegramCore_TelegramMediaResource_CloudPhotoSizeMediaResource.add(datacenterId: Int32(resource.datacenterId), &builder)
TelegramCore_TelegramMediaResource_CloudPhotoSizeMediaResource.add(photoId: resource.photoId, &builder)
TelegramCore_TelegramMediaResource_CloudPhotoSizeMediaResource.add(accessHash: resource.accessHash, &builder)

View File

@@ -1,4 +1,7 @@
import Foundation
import Postbox
import FlatBuffers
import FlatSerialization
private enum InstantPageBlockType: Int32 {
case unsupported = 0
@@ -512,6 +515,395 @@ public indirect enum InstantPageBlock: PostboxCoding, Equatable {
}
}
}
public init(flatBuffersObject: TelegramCore_InstantPageBlock) throws {
switch flatBuffersObject.valueType {
case .instantpageblockUnsupported:
self = .unsupported
case .instantpageblockTitle:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Title.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .title(try RichText(flatBuffersObject: value.text))
case .instantpageblockSubtitle:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Subtitle.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .subtitle(try RichText(flatBuffersObject: value.text))
case .instantpageblockAuthordate:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_AuthorDate.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .authorDate(author: try RichText(flatBuffersObject: value.author), date: value.date)
case .instantpageblockHeader:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Header.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .header(try RichText(flatBuffersObject: value.text))
case .instantpageblockSubheader:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Subheader.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .subheader(try RichText(flatBuffersObject: value.text))
case .instantpageblockParagraph:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Paragraph.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .paragraph(try RichText(flatBuffersObject: value.text))
case .instantpageblockPreformatted:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Preformatted.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .preformatted(try RichText(flatBuffersObject: value.text))
case .instantpageblockFooter:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Footer.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .footer(try RichText(flatBuffersObject: value.text))
case .instantpageblockDivider:
self = .divider
case .instantpageblockAnchor:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Anchor.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .anchor(value.name)
case .instantpageblockList:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_List.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .list(items: try (0 ..< value.itemsCount).map { try InstantPageListItem(flatBuffersObject: value.items(at: $0)!) }, ordered: value.ordered)
case .instantpageblockBlockquote:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_BlockQuote.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .blockQuote(text: try RichText(flatBuffersObject: value.text), caption: try RichText(flatBuffersObject: value.caption))
case .instantpageblockPullquote:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_PullQuote.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .pullQuote(text: try RichText(flatBuffersObject: value.text), caption: try RichText(flatBuffersObject: value.caption))
case .instantpageblockImage:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Image.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .image(id: MediaId(value.id), caption: try InstantPageCaption(flatBuffersObject: value.caption), url: value.url, webpageId: value.webpageId.flatMap(MediaId.init))
case .instantpageblockVideo:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Video.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .video(id: MediaId(value.id), caption: try InstantPageCaption(flatBuffersObject: value.caption), autoplay: value.autoplay, loop: value.loop)
case .instantpageblockAudio:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Audio.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .audio(id: MediaId(value.id), caption: try InstantPageCaption(flatBuffersObject: value.caption))
case .instantpageblockCover:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Cover.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .cover(try InstantPageBlock(flatBuffersObject: value.block))
case .instantpageblockWebembed:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_WebEmbed.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .webEmbed(url: value.url, html: value.html, dimensions: value.dimensions.flatMap(PixelDimensions.init), caption: try InstantPageCaption(flatBuffersObject: value.caption), stretchToWidth: value.stretchToWidth, allowScrolling: value.allowScrolling, coverId: value.coverId.flatMap(MediaId.init))
case .instantpageblockPostembed:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_PostEmbed.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .postEmbed(url: value.url, webpageId: value.webpageId.flatMap(MediaId.init), avatarId: value.avatarId.flatMap(MediaId.init), author: value.author, date: value.date, blocks: try (0 ..< value.blocksCount).map { try InstantPageBlock(flatBuffersObject: value.blocks(at: $0)!) }, caption: try InstantPageCaption(flatBuffersObject: value.caption))
case .instantpageblockCollage:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Collage.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .collage(items: try (0 ..< value.itemsCount).map { try InstantPageBlock(flatBuffersObject: value.items(at: $0)!) }, caption: try InstantPageCaption(flatBuffersObject: value.caption))
case .instantpageblockSlideshow:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Slideshow.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .slideshow(items: try (0 ..< value.itemsCount).map { try InstantPageBlock(flatBuffersObject: value.items(at: $0)!) }, caption: try InstantPageCaption(flatBuffersObject: value.caption))
case .instantpageblockChannelbanner:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_ChannelBanner.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
let channel = try value.channel.flatMap { try TelegramChannel(flatBuffersObject: $0) }
self = .channelBanner(channel)
case .instantpageblockKicker:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Kicker.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .kicker(try RichText(flatBuffersObject: value.text))
case .instantpageblockTable:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Table.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .table(title: try RichText(flatBuffersObject: value.title), rows: try (0 ..< value.rowsCount).map { try InstantPageTableRow(flatBuffersObject: value.rows(at: $0)!) }, bordered: value.bordered, striped: value.striped)
case .instantpageblockDetails:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Details.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .details(title: try RichText(flatBuffersObject: value.title), blocks: try (0 ..< value.blocksCount).map { try InstantPageBlock(flatBuffersObject: value.blocks(at: $0)!) }, expanded: value.expanded)
case .instantpageblockRelatedarticles:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_RelatedArticles.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .relatedArticles(title: try RichText(flatBuffersObject: value.title), articles: try (0 ..< value.articlesCount).map { try InstantPageRelatedArticle(flatBuffersObject: value.articles(at: $0)!) })
case .instantpageblockMap:
guard let value = flatBuffersObject.value(type: TelegramCore_InstantPageBlock_Map.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .map(latitude: value.latitude, longitude: value.longitude, zoom: value.zoom, dimensions: PixelDimensions(value.dimensions), caption: try InstantPageCaption(flatBuffersObject: value.caption))
case .none_:
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
}
public func encodeToFlatBuffers(builder: inout FlatBufferBuilder) -> Offset {
let valueType: TelegramCore_InstantPageBlock_Value
let offset: Offset
switch self {
case .unsupported:
valueType = .instantpageblockUnsupported
let start = TelegramCore_InstantPageBlock_Unsupported.startInstantPageBlock_Unsupported(&builder)
offset = TelegramCore_InstantPageBlock_Unsupported.endInstantPageBlock_Unsupported(&builder, start: start)
case let .title(text):
valueType = .instantpageblockTitle
let textOffset = text.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_InstantPageBlock_Title.startInstantPageBlock_Title(&builder)
TelegramCore_InstantPageBlock_Title.add(text: textOffset, &builder)
offset = TelegramCore_InstantPageBlock_Title.endInstantPageBlock_Title(&builder, start: start)
case let .subtitle(text):
valueType = .instantpageblockSubtitle
let textOffset = text.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_InstantPageBlock_Subtitle.startInstantPageBlock_Subtitle(&builder)
TelegramCore_InstantPageBlock_Subtitle.add(text: textOffset, &builder)
offset = TelegramCore_InstantPageBlock_Subtitle.endInstantPageBlock_Subtitle(&builder, start: start)
case let .authorDate(author, date):
valueType = .instantpageblockAuthordate
let authorOffset = author.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_InstantPageBlock_AuthorDate.startInstantPageBlock_AuthorDate(&builder)
TelegramCore_InstantPageBlock_AuthorDate.add(author: authorOffset, &builder)
TelegramCore_InstantPageBlock_AuthorDate.add(date: date, &builder)
offset = TelegramCore_InstantPageBlock_AuthorDate.endInstantPageBlock_AuthorDate(&builder, start: start)
case let .header(text):
valueType = .instantpageblockHeader
let textOffset = text.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_InstantPageBlock_Header.startInstantPageBlock_Header(&builder)
TelegramCore_InstantPageBlock_Header.add(text: textOffset, &builder)
offset = TelegramCore_InstantPageBlock_Header.endInstantPageBlock_Header(&builder, start: start)
case let .subheader(text):
valueType = .instantpageblockSubheader
let textOffset = text.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_InstantPageBlock_Subheader.startInstantPageBlock_Subheader(&builder)
TelegramCore_InstantPageBlock_Subheader.add(text: textOffset, &builder)
offset = TelegramCore_InstantPageBlock_Subheader.endInstantPageBlock_Subheader(&builder, start: start)
case let .paragraph(text):
valueType = .instantpageblockParagraph
let textOffset = text.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_InstantPageBlock_Paragraph.startInstantPageBlock_Paragraph(&builder)
TelegramCore_InstantPageBlock_Paragraph.add(text: textOffset, &builder)
offset = TelegramCore_InstantPageBlock_Paragraph.endInstantPageBlock_Paragraph(&builder, start: start)
case let .preformatted(text):
valueType = .instantpageblockPreformatted
let textOffset = text.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_InstantPageBlock_Preformatted.startInstantPageBlock_Preformatted(&builder)
TelegramCore_InstantPageBlock_Preformatted.add(text: textOffset, &builder)
offset = TelegramCore_InstantPageBlock_Preformatted.endInstantPageBlock_Preformatted(&builder, start: start)
case let .footer(text):
valueType = .instantpageblockFooter
let textOffset = text.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_InstantPageBlock_Footer.startInstantPageBlock_Footer(&builder)
TelegramCore_InstantPageBlock_Footer.add(text: textOffset, &builder)
offset = TelegramCore_InstantPageBlock_Footer.endInstantPageBlock_Footer(&builder, start: start)
case .divider:
valueType = .instantpageblockDivider
let start = TelegramCore_InstantPageBlock_Divider.startInstantPageBlock_Divider(&builder)
offset = TelegramCore_InstantPageBlock_Divider.endInstantPageBlock_Divider(&builder, start: start)
case let .anchor(name):
valueType = .instantpageblockAnchor
let nameOffset = builder.create(string: name)
let start = TelegramCore_InstantPageBlock_Anchor.startInstantPageBlock_Anchor(&builder)
TelegramCore_InstantPageBlock_Anchor.add(name: nameOffset, &builder)
offset = TelegramCore_InstantPageBlock_Anchor.endInstantPageBlock_Anchor(&builder, start: start)
case let .list(items, ordered):
valueType = .instantpageblockList
let itemsOffsets = items.map { $0.encodeToFlatBuffers(builder: &builder) }
let itemsOffset = builder.createVector(ofOffsets: itemsOffsets, len: itemsOffsets.count)
let start = TelegramCore_InstantPageBlock_List.startInstantPageBlock_List(&builder)
TelegramCore_InstantPageBlock_List.addVectorOf(items: itemsOffset, &builder)
TelegramCore_InstantPageBlock_List.add(ordered: ordered, &builder)
offset = TelegramCore_InstantPageBlock_List.endInstantPageBlock_List(&builder, start: start)
case let .blockQuote(text, caption):
valueType = .instantpageblockBlockquote
let textOffset = text.encodeToFlatBuffers(builder: &builder)
let captionOffset = caption.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_InstantPageBlock_BlockQuote.startInstantPageBlock_BlockQuote(&builder)
TelegramCore_InstantPageBlock_BlockQuote.add(text: textOffset, &builder)
TelegramCore_InstantPageBlock_BlockQuote.add(caption: captionOffset, &builder)
offset = TelegramCore_InstantPageBlock_BlockQuote.endInstantPageBlock_BlockQuote(&builder, start: start)
case let .pullQuote(text, caption):
valueType = .instantpageblockPullquote
let textOffset = text.encodeToFlatBuffers(builder: &builder)
let captionOffset = caption.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_InstantPageBlock_PullQuote.startInstantPageBlock_PullQuote(&builder)
TelegramCore_InstantPageBlock_PullQuote.add(text: textOffset, &builder)
TelegramCore_InstantPageBlock_PullQuote.add(caption: captionOffset, &builder)
offset = TelegramCore_InstantPageBlock_PullQuote.endInstantPageBlock_PullQuote(&builder, start: start)
case let .image(id, caption, url, webpageId):
valueType = .instantpageblockImage
let captionOffset = caption.encodeToFlatBuffers(builder: &builder)
let urlOffset = url.flatMap { builder.create(string: $0) }
let start = TelegramCore_InstantPageBlock_Image.startInstantPageBlock_Image(&builder)
TelegramCore_InstantPageBlock_Image.add(id: id.asFlatBuffersObject(), &builder)
TelegramCore_InstantPageBlock_Image.add(caption: captionOffset, &builder)
if let urlOffset {
TelegramCore_InstantPageBlock_Image.add(url: urlOffset, &builder)
}
if let webpageId {
TelegramCore_InstantPageBlock_Image.add(webpageId: webpageId.asFlatBuffersObject(), &builder)
}
offset = TelegramCore_InstantPageBlock_Image.endInstantPageBlock_Image(&builder, start: start)
case let .video(id, caption, autoplay, loop):
valueType = .instantpageblockVideo
let captionOffset = caption.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_InstantPageBlock_Video.startInstantPageBlock_Video(&builder)
TelegramCore_InstantPageBlock_Video.add(id: id.asFlatBuffersObject(), &builder)
TelegramCore_InstantPageBlock_Video.add(caption: captionOffset, &builder)
TelegramCore_InstantPageBlock_Video.add(autoplay: autoplay, &builder)
TelegramCore_InstantPageBlock_Video.add(loop: loop, &builder)
offset = TelegramCore_InstantPageBlock_Video.endInstantPageBlock_Video(&builder, start: start)
case let .audio(id, caption):
valueType = .instantpageblockAudio
let captionOffset = caption.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_InstantPageBlock_Audio.startInstantPageBlock_Audio(&builder)
TelegramCore_InstantPageBlock_Audio.add(id: id.asFlatBuffersObject(), &builder)
TelegramCore_InstantPageBlock_Audio.add(caption: captionOffset, &builder)
offset = TelegramCore_InstantPageBlock_Audio.endInstantPageBlock_Audio(&builder, start: start)
case let .cover(block):
valueType = .instantpageblockCover
let blockOffset = block.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_InstantPageBlock_Cover.startInstantPageBlock_Cover(&builder)
TelegramCore_InstantPageBlock_Cover.add(block: blockOffset, &builder)
offset = TelegramCore_InstantPageBlock_Cover.endInstantPageBlock_Cover(&builder, start: start)
case let .webEmbed(url, html, dimensions, caption, stretchToWidth, allowScrolling, coverId):
valueType = .instantpageblockWebembed
let urlOffset = url.flatMap { builder.create(string: $0) }
let htmlOffset = html.flatMap { builder.create(string: $0) }
let captionOffset = caption.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_InstantPageBlock_WebEmbed.startInstantPageBlock_WebEmbed(&builder)
if let urlOffset {
TelegramCore_InstantPageBlock_WebEmbed.add(url: urlOffset, &builder)
}
if let htmlOffset {
TelegramCore_InstantPageBlock_WebEmbed.add(html: htmlOffset, &builder)
}
if let dimensions {
TelegramCore_InstantPageBlock_WebEmbed.add(dimensions: dimensions.asFlatBuffersObject(), &builder)
}
TelegramCore_InstantPageBlock_WebEmbed.add(caption: captionOffset, &builder)
TelegramCore_InstantPageBlock_WebEmbed.add(stretchToWidth: stretchToWidth, &builder)
TelegramCore_InstantPageBlock_WebEmbed.add(allowScrolling: allowScrolling, &builder)
if let coverId {
TelegramCore_InstantPageBlock_WebEmbed.add(coverId: coverId.asFlatBuffersObject(), &builder)
}
offset = TelegramCore_InstantPageBlock_WebEmbed.endInstantPageBlock_WebEmbed(&builder, start: start)
case let .postEmbed(url, webpageId, avatarId, author, date, blocks, caption):
valueType = .instantpageblockPostembed
let urlOffset = builder.create(string: url)
let authorOffset = builder.create(string: author)
let blocksOffsets = blocks.map { $0.encodeToFlatBuffers(builder: &builder) }
let blocksOffset = builder.createVector(ofOffsets: blocksOffsets, len: blocksOffsets.count)
let captionOffset = caption.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_InstantPageBlock_PostEmbed.startInstantPageBlock_PostEmbed(&builder)
TelegramCore_InstantPageBlock_PostEmbed.add(url: urlOffset, &builder)
if let webpageId {
TelegramCore_InstantPageBlock_PostEmbed.add(webpageId: webpageId.asFlatBuffersObject(), &builder)
}
if let avatarId {
TelegramCore_InstantPageBlock_PostEmbed.add(avatarId: avatarId.asFlatBuffersObject(), &builder)
}
TelegramCore_InstantPageBlock_PostEmbed.add(author: authorOffset, &builder)
TelegramCore_InstantPageBlock_PostEmbed.add(date: date, &builder)
TelegramCore_InstantPageBlock_PostEmbed.addVectorOf(blocks: blocksOffset, &builder)
TelegramCore_InstantPageBlock_PostEmbed.add(caption: captionOffset, &builder)
offset = TelegramCore_InstantPageBlock_PostEmbed.endInstantPageBlock_PostEmbed(&builder, start: start)
case let .collage(items, caption):
valueType = .instantpageblockCollage
let itemsOffsets = items.map { $0.encodeToFlatBuffers(builder: &builder) }
let itemsOffset = builder.createVector(ofOffsets: itemsOffsets, len: itemsOffsets.count)
let captionOffset = caption.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_InstantPageBlock_Collage.startInstantPageBlock_Collage(&builder)
TelegramCore_InstantPageBlock_Collage.addVectorOf(items: itemsOffset, &builder)
TelegramCore_InstantPageBlock_Collage.add(caption: captionOffset, &builder)
offset = TelegramCore_InstantPageBlock_Collage.endInstantPageBlock_Collage(&builder, start: start)
case let .slideshow(items, caption):
valueType = .instantpageblockSlideshow
let itemsOffsets = items.map { $0.encodeToFlatBuffers(builder: &builder) }
let itemsOffset = builder.createVector(ofOffsets: itemsOffsets, len: itemsOffsets.count)
let captionOffset = caption.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_InstantPageBlock_Slideshow.startInstantPageBlock_Slideshow(&builder)
TelegramCore_InstantPageBlock_Slideshow.addVectorOf(items: itemsOffset, &builder)
TelegramCore_InstantPageBlock_Slideshow.add(caption: captionOffset, &builder)
offset = TelegramCore_InstantPageBlock_Slideshow.endInstantPageBlock_Slideshow(&builder, start: start)
case let .channelBanner(channel):
valueType = .instantpageblockChannelbanner
let channelOffset = channel.flatMap { $0.encodeToFlatBuffers(builder: &builder) }
let start = TelegramCore_InstantPageBlock_ChannelBanner.startInstantPageBlock_ChannelBanner(&builder)
if let channelOffset {
TelegramCore_InstantPageBlock_ChannelBanner.add(channel: channelOffset, &builder)
}
offset = TelegramCore_InstantPageBlock_ChannelBanner.endInstantPageBlock_ChannelBanner(&builder, start: start)
case let .kicker(text):
valueType = .instantpageblockKicker
let textOffset = text.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_InstantPageBlock_Kicker.startInstantPageBlock_Kicker(&builder)
TelegramCore_InstantPageBlock_Kicker.add(text: textOffset, &builder)
offset = TelegramCore_InstantPageBlock_Kicker.endInstantPageBlock_Kicker(&builder, start: start)
case let .table(title, rows, bordered, striped):
valueType = .instantpageblockTable
let titleOffset = title.encodeToFlatBuffers(builder: &builder)
let rowsOffsets = rows.map { $0.encodeToFlatBuffers(builder: &builder) }
let rowsOffset = builder.createVector(ofOffsets: rowsOffsets, len: rowsOffsets.count)
let start = TelegramCore_InstantPageBlock_Table.startInstantPageBlock_Table(&builder)
TelegramCore_InstantPageBlock_Table.add(title: titleOffset, &builder)
TelegramCore_InstantPageBlock_Table.addVectorOf(rows: rowsOffset, &builder)
TelegramCore_InstantPageBlock_Table.add(bordered: bordered, &builder)
TelegramCore_InstantPageBlock_Table.add(striped: striped, &builder)
offset = TelegramCore_InstantPageBlock_Table.endInstantPageBlock_Table(&builder, start: start)
case let .details(title, blocks, expanded):
valueType = .instantpageblockDetails
let titleOffset = title.encodeToFlatBuffers(builder: &builder)
let blocksOffsets = blocks.map { $0.encodeToFlatBuffers(builder: &builder) }
let blocksOffset = builder.createVector(ofOffsets: blocksOffsets, len: blocksOffsets.count)
let start = TelegramCore_InstantPageBlock_Details.startInstantPageBlock_Details(&builder)
TelegramCore_InstantPageBlock_Details.add(title: titleOffset, &builder)
TelegramCore_InstantPageBlock_Details.addVectorOf(blocks: blocksOffset, &builder)
TelegramCore_InstantPageBlock_Details.add(expanded: expanded, &builder)
offset = TelegramCore_InstantPageBlock_Details.endInstantPageBlock_Details(&builder, start: start)
case let .relatedArticles(title, articles):
valueType = .instantpageblockRelatedarticles
let titleOffset = title.encodeToFlatBuffers(builder: &builder)
let articlesOffsets = articles.map { $0.encodeToFlatBuffers(builder: &builder) }
let articlesOffset = builder.createVector(ofOffsets: articlesOffsets, len: articlesOffsets.count)
let start = TelegramCore_InstantPageBlock_RelatedArticles.startInstantPageBlock_RelatedArticles(&builder)
TelegramCore_InstantPageBlock_RelatedArticles.add(title: titleOffset, &builder)
TelegramCore_InstantPageBlock_RelatedArticles.addVectorOf(articles: articlesOffset, &builder)
offset = TelegramCore_InstantPageBlock_RelatedArticles.endInstantPageBlock_RelatedArticles(&builder, start: start)
case let .map(latitude, longitude, zoom, dimensions, caption):
valueType = .instantpageblockMap
let captionOffset = caption.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_InstantPageBlock_Map.startInstantPageBlock_Map(&builder)
TelegramCore_InstantPageBlock_Map.add(latitude: latitude, &builder)
TelegramCore_InstantPageBlock_Map.add(longitude: longitude, &builder)
TelegramCore_InstantPageBlock_Map.add(zoom: zoom, &builder)
TelegramCore_InstantPageBlock_Map.add(dimensions: dimensions.asFlatBuffersObject(), &builder)
TelegramCore_InstantPageBlock_Map.add(caption: captionOffset, &builder)
offset = TelegramCore_InstantPageBlock_Map.endInstantPageBlock_Map(&builder, start: start)
}
return TelegramCore_InstantPageBlock.createInstantPageBlock(&builder, valueType: valueType, valueOffset: offset)
}
}
public final class InstantPageCaption: PostboxCoding, Equatable {
@@ -542,6 +934,21 @@ public final class InstantPageCaption: PostboxCoding, Equatable {
}
return true
}
public init(flatBuffersObject: TelegramCore_InstantPageCaption) throws {
self.text = try RichText(flatBuffersObject: flatBuffersObject.text)
self.credit = try RichText(flatBuffersObject: flatBuffersObject.credit)
}
public func encodeToFlatBuffers(builder: inout FlatBufferBuilder) -> Offset {
let textOffset = self.text.encodeToFlatBuffers(builder: &builder)
let creditOffset = self.credit.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_InstantPageCaption.startInstantPageCaption(&builder)
TelegramCore_InstantPageCaption.add(text: textOffset, &builder)
TelegramCore_InstantPageCaption.add(credit: creditOffset, &builder)
let offset = TelegramCore_InstantPageCaption.endInstantPageCaption(&builder, start: start)
return offset
}
}
private enum InstantPageListItemType: Int32 {
@@ -611,6 +1018,69 @@ public indirect enum InstantPageListItem: PostboxCoding, Equatable {
}
}
}
public init(flatBuffersObject: TelegramCore_InstantPageListItem) throws {
switch flatBuffersObject.valueType {
case .instantpagelistitemText:
guard let textValue = flatBuffersObject.value(type: TelegramCore_InstantPageListItem_Text.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .text(try RichText(flatBuffersObject: textValue.text), textValue.number)
case .instantpagelistitemBlocks:
guard let blocksValue = flatBuffersObject.value(type: TelegramCore_InstantPageListItem_Blocks.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
let blocks = try (0 ..< blocksValue.blocksCount).map { i in
return try InstantPageBlock(flatBuffersObject: blocksValue.blocks(at: i)!)
}
self = .blocks(blocks, blocksValue.number)
case .instantpagelistitemUnknown:
self = .unknown
case .none_:
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
}
public func encodeToFlatBuffers(builder: inout FlatBufferBuilder) -> Offset {
let valueType: TelegramCore_InstantPageListItem_Value
let offset: Offset
switch self {
case let .text(text, number):
valueType = .instantpagelistitemText
let textOffset = text.encodeToFlatBuffers(builder: &builder)
let numberOffset = number.map { builder.create(string: $0) } ?? Offset()
let start = TelegramCore_InstantPageListItem_Text.startInstantPageListItem_Text(&builder)
TelegramCore_InstantPageListItem_Text.add(text: textOffset, &builder)
if let _ = number {
TelegramCore_InstantPageListItem_Text.add(number: numberOffset, &builder)
}
offset = TelegramCore_InstantPageListItem_Text.endInstantPageListItem_Text(&builder, start: start)
case let .blocks(blocks, number):
valueType = .instantpagelistitemBlocks
let blocksOffsets = blocks.map { $0.encodeToFlatBuffers(builder: &builder) }
let blocksOffset = builder.createVector(ofOffsets: blocksOffsets, len: blocksOffsets.count)
let numberOffset = number.map { builder.create(string: $0) } ?? Offset()
let start = TelegramCore_InstantPageListItem_Blocks.startInstantPageListItem_Blocks(&builder)
TelegramCore_InstantPageListItem_Blocks.addVectorOf(blocks: blocksOffset, &builder)
if let _ = number {
TelegramCore_InstantPageListItem_Blocks.add(number: numberOffset, &builder)
}
offset = TelegramCore_InstantPageListItem_Blocks.endInstantPageListItem_Blocks(&builder, start: start)
case .unknown:
valueType = .instantpagelistitemUnknown
let start = TelegramCore_InstantPageListItem_Unknown.startInstantPageListItem_Unknown(&builder)
offset = TelegramCore_InstantPageListItem_Unknown.endInstantPageListItem_Unknown(&builder, start: start)
}
let start = TelegramCore_InstantPageListItem.startInstantPageListItem(&builder)
TelegramCore_InstantPageListItem.add(valueType: valueType, &builder)
TelegramCore_InstantPageListItem.add(value: offset, &builder)
return TelegramCore_InstantPageListItem.endInstantPageListItem(&builder, start: start)
}
}
public enum TableHorizontalAlignment: Int32 {
@@ -685,6 +1155,30 @@ public final class InstantPageTableCell: PostboxCoding, Equatable {
}
return true
}
public init(flatBuffersObject: TelegramCore_InstantPageTableCell) throws {
self.text = try flatBuffersObject.text.map { try RichText(flatBuffersObject: $0) }
self.header = flatBuffersObject.header
self.alignment = TableHorizontalAlignment(rawValue: flatBuffersObject.alignment) ?? .left
self.verticalAlignment = TableVerticalAlignment(rawValue: flatBuffersObject.verticalAlignment) ?? .top
self.colspan = flatBuffersObject.colspan
self.rowspan = flatBuffersObject.rowspan
}
public func encodeToFlatBuffers(builder: inout FlatBufferBuilder) -> Offset {
let textOffset = text.map { $0.encodeToFlatBuffers(builder: &builder) } ?? Offset()
let start = TelegramCore_InstantPageTableCell.startInstantPageTableCell(&builder)
if let _ = text {
TelegramCore_InstantPageTableCell.add(text: textOffset, &builder)
}
TelegramCore_InstantPageTableCell.add(header: header, &builder)
TelegramCore_InstantPageTableCell.add(alignment: alignment.rawValue, &builder)
TelegramCore_InstantPageTableCell.add(verticalAlignment: verticalAlignment.rawValue, &builder)
TelegramCore_InstantPageTableCell.add(colspan: colspan, &builder)
TelegramCore_InstantPageTableCell.add(rowspan: rowspan, &builder)
return TelegramCore_InstantPageTableCell.endInstantPageTableCell(&builder, start: start)
}
}
public final class InstantPageTableRow: PostboxCoding, Equatable {
@@ -705,6 +1199,21 @@ public final class InstantPageTableRow: PostboxCoding, Equatable {
public static func ==(lhs: InstantPageTableRow, rhs: InstantPageTableRow) -> Bool {
return lhs.cells == rhs.cells
}
public init(flatBuffersObject: TelegramCore_InstantPageTableRow) throws {
self.cells = try (0 ..< flatBuffersObject.cellsCount).map { i in
return try InstantPageTableCell(flatBuffersObject: flatBuffersObject.cells(at: i)!)
}
}
public func encodeToFlatBuffers(builder: inout FlatBufferBuilder) -> Offset {
let cellsOffsets = cells.map { $0.encodeToFlatBuffers(builder: &builder) }
let cellsOffset = builder.createVector(ofOffsets: cellsOffsets, len: cellsOffsets.count)
let start = TelegramCore_InstantPageTableRow.startInstantPageTableRow(&builder)
TelegramCore_InstantPageTableRow.addVectorOf(cells: cellsOffset, &builder)
return TelegramCore_InstantPageTableRow.endInstantPageTableRow(&builder, start: start)
}
}
public final class InstantPageRelatedArticle: PostboxCoding, Equatable {
@@ -801,6 +1310,45 @@ public final class InstantPageRelatedArticle: PostboxCoding, Equatable {
}
return true
}
public init(flatBuffersObject: TelegramCore_InstantPageRelatedArticle) throws {
self.url = flatBuffersObject.url
self.webpageId = MediaId(flatBuffersObject.webpageId)
self.title = flatBuffersObject.title
self.description = flatBuffersObject.description
self.photoId = flatBuffersObject.photoId.flatMap(MediaId.init)
self.author = flatBuffersObject.author
self.date = flatBuffersObject.date == Int32.min ? nil : flatBuffersObject.date
}
public func encodeToFlatBuffers(builder: inout FlatBufferBuilder) -> Offset {
let urlOffset = builder.create(string: url)
let titleOffset = title.map { builder.create(string: $0) }
let descriptionOffset = description.map { builder.create(string: $0) }
let authorOffset = author.map { builder.create(string: $0) }
let start = TelegramCore_InstantPageRelatedArticle.startInstantPageRelatedArticle(&builder)
TelegramCore_InstantPageRelatedArticle.add(url: urlOffset, &builder)
TelegramCore_InstantPageRelatedArticle.add(webpageId: webpageId.asFlatBuffersObject(), &builder)
if let titleOffset {
TelegramCore_InstantPageRelatedArticle.add(title: titleOffset, &builder)
}
if let descriptionOffset {
TelegramCore_InstantPageRelatedArticle.add(description: descriptionOffset, &builder)
}
if let photoId {
TelegramCore_InstantPageRelatedArticle.add(photoId: photoId.asFlatBuffersObject(), &builder)
}
if let authorOffset {
TelegramCore_InstantPageRelatedArticle.add(author: authorOffset, &builder)
}
if let date {
TelegramCore_InstantPageRelatedArticle.add(date: date, &builder)
} else {
TelegramCore_InstantPageRelatedArticle.add(date: Int32.min, &builder)
}
return TelegramCore_InstantPageRelatedArticle.endInstantPageRelatedArticle(&builder, start: start)
}
}
private final class MediaDictionary: PostboxCoding {
@@ -862,6 +1410,17 @@ public final class InstantPage: PostboxCoding, Equatable {
self.rtl = decoder.decodeInt32ForKey("r", orElse: 0) != 0
self.url = decoder.decodeStringForKey("url", orElse: "")
self.views = decoder.decodeOptionalInt32ForKey("v")
#if DEBUG
var builder = FlatBufferBuilder(initialSize: 1024)
let offset = self.encodeToFlatBuffers(builder: &builder)
builder.finish(offset: offset)
let serializedData = builder.data
var byteBuffer = ByteBuffer(data: serializedData)
let deserializedValue = FlatBuffers_getRoot(byteBuffer: &byteBuffer) as TelegramCore_InstantPage
let parsedValue = try! InstantPage(flatBuffersObject: deserializedValue)
assert(self == parsedValue)
#endif
}
public func encode(_ encoder: PostboxEncoder) {
@@ -908,4 +1467,119 @@ public final class InstantPage: PostboxCoding, Equatable {
}
return true
}
public init(flatBuffersObject: TelegramCore_InstantPage) throws {
self.blocks = try (0 ..< flatBuffersObject.blocksCount).map { i in
return try InstantPageBlock(flatBuffersObject: flatBuffersObject.blocks(at: i)!)
}
//TODO:release support other media types
var media: [MediaId: Media] = [:]
for i in 0 ..< flatBuffersObject.mediaCount {
let mediaItem = flatBuffersObject.media(at: i)!
switch mediaItem.valueType {
case .mediaTelegrammediafile:
guard let value = mediaItem.value(type: TelegramCore_Media_TelegramMediaFile.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
let parsedMedia = try TelegramMediaFile(flatBuffersObject: value.file)
media[parsedMedia.fileId] = parsedMedia
case .mediaTelegrammediaimage:
guard let value = mediaItem.value(type: TelegramCore_Media_TelegramMediaImage.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
let parsedMedia = try TelegramMediaImage(flatBuffersObject: value.image)
media[parsedMedia.imageId] = parsedMedia
case .none_:
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
}
self.media = media
self.isComplete = flatBuffersObject.isComplete
self.rtl = flatBuffersObject.rtl
self.url = flatBuffersObject.url
self.views = flatBuffersObject.views == Int32.min ? nil : flatBuffersObject.views
}
public func encodeToFlatBuffers(builder: inout FlatBufferBuilder) -> Offset {
let blocksOffsets = self.blocks.map { block in
return block.encodeToFlatBuffers(builder: &builder)
}
let blocksOffset = builder.createVector(ofOffsets: blocksOffsets, len: blocksOffsets.count)
var mediaOffsets: [Offset] = []
for (_, media) in self.media.sorted(by: { $0.key < $1.key }) {
switch media {
case let file as TelegramMediaFile:
let fileOffset = file.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_Media_TelegramMediaFile.startMedia_TelegramMediaFile(&builder)
TelegramCore_Media_TelegramMediaFile.add(file: fileOffset, &builder)
let offset = TelegramCore_Media_TelegramMediaFile.endMedia_TelegramMediaFile(&builder, start: start)
mediaOffsets.append(TelegramCore_Media.createMedia(&builder, valueType: .mediaTelegrammediafile, valueOffset: offset))
case let image as TelegramMediaImage:
let imageOffset = image.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_Media_TelegramMediaImage.startMedia_TelegramMediaImage(&builder)
TelegramCore_Media_TelegramMediaImage.add(image: imageOffset, &builder)
let offset = TelegramCore_Media_TelegramMediaImage.endMedia_TelegramMediaImage(&builder, start: start)
mediaOffsets.append(TelegramCore_Media.createMedia(&builder, valueType: .mediaTelegrammediaimage, valueOffset: offset))
default:
assertionFailure()
}
}
let mediaOffset = builder.createVector(ofOffsets: mediaOffsets, len: mediaOffsets.count)
let urlOffset = builder.create(string: self.url)
let start = TelegramCore_InstantPage.startInstantPage(&builder)
TelegramCore_InstantPage.addVectorOf(blocks: blocksOffset, &builder)
TelegramCore_InstantPage.addVectorOf(media: mediaOffset, &builder)
TelegramCore_InstantPage.add(isComplete: self.isComplete, &builder)
TelegramCore_InstantPage.add(rtl: self.rtl, &builder)
TelegramCore_InstantPage.add(url: urlOffset, &builder)
TelegramCore_InstantPage.add(views: self.views ?? Int32.min, &builder)
return TelegramCore_InstantPage.endInstantPage(&builder, start: start)
}
}
public extension InstantPage {
struct Accessor: Equatable {
let _wrappedInstantPage: InstantPage?
let _wrapped: TelegramCore_InstantPage?
let _wrappedData: Data?
public init(_ wrapped: TelegramCore_InstantPage, _ _wrappedData: Data) {
self._wrapped = wrapped
self._wrappedData = _wrappedData
self._wrappedInstantPage = nil
}
public init(_ wrapped: InstantPage) {
self._wrapped = nil
self._wrappedData = nil
self._wrappedInstantPage = wrapped
}
public func _parse() -> InstantPage {
if let _wrappedInstantPage = self._wrappedInstantPage {
return _wrappedInstantPage
} else {
return try! InstantPage(flatBuffersObject: self._wrapped!)
}
}
public static func ==(lhs: InstantPage.Accessor, rhs: InstantPage.Accessor) -> Bool {
if let lhsWrappedInstantPage = lhs._wrappedInstantPage, let rhsWrappedInstantPage = rhs._wrappedInstantPage {
return lhsWrappedInstantPage === rhsWrappedInstantPage
} else if let lhsWrappedData = lhs._wrappedData, let rhsWrappedData = rhs._wrappedData {
return lhsWrappedData == rhsWrappedData
} else {
assertionFailure()
return lhs._parse() == rhs._parse()
}
}
}
}

View File

@@ -79,7 +79,7 @@ public extension PartialMediaReference {
switch flatBuffersObject.valueType {
case .partialmediareferenceMessage:
guard let value = flatBuffersObject.value(type: TelegramCore_PartialMediaReference_Message.self) else {
throw FlatBuffersError.missingRequiredField
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
if let message = value.message {
self = .message(message: try MessageReference(flatBuffersObject: message))
@@ -88,7 +88,7 @@ public extension PartialMediaReference {
}
case .partialmediareferenceWebpage:
guard let value = flatBuffersObject.value(type: TelegramCore_PartialMediaReference_WebPage.self) else {
throw FlatBuffersError.missingRequiredField
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
if let webPage = value.webPage {
self = .webPage(webPage: try WebpageReference(flatBuffersObject: webPage))
@@ -97,7 +97,7 @@ public extension PartialMediaReference {
}
case .partialmediareferenceStickerpack:
guard let value = flatBuffersObject.value(type: TelegramCore_PartialMediaReference_StickerPack.self) else {
throw FlatBuffersError.missingRequiredField
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .stickerPack(stickerPack: try StickerPackReference(flatBuffersObject: value.stickerPack))
case .partialmediareferenceSavedgif:
@@ -107,7 +107,7 @@ public extension PartialMediaReference {
case .partialmediareferenceRecentsticker:
self = .recentSticker
case .none_:
throw FlatBuffersError.missingRequiredField
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
}

View File

@@ -1,4 +1,6 @@
import Foundation
import FlatBuffers
import FlatSerialization
public enum TelegramPeerAccessHash: Hashable {
case personal(Int64)
@@ -12,4 +14,44 @@ public enum TelegramPeerAccessHash: Hashable {
return genericPublic
}
}
public init(flatBuffersObject: TelegramCore_TelegramPeerAccessHash) throws {
switch flatBuffersObject.valueType {
case .telegrampeeraccesshashPersonal:
guard let personal = flatBuffersObject.value(type: TelegramCore_TelegramPeerAccessHash_Personal.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .personal(personal.accessHash)
case .telegrampeeraccesshashGenericpublic:
guard let genericPublic = flatBuffersObject.value(type: TelegramCore_TelegramPeerAccessHash_GenericPublic.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .genericPublic(genericPublic.accessHash)
case .none_:
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
}
public func encodeToFlatBuffers(builder: inout FlatBufferBuilder) -> Offset {
let valueType: TelegramCore_TelegramPeerAccessHash_Value
let valueOffset: Offset
switch self {
case let .personal(accessHash):
valueType = .telegrampeeraccesshashPersonal
let start = TelegramCore_TelegramPeerAccessHash_Personal.startTelegramPeerAccessHash_Personal(&builder)
TelegramCore_TelegramPeerAccessHash_Personal.add(accessHash: accessHash, &builder)
valueOffset = TelegramCore_TelegramPeerAccessHash_Personal.endTelegramPeerAccessHash_Personal(&builder, start: start)
case let .genericPublic(accessHash):
valueType = .telegrampeeraccesshashGenericpublic
let start = TelegramCore_TelegramPeerAccessHash_GenericPublic.startTelegramPeerAccessHash_GenericPublic(&builder)
TelegramCore_TelegramPeerAccessHash_GenericPublic.add(accessHash: accessHash, &builder)
valueOffset = TelegramCore_TelegramPeerAccessHash_GenericPublic.endTelegramPeerAccessHash_GenericPublic(&builder, start: start)
}
let start = TelegramCore_TelegramPeerAccessHash.startTelegramPeerAccessHash(&builder)
TelegramCore_TelegramPeerAccessHash.add(valueType: valueType, &builder)
TelegramCore_TelegramPeerAccessHash.add(value: valueOffset, &builder)
return TelegramCore_TelegramPeerAccessHash.endTelegramPeerAccessHash(&builder, start: start)
}
}

View File

@@ -1,4 +1,6 @@
import Postbox
import FlatBuffers
import FlatSerialization
public final class RestrictionRule: PostboxCoding, Equatable {
public let platform: String
@@ -41,6 +43,24 @@ public final class RestrictionRule: PostboxCoding, Equatable {
}
return true
}
public init(flatBuffersObject: TelegramCore_RestrictionRule) throws {
self.platform = flatBuffersObject.platform
self.reason = flatBuffersObject.reason
self.text = flatBuffersObject.text
}
public func encodeToFlatBuffers(builder: inout FlatBufferBuilder) -> Offset {
let platformOffset = builder.create(string: self.platform)
let reasonOffset = builder.create(string: self.reason)
let textOffset = builder.create(string: self.text)
let start = TelegramCore_RestrictionRule.startRestrictionRule(&builder)
TelegramCore_RestrictionRule.add(platform: platformOffset, &builder)
TelegramCore_RestrictionRule.add(reason: reasonOffset, &builder)
TelegramCore_RestrictionRule.add(text: textOffset, &builder)
return TelegramCore_RestrictionRule.endRestrictionRule(&builder, start: start)
}
}
public final class PeerAccessRestrictionInfo: PostboxCoding, Equatable {
@@ -65,4 +85,17 @@ public final class PeerAccessRestrictionInfo: PostboxCoding, Equatable {
public static func ==(lhs: PeerAccessRestrictionInfo, rhs: PeerAccessRestrictionInfo) -> Bool {
return lhs.rules == rhs.rules
}
public init(flatBuffersObject: TelegramCore_PeerAccessRestrictionInfo) throws {
self.rules = try (0 ..< flatBuffersObject.rulesCount).map { try RestrictionRule(flatBuffersObject: flatBuffersObject.rules(at: $0)!) }
}
public func encodeToFlatBuffers(builder: inout FlatBufferBuilder) -> Offset {
let rulesOffsets = self.rules.map { $0.encodeToFlatBuffers(builder: &builder) }
let rulesOffset = builder.createVector(ofOffsets: rulesOffsets, len: rulesOffsets.count)
let start = TelegramCore_PeerAccessRestrictionInfo.startPeerAccessRestrictionInfo(&builder)
TelegramCore_PeerAccessRestrictionInfo.addVectorOf(rules: rulesOffset, &builder)
return TelegramCore_PeerAccessRestrictionInfo.endPeerAccessRestrictionInfo(&builder, start: start)
}
}

View File

@@ -80,21 +80,21 @@ public enum PeerReference: PostboxCoding, Hashable, Equatable {
switch flatBuffersObject.valueType {
case .peerreferenceUser:
guard let value = flatBuffersObject.value(type: TelegramCore_PeerReference_User.self) else {
throw FlatBuffersError.missingRequiredField
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .user(id: value.id, accessHash: value.accessHash)
case .peerreferenceGroup:
guard let value = flatBuffersObject.value(type: TelegramCore_PeerReference_Group.self) else {
throw FlatBuffersError.missingRequiredField
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .group(id: value.id)
case .peerreferenceChannel:
guard let value = flatBuffersObject.value(type: TelegramCore_PeerReference_Channel.self) else {
throw FlatBuffersError.missingRequiredField
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .channel(id: value.id, accessHash: value.accessHash)
case .none_:
throw FlatBuffersError.missingRequiredField
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
}

View File

@@ -42,7 +42,7 @@ public final class RecentMediaItem: Codable, Equatable {
if let serializedFileData = try container.decodeIfPresent(Data.self, forKey: "md") {
self.serializedFile = serializedFileData
var byteBuffer = ByteBuffer(data: serializedFileData)
self.media = TelegramMediaFile.Accessor(getRoot(byteBuffer: &byteBuffer) as TelegramCore_TelegramMediaFile, serializedFileData)
self.media = TelegramMediaFile.Accessor(FlatBuffers_getRoot(byteBuffer: &byteBuffer) as TelegramCore_TelegramMediaFile, serializedFileData)
} else {
let mediaData = try container.decode(AdaptedPostboxDecoder.RawObjectData.self, forKey: "m")
let media = TelegramMediaFile(decoder: PostboxDecoder(buffer: MemoryBuffer(data: mediaData.data)))
@@ -282,7 +282,7 @@ public final class RecentReactionItem: Codable, Equatable {
if let mediaData = try container.decodeIfPresent(Data.self, forKey: "md") {
var byteBuffer = ByteBuffer(data: mediaData)
let file = TelegramMediaFile.Accessor(getRoot(byteBuffer: &byteBuffer) as TelegramCore_TelegramMediaFile, mediaData)
let file = TelegramMediaFile.Accessor(FlatBuffers_getRoot(byteBuffer: &byteBuffer) as TelegramCore_TelegramMediaFile, mediaData)
self.content = .custom(file)
} else if let mediaData = try container.decodeIfPresent(AdaptedPostboxDecoder.RawObjectData.self, forKey: "m") {
self.content = .custom(TelegramMediaFile.Accessor(TelegramMediaFile(decoder: PostboxDecoder(buffer: MemoryBuffer(data: mediaData.data)))))

View File

@@ -1,4 +1,6 @@
import Postbox
import FlatBuffers
import FlatSerialization
private enum RichTextTypes: Int32 {
case empty = 0
@@ -292,3 +294,208 @@ public extension RichText {
}
}
}
extension RichText {
public init(flatBuffersObject: TelegramCore_RichText) throws {
switch flatBuffersObject.valueType {
case .richtextEmpty:
self = .empty
case .richtextPlain:
guard let value = flatBuffersObject.value(type: TelegramCore_RichText_Plain.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .plain(value.text)
case .richtextBold:
guard let value = flatBuffersObject.value(type: TelegramCore_RichText_Bold.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .bold(try RichText(flatBuffersObject: value.text))
case .richtextItalic:
guard let value = flatBuffersObject.value(type: TelegramCore_RichText_Italic.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .italic(try RichText(flatBuffersObject: value.text))
case .richtextUnderline:
guard let value = flatBuffersObject.value(type: TelegramCore_RichText_Underline.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .underline(try RichText(flatBuffersObject: value.text))
case .richtextStrikethrough:
guard let value = flatBuffersObject.value(type: TelegramCore_RichText_Strikethrough.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .strikethrough(try RichText(flatBuffersObject: value.text))
case .richtextFixed:
guard let value = flatBuffersObject.value(type: TelegramCore_RichText_Fixed.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .fixed(try RichText(flatBuffersObject: value.text))
case .richtextUrl:
guard let value = flatBuffersObject.value(type: TelegramCore_RichText_Url.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .url(text: try RichText(flatBuffersObject: value.text), url: value.url, webpageId: value.webpageId.flatMap { MediaId($0) })
case .richtextEmail:
guard let value = flatBuffersObject.value(type: TelegramCore_RichText_Email.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .email(text: try RichText(flatBuffersObject: value.text),
email: value.email)
case .richtextConcat:
guard let value = flatBuffersObject.value(type: TelegramCore_RichText_Concat.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .concat(try (0..<value.textsCount).map { try RichText(flatBuffersObject: value.texts(at: $0)!) })
case .richtextSubscript:
guard let value = flatBuffersObject.value(type: TelegramCore_RichText_Subscript.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .subscript(try RichText(flatBuffersObject: value.text))
case .richtextSuperscript:
guard let value = flatBuffersObject.value(type: TelegramCore_RichText_Superscript.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .superscript(try RichText(flatBuffersObject: value.text))
case .richtextMarked:
guard let value = flatBuffersObject.value(type: TelegramCore_RichText_Marked.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .marked(try RichText(flatBuffersObject: value.text))
case .richtextPhone:
guard let value = flatBuffersObject.value(type: TelegramCore_RichText_Phone.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .phone(text: try RichText(flatBuffersObject: value.text),
phone: value.phone)
case .richtextImage:
guard let value = flatBuffersObject.value(type: TelegramCore_RichText_Image.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .image(id: MediaId(value.id), dimensions: PixelDimensions(value.dimensions))
case .richtextAnchor:
guard let value = flatBuffersObject.value(type: TelegramCore_RichText_Anchor.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .anchor(text: try RichText(flatBuffersObject: value.text),
name: value.name)
case .none_:
self = .empty
}
}
public func encodeToFlatBuffers(builder: inout FlatBufferBuilder) -> Offset {
let valueType: TelegramCore_RichText_Value
let offset: Offset
switch self {
case .empty:
valueType = .richtextEmpty
let start = TelegramCore_RichText_Empty.startRichText_Empty(&builder)
offset = TelegramCore_RichText_Empty.endRichText_Empty(&builder, start: start)
case let .plain(text):
valueType = .richtextPlain
let textOffset = builder.create(string: text)
let start = TelegramCore_RichText_Plain.startRichText_Plain(&builder)
TelegramCore_RichText_Plain.add(text: textOffset, &builder)
offset = TelegramCore_RichText_Plain.endRichText_Plain(&builder, start: start)
case let .bold(text):
valueType = .richtextBold
let textOffset = text.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_RichText_Bold.startRichText_Bold(&builder)
TelegramCore_RichText_Bold.add(text: textOffset, &builder)
offset = TelegramCore_RichText_Bold.endRichText_Bold(&builder, start: start)
case let .italic(text):
valueType = .richtextItalic
let textOffset = text.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_RichText_Italic.startRichText_Italic(&builder)
TelegramCore_RichText_Italic.add(text: textOffset, &builder)
offset = TelegramCore_RichText_Italic.endRichText_Italic(&builder, start: start)
case let .underline(text):
valueType = .richtextUnderline
let textOffset = text.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_RichText_Underline.startRichText_Underline(&builder)
TelegramCore_RichText_Underline.add(text: textOffset, &builder)
offset = TelegramCore_RichText_Underline.endRichText_Underline(&builder, start: start)
case let .strikethrough(text):
valueType = .richtextStrikethrough
let textOffset = text.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_RichText_Strikethrough.startRichText_Strikethrough(&builder)
TelegramCore_RichText_Strikethrough.add(text: textOffset, &builder)
offset = TelegramCore_RichText_Strikethrough.endRichText_Strikethrough(&builder, start: start)
case let .fixed(text):
valueType = .richtextFixed
let textOffset = text.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_RichText_Fixed.startRichText_Fixed(&builder)
TelegramCore_RichText_Fixed.add(text: textOffset, &builder)
offset = TelegramCore_RichText_Fixed.endRichText_Fixed(&builder, start: start)
case let .url(text, url, webpageId):
valueType = .richtextUrl
let textOffset = text.encodeToFlatBuffers(builder: &builder)
let urlOffset = builder.create(string: url)
let start = TelegramCore_RichText_Url.startRichText_Url(&builder)
TelegramCore_RichText_Url.add(text: textOffset, &builder)
TelegramCore_RichText_Url.add(url: urlOffset, &builder)
if let webpageId {
TelegramCore_RichText_Url.add(webpageId: webpageId.asFlatBuffersObject(), &builder)
}
offset = TelegramCore_RichText_Url.endRichText_Url(&builder, start: start)
case let .email(text, email):
valueType = .richtextEmail
let textOffset = text.encodeToFlatBuffers(builder: &builder)
let emailOffset = builder.create(string: email)
let start = TelegramCore_RichText_Email.startRichText_Email(&builder)
TelegramCore_RichText_Email.add(text: textOffset, &builder)
TelegramCore_RichText_Email.add(email: emailOffset, &builder)
offset = TelegramCore_RichText_Email.endRichText_Email(&builder, start: start)
case let .concat(texts):
valueType = .richtextConcat
let textsOffsets = texts.map { $0.encodeToFlatBuffers(builder: &builder) }
let textsOffset = builder.createVector(ofOffsets: textsOffsets, len: textsOffsets.count)
let start = TelegramCore_RichText_Concat.startRichText_Concat(&builder)
TelegramCore_RichText_Concat.addVectorOf(texts: textsOffset, &builder)
offset = TelegramCore_RichText_Concat.endRichText_Concat(&builder, start: start)
case let .subscript(text):
valueType = .richtextSubscript
let textOffset = text.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_RichText_Subscript.startRichText_Subscript(&builder)
TelegramCore_RichText_Subscript.add(text: textOffset, &builder)
offset = TelegramCore_RichText_Subscript.endRichText_Subscript(&builder, start: start)
case let .superscript(text):
valueType = .richtextSuperscript
let textOffset = text.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_RichText_Superscript.startRichText_Superscript(&builder)
TelegramCore_RichText_Superscript.add(text: textOffset, &builder)
offset = TelegramCore_RichText_Superscript.endRichText_Superscript(&builder, start: start)
case let .marked(text):
valueType = .richtextMarked
let textOffset = text.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_RichText_Marked.startRichText_Marked(&builder)
TelegramCore_RichText_Marked.add(text: textOffset, &builder)
offset = TelegramCore_RichText_Marked.endRichText_Marked(&builder, start: start)
case let .phone(text, phone):
valueType = .richtextPhone
let textOffset = text.encodeToFlatBuffers(builder: &builder)
let phoneOffset = builder.create(string: phone)
let start = TelegramCore_RichText_Phone.startRichText_Phone(&builder)
TelegramCore_RichText_Phone.add(text: textOffset, &builder)
TelegramCore_RichText_Phone.add(phone: phoneOffset, &builder)
offset = TelegramCore_RichText_Phone.endRichText_Phone(&builder, start: start)
case let .image(id, dimensions):
valueType = .richtextImage
let start = TelegramCore_RichText_Image.startRichText_Image(&builder)
TelegramCore_RichText_Image.add(id: id.asFlatBuffersObject(), &builder)
TelegramCore_RichText_Image.add(dimensions: dimensions.asFlatBuffersObject(), &builder)
offset = TelegramCore_RichText_Image.endRichText_Image(&builder, start: start)
case let .anchor(text, name):
valueType = .richtextAnchor
let textOffset = text.encodeToFlatBuffers(builder: &builder)
let nameOffset = builder.create(string: name)
let start = TelegramCore_RichText_Anchor.startRichText_Anchor(&builder)
TelegramCore_RichText_Anchor.add(text: textOffset, &builder)
TelegramCore_RichText_Anchor.add(name: nameOffset, &builder)
offset = TelegramCore_RichText_Anchor.endRichText_Anchor(&builder, start: start)
}
return TelegramCore_RichText.createRichText(&builder, valueType: valueType, valueOffset: offset)
}
}

View File

@@ -17,7 +17,7 @@ public final class SavedStickerItem: Codable, Equatable {
if let serializedFileData = try container.decodeIfPresent(Data.self, forKey: "fd") {
var byteBuffer = ByteBuffer(data: serializedFileData)
self.file = TelegramMediaFile.Accessor(getRoot(byteBuffer: &byteBuffer) as TelegramCore_TelegramMediaFile, serializedFileData)
self.file = TelegramMediaFile.Accessor(FlatBuffers_getRoot(byteBuffer: &byteBuffer) as TelegramCore_TelegramMediaFile, serializedFileData)
} else {
let file = TelegramMediaFile(decoder: PostboxDecoder(buffer: MemoryBuffer(data: (try container.decode(AdaptedPostboxDecoder.RawObjectData.self, forKey: "f")).data)))
self.file = TelegramMediaFile.Accessor(file)

View File

@@ -18,7 +18,7 @@ public final class StickerPackItem: ItemCollectionItem, Equatable {
self.index = index
var byteBuffer = ByteBuffer(data: serializedFile)
let accessor = getRoot(byteBuffer: &byteBuffer) as TelegramCore_TelegramMediaFile
let accessor = FlatBuffers_getRoot(byteBuffer: &byteBuffer) as TelegramCore_TelegramMediaFile
self.file = TelegramMediaFile.Accessor(accessor, serializedFile)
self.indexKeys = indexKeys
@@ -29,7 +29,7 @@ public final class StickerPackItem: ItemCollectionItem, Equatable {
if let serializedFileData = decoder.decodeDataForKey("fd") {
var byteBuffer = ByteBuffer(data: serializedFileData)
self.file = TelegramMediaFile.Accessor(getRoot(byteBuffer: &byteBuffer) as TelegramCore_TelegramMediaFile, serializedFileData)
self.file = TelegramMediaFile.Accessor(FlatBuffers_getRoot(byteBuffer: &byteBuffer) as TelegramCore_TelegramMediaFile, serializedFileData)
} else {
let file = decoder.decodeObjectForKey("f") as! TelegramMediaFile
self.file = TelegramMediaFile.Accessor(file)

View File

@@ -1,31 +1,22 @@
import Postbox
import FlatBuffers
import FlatSerialization
public enum TelegramChannelParticipationStatus {
case member
case left
case kicked
public enum TelegramChannelParticipationStatus: Int32 {
case member = 0
case left = 1
case kicked = 2
fileprivate var rawValue: Int32 {
switch self {
case .member:
return 0
case .left:
return 1
case .kicked:
return 2
}
}
fileprivate init(rawValue: Int32) {
public init(rawValue: Int32) {
switch rawValue {
case 0:
self = .member
case 1:
self = .left
case 2:
self = .kicked
default:
self = .left
case 0:
self = .member
case 1:
self = .left
case 2:
self = .kicked
default:
self = .left
}
}
}
@@ -48,6 +39,7 @@ public struct TelegramChannelBroadcastFlags: OptionSet {
public struct TelegramChannelBroadcastInfo: Equatable {
public let flags: TelegramChannelBroadcastFlags
public init(flags: TelegramChannelBroadcastFlags) {
self.flags = flags
}
@@ -124,6 +116,46 @@ public enum TelegramChannelInfo: Equatable {
return .group(TelegramChannelGroupInfo(flags: TelegramChannelGroupFlags(rawValue: decoder.decodeInt32ForKey("i.f", orElse: 0))))
}
}
public init(flatBuffersObject: TelegramCore_TelegramChannelInfo) throws {
switch flatBuffersObject.valueType {
case .telegramchannelinfoBroadcast:
guard let value = flatBuffersObject.value(type: TelegramCore_TelegramChannelInfo_Broadcast.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .broadcast(TelegramChannelBroadcastInfo(flags: TelegramChannelBroadcastFlags(rawValue: value.flags)))
case .telegramchannelinfoGroup:
guard let value = flatBuffersObject.value(type: TelegramCore_TelegramChannelInfo_Group.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .group(TelegramChannelGroupInfo(flags: TelegramChannelGroupFlags(rawValue: value.flags)))
case .none_:
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
}
public func encodeToFlatBuffers(builder: inout FlatBufferBuilder) -> Offset {
let valueType: TelegramCore_TelegramChannelInfo_Value
let valueOffset: Offset
switch self {
case let .broadcast(info):
valueType = .telegramchannelinfoBroadcast
let start = TelegramCore_TelegramChannelInfo_Broadcast.startTelegramChannelInfo_Broadcast(&builder)
TelegramCore_TelegramChannelInfo_Broadcast.add(flags: info.flags.rawValue, &builder)
valueOffset = TelegramCore_TelegramChannelInfo_Broadcast.endTelegramChannelInfo_Broadcast(&builder, start: start)
case let .group(info):
valueType = .telegramchannelinfoGroup
let start = TelegramCore_TelegramChannelInfo_Group.startTelegramChannelInfo_Group(&builder)
TelegramCore_TelegramChannelInfo_Group.add(flags: info.flags.rawValue, &builder)
valueOffset = TelegramCore_TelegramChannelInfo_Group.endTelegramChannelInfo_Group(&builder, start: start)
}
let start = TelegramCore_TelegramChannelInfo.startTelegramChannelInfo(&builder)
TelegramCore_TelegramChannelInfo.add(valueType: valueType, &builder)
TelegramCore_TelegramChannelInfo.add(value: valueOffset, &builder)
return TelegramCore_TelegramChannelInfo.endTelegramChannelInfo(&builder, start: start)
}
}
public struct TelegramChannelFlags: OptionSet {
@@ -314,6 +346,17 @@ public final class TelegramChannel: Peer, Equatable {
self.subscriptionUntilDate = decoder.decodeOptionalInt32ForKey("sud")
self.verificationIconFileId = decoder.decodeOptionalInt64ForKey("vfid")
self.sendPaidMessageStars = decoder.decodeCodable(StarsAmount.self, forKey: "sendPaidMessageStars")
#if DEBUG
var builder = FlatBufferBuilder(initialSize: 1024)
let offset = self.encodeToFlatBuffers(builder: &builder)
builder.finish(offset: offset)
let serializedData = builder.data
var byteBuffer = ByteBuffer(data: serializedData)
let deserializedValue = FlatBuffers_getRoot(byteBuffer: &byteBuffer) as TelegramCore_TelegramChannel
let parsedValue = try! TelegramChannel(flatBuffersObject: deserializedValue)
assert(self == parsedValue)
#endif
}
public func encode(_ encoder: PostboxEncoder) {
@@ -544,4 +587,116 @@ public final class TelegramChannel: Peer, Equatable {
public func withUpdatedVerificationIconFileId(_ verificationIconFileId: Int64?) -> TelegramChannel {
return TelegramChannel(id: self.id, accessHash: self.accessHash, title: self.title, username: self.username, photo: self.photo, creationDate: self.creationDate, version: self.version, participationStatus: self.participationStatus, info: self.info, flags: self.flags, restrictionInfo: self.restrictionInfo, adminRights: self.adminRights, bannedRights: self.bannedRights, defaultBannedRights: self.defaultBannedRights, usernames: self.usernames, storiesHidden: self.storiesHidden, nameColor: self.nameColor, backgroundEmojiId: self.backgroundEmojiId, profileColor: self.profileColor, profileBackgroundEmojiId: self.profileBackgroundEmojiId, emojiStatus: self.emojiStatus, approximateBoostLevel: self.approximateBoostLevel, subscriptionUntilDate: self.subscriptionUntilDate, verificationIconFileId: verificationIconFileId, sendPaidMessageStars: self.sendPaidMessageStars)
}
public init(flatBuffersObject: TelegramCore_TelegramChannel) throws {
self.id = PeerId(flatBuffersObject.id)
self.accessHash = try flatBuffersObject.accessHash.flatMap(TelegramPeerAccessHash.init)
self.title = flatBuffersObject.title
self.username = flatBuffersObject.username
self.photo = try (0 ..< flatBuffersObject.photoCount).map { try TelegramMediaImageRepresentation(flatBuffersObject: flatBuffersObject.photo(at: $0)!) }
self.creationDate = flatBuffersObject.creationDate
self.version = flatBuffersObject.version
self.participationStatus = TelegramChannelParticipationStatus(rawValue: flatBuffersObject.participationStatus)
guard let infoObj = flatBuffersObject.info else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self.info = try TelegramChannelInfo(flatBuffersObject: infoObj)
self.flags = TelegramChannelFlags(rawValue: flatBuffersObject.flags)
self.restrictionInfo = try flatBuffersObject.restrictionInfo.flatMap { try PeerAccessRestrictionInfo(flatBuffersObject: $0) }
self.adminRights = try flatBuffersObject.adminRights.flatMap { try TelegramChatAdminRights(flatBuffersObject: $0) }
self.bannedRights = try flatBuffersObject.bannedRights.flatMap { try TelegramChatBannedRights(flatBuffersObject: $0) }
self.defaultBannedRights = try flatBuffersObject.defaultBannedRights.map { try TelegramChatBannedRights(flatBuffersObject: $0) }
self.usernames = try (0 ..< flatBuffersObject.usernamesCount).map { try TelegramPeerUsername(flatBuffersObject: flatBuffersObject.usernames(at: $0)!) }
self.storiesHidden = flatBuffersObject.storiesHidden?.value
self.nameColor = try flatBuffersObject.nameColor.flatMap(PeerNameColor.init(flatBuffersObject:))
self.backgroundEmojiId = flatBuffersObject.backgroundEmojiId == Int64.min ? nil : flatBuffersObject.backgroundEmojiId
self.profileColor = try flatBuffersObject.profileColor.flatMap(PeerNameColor.init)
self.profileBackgroundEmojiId = flatBuffersObject.profileBackgroundEmojiId == Int64.min ? nil : flatBuffersObject.profileBackgroundEmojiId
self.emojiStatus = try flatBuffersObject.emojiStatus.flatMap { try PeerEmojiStatus(flatBuffersObject: $0) }
self.approximateBoostLevel = flatBuffersObject.approximateBoostLevel == Int32.min ? nil : flatBuffersObject.approximateBoostLevel
self.subscriptionUntilDate = flatBuffersObject.subscriptionUntilDate == Int32.min ? nil : flatBuffersObject.subscriptionUntilDate
self.verificationIconFileId = flatBuffersObject.verificationIconFileId == Int64.min ? nil : flatBuffersObject.verificationIconFileId
self.sendPaidMessageStars = try flatBuffersObject.sendPaidMessageStars.flatMap { try StarsAmount(flatBuffersObject: $0) }
}
public func encodeToFlatBuffers(builder: inout FlatBufferBuilder) -> Offset {
let accessHashOffset = self.accessHash.flatMap { $0.encodeToFlatBuffers(builder: &builder) }
let photoOffsets = self.photo.map { $0.encodeToFlatBuffers(builder: &builder) }
let photoOffset = builder.createVector(ofOffsets: photoOffsets, len: photoOffsets.count)
let usernamesOffsets = self.usernames.map { $0.encodeToFlatBuffers(builder: &builder) }
let usernamesOffset = builder.createVector(ofOffsets: usernamesOffsets, len: usernamesOffsets.count)
let titleOffset = builder.create(string: self.title)
let usernameOffset = self.username.map { builder.create(string: $0) }
let nameColorOffset = self.nameColor.flatMap { $0.encodeToFlatBuffers(builder: &builder) }
let profileColorOffset = self.profileColor.flatMap { $0.encodeToFlatBuffers(builder: &builder) }
let infoOffset = self.info.encodeToFlatBuffers(builder: &builder)
let restrictionInfoOffset = self.restrictionInfo?.encodeToFlatBuffers(builder: &builder)
let adminRightsOffset = self.adminRights?.encodeToFlatBuffers(builder: &builder)
let bannedRightsOffset = self.bannedRights?.encodeToFlatBuffers(builder: &builder)
let defaultBannedRightsOffset = self.defaultBannedRights?.encodeToFlatBuffers(builder: &builder)
let emojiStatusOffset = self.emojiStatus?.encodeToFlatBuffers(builder: &builder)
let sendPaidMessageStarsOffset = self.sendPaidMessageStars?.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_TelegramChannel.startTelegramChannel(&builder)
TelegramCore_TelegramChannel.add(id: self.id.asFlatBuffersObject(), &builder)
if let accessHashOffset {
TelegramCore_TelegramChannel.add(accessHash: accessHashOffset, &builder)
}
TelegramCore_TelegramChannel.add(title: titleOffset, &builder)
if let usernameOffset {
TelegramCore_TelegramChannel.add(username: usernameOffset, &builder)
}
TelegramCore_TelegramChannel.addVectorOf(photo: photoOffset, &builder)
TelegramCore_TelegramChannel.add(creationDate: self.creationDate, &builder)
TelegramCore_TelegramChannel.add(version: self.version, &builder)
TelegramCore_TelegramChannel.add(participationStatus: self.participationStatus.rawValue, &builder)
TelegramCore_TelegramChannel.add(info: infoOffset, &builder)
TelegramCore_TelegramChannel.add(flags: self.flags.rawValue, &builder)
if let restrictionInfoOffset {
TelegramCore_TelegramChannel.add(restrictionInfo: restrictionInfoOffset, &builder)
}
if let adminRightsOffset {
TelegramCore_TelegramChannel.add(adminRights: adminRightsOffset, &builder)
}
if let bannedRightsOffset {
TelegramCore_TelegramChannel.add(bannedRights: bannedRightsOffset, &builder)
}
if let defaultBannedRightsOffset {
TelegramCore_TelegramChannel.add(defaultBannedRights: defaultBannedRightsOffset, &builder)
}
TelegramCore_TelegramChannel.addVectorOf(usernames: usernamesOffset, &builder)
if let storiesHidden = self.storiesHidden {
TelegramCore_TelegramChannel.add(storiesHidden: TelegramCore_OptionalBool(value: storiesHidden), &builder)
}
if let nameColorOffset {
TelegramCore_TelegramChannel.add(nameColor: nameColorOffset, &builder)
}
TelegramCore_TelegramChannel.add(backgroundEmojiId: self.backgroundEmojiId ?? Int64.min, &builder)
if let profileColorOffset {
TelegramCore_TelegramChannel.add(profileColor: profileColorOffset, &builder)
}
TelegramCore_TelegramChannel.add(profileBackgroundEmojiId: self.profileBackgroundEmojiId ?? Int64.min, &builder)
if let emojiStatusOffset {
TelegramCore_TelegramChannel.add(emojiStatus: emojiStatusOffset, &builder)
}
TelegramCore_TelegramChannel.add(approximateBoostLevel: self.approximateBoostLevel ?? Int32.min, &builder)
TelegramCore_TelegramChannel.add(subscriptionUntilDate: self.subscriptionUntilDate ?? Int32.min, &builder)
TelegramCore_TelegramChannel.add(verificationIconFileId: self.verificationIconFileId ?? Int64.min, &builder)
if let sendPaidMessageStarsOffset {
TelegramCore_TelegramChannel.add(sendPaidMessageStars: sendPaidMessageStarsOffset, &builder)
}
return TelegramCore_TelegramChannel.endTelegramChannel(&builder, start: start)
}
}

View File

@@ -1,4 +1,6 @@
import Postbox
import FlatBuffers
import FlatSerialization
public struct TelegramChatAdminRightsFlags: OptionSet, Hashable {
public var rawValue: Int32
@@ -124,4 +126,14 @@ public struct TelegramChatAdminRights: PostboxCoding, Codable, Equatable {
public static func ==(lhs: TelegramChatAdminRights, rhs: TelegramChatAdminRights) -> Bool {
return lhs.rights == rhs.rights
}
public init(flatBuffersObject: TelegramCore_TelegramChatAdminRights) throws {
self.rights = TelegramChatAdminRightsFlags(rawValue: flatBuffersObject.rights)
}
public func encodeToFlatBuffers(builder: inout FlatBufferBuilder) -> Offset {
let start = TelegramCore_TelegramChatAdminRights.startTelegramChatAdminRights(&builder)
TelegramCore_TelegramChatAdminRights.add(rights: self.rights.rawValue, &builder)
return TelegramCore_TelegramChatAdminRights.endTelegramChatAdminRights(&builder, start: start)
}
}

View File

@@ -1,4 +1,6 @@
import Postbox
import FlatBuffers
import FlatSerialization
public struct TelegramChatBannedRightsFlags: OptionSet, Hashable {
public var rawValue: Int32
@@ -54,4 +56,16 @@ public struct TelegramChatBannedRights: PostboxCoding, Equatable {
public static func ==(lhs: TelegramChatBannedRights, rhs: TelegramChatBannedRights) -> Bool {
return lhs.flags == rhs.flags && lhs.untilDate == rhs.untilDate
}
public init(flatBuffersObject: TelegramCore_TelegramChatBannedRights) throws {
self.flags = TelegramChatBannedRightsFlags(rawValue: flatBuffersObject.flags)
self.untilDate = flatBuffersObject.untilDate
}
public func encodeToFlatBuffers(builder: inout FlatBufferBuilder) -> Offset {
let start = TelegramCore_TelegramChatBannedRights.startTelegramChatBannedRights(&builder)
TelegramCore_TelegramChatBannedRights.add(flags: self.flags.rawValue, &builder)
TelegramCore_TelegramChatBannedRights.add(untilDate: self.untilDate, &builder)
return TelegramCore_TelegramChatBannedRights.endTelegramChatBannedRights(&builder, start: start)
}
}

View File

@@ -1,4 +1,6 @@
import Postbox
import FlatBuffers
import FlatSerialization
public enum TelegramGroupRole: Equatable, PostboxCoding {
case creator(rank: String?)
@@ -40,6 +42,61 @@ public enum TelegramGroupRole: Equatable, PostboxCoding {
encoder.encodeInt32(2, forKey: "_v")
}
}
public init(flatBuffersObject: TelegramCore_TelegramGroupRole) throws {
switch flatBuffersObject.valueType {
case .telegramgrouproleCreator:
guard let creator = flatBuffersObject.value(type: TelegramCore_TelegramGroupRole_Creator.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .creator(rank: creator.rank)
case .telegramgrouproleAdmin:
guard let admin = flatBuffersObject.value(type: TelegramCore_TelegramGroupRole_Admin.self) else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .admin(try TelegramChatAdminRights(flatBuffersObject: admin.rights), rank: admin.rank)
case .telegramgrouproleMember:
self = .member
case .none_:
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
}
public func encodeToFlatBuffers(builder: inout FlatBufferBuilder) -> Offset {
let valueOffset: Offset
let valueType: TelegramCore_TelegramGroupRole_Value
switch self {
case let .creator(rank):
let rankOffset = rank.map { builder.create(string: $0) }
let start = TelegramCore_TelegramGroupRole_Creator.startTelegramGroupRole_Creator(&builder)
if let rankOffset {
TelegramCore_TelegramGroupRole_Creator.add(rank: rankOffset, &builder)
}
valueOffset = TelegramCore_TelegramGroupRole_Creator.endTelegramGroupRole_Creator(&builder, start: start)
valueType = .telegramgrouproleCreator
case let .admin(rights, rank):
let rankOffset = rank.map { builder.create(string: $0) }
let rightsOffset = rights.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_TelegramGroupRole_Admin.startTelegramGroupRole_Admin(&builder)
TelegramCore_TelegramGroupRole_Admin.add(rights: rightsOffset, &builder)
if let rankOffset {
TelegramCore_TelegramGroupRole_Admin.add(rank: rankOffset, &builder)
}
valueOffset = TelegramCore_TelegramGroupRole_Admin.endTelegramGroupRole_Admin(&builder, start: start)
valueType = .telegramgrouproleAdmin
case .member:
let start = TelegramCore_TelegramGroupRole_Member.startTelegramGroupRole_Member(&builder)
valueOffset = TelegramCore_TelegramGroupRole_Member.endTelegramGroupRole_Member(&builder, start: start)
valueType = .telegramgrouproleMember
}
let start = TelegramCore_TelegramGroupRole.startTelegramGroupRole(&builder)
TelegramCore_TelegramGroupRole.add(value: valueOffset, &builder)
TelegramCore_TelegramGroupRole.add(valueType: valueType, &builder)
return TelegramCore_TelegramGroupRole.endTelegramGroupRole(&builder, start: start)
}
}
public enum TelegramGroupMembership: Int32 {
@@ -73,6 +130,18 @@ public struct TelegramGroupToChannelMigrationReference: Equatable {
self.peerId = peerId
self.accessHash = accessHash
}
public init(flatBuffersObject: TelegramCore_TelegramGroupToChannelMigrationReference) throws {
self.peerId = PeerId(flatBuffersObject.peerId)
self.accessHash = flatBuffersObject.accessHash
}
public func encodeToFlatBuffers(builder: inout FlatBufferBuilder) -> Offset {
let start = TelegramCore_TelegramGroupToChannelMigrationReference.startTelegramGroupToChannelMigrationReference(&builder)
TelegramCore_TelegramGroupToChannelMigrationReference.add(peerId: self.peerId.toInt64(), &builder)
TelegramCore_TelegramGroupToChannelMigrationReference.add(accessHash: self.accessHash, &builder)
return TelegramCore_TelegramGroupToChannelMigrationReference.endTelegramGroupToChannelMigrationReference(&builder, start: start)
}
}
public final class TelegramGroup: Peer, Equatable {
@@ -137,6 +206,17 @@ public final class TelegramGroup: Peer, Equatable {
}
self.creationDate = decoder.decodeInt32ForKey("d", orElse: 0)
self.version = Int(decoder.decodeInt32ForKey("v", orElse: 0))
#if DEBUG
var builder = FlatBufferBuilder(initialSize: 1024)
let offset = self.encodeToFlatBuffers(builder: &builder)
builder.finish(offset: offset)
let serializedData = builder.data
var byteBuffer = ByteBuffer(data: serializedData)
let deserializedValue = FlatBuffers_getRoot(byteBuffer: &byteBuffer) as TelegramCore_TelegramGroup
let parsedValue = try! TelegramGroup(flatBuffersObject: deserializedValue)
assert(self == parsedValue)
#endif
}
public func encode(_ encoder: PostboxEncoder) {
@@ -162,6 +242,65 @@ public final class TelegramGroup: Peer, Equatable {
encoder.encodeInt32(self.creationDate, forKey: "d")
encoder.encodeInt32(Int32(self.version), forKey: "v")
}
public init(flatBuffersObject: TelegramCore_TelegramGroup) throws {
self.id = PeerId(flatBuffersObject.id)
self.title = flatBuffersObject.title
self.photo = try (0 ..< flatBuffersObject.photoCount).map { try TelegramMediaImageRepresentation(flatBuffersObject: flatBuffersObject.photo(at: $0)!) }
self.participantCount = Int(flatBuffersObject.participantCount)
guard let role = flatBuffersObject.role else {
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self.role = try TelegramGroupRole(flatBuffersObject: role)
self.membership = TelegramGroupMembership(rawValue: flatBuffersObject.membership)!
self.flags = TelegramGroupFlags(rawValue: flatBuffersObject.flags)
self.defaultBannedRights = try flatBuffersObject.defaultBannedRights.flatMap { try TelegramChatBannedRights(flatBuffersObject: $0) }
if let migrationReference = flatBuffersObject.migrationReference {
self.migrationReference = try TelegramGroupToChannelMigrationReference(flatBuffersObject: migrationReference)
} else {
self.migrationReference = nil
}
self.creationDate = flatBuffersObject.creationDate
self.version = Int(flatBuffersObject.version)
}
public func encodeToFlatBuffers(builder: inout FlatBufferBuilder) -> Offset {
let titleOffset = builder.create(string: self.title)
let photoOffsets = self.photo.map { $0.encodeToFlatBuffers(builder: &builder) }
let photoOffset = builder.createVector(ofOffsets: photoOffsets, len: photoOffsets.count)
let roleOffset = self.role.encodeToFlatBuffers(builder: &builder)
let defaultBannedRightsOffset = self.defaultBannedRights?.encodeToFlatBuffers(builder: &builder)
let migrationReferenceOffset = self.migrationReference?.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_TelegramGroup.startTelegramGroup(&builder)
TelegramCore_TelegramGroup.add(id: self.id.asFlatBuffersObject(), &builder)
TelegramCore_TelegramGroup.add(title: titleOffset, &builder)
TelegramCore_TelegramGroup.addVectorOf(photo: photoOffset, &builder)
TelegramCore_TelegramGroup.add(participantCount: Int32(self.participantCount), &builder)
TelegramCore_TelegramGroup.add(role: roleOffset, &builder)
TelegramCore_TelegramGroup.add(membership: self.membership.rawValue, &builder)
TelegramCore_TelegramGroup.add(flags: self.flags.rawValue, &builder)
if let defaultBannedRightsOffset {
TelegramCore_TelegramGroup.add(defaultBannedRights: defaultBannedRightsOffset, &builder)
}
if let migrationReferenceOffset {
TelegramCore_TelegramGroup.add(migrationReference: migrationReferenceOffset, &builder)
}
TelegramCore_TelegramGroup.add(creationDate: self.creationDate, &builder)
TelegramCore_TelegramGroup.add(version: Int32(self.version), &builder)
return TelegramCore_TelegramGroup.endTelegramGroup(&builder, start: start)
}
public func isEqual(_ other: Peer) -> Bool {
if let other = other as? TelegramGroup {

View File

@@ -15,11 +15,6 @@ private let typeHintIsValidated: Int32 = 8
private let typeNoPremium: Int32 = 9
private let typeCustomEmoji: Int32 = 10
enum FlatBuffersError: Error {
case missingRequiredField
case invalidUnionType
}
public enum StickerPackReference: PostboxCoding, Hashable, Equatable, Codable {
case id(id: Int64, accessHash: Int64)
case name(String)
@@ -131,19 +126,19 @@ public enum StickerPackReference: PostboxCoding, Hashable, Equatable, Codable {
switch flatBuffersObject.valueType {
case .stickerpackreferenceId:
guard let value = flatBuffersObject.value(type: TelegramCore_StickerPackReference_Id.self) else {
throw FlatBuffersError.missingRequiredField
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .id(id: value.id, accessHash: value.accessHash)
case .stickerpackreferenceName:
guard let value = flatBuffersObject.value(type: TelegramCore_StickerPackReference_Name.self) else {
throw FlatBuffersError.missingRequiredField
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .name(value.name)
case .stickerpackreferenceAnimatedemoji:
self = .animatedEmoji
case .stickerpackreferenceDice:
guard let value = flatBuffersObject.value(type: TelegramCore_StickerPackReference_Dice.self) else {
throw FlatBuffersError.missingRequiredField
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .dice(value.emoji)
case .stickerpackreferenceAnimatedemojianimations:
@@ -159,7 +154,7 @@ public enum StickerPackReference: PostboxCoding, Hashable, Equatable, Codable {
case .stickerpackreferenceIconchannelstatusemoji:
self = .iconChannelStatusEmoji
case .none_:
throw FlatBuffersError.missingRequiredField
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
}
@@ -475,7 +470,7 @@ public enum TelegramMediaFileAttribute: PostboxCoding, Equatable {
init(flatBuffersData data: Data) throws {
var byteBuffer = ByteBuffer(data: data)
let flatBuffersObject: TelegramCore_TelegramMediaFileAttribute = getRoot(byteBuffer: &byteBuffer)
let flatBuffersObject: TelegramCore_TelegramMediaFileAttribute = FlatBuffers_getRoot(byteBuffer: &byteBuffer)
try self.init(flatBuffersObject: flatBuffersObject)
}
@@ -483,29 +478,29 @@ public enum TelegramMediaFileAttribute: PostboxCoding, Equatable {
switch flatBuffersObject.valueType {
case .telegrammediafileattributeFilename:
guard let value = flatBuffersObject.value(type: TelegramCore_TelegramMediaFileAttribute_FileName.self) else {
throw FlatBuffersError.missingRequiredField
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .FileName(fileName: value.fileName)
case .telegrammediafileattributeSticker:
guard let value = flatBuffersObject.value(type: TelegramCore_TelegramMediaFileAttribute_Sticker.self) else {
throw FlatBuffersError.missingRequiredField
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .Sticker(displayText: value.displayText, packReference: try value.packReference.flatMap({ try StickerPackReference(flatBuffersObject: $0) }), maskData: value.maskData.flatMap({ StickerMaskCoords(flatBuffersObject: $0) }))
case .telegrammediafileattributeImagesize:
guard let value = flatBuffersObject.value(type: TelegramCore_TelegramMediaFileAttribute_ImageSize.self) else {
throw FlatBuffersError.missingRequiredField
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .ImageSize(size: PixelDimensions(width: value.width, height: value.height))
case .telegrammediafileattributeAnimated:
self = .Animated
case .telegrammediafileattributeVideo:
guard let value = flatBuffersObject.value(type: TelegramCore_TelegramMediaFileAttribute_Video.self) else {
throw FlatBuffersError.missingRequiredField
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .Video(duration: Double(value.duration), size: PixelDimensions(width: value.width, height: value.height), flags: TelegramMediaVideoFlags(rawValue: value.flags), preloadSize: value.preloadSize == 0 ? nil : value.preloadSize, coverTime: value.coverTime == 0.0 ? nil : Double(value.coverTime), videoCodec: value.videoCodec)
case .telegrammediafileattributeAudio:
guard let value = flatBuffersObject.value(type: TelegramCore_TelegramMediaFileAttribute_Audio.self) else {
throw FlatBuffersError.missingRequiredField
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .Audio(isVoice: value.isVoice, duration: Int(value.duration), title: value.title, performer: value.performer, waveform: value.waveform.isEmpty ? nil : Data(value.waveform))
case .telegrammediafileattributeHaslinkedstickers:
@@ -517,10 +512,10 @@ public enum TelegramMediaFileAttribute: PostboxCoding, Equatable {
case .telegrammediafileattributeNopremium:
self = .NoPremium
case .none_:
throw FlatBuffersError.missingRequiredField
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
case .telegrammediafileattributeCustomemoji:
guard let value = flatBuffersObject.value(type: TelegramCore_TelegramMediaFileAttribute_CustomEmoji.self) else {
throw FlatBuffersError.missingRequiredField
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self = .CustomEmoji(isPremium: value.isPremium, isSingleColor: value.isSingleColor, alt: value.alt, packReference: try value.packReference.flatMap({ try StickerPackReference(flatBuffersObject: $0) }))
}

View File

@@ -219,16 +219,16 @@ public final class TelegramMediaImage: Media, Equatable, Codable {
switch flatBuffersObject.contentType {
case .emojimarkupContentEmoji:
guard let value = flatBuffersObject.content(type: TelegramCore_EmojiMarkup_Content_Emoji.self) else {
throw FlatBuffersError.missingRequiredField
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self.content = .emoji(fileId: value.fileId)
case .emojimarkupContentSticker:
guard let value = flatBuffersObject.content(type: TelegramCore_EmojiMarkup_Content_Sticker.self) else {
throw FlatBuffersError.missingRequiredField
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self.content = .sticker(packReference: try StickerPackReference(flatBuffersObject: value.packReference), fileId: value.fileId)
case .none_:
throw FlatBuffersError.missingRequiredField
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
}
self.backgroundColors = flatBuffersObject.backgroundColors

View File

@@ -1,4 +1,6 @@
import Postbox
import FlatBuffers
import FlatSerialization
public struct UserInfoFlags: OptionSet {
public var rawValue: Int32
@@ -64,6 +66,22 @@ public struct BotUserInfo: PostboxCoding, Equatable {
encoder.encodeNil(forKey: "ip")
}
}
public init(flatBuffersObject: TelegramCore_BotUserInfo) throws {
self.flags = BotUserInfoFlags(rawValue: flatBuffersObject.flags)
self.inlinePlaceholder = flatBuffersObject.inlinePlaceholder
}
public func encodeToFlatBuffers(builder: inout FlatBufferBuilder) -> Offset {
let inlinePlaceholderOffset = self.inlinePlaceholder.map { builder.create(string: $0) }
let start = TelegramCore_BotUserInfo.startBotUserInfo(&builder)
TelegramCore_BotUserInfo.add(flags: self.flags.rawValue, &builder)
if let inlinePlaceholderOffset {
TelegramCore_BotUserInfo.add(inlinePlaceholder: inlinePlaceholderOffset, &builder)
}
return TelegramCore_BotUserInfo.endBotUserInfo(&builder, start: start)
}
}
public struct TelegramPeerUsername: PostboxCoding, Equatable {
@@ -99,6 +117,20 @@ public struct TelegramPeerUsername: PostboxCoding, Equatable {
encoder.encodeInt32(self.flags.rawValue, forKey: "f")
encoder.encodeString(self.username, forKey: "un")
}
public init(flatBuffersObject: TelegramCore_TelegramPeerUsername) throws {
self.flags = Flags(rawValue: flatBuffersObject.flags)
self.username = flatBuffersObject.username
}
public func encodeToFlatBuffers(builder: inout FlatBufferBuilder) -> Offset {
let usernameOffset = builder.create(string: self.username)
let start = TelegramCore_TelegramPeerUsername.startTelegramPeerUsername(&builder)
TelegramCore_TelegramPeerUsername.add(flags: self.flags.rawValue, &builder)
TelegramCore_TelegramPeerUsername.add(username: usernameOffset, &builder)
return TelegramCore_TelegramPeerUsername.endTelegramPeerUsername(&builder, start: start)
}
}
public struct PeerVerification: Codable, Equatable {
@@ -298,6 +330,17 @@ public final class TelegramUser: Peer, Equatable {
self.profileBackgroundEmojiId = decoder.decodeOptionalInt64ForKey("pgem")
self.subscriberCount = decoder.decodeOptionalInt32ForKey("ssc")
self.verificationIconFileId = decoder.decodeOptionalInt64ForKey("vfid")
#if DEBUG
var builder = FlatBufferBuilder(initialSize: 1024)
let offset = self.encodeToFlatBuffers(builder: &builder)
builder.finish(offset: offset)
let serializedData = builder.data
var byteBuffer = ByteBuffer(data: serializedData)
let deserializedValue = FlatBuffers_getRoot(byteBuffer: &byteBuffer) as TelegramCore_TelegramUser
let parsedValue = try! TelegramUser(flatBuffersObject: deserializedValue)
assert(self == parsedValue)
#endif
}
public func encode(_ encoder: PostboxEncoder) {
@@ -516,4 +559,95 @@ public final class TelegramUser: Peer, Equatable {
public func withUpdatedProfileBackgroundEmojiId(_ profileBackgroundEmojiId: Int64?) -> TelegramUser {
return TelegramUser(id: self.id, accessHash: self.accessHash, firstName: self.firstName, lastName: self.lastName, username: self.username, phone: self.phone, photo: self.photo, botInfo: self.botInfo, restrictionInfo: self.restrictionInfo, flags: self.flags, emojiStatus: self.emojiStatus, usernames: self.usernames, storiesHidden: self.storiesHidden, nameColor: self.nameColor, backgroundEmojiId: self.backgroundEmojiId, profileColor: self.profileColor, profileBackgroundEmojiId: profileBackgroundEmojiId, subscriberCount: self.subscriberCount, verificationIconFileId: self.verificationIconFileId)
}
public init(flatBuffersObject: TelegramCore_TelegramUser) throws {
self.id = PeerId(flatBuffersObject.id)
self.accessHash = try flatBuffersObject.accessHash.flatMap(TelegramPeerAccessHash.init)
self.firstName = flatBuffersObject.firstName
self.lastName = flatBuffersObject.lastName
self.username = flatBuffersObject.username
self.phone = flatBuffersObject.phone
self.photo = try (0 ..< flatBuffersObject.photoCount).map { try TelegramMediaImageRepresentation(flatBuffersObject: flatBuffersObject.photo(at: $0)!) }
self.botInfo = try flatBuffersObject.botInfo.flatMap { try BotUserInfo(flatBuffersObject: $0) }
self.restrictionInfo = try flatBuffersObject.restrictionInfo.flatMap { try PeerAccessRestrictionInfo(flatBuffersObject: $0) }
self.flags = UserInfoFlags(rawValue: flatBuffersObject.flags)
self.emojiStatus = try flatBuffersObject.emojiStatus.flatMap { try PeerEmojiStatus(flatBuffersObject: $0) }
self.usernames = try (0 ..< flatBuffersObject.usernamesCount).map { try TelegramPeerUsername(flatBuffersObject: flatBuffersObject.usernames(at: $0)!) }
self.storiesHidden = flatBuffersObject.storiesHidden?.value
self.nameColor = try flatBuffersObject.nameColor.flatMap(PeerNameColor.init)
self.backgroundEmojiId = flatBuffersObject.backgroundEmojiId == Int64.min ? nil : flatBuffersObject.backgroundEmojiId
self.profileColor = try flatBuffersObject.profileColor.flatMap(PeerNameColor.init)
self.profileBackgroundEmojiId = flatBuffersObject.profileBackgroundEmojiId == Int64.min ? nil : flatBuffersObject.profileBackgroundEmojiId
self.subscriberCount = flatBuffersObject.subscriberCount == Int32.min ? nil : flatBuffersObject.subscriberCount
self.verificationIconFileId = flatBuffersObject.verificationIconFileId == Int64.min ? nil : flatBuffersObject.verificationIconFileId
}
public func encodeToFlatBuffers(builder: inout FlatBufferBuilder) -> Offset {
let accessHashOffset = self.accessHash.flatMap { $0.encodeToFlatBuffers(builder: &builder) }
let firstNameOffset = self.firstName.map { builder.create(string: $0) }
let lastNameOffset = self.lastName.map { builder.create(string: $0) }
let usernameOffset = self.username.map { builder.create(string: $0) }
let phoneOffset = self.phone.map { builder.create(string: $0) }
let photoOffsets = self.photo.map { $0.encodeToFlatBuffers(builder: &builder) }
let photoOffset = builder.createVector(ofOffsets: photoOffsets, len: photoOffsets.count)
let botInfoOffset = self.botInfo?.encodeToFlatBuffers(builder: &builder)
let restrictionInfoOffset = self.restrictionInfo?.encodeToFlatBuffers(builder: &builder)
let usernamesOffsets = self.usernames.map { $0.encodeToFlatBuffers(builder: &builder) }
let usernamesOffset = builder.createVector(ofOffsets: usernamesOffsets, len: usernamesOffsets.count)
let nameColorOffset = self.nameColor.flatMap { $0.encodeToFlatBuffers(builder: &builder) }
let profileColorOffset = self.profileColor.flatMap { $0.encodeToFlatBuffers(builder: &builder) }
let emojiStatusOffset = self.emojiStatus?.encodeToFlatBuffers(builder: &builder)
let start = TelegramCore_TelegramUser.startTelegramUser(&builder)
TelegramCore_TelegramUser.add(id: self.id.asFlatBuffersObject(), &builder)
if let accessHashOffset {
TelegramCore_TelegramUser.add(accessHash: accessHashOffset, &builder)
}
if let firstNameOffset {
TelegramCore_TelegramUser.add(firstName: firstNameOffset, &builder)
}
if let lastNameOffset {
TelegramCore_TelegramUser.add(lastName: lastNameOffset, &builder)
}
if let usernameOffset {
TelegramCore_TelegramUser.add(username: usernameOffset, &builder)
}
if let phoneOffset {
TelegramCore_TelegramUser.add(phone: phoneOffset, &builder)
}
TelegramCore_TelegramUser.addVectorOf(photo: photoOffset, &builder)
if let botInfoOffset {
TelegramCore_TelegramUser.add(botInfo: botInfoOffset, &builder)
}
if let restrictionInfoOffset {
TelegramCore_TelegramUser.add(restrictionInfo: restrictionInfoOffset, &builder)
}
TelegramCore_TelegramUser.add(flags: self.flags.rawValue, &builder)
if let emojiStatusOffset {
TelegramCore_TelegramUser.add(emojiStatus: emojiStatusOffset, &builder)
}
TelegramCore_TelegramUser.addVectorOf(usernames: usernamesOffset, &builder)
if let storiesHidden = self.storiesHidden {
TelegramCore_TelegramUser.add(storiesHidden: TelegramCore_OptionalBool(value: storiesHidden), &builder)
}
if let nameColorOffset {
TelegramCore_TelegramUser.add(nameColor: nameColorOffset, &builder)
}
TelegramCore_TelegramUser.add(backgroundEmojiId: self.backgroundEmojiId ?? Int64.min, &builder)
if let profileColorOffset {
TelegramCore_TelegramUser.add(profileColor: profileColorOffset, &builder)
}
TelegramCore_TelegramUser.add(profileBackgroundEmojiId: self.profileBackgroundEmojiId ?? Int64.min, &builder)
TelegramCore_TelegramUser.add(subscriberCount: self.subscriberCount ?? Int32.min, &builder)
TelegramCore_TelegramUser.add(verificationIconFileId: self.verificationIconFileId ?? Int64.min, &builder)
return TelegramCore_TelegramUser.endTelegramUser(&builder, start: start)
}
}