Folder improvements

This commit is contained in:
Ali 2023-04-02 16:56:33 +04:00
parent dfe8e80232
commit 65bcef3ee2
19 changed files with 317 additions and 226 deletions

View File

@ -9125,4 +9125,4 @@ Sorry for the inconvenience.";
"Channel.AdminLog.JoinedViaFolderInviteLink" = "%1$@ joined via invite link %2$@ (community)"; "Channel.AdminLog.JoinedViaFolderInviteLink" = "%1$@ joined via invite link %2$@ (community)";
"Conversation.OpenChatFolder" = "Open Shared Folder"; "Conversation.OpenChatFolder" = "VIEW CHAT LIST";

View File

@ -665,6 +665,9 @@ private func chatListFilterPresetControllerEntries(presentationData: Presentatio
if let inviteLinks, !inviteLinks.isEmpty { if let inviteLinks, !inviteLinks.isEmpty {
hasLinks = true hasLinks = true
} }
if let currentPreset, let data = currentPreset.data, data.hasSharedLinks {
hasLinks = true
}
entries.append(.inviteLinkHeader(hasLinks: hasLinks || hadLinks)) entries.append(.inviteLinkHeader(hasLinks: hasLinks || hadLinks))
entries.append(.inviteLinkCreate(hasLinks: hasLinks)) entries.append(.inviteLinkCreate(hasLinks: hasLinks))
@ -1393,10 +1396,12 @@ func chatListFilterPresetController(context: AccountContext, currentPreset: Chat
var attemptNavigationImpl: (() -> Bool)? var attemptNavigationImpl: (() -> Bool)?
applyImpl = { completed in applyImpl = { completed in
let state = stateValue.with { $0 } let state = stateValue.with { $0 }
let _ = (context.engine.peers.updateChatListFiltersInteractively { filters in
var includePeers = ChatListFilterIncludePeers() var includePeers = ChatListFilterIncludePeers()
includePeers.setPeers(state.additionallyIncludePeers) includePeers.setPeers(state.additionallyIncludePeers)
let _ = (context.engine.peers.updateChatListFiltersInteractively { filters in
var filterId = currentPreset?.id ?? -1 var filterId = currentPreset?.id ?? -1
if currentPreset == nil { if currentPreset == nil {
filterId = context.engine.peers.generateNewChatListFilterId(filters: filters) filterId = context.engine.peers.generateNewChatListFilterId(filters: filters)
@ -1434,8 +1439,30 @@ func chatListFilterPresetController(context: AccountContext, currentPreset: Chat
} }
|> deliverOnMainQueue).start(next: { filters in |> deliverOnMainQueue).start(next: { filters in
updated(filters) updated(filters)
if let currentPreset {
let _ = (context.engine.peers.updatedChatListFilters()
|> filter { filters -> Bool in
for filter in filters {
if filter.id == currentPreset.id {
if let data = filter.data {
if Set(data.includePeers.peers) == Set(includePeers.peers) {
return true
}
}
}
}
return true
}
|> take(1)
|> delay(1.0, queue: .mainQueue())
|> deliverOnMainQueue).start(next: { _ in
completed() completed()
}) })
} else {
completed()
}
})
} }
var previousState = stateValue.with { $0 } var previousState = stateValue.with { $0 }
@ -1473,8 +1500,10 @@ func chatListFilterPresetController(context: AccountContext, currentPreset: Chat
if previousStateValue.expandedSections != state.expandedSections { if previousStateValue.expandedSections != state.expandedSections {
skipStateAnimation = true skipStateAnimation = true
} }
var crossfadeAnimation = false
if previousSharedLinks == nil && sharedLinks != nil { if previousSharedLinks == nil && sharedLinks != nil {
skipStateAnimation = true skipStateAnimation = true
crossfadeAnimation = true
} }
previousSharedLinks = sharedLinks previousSharedLinks = sharedLinks
@ -1483,7 +1512,7 @@ func chatListFilterPresetController(context: AccountContext, currentPreset: Chat
} }
let controllerState = ItemListControllerState(presentationData: ItemListPresentationData(presentationData), title: .text(currentPreset != nil ? presentationData.strings.ChatListFolder_TitleEdit : presentationData.strings.ChatListFolder_TitleCreate), leftNavigationButton: leftNavigationButton, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: false) let controllerState = ItemListControllerState(presentationData: ItemListPresentationData(presentationData), title: .text(currentPreset != nil ? presentationData.strings.ChatListFolder_TitleEdit : presentationData.strings.ChatListFolder_TitleCreate), leftNavigationButton: leftNavigationButton, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: false)
let listState = ItemListNodeState(presentationData: ItemListPresentationData(presentationData), entries: chatListFilterPresetControllerEntries(presentationData: presentationData, isNewFilter: currentPreset == nil, currentPreset: currentPreset, state: state, includePeers: includePeers, excludePeers: excludePeers, isPremium: isPremium, limit: premiumLimits.maxFolderChatsCount, inviteLinks: sharedLinks, hadLinks: hadLinks), style: .blocks, emptyStateItem: nil, animateChanges: !skipStateAnimation) let listState = ItemListNodeState(presentationData: ItemListPresentationData(presentationData), entries: chatListFilterPresetControllerEntries(presentationData: presentationData, isNewFilter: currentPreset == nil, currentPreset: currentPreset, state: state, includePeers: includePeers, excludePeers: excludePeers, isPremium: isPremium, limit: premiumLimits.maxFolderChatsCount, inviteLinks: sharedLinks, hadLinks: hadLinks), style: .blocks, emptyStateItem: nil, crossfadeState: crossfadeAnimation, animateChanges: !skipStateAnimation)
skipStateAnimation = false skipStateAnimation = false
return (controllerState, (listState, arguments)) return (controllerState, (listState, arguments))

View File

@ -231,6 +231,13 @@ class ChatListStorageInfoItemNode: ItemListRevealOptionsItemNode {
} }
} }
override public func animateInsertion(_ currentTimestamp: Double, duration: Double, short: Bool) {
super.animateInsertion(currentTimestamp, duration: duration, short: short)
//self.transitionOffset = self.bounds.size.height * 1.6
//self.addTransitionOffsetAnimation(0.0, duration: duration, beginAt: currentTimestamp)
}
override public func updateRevealOffset(offset: CGFloat, transition: ContainedViewLayoutTransition) { override public func updateRevealOffset(offset: CGFloat, transition: ContainedViewLayoutTransition) {
super.updateRevealOffset(offset: offset, transition: transition) super.updateRevealOffset(offset: offset, transition: transition)

View File

@ -521,7 +521,7 @@ public func folderInviteLinkListController(context: AccountContext, updatedPrese
text = "You can't share private chats" text = "You can't share private chats"
} }
} else { } else {
text = "you can't invite others here" text = "You don't have the admin rights to share invite links to this group chat."
} }
dismissTooltipsImpl?() dismissTooltipsImpl?()
displayTooltipImpl?(.peers(context: context, peers: [peer], title: nil, text: text, customUndoText: nil)) displayTooltipImpl?(.peers(context: context, peers: [peer], title: nil, text: text, customUndoText: nil))
@ -560,6 +560,11 @@ public func folderInviteLinkListController(context: AccountContext, updatedPrese
let applyChangesImpl: (() -> Void)? = { let applyChangesImpl: (() -> Void)? = {
let state = stateValue.with({ $0 }) let state = stateValue.with({ $0 })
if state.selectedPeerIds.isEmpty {
return
}
if let currentLink = state.currentLink { if let currentLink = state.currentLink {
if currentLink.title != state.title || Set(currentLink.peerIds) != state.selectedPeerIds { if currentLink.title != state.title || Set(currentLink.peerIds) != state.selectedPeerIds {
updateState { state in updateState { state in
@ -625,6 +630,8 @@ public func folderInviteLinkListController(context: AccountContext, updatedPrese
allPeers allPeers
) )
|> map { presentationData, state, allPeers -> (ItemListControllerState, (ItemListNodeState, Any)) in |> map { presentationData, state, allPeers -> (ItemListControllerState, (ItemListNodeState, Any)) in
let allPeers = allPeers.compactMap { $0 }
let crossfade = false let crossfade = false
var animateChanges = false var animateChanges = false
@ -644,7 +651,12 @@ public func folderInviteLinkListController(context: AccountContext, updatedPrese
title = .text(folderTitle) title = .text(folderTitle)
var doneButton: ItemListNavigationButton? var doneButton: ItemListNavigationButton?
if state.isSaving {
let canShareChats = !allPeers.allSatisfy({ !canShareLinkToPeer(peer: $0) })
if !canShareChats {
doneButton = nil
} else if state.isSaving {
doneButton = ItemListNavigationButton(content: .none, style: .activity, enabled: true, action: {}) doneButton = ItemListNavigationButton(content: .none, style: .activity, enabled: true, action: {})
} else { } else {
doneButton = ItemListNavigationButton(content: .text(presentationData.strings.Common_Save), style: .bold, enabled: !state.selectedPeerIds.isEmpty, action: { doneButton = ItemListNavigationButton(content: .text(presentationData.strings.Common_Save), style: .bold, enabled: !state.selectedPeerIds.isEmpty, action: {
@ -657,7 +669,7 @@ public func folderInviteLinkListController(context: AccountContext, updatedPrese
presentationData: presentationData, presentationData: presentationData,
state: state, state: state,
title: filterTitle, title: filterTitle,
allPeers: allPeers.compactMap { $0 } allPeers: allPeers
), style: .blocks, emptyStateItem: nil, crossfadeState: crossfade, animateChanges: animateChanges) ), style: .blocks, emptyStateItem: nil, crossfadeState: crossfade, animateChanges: animateChanges)
return (controllerState, (listState, arguments)) return (controllerState, (listState, arguments))

View File

@ -4,7 +4,7 @@ public enum Api {
public enum auth {} public enum auth {}
public enum bots {} public enum bots {}
public enum channels {} public enum channels {}
public enum communities {} public enum chatlists {}
public enum contacts {} public enum contacts {}
public enum help {} public enum help {}
public enum messages {} public enum messages {}
@ -22,7 +22,7 @@ public enum Api {
public enum auth {} public enum auth {}
public enum bots {} public enum bots {}
public enum channels {} public enum channels {}
public enum communities {} public enum chatlists {}
public enum contacts {} public enum contacts {}
public enum folders {} public enum folders {}
public enum help {} public enum help {}
@ -193,7 +193,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
dict[-712374074] = { return Api.Dialog.parse_dialog($0) } dict[-712374074] = { return Api.Dialog.parse_dialog($0) }
dict[1908216652] = { return Api.Dialog.parse_dialogFolder($0) } dict[1908216652] = { return Api.Dialog.parse_dialogFolder($0) }
dict[1949890536] = { return Api.DialogFilter.parse_dialogFilter($0) } dict[1949890536] = { return Api.DialogFilter.parse_dialogFilter($0) }
dict[-665432009] = { return Api.DialogFilter.parse_dialogFilterCommunity($0) } dict[-699792216] = { return Api.DialogFilter.parse_dialogFilterChatlist($0) }
dict[909284270] = { return Api.DialogFilter.parse_dialogFilterDefault($0) } dict[909284270] = { return Api.DialogFilter.parse_dialogFilterDefault($0) }
dict[2004110666] = { return Api.DialogFilterSuggested.parse_dialogFilterSuggested($0) } dict[2004110666] = { return Api.DialogFilterSuggested.parse_dialogFilterSuggested($0) }
dict[-445792507] = { return Api.DialogPeer.parse_dialogPeer($0) } dict[-445792507] = { return Api.DialogPeer.parse_dialogPeer($0) }
@ -238,7 +238,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
dict[594758406] = { return Api.EncryptedMessage.parse_encryptedMessageService($0) } dict[594758406] = { return Api.EncryptedMessage.parse_encryptedMessageService($0) }
dict[179611673] = { return Api.ExportedChatInvite.parse_chatInviteExported($0) } dict[179611673] = { return Api.ExportedChatInvite.parse_chatInviteExported($0) }
dict[-317687113] = { return Api.ExportedChatInvite.parse_chatInvitePublicJoinRequests($0) } dict[-317687113] = { return Api.ExportedChatInvite.parse_chatInvitePublicJoinRequests($0) }
dict[-337788502] = { return Api.ExportedCommunityInvite.parse_exportedCommunityInvite($0) } dict[206668204] = { return Api.ExportedChatlistInvite.parse_exportedChatlistInvite($0) }
dict[1103040667] = { return Api.ExportedContactToken.parse_exportedContactToken($0) } dict[1103040667] = { return Api.ExportedContactToken.parse_exportedContactToken($0) }
dict[1571494644] = { return Api.ExportedMessageLink.parse_exportedMessageLink($0) } dict[1571494644] = { return Api.ExportedMessageLink.parse_exportedMessageLink($0) }
dict[-207944868] = { return Api.FileHash.parse_fileHash($0) } dict[-207944868] = { return Api.FileHash.parse_fileHash($0) }
@ -287,10 +287,10 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
dict[-1991004873] = { return Api.InputChatPhoto.parse_inputChatPhoto($0) } dict[-1991004873] = { return Api.InputChatPhoto.parse_inputChatPhoto($0) }
dict[480546647] = { return Api.InputChatPhoto.parse_inputChatPhotoEmpty($0) } dict[480546647] = { return Api.InputChatPhoto.parse_inputChatPhotoEmpty($0) }
dict[-1110593856] = { return Api.InputChatPhoto.parse_inputChatUploadedPhoto($0) } dict[-1110593856] = { return Api.InputChatPhoto.parse_inputChatUploadedPhoto($0) }
dict[-203367885] = { return Api.InputChatlist.parse_inputChatlistDialogFilter($0) }
dict[-1736378792] = { return Api.InputCheckPasswordSRP.parse_inputCheckPasswordEmpty($0) } dict[-1736378792] = { return Api.InputCheckPasswordSRP.parse_inputCheckPasswordEmpty($0) }
dict[-763367294] = { return Api.InputCheckPasswordSRP.parse_inputCheckPasswordSRP($0) } dict[-763367294] = { return Api.InputCheckPasswordSRP.parse_inputCheckPasswordSRP($0) }
dict[1968737087] = { return Api.InputClientProxy.parse_inputClientProxy($0) } dict[1968737087] = { return Api.InputClientProxy.parse_inputClientProxy($0) }
dict[450955169] = { return Api.InputCommunity.parse_inputCommunityDialogFilter($0) }
dict[-208488460] = { return Api.InputContact.parse_inputPhoneContact($0) } dict[-208488460] = { return Api.InputContact.parse_inputPhoneContact($0) }
dict[-55902537] = { return Api.InputDialogPeer.parse_inputDialogPeer($0) } dict[-55902537] = { return Api.InputDialogPeer.parse_inputDialogPeer($0) }
dict[1684014375] = { return Api.InputDialogPeer.parse_inputDialogPeerFolder($0) } dict[1684014375] = { return Api.InputDialogPeer.parse_inputDialogPeerFolder($0) }
@ -478,6 +478,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
dict[-1434950843] = { return Api.MessageAction.parse_messageActionSetChatTheme($0) } dict[-1434950843] = { return Api.MessageAction.parse_messageActionSetChatTheme($0) }
dict[-1136350937] = { return Api.MessageAction.parse_messageActionSetChatWallPaper($0) } dict[-1136350937] = { return Api.MessageAction.parse_messageActionSetChatWallPaper($0) }
dict[1007897979] = { return Api.MessageAction.parse_messageActionSetMessagesTTL($0) } dict[1007897979] = { return Api.MessageAction.parse_messageActionSetMessagesTTL($0) }
dict[-632006598] = { return Api.MessageAction.parse_messageActionSetSameChatWallPaper($0) }
dict[1474192222] = { return Api.MessageAction.parse_messageActionSuggestProfilePhoto($0) } dict[1474192222] = { return Api.MessageAction.parse_messageActionSuggestProfilePhoto($0) }
dict[228168278] = { return Api.MessageAction.parse_messageActionTopicCreate($0) } dict[228168278] = { return Api.MessageAction.parse_messageActionTopicCreate($0) }
dict[-1064024032] = { return Api.MessageAction.parse_messageActionTopicEdit($0) } dict[-1064024032] = { return Api.MessageAction.parse_messageActionTopicEdit($0) }
@ -998,11 +999,11 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
dict[-1699676497] = { return Api.channels.ChannelParticipants.parse_channelParticipants($0) } dict[-1699676497] = { return Api.channels.ChannelParticipants.parse_channelParticipants($0) }
dict[-266911767] = { return Api.channels.ChannelParticipants.parse_channelParticipantsNotModified($0) } dict[-266911767] = { return Api.channels.ChannelParticipants.parse_channelParticipantsNotModified($0) }
dict[-191450938] = { return Api.channels.SendAsPeers.parse_sendAsPeers($0) } dict[-191450938] = { return Api.channels.SendAsPeers.parse_sendAsPeers($0) }
dict[59080097] = { return Api.communities.CommunityInvite.parse_communityInvite($0) } dict[500007837] = { return Api.chatlists.ChatlistInvite.parse_chatlistInvite($0) }
dict[-951718393] = { return Api.communities.CommunityInvite.parse_communityInviteAlready($0) } dict[-91752871] = { return Api.chatlists.ChatlistInvite.parse_chatlistInviteAlready($0) }
dict[-414818125] = { return Api.communities.CommunityUpdates.parse_communityUpdates($0) } dict[-1816295539] = { return Api.chatlists.ChatlistUpdates.parse_chatlistUpdates($0) }
dict[1805101290] = { return Api.communities.ExportedCommunityInvite.parse_exportedCommunityInvite($0) } dict[283567014] = { return Api.chatlists.ExportedChatlistInvite.parse_exportedChatlistInvite($0) }
dict[-2662489] = { return Api.communities.ExportedInvites.parse_exportedInvites($0) } dict[279670215] = { return Api.chatlists.ExportedInvites.parse_exportedInvites($0) }
dict[182326673] = { return Api.contacts.Blocked.parse_blocked($0) } dict[182326673] = { return Api.contacts.Blocked.parse_blocked($0) }
dict[-513392236] = { return Api.contacts.Blocked.parse_blockedSlice($0) } dict[-513392236] = { return Api.contacts.Blocked.parse_blockedSlice($0) }
dict[-353862078] = { return Api.contacts.Contacts.parse_contacts($0) } dict[-353862078] = { return Api.contacts.Contacts.parse_contacts($0) }
@ -1354,7 +1355,7 @@ public extension Api {
_1.serialize(buffer, boxed) _1.serialize(buffer, boxed)
case let _1 as Api.ExportedChatInvite: case let _1 as Api.ExportedChatInvite:
_1.serialize(buffer, boxed) _1.serialize(buffer, boxed)
case let _1 as Api.ExportedCommunityInvite: case let _1 as Api.ExportedChatlistInvite:
_1.serialize(buffer, boxed) _1.serialize(buffer, boxed)
case let _1 as Api.ExportedContactToken: case let _1 as Api.ExportedContactToken:
_1.serialize(buffer, boxed) _1.serialize(buffer, boxed)
@ -1408,12 +1409,12 @@ public extension Api {
_1.serialize(buffer, boxed) _1.serialize(buffer, boxed)
case let _1 as Api.InputChatPhoto: case let _1 as Api.InputChatPhoto:
_1.serialize(buffer, boxed) _1.serialize(buffer, boxed)
case let _1 as Api.InputChatlist:
_1.serialize(buffer, boxed)
case let _1 as Api.InputCheckPasswordSRP: case let _1 as Api.InputCheckPasswordSRP:
_1.serialize(buffer, boxed) _1.serialize(buffer, boxed)
case let _1 as Api.InputClientProxy: case let _1 as Api.InputClientProxy:
_1.serialize(buffer, boxed) _1.serialize(buffer, boxed)
case let _1 as Api.InputCommunity:
_1.serialize(buffer, boxed)
case let _1 as Api.InputContact: case let _1 as Api.InputContact:
_1.serialize(buffer, boxed) _1.serialize(buffer, boxed)
case let _1 as Api.InputDialogPeer: case let _1 as Api.InputDialogPeer:
@ -1802,13 +1803,13 @@ public extension Api {
_1.serialize(buffer, boxed) _1.serialize(buffer, boxed)
case let _1 as Api.channels.SendAsPeers: case let _1 as Api.channels.SendAsPeers:
_1.serialize(buffer, boxed) _1.serialize(buffer, boxed)
case let _1 as Api.communities.CommunityInvite: case let _1 as Api.chatlists.ChatlistInvite:
_1.serialize(buffer, boxed) _1.serialize(buffer, boxed)
case let _1 as Api.communities.CommunityUpdates: case let _1 as Api.chatlists.ChatlistUpdates:
_1.serialize(buffer, boxed) _1.serialize(buffer, boxed)
case let _1 as Api.communities.ExportedCommunityInvite: case let _1 as Api.chatlists.ExportedChatlistInvite:
_1.serialize(buffer, boxed) _1.serialize(buffer, boxed)
case let _1 as Api.communities.ExportedInvites: case let _1 as Api.chatlists.ExportedInvites:
_1.serialize(buffer, boxed) _1.serialize(buffer, boxed)
case let _1 as Api.contacts.Blocked: case let _1 as Api.contacts.Blocked:
_1.serialize(buffer, boxed) _1.serialize(buffer, boxed)

View File

@ -263,6 +263,7 @@ public extension Api {
case messageActionSetChatTheme(emoticon: String) case messageActionSetChatTheme(emoticon: String)
case messageActionSetChatWallPaper(wallpaper: Api.WallPaper) case messageActionSetChatWallPaper(wallpaper: Api.WallPaper)
case messageActionSetMessagesTTL(flags: Int32, period: Int32, autoSettingFrom: Int64?) case messageActionSetMessagesTTL(flags: Int32, period: Int32, autoSettingFrom: Int64?)
case messageActionSetSameChatWallPaper
case messageActionSuggestProfilePhoto(photo: Api.Photo) case messageActionSuggestProfilePhoto(photo: Api.Photo)
case messageActionTopicCreate(flags: Int32, title: String, iconColor: Int32, iconEmojiId: Int64?) case messageActionTopicCreate(flags: Int32, title: String, iconColor: Int32, iconEmojiId: Int64?)
case messageActionTopicEdit(flags: Int32, title: String?, iconEmojiId: Int64?, closed: Api.Bool?, hidden: Api.Bool?) case messageActionTopicEdit(flags: Int32, title: String?, iconEmojiId: Int64?, closed: Api.Bool?, hidden: Api.Bool?)
@ -520,6 +521,12 @@ public extension Api {
serializeInt32(flags, buffer: buffer, boxed: false) serializeInt32(flags, buffer: buffer, boxed: false)
serializeInt32(period, buffer: buffer, boxed: false) serializeInt32(period, buffer: buffer, boxed: false)
if Int(flags) & Int(1 << 0) != 0 {serializeInt64(autoSettingFrom!, buffer: buffer, boxed: false)} if Int(flags) & Int(1 << 0) != 0 {serializeInt64(autoSettingFrom!, buffer: buffer, boxed: false)}
break
case .messageActionSetSameChatWallPaper:
if boxed {
buffer.appendInt32(-632006598)
}
break break
case .messageActionSuggestProfilePhoto(let photo): case .messageActionSuggestProfilePhoto(let photo):
if boxed { if boxed {
@ -630,6 +637,8 @@ public extension Api {
return ("messageActionSetChatWallPaper", [("wallpaper", wallpaper as Any)]) return ("messageActionSetChatWallPaper", [("wallpaper", wallpaper as Any)])
case .messageActionSetMessagesTTL(let flags, let period, let autoSettingFrom): case .messageActionSetMessagesTTL(let flags, let period, let autoSettingFrom):
return ("messageActionSetMessagesTTL", [("flags", flags as Any), ("period", period as Any), ("autoSettingFrom", autoSettingFrom as Any)]) return ("messageActionSetMessagesTTL", [("flags", flags as Any), ("period", period as Any), ("autoSettingFrom", autoSettingFrom as Any)])
case .messageActionSetSameChatWallPaper:
return ("messageActionSetSameChatWallPaper", [])
case .messageActionSuggestProfilePhoto(let photo): case .messageActionSuggestProfilePhoto(let photo):
return ("messageActionSuggestProfilePhoto", [("photo", photo as Any)]) return ("messageActionSuggestProfilePhoto", [("photo", photo as Any)])
case .messageActionTopicCreate(let flags, let title, let iconColor, let iconEmojiId): case .messageActionTopicCreate(let flags, let title, let iconColor, let iconEmojiId):
@ -1082,6 +1091,9 @@ public extension Api {
return nil return nil
} }
} }
public static func parse_messageActionSetSameChatWallPaper(_ reader: BufferReader) -> MessageAction? {
return Api.MessageAction.messageActionSetSameChatWallPaper
}
public static func parse_messageActionSuggestProfilePhoto(_ reader: BufferReader) -> MessageAction? { public static func parse_messageActionSuggestProfilePhoto(_ reader: BufferReader) -> MessageAction? {
var _1: Api.Photo? var _1: Api.Photo?
if let signature = reader.readInt32() { if let signature = reader.readInt32() {

View File

@ -894,16 +894,16 @@ public extension Api.channels {
} }
} }
public extension Api.communities { public extension Api.chatlists {
enum CommunityInvite: TypeConstructorDescription { enum ChatlistInvite: TypeConstructorDescription {
case communityInvite(flags: Int32, title: String, emoticon: String?, peers: [Api.Peer], chats: [Api.Chat], users: [Api.User]) case chatlistInvite(flags: Int32, title: String, emoticon: String?, peers: [Api.Peer], chats: [Api.Chat], users: [Api.User])
case communityInviteAlready(filterId: Int32, missingPeers: [Api.Peer], alreadyPeers: [Api.Peer], chats: [Api.Chat], users: [Api.User]) case chatlistInviteAlready(filterId: Int32, missingPeers: [Api.Peer], alreadyPeers: [Api.Peer], chats: [Api.Chat], users: [Api.User])
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
switch self { switch self {
case .communityInvite(let flags, let title, let emoticon, let peers, let chats, let users): case .chatlistInvite(let flags, let title, let emoticon, let peers, let chats, let users):
if boxed { if boxed {
buffer.appendInt32(59080097) buffer.appendInt32(500007837)
} }
serializeInt32(flags, buffer: buffer, boxed: false) serializeInt32(flags, buffer: buffer, boxed: false)
serializeString(title, buffer: buffer, boxed: false) serializeString(title, buffer: buffer, boxed: false)
@ -924,9 +924,9 @@ public extension Api.communities {
item.serialize(buffer, true) item.serialize(buffer, true)
} }
break break
case .communityInviteAlready(let filterId, let missingPeers, let alreadyPeers, let chats, let users): case .chatlistInviteAlready(let filterId, let missingPeers, let alreadyPeers, let chats, let users):
if boxed { if boxed {
buffer.appendInt32(-951718393) buffer.appendInt32(-91752871)
} }
serializeInt32(filterId, buffer: buffer, boxed: false) serializeInt32(filterId, buffer: buffer, boxed: false)
buffer.appendInt32(481674261) buffer.appendInt32(481674261)
@ -955,14 +955,14 @@ public extension Api.communities {
public func descriptionFields() -> (String, [(String, Any)]) { public func descriptionFields() -> (String, [(String, Any)]) {
switch self { switch self {
case .communityInvite(let flags, let title, let emoticon, let peers, let chats, let users): case .chatlistInvite(let flags, let title, let emoticon, let peers, let chats, let users):
return ("communityInvite", [("flags", flags as Any), ("title", title as Any), ("emoticon", emoticon as Any), ("peers", peers as Any), ("chats", chats as Any), ("users", users as Any)]) return ("chatlistInvite", [("flags", flags as Any), ("title", title as Any), ("emoticon", emoticon as Any), ("peers", peers as Any), ("chats", chats as Any), ("users", users as Any)])
case .communityInviteAlready(let filterId, let missingPeers, let alreadyPeers, let chats, let users): case .chatlistInviteAlready(let filterId, let missingPeers, let alreadyPeers, let chats, let users):
return ("communityInviteAlready", [("filterId", filterId as Any), ("missingPeers", missingPeers as Any), ("alreadyPeers", alreadyPeers as Any), ("chats", chats as Any), ("users", users as Any)]) return ("chatlistInviteAlready", [("filterId", filterId as Any), ("missingPeers", missingPeers as Any), ("alreadyPeers", alreadyPeers as Any), ("chats", chats as Any), ("users", users as Any)])
} }
} }
public static func parse_communityInvite(_ reader: BufferReader) -> CommunityInvite? { public static func parse_chatlistInvite(_ reader: BufferReader) -> ChatlistInvite? {
var _1: Int32? var _1: Int32?
_1 = reader.readInt32() _1 = reader.readInt32()
var _2: String? var _2: String?
@ -988,13 +988,13 @@ public extension Api.communities {
let _c5 = _5 != nil let _c5 = _5 != nil
let _c6 = _6 != nil let _c6 = _6 != nil
if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 { if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 {
return Api.communities.CommunityInvite.communityInvite(flags: _1!, title: _2!, emoticon: _3, peers: _4!, chats: _5!, users: _6!) return Api.chatlists.ChatlistInvite.chatlistInvite(flags: _1!, title: _2!, emoticon: _3, peers: _4!, chats: _5!, users: _6!)
} }
else { else {
return nil return nil
} }
} }
public static func parse_communityInviteAlready(_ reader: BufferReader) -> CommunityInvite? { public static func parse_chatlistInviteAlready(_ reader: BufferReader) -> ChatlistInvite? {
var _1: Int32? var _1: Int32?
_1 = reader.readInt32() _1 = reader.readInt32()
var _2: [Api.Peer]? var _2: [Api.Peer]?
@ -1019,7 +1019,7 @@ public extension Api.communities {
let _c4 = _4 != nil let _c4 = _4 != nil
let _c5 = _5 != nil let _c5 = _5 != nil
if _c1 && _c2 && _c3 && _c4 && _c5 { if _c1 && _c2 && _c3 && _c4 && _c5 {
return Api.communities.CommunityInvite.communityInviteAlready(filterId: _1!, missingPeers: _2!, alreadyPeers: _3!, chats: _4!, users: _5!) return Api.chatlists.ChatlistInvite.chatlistInviteAlready(filterId: _1!, missingPeers: _2!, alreadyPeers: _3!, chats: _4!, users: _5!)
} }
else { else {
return nil return nil
@ -1028,15 +1028,15 @@ public extension Api.communities {
} }
} }
public extension Api.communities { public extension Api.chatlists {
enum CommunityUpdates: TypeConstructorDescription { enum ChatlistUpdates: TypeConstructorDescription {
case communityUpdates(missingPeers: [Api.Peer], chats: [Api.Chat], users: [Api.User]) case chatlistUpdates(missingPeers: [Api.Peer], chats: [Api.Chat], users: [Api.User])
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
switch self { switch self {
case .communityUpdates(let missingPeers, let chats, let users): case .chatlistUpdates(let missingPeers, let chats, let users):
if boxed { if boxed {
buffer.appendInt32(-414818125) buffer.appendInt32(-1816295539)
} }
buffer.appendInt32(481674261) buffer.appendInt32(481674261)
buffer.appendInt32(Int32(missingPeers.count)) buffer.appendInt32(Int32(missingPeers.count))
@ -1059,12 +1059,12 @@ public extension Api.communities {
public func descriptionFields() -> (String, [(String, Any)]) { public func descriptionFields() -> (String, [(String, Any)]) {
switch self { switch self {
case .communityUpdates(let missingPeers, let chats, let users): case .chatlistUpdates(let missingPeers, let chats, let users):
return ("communityUpdates", [("missingPeers", missingPeers as Any), ("chats", chats as Any), ("users", users as Any)]) return ("chatlistUpdates", [("missingPeers", missingPeers as Any), ("chats", chats as Any), ("users", users as Any)])
} }
} }
public static func parse_communityUpdates(_ reader: BufferReader) -> CommunityUpdates? { public static func parse_chatlistUpdates(_ reader: BufferReader) -> ChatlistUpdates? {
var _1: [Api.Peer]? var _1: [Api.Peer]?
if let _ = reader.readInt32() { if let _ = reader.readInt32() {
_1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Peer.self) _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Peer.self)
@ -1081,7 +1081,7 @@ public extension Api.communities {
let _c2 = _2 != nil let _c2 = _2 != nil
let _c3 = _3 != nil let _c3 = _3 != nil
if _c1 && _c2 && _c3 { if _c1 && _c2 && _c3 {
return Api.communities.CommunityUpdates.communityUpdates(missingPeers: _1!, chats: _2!, users: _3!) return Api.chatlists.ChatlistUpdates.chatlistUpdates(missingPeers: _1!, chats: _2!, users: _3!)
} }
else { else {
return nil return nil
@ -1090,15 +1090,15 @@ public extension Api.communities {
} }
} }
public extension Api.communities { public extension Api.chatlists {
enum ExportedCommunityInvite: TypeConstructorDescription { enum ExportedChatlistInvite: TypeConstructorDescription {
case exportedCommunityInvite(filter: Api.DialogFilter, invite: Api.ExportedCommunityInvite) case exportedChatlistInvite(filter: Api.DialogFilter, invite: Api.ExportedChatlistInvite)
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
switch self { switch self {
case .exportedCommunityInvite(let filter, let invite): case .exportedChatlistInvite(let filter, let invite):
if boxed { if boxed {
buffer.appendInt32(1805101290) buffer.appendInt32(283567014)
} }
filter.serialize(buffer, true) filter.serialize(buffer, true)
invite.serialize(buffer, true) invite.serialize(buffer, true)
@ -1108,24 +1108,24 @@ public extension Api.communities {
public func descriptionFields() -> (String, [(String, Any)]) { public func descriptionFields() -> (String, [(String, Any)]) {
switch self { switch self {
case .exportedCommunityInvite(let filter, let invite): case .exportedChatlistInvite(let filter, let invite):
return ("exportedCommunityInvite", [("filter", filter as Any), ("invite", invite as Any)]) return ("exportedChatlistInvite", [("filter", filter as Any), ("invite", invite as Any)])
} }
} }
public static func parse_exportedCommunityInvite(_ reader: BufferReader) -> ExportedCommunityInvite? { public static func parse_exportedChatlistInvite(_ reader: BufferReader) -> ExportedChatlistInvite? {
var _1: Api.DialogFilter? var _1: Api.DialogFilter?
if let signature = reader.readInt32() { if let signature = reader.readInt32() {
_1 = Api.parse(reader, signature: signature) as? Api.DialogFilter _1 = Api.parse(reader, signature: signature) as? Api.DialogFilter
} }
var _2: Api.ExportedCommunityInvite? var _2: Api.ExportedChatlistInvite?
if let signature = reader.readInt32() { if let signature = reader.readInt32() {
_2 = Api.parse(reader, signature: signature) as? Api.ExportedCommunityInvite _2 = Api.parse(reader, signature: signature) as? Api.ExportedChatlistInvite
} }
let _c1 = _1 != nil let _c1 = _1 != nil
let _c2 = _2 != nil let _c2 = _2 != nil
if _c1 && _c2 { if _c1 && _c2 {
return Api.communities.ExportedCommunityInvite.exportedCommunityInvite(filter: _1!, invite: _2!) return Api.chatlists.ExportedChatlistInvite.exportedChatlistInvite(filter: _1!, invite: _2!)
} }
else { else {
return nil return nil

View File

@ -1,12 +1,12 @@
public extension Api.communities { public extension Api.chatlists {
enum ExportedInvites: TypeConstructorDescription { enum ExportedInvites: TypeConstructorDescription {
case exportedInvites(invites: [Api.ExportedCommunityInvite], chats: [Api.Chat], users: [Api.User]) case exportedInvites(invites: [Api.ExportedChatlistInvite], chats: [Api.Chat], users: [Api.User])
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
switch self { switch self {
case .exportedInvites(let invites, let chats, let users): case .exportedInvites(let invites, let chats, let users):
if boxed { if boxed {
buffer.appendInt32(-2662489) buffer.appendInt32(279670215)
} }
buffer.appendInt32(481674261) buffer.appendInt32(481674261)
buffer.appendInt32(Int32(invites.count)) buffer.appendInt32(Int32(invites.count))
@ -35,9 +35,9 @@ public extension Api.communities {
} }
public static func parse_exportedInvites(_ reader: BufferReader) -> ExportedInvites? { public static func parse_exportedInvites(_ reader: BufferReader) -> ExportedInvites? {
var _1: [Api.ExportedCommunityInvite]? var _1: [Api.ExportedChatlistInvite]?
if let _ = reader.readInt32() { if let _ = reader.readInt32() {
_1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.ExportedCommunityInvite.self) _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.ExportedChatlistInvite.self)
} }
var _2: [Api.Chat]? var _2: [Api.Chat]?
if let _ = reader.readInt32() { if let _ = reader.readInt32() {
@ -51,7 +51,7 @@ public extension Api.communities {
let _c2 = _2 != nil let _c2 = _2 != nil
let _c3 = _3 != nil let _c3 = _3 != nil
if _c1 && _c2 && _c3 { if _c1 && _c2 && _c3 {
return Api.communities.ExportedInvites.exportedInvites(invites: _1!, chats: _2!, users: _3!) return Api.chatlists.ExportedInvites.exportedInvites(invites: _1!, chats: _2!, users: _3!)
} }
else { else {
return nil return nil

View File

@ -1369,13 +1369,14 @@ public extension Api.functions.account {
} }
} }
public extension Api.functions.account { public extension Api.functions.account {
static func uploadWallPaper(file: Api.InputFile, mimeType: String, settings: Api.WallPaperSettings) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.WallPaper>) { static func uploadWallPaper(flags: Int32, file: Api.InputFile, mimeType: String, settings: Api.WallPaperSettings) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.WallPaper>) {
let buffer = Buffer() let buffer = Buffer()
buffer.appendInt32(-578472351) buffer.appendInt32(-476410109)
serializeInt32(flags, buffer: buffer, boxed: false)
file.serialize(buffer, true) file.serialize(buffer, true)
serializeString(mimeType, buffer: buffer, boxed: false) serializeString(mimeType, buffer: buffer, boxed: false)
settings.serialize(buffer, true) settings.serialize(buffer, true)
return (FunctionDescription(name: "account.uploadWallPaper", parameters: [("file", String(describing: file)), ("mimeType", String(describing: mimeType)), ("settings", String(describing: settings))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.WallPaper? in return (FunctionDescription(name: "account.uploadWallPaper", parameters: [("flags", String(describing: flags)), ("file", String(describing: file)), ("mimeType", String(describing: mimeType)), ("settings", String(describing: settings))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.WallPaper? in
let reader = BufferReader(buffer) let reader = BufferReader(buffer)
var result: Api.WallPaper? var result: Api.WallPaper?
if let signature = reader.readInt32() { if let signature = reader.readInt32() {
@ -2952,28 +2953,28 @@ public extension Api.functions.channels {
}) })
} }
} }
public extension Api.functions.communities { public extension Api.functions.chatlists {
static func checkCommunityInvite(slug: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.communities.CommunityInvite>) { static func checkChatlistInvite(slug: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.chatlists.ChatlistInvite>) {
let buffer = Buffer() let buffer = Buffer()
buffer.appendInt32(161196517) buffer.appendInt32(1103171583)
serializeString(slug, buffer: buffer, boxed: false) serializeString(slug, buffer: buffer, boxed: false)
return (FunctionDescription(name: "communities.checkCommunityInvite", parameters: [("slug", String(describing: slug))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.communities.CommunityInvite? in return (FunctionDescription(name: "chatlists.checkChatlistInvite", parameters: [("slug", String(describing: slug))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.chatlists.ChatlistInvite? in
let reader = BufferReader(buffer) let reader = BufferReader(buffer)
var result: Api.communities.CommunityInvite? var result: Api.chatlists.ChatlistInvite?
if let signature = reader.readInt32() { if let signature = reader.readInt32() {
result = Api.parse(reader, signature: signature) as? Api.communities.CommunityInvite result = Api.parse(reader, signature: signature) as? Api.chatlists.ChatlistInvite
} }
return result return result
}) })
} }
} }
public extension Api.functions.communities { public extension Api.functions.chatlists {
static func deleteExportedInvite(community: Api.InputCommunity, slug: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.Bool>) { static func deleteExportedInvite(chatlist: Api.InputChatlist, slug: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.Bool>) {
let buffer = Buffer() let buffer = Buffer()
buffer.appendInt32(-110213610) buffer.appendInt32(1906072670)
community.serialize(buffer, true) chatlist.serialize(buffer, true)
serializeString(slug, buffer: buffer, boxed: false) serializeString(slug, buffer: buffer, boxed: false)
return (FunctionDescription(name: "communities.deleteExportedInvite", parameters: [("community", String(describing: community)), ("slug", String(describing: slug))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Bool? in return (FunctionDescription(name: "chatlists.deleteExportedInvite", parameters: [("chatlist", String(describing: chatlist)), ("slug", String(describing: slug))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Bool? in
let reader = BufferReader(buffer) let reader = BufferReader(buffer)
var result: Api.Bool? var result: Api.Bool?
if let signature = reader.readInt32() { if let signature = reader.readInt32() {
@ -2983,12 +2984,12 @@ public extension Api.functions.communities {
}) })
} }
} }
public extension Api.functions.communities { public extension Api.functions.chatlists {
static func editExportedInvite(flags: Int32, community: Api.InputCommunity, slug: String, title: String?, peers: [Api.InputPeer]?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.ExportedCommunityInvite>) { static func editExportedInvite(flags: Int32, chatlist: Api.InputChatlist, slug: String, title: String?, peers: [Api.InputPeer]?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.ExportedChatlistInvite>) {
let buffer = Buffer() let buffer = Buffer()
buffer.appendInt32(655623442) buffer.appendInt32(1698543165)
serializeInt32(flags, buffer: buffer, boxed: false) serializeInt32(flags, buffer: buffer, boxed: false)
community.serialize(buffer, true) chatlist.serialize(buffer, true)
serializeString(slug, buffer: buffer, boxed: false) serializeString(slug, buffer: buffer, boxed: false)
if Int(flags) & Int(1 << 1) != 0 {serializeString(title!, buffer: buffer, boxed: false)} if Int(flags) & Int(1 << 1) != 0 {serializeString(title!, buffer: buffer, boxed: false)}
if Int(flags) & Int(1 << 2) != 0 {buffer.appendInt32(481674261) if Int(flags) & Int(1 << 2) != 0 {buffer.appendInt32(481674261)
@ -2996,73 +2997,73 @@ public extension Api.functions.communities {
for item in peers! { for item in peers! {
item.serialize(buffer, true) item.serialize(buffer, true)
}} }}
return (FunctionDescription(name: "communities.editExportedInvite", parameters: [("flags", String(describing: flags)), ("community", String(describing: community)), ("slug", String(describing: slug)), ("title", String(describing: title)), ("peers", String(describing: peers))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.ExportedCommunityInvite? in return (FunctionDescription(name: "chatlists.editExportedInvite", parameters: [("flags", String(describing: flags)), ("chatlist", String(describing: chatlist)), ("slug", String(describing: slug)), ("title", String(describing: title)), ("peers", String(describing: peers))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.ExportedChatlistInvite? in
let reader = BufferReader(buffer) let reader = BufferReader(buffer)
var result: Api.ExportedCommunityInvite? var result: Api.ExportedChatlistInvite?
if let signature = reader.readInt32() { if let signature = reader.readInt32() {
result = Api.parse(reader, signature: signature) as? Api.ExportedCommunityInvite result = Api.parse(reader, signature: signature) as? Api.ExportedChatlistInvite
} }
return result return result
}) })
} }
} }
public extension Api.functions.communities { public extension Api.functions.chatlists {
static func exportCommunityInvite(community: Api.InputCommunity, title: String, peers: [Api.InputPeer]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.communities.ExportedCommunityInvite>) { static func exportChatlistInvite(chatlist: Api.InputChatlist, title: String, peers: [Api.InputPeer]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.chatlists.ExportedChatlistInvite>) {
let buffer = Buffer() let buffer = Buffer()
buffer.appendInt32(1107192281) buffer.appendInt32(-2072885362)
community.serialize(buffer, true) chatlist.serialize(buffer, true)
serializeString(title, buffer: buffer, boxed: false) serializeString(title, buffer: buffer, boxed: false)
buffer.appendInt32(481674261) buffer.appendInt32(481674261)
buffer.appendInt32(Int32(peers.count)) buffer.appendInt32(Int32(peers.count))
for item in peers { for item in peers {
item.serialize(buffer, true) item.serialize(buffer, true)
} }
return (FunctionDescription(name: "communities.exportCommunityInvite", parameters: [("community", String(describing: community)), ("title", String(describing: title)), ("peers", String(describing: peers))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.communities.ExportedCommunityInvite? in return (FunctionDescription(name: "chatlists.exportChatlistInvite", parameters: [("chatlist", String(describing: chatlist)), ("title", String(describing: title)), ("peers", String(describing: peers))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.chatlists.ExportedChatlistInvite? in
let reader = BufferReader(buffer) let reader = BufferReader(buffer)
var result: Api.communities.ExportedCommunityInvite? var result: Api.chatlists.ExportedChatlistInvite?
if let signature = reader.readInt32() { if let signature = reader.readInt32() {
result = Api.parse(reader, signature: signature) as? Api.communities.ExportedCommunityInvite result = Api.parse(reader, signature: signature) as? Api.chatlists.ExportedChatlistInvite
} }
return result return result
}) })
} }
} }
public extension Api.functions.communities { public extension Api.functions.chatlists {
static func getCommunityUpdates(community: Api.InputCommunity) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.communities.CommunityUpdates>) { static func getChatlistUpdates(chatlist: Api.InputChatlist) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.chatlists.ChatlistUpdates>) {
let buffer = Buffer() let buffer = Buffer()
buffer.appendInt32(693556789) buffer.appendInt32(-1992190687)
community.serialize(buffer, true) chatlist.serialize(buffer, true)
return (FunctionDescription(name: "communities.getCommunityUpdates", parameters: [("community", String(describing: community))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.communities.CommunityUpdates? in return (FunctionDescription(name: "chatlists.getChatlistUpdates", parameters: [("chatlist", String(describing: chatlist))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.chatlists.ChatlistUpdates? in
let reader = BufferReader(buffer) let reader = BufferReader(buffer)
var result: Api.communities.CommunityUpdates? var result: Api.chatlists.ChatlistUpdates?
if let signature = reader.readInt32() { if let signature = reader.readInt32() {
result = Api.parse(reader, signature: signature) as? Api.communities.CommunityUpdates result = Api.parse(reader, signature: signature) as? Api.chatlists.ChatlistUpdates
} }
return result return result
}) })
} }
} }
public extension Api.functions.communities { public extension Api.functions.chatlists {
static func getExportedInvites(community: Api.InputCommunity) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.communities.ExportedInvites>) { static func getExportedInvites(chatlist: Api.InputChatlist) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.chatlists.ExportedInvites>) {
let buffer = Buffer() let buffer = Buffer()
buffer.appendInt32(1183359901) buffer.appendInt32(-838608253)
community.serialize(buffer, true) chatlist.serialize(buffer, true)
return (FunctionDescription(name: "communities.getExportedInvites", parameters: [("community", String(describing: community))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.communities.ExportedInvites? in return (FunctionDescription(name: "chatlists.getExportedInvites", parameters: [("chatlist", String(describing: chatlist))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.chatlists.ExportedInvites? in
let reader = BufferReader(buffer) let reader = BufferReader(buffer)
var result: Api.communities.ExportedInvites? var result: Api.chatlists.ExportedInvites?
if let signature = reader.readInt32() { if let signature = reader.readInt32() {
result = Api.parse(reader, signature: signature) as? Api.communities.ExportedInvites result = Api.parse(reader, signature: signature) as? Api.chatlists.ExportedInvites
} }
return result return result
}) })
} }
} }
public extension Api.functions.communities { public extension Api.functions.chatlists {
static func getLeaveCommunitySuggestions(community: Api.InputCommunity) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Api.Peer]>) { static func getLeaveChatlistSuggestions(chatlist: Api.InputChatlist) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Api.Peer]>) {
let buffer = Buffer() let buffer = Buffer()
buffer.appendInt32(-296838430) buffer.appendInt32(-37955820)
community.serialize(buffer, true) chatlist.serialize(buffer, true)
return (FunctionDescription(name: "communities.getLeaveCommunitySuggestions", parameters: [("community", String(describing: community))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> [Api.Peer]? in return (FunctionDescription(name: "chatlists.getLeaveChatlistSuggestions", parameters: [("chatlist", String(describing: chatlist))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> [Api.Peer]? in
let reader = BufferReader(buffer) let reader = BufferReader(buffer)
var result: [Api.Peer]? var result: [Api.Peer]?
if let _ = reader.readInt32() { if let _ = reader.readInt32() {
@ -3072,12 +3073,12 @@ public extension Api.functions.communities {
}) })
} }
} }
public extension Api.functions.communities { public extension Api.functions.chatlists {
static func hideCommunityUpdates(community: Api.InputCommunity) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.Bool>) { static func hideChatlistUpdates(chatlist: Api.InputChatlist) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.Bool>) {
let buffer = Buffer() let buffer = Buffer()
buffer.appendInt32(224889775) buffer.appendInt32(1726252795)
community.serialize(buffer, true) chatlist.serialize(buffer, true)
return (FunctionDescription(name: "communities.hideCommunityUpdates", parameters: [("community", String(describing: community))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Bool? in return (FunctionDescription(name: "chatlists.hideChatlistUpdates", parameters: [("chatlist", String(describing: chatlist))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Bool? in
let reader = BufferReader(buffer) let reader = BufferReader(buffer)
var result: Api.Bool? var result: Api.Bool?
if let signature = reader.readInt32() { if let signature = reader.readInt32() {
@ -3087,17 +3088,17 @@ public extension Api.functions.communities {
}) })
} }
} }
public extension Api.functions.communities { public extension Api.functions.chatlists {
static func joinCommunityInvite(slug: String, peers: [Api.InputPeer]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.Updates>) { static func joinChatlistInvite(slug: String, peers: [Api.InputPeer]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.Updates>) {
let buffer = Buffer() let buffer = Buffer()
buffer.appendInt32(82835751) buffer.appendInt32(-1498291302)
serializeString(slug, buffer: buffer, boxed: false) serializeString(slug, buffer: buffer, boxed: false)
buffer.appendInt32(481674261) buffer.appendInt32(481674261)
buffer.appendInt32(Int32(peers.count)) buffer.appendInt32(Int32(peers.count))
for item in peers { for item in peers {
item.serialize(buffer, true) item.serialize(buffer, true)
} }
return (FunctionDescription(name: "communities.joinCommunityInvite", parameters: [("slug", String(describing: slug)), ("peers", String(describing: peers))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in return (FunctionDescription(name: "chatlists.joinChatlistInvite", parameters: [("slug", String(describing: slug)), ("peers", String(describing: peers))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in
let reader = BufferReader(buffer) let reader = BufferReader(buffer)
var result: Api.Updates? var result: Api.Updates?
if let signature = reader.readInt32() { if let signature = reader.readInt32() {
@ -3107,17 +3108,17 @@ public extension Api.functions.communities {
}) })
} }
} }
public extension Api.functions.communities { public extension Api.functions.chatlists {
static func joinCommunityUpdates(community: Api.InputCommunity, peers: [Api.InputPeer]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.Updates>) { static func joinChatlistUpdates(chatlist: Api.InputChatlist, peers: [Api.InputPeer]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.Updates>) {
let buffer = Buffer() let buffer = Buffer()
buffer.appendInt32(1372856854) buffer.appendInt32(-527828747)
community.serialize(buffer, true) chatlist.serialize(buffer, true)
buffer.appendInt32(481674261) buffer.appendInt32(481674261)
buffer.appendInt32(Int32(peers.count)) buffer.appendInt32(Int32(peers.count))
for item in peers { for item in peers {
item.serialize(buffer, true) item.serialize(buffer, true)
} }
return (FunctionDescription(name: "communities.joinCommunityUpdates", parameters: [("community", String(describing: community)), ("peers", String(describing: peers))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in return (FunctionDescription(name: "chatlists.joinChatlistUpdates", parameters: [("chatlist", String(describing: chatlist)), ("peers", String(describing: peers))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in
let reader = BufferReader(buffer) let reader = BufferReader(buffer)
var result: Api.Updates? var result: Api.Updates?
if let signature = reader.readInt32() { if let signature = reader.readInt32() {
@ -3127,17 +3128,17 @@ public extension Api.functions.communities {
}) })
} }
} }
public extension Api.functions.communities { public extension Api.functions.chatlists {
static func leaveCommunity(community: Api.InputCommunity, peers: [Api.InputPeer]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.Updates>) { static func leaveChatlist(chatlist: Api.InputChatlist, peers: [Api.InputPeer]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.Updates>) {
let buffer = Buffer() let buffer = Buffer()
buffer.appendInt32(903443807) buffer.appendInt32(1962598714)
community.serialize(buffer, true) chatlist.serialize(buffer, true)
buffer.appendInt32(481674261) buffer.appendInt32(481674261)
buffer.appendInt32(Int32(peers.count)) buffer.appendInt32(Int32(peers.count))
for item in peers { for item in peers {
item.serialize(buffer, true) item.serialize(buffer, true)
} }
return (FunctionDescription(name: "communities.leaveCommunity", parameters: [("community", String(describing: community)), ("peers", String(describing: peers))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in return (FunctionDescription(name: "chatlists.leaveChatlist", parameters: [("chatlist", String(describing: chatlist)), ("peers", String(describing: peers))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in
let reader = BufferReader(buffer) let reader = BufferReader(buffer)
var result: Api.Updates? var result: Api.Updates?
if let signature = reader.readInt32() { if let signature = reader.readInt32() {
@ -6881,13 +6882,15 @@ public extension Api.functions.messages {
} }
} }
public extension Api.functions.messages { public extension Api.functions.messages {
static func setChatWallPaper(peer: Api.InputPeer, wallpaper: Api.InputWallPaper, settings: Api.WallPaperSettings) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.Updates>) { static func setChatWallPaper(flags: Int32, peer: Api.InputPeer, wallpaper: Api.InputWallPaper?, settings: Api.WallPaperSettings?, id: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.Updates>) {
let buffer = Buffer() let buffer = Buffer()
buffer.appendInt32(-1109557590) buffer.appendInt32(-609568219)
serializeInt32(flags, buffer: buffer, boxed: false)
peer.serialize(buffer, true) peer.serialize(buffer, true)
wallpaper.serialize(buffer, true) if Int(flags) & Int(1 << 0) != 0 {wallpaper!.serialize(buffer, true)}
settings.serialize(buffer, true) if Int(flags) & Int(1 << 0) != 0 {settings!.serialize(buffer, true)}
return (FunctionDescription(name: "messages.setChatWallPaper", parameters: [("peer", String(describing: peer)), ("wallpaper", String(describing: wallpaper)), ("settings", String(describing: settings))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in if Int(flags) & Int(1 << 1) != 0 {serializeInt32(id!, buffer: buffer, boxed: false)}
return (FunctionDescription(name: "messages.setChatWallPaper", parameters: [("flags", String(describing: flags)), ("peer", String(describing: peer)), ("wallpaper", String(describing: wallpaper)), ("settings", String(describing: settings)), ("id", String(describing: id))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in
let reader = BufferReader(buffer) let reader = BufferReader(buffer)
var result: Api.Updates? var result: Api.Updates?
if let signature = reader.readInt32() { if let signature = reader.readInt32() {

View File

@ -1015,7 +1015,7 @@ public extension Api {
public extension Api { public extension Api {
enum DialogFilter: TypeConstructorDescription { enum DialogFilter: TypeConstructorDescription {
case dialogFilter(flags: Int32, id: Int32, title: String, emoticon: String?, pinnedPeers: [Api.InputPeer], includePeers: [Api.InputPeer], excludePeers: [Api.InputPeer]) case dialogFilter(flags: Int32, id: Int32, title: String, emoticon: String?, pinnedPeers: [Api.InputPeer], includePeers: [Api.InputPeer], excludePeers: [Api.InputPeer])
case dialogFilterCommunity(flags: Int32, id: Int32, title: String, emoticon: String?, pinnedPeers: [Api.InputPeer], includePeers: [Api.InputPeer]) case dialogFilterChatlist(flags: Int32, id: Int32, title: String, emoticon: String?, pinnedPeers: [Api.InputPeer], includePeers: [Api.InputPeer])
case dialogFilterDefault case dialogFilterDefault
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
@ -1044,9 +1044,9 @@ public extension Api {
item.serialize(buffer, true) item.serialize(buffer, true)
} }
break break
case .dialogFilterCommunity(let flags, let id, let title, let emoticon, let pinnedPeers, let includePeers): case .dialogFilterChatlist(let flags, let id, let title, let emoticon, let pinnedPeers, let includePeers):
if boxed { if boxed {
buffer.appendInt32(-665432009) buffer.appendInt32(-699792216)
} }
serializeInt32(flags, buffer: buffer, boxed: false) serializeInt32(flags, buffer: buffer, boxed: false)
serializeInt32(id, buffer: buffer, boxed: false) serializeInt32(id, buffer: buffer, boxed: false)
@ -1076,8 +1076,8 @@ public extension Api {
switch self { switch self {
case .dialogFilter(let flags, let id, let title, let emoticon, let pinnedPeers, let includePeers, let excludePeers): case .dialogFilter(let flags, let id, let title, let emoticon, let pinnedPeers, let includePeers, let excludePeers):
return ("dialogFilter", [("flags", flags as Any), ("id", id as Any), ("title", title as Any), ("emoticon", emoticon as Any), ("pinnedPeers", pinnedPeers as Any), ("includePeers", includePeers as Any), ("excludePeers", excludePeers as Any)]) return ("dialogFilter", [("flags", flags as Any), ("id", id as Any), ("title", title as Any), ("emoticon", emoticon as Any), ("pinnedPeers", pinnedPeers as Any), ("includePeers", includePeers as Any), ("excludePeers", excludePeers as Any)])
case .dialogFilterCommunity(let flags, let id, let title, let emoticon, let pinnedPeers, let includePeers): case .dialogFilterChatlist(let flags, let id, let title, let emoticon, let pinnedPeers, let includePeers):
return ("dialogFilterCommunity", [("flags", flags as Any), ("id", id as Any), ("title", title as Any), ("emoticon", emoticon as Any), ("pinnedPeers", pinnedPeers as Any), ("includePeers", includePeers as Any)]) return ("dialogFilterChatlist", [("flags", flags as Any), ("id", id as Any), ("title", title as Any), ("emoticon", emoticon as Any), ("pinnedPeers", pinnedPeers as Any), ("includePeers", includePeers as Any)])
case .dialogFilterDefault: case .dialogFilterDefault:
return ("dialogFilterDefault", []) return ("dialogFilterDefault", [])
} }
@ -1118,7 +1118,7 @@ public extension Api {
return nil return nil
} }
} }
public static func parse_dialogFilterCommunity(_ reader: BufferReader) -> DialogFilter? { public static func parse_dialogFilterChatlist(_ reader: BufferReader) -> DialogFilter? {
var _1: Int32? var _1: Int32?
_1 = reader.readInt32() _1 = reader.readInt32()
var _2: Int32? var _2: Int32?
@ -1142,7 +1142,7 @@ public extension Api {
let _c5 = _5 != nil let _c5 = _5 != nil
let _c6 = _6 != nil let _c6 = _6 != nil
if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 { if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 {
return Api.DialogFilter.dialogFilterCommunity(flags: _1!, id: _2!, title: _3!, emoticon: _4, pinnedPeers: _5!, includePeers: _6!) return Api.DialogFilter.dialogFilterChatlist(flags: _1!, id: _2!, title: _3!, emoticon: _4, pinnedPeers: _5!, includePeers: _6!)
} }
else { else {
return nil return nil

View File

@ -1025,14 +1025,14 @@ public extension Api {
} }
} }
public extension Api { public extension Api {
enum ExportedCommunityInvite: TypeConstructorDescription { enum ExportedChatlistInvite: TypeConstructorDescription {
case exportedCommunityInvite(flags: Int32, title: String, url: String, peers: [Api.Peer]) case exportedChatlistInvite(flags: Int32, title: String, url: String, peers: [Api.Peer])
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
switch self { switch self {
case .exportedCommunityInvite(let flags, let title, let url, let peers): case .exportedChatlistInvite(let flags, let title, let url, let peers):
if boxed { if boxed {
buffer.appendInt32(-337788502) buffer.appendInt32(206668204)
} }
serializeInt32(flags, buffer: buffer, boxed: false) serializeInt32(flags, buffer: buffer, boxed: false)
serializeString(title, buffer: buffer, boxed: false) serializeString(title, buffer: buffer, boxed: false)
@ -1048,12 +1048,12 @@ public extension Api {
public func descriptionFields() -> (String, [(String, Any)]) { public func descriptionFields() -> (String, [(String, Any)]) {
switch self { switch self {
case .exportedCommunityInvite(let flags, let title, let url, let peers): case .exportedChatlistInvite(let flags, let title, let url, let peers):
return ("exportedCommunityInvite", [("flags", flags as Any), ("title", title as Any), ("url", url as Any), ("peers", peers as Any)]) return ("exportedChatlistInvite", [("flags", flags as Any), ("title", title as Any), ("url", url as Any), ("peers", peers as Any)])
} }
} }
public static func parse_exportedCommunityInvite(_ reader: BufferReader) -> ExportedCommunityInvite? { public static func parse_exportedChatlistInvite(_ reader: BufferReader) -> ExportedChatlistInvite? {
var _1: Int32? var _1: Int32?
_1 = reader.readInt32() _1 = reader.readInt32()
var _2: String? var _2: String?
@ -1069,7 +1069,7 @@ public extension Api {
let _c3 = _3 != nil let _c3 = _3 != nil
let _c4 = _4 != nil let _c4 = _4 != nil
if _c1 && _c2 && _c3 && _c4 { if _c1 && _c2 && _c3 && _c4 {
return Api.ExportedCommunityInvite.exportedCommunityInvite(flags: _1!, title: _2!, url: _3!, peers: _4!) return Api.ExportedChatlistInvite.exportedChatlistInvite(flags: _1!, title: _2!, url: _3!, peers: _4!)
} }
else { else {
return nil return nil

View File

@ -436,6 +436,42 @@ public extension Api {
} }
} }
public extension Api {
enum InputChatlist: TypeConstructorDescription {
case inputChatlistDialogFilter(filterId: Int32)
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
switch self {
case .inputChatlistDialogFilter(let filterId):
if boxed {
buffer.appendInt32(-203367885)
}
serializeInt32(filterId, buffer: buffer, boxed: false)
break
}
}
public func descriptionFields() -> (String, [(String, Any)]) {
switch self {
case .inputChatlistDialogFilter(let filterId):
return ("inputChatlistDialogFilter", [("filterId", filterId as Any)])
}
}
public static func parse_inputChatlistDialogFilter(_ reader: BufferReader) -> InputChatlist? {
var _1: Int32?
_1 = reader.readInt32()
let _c1 = _1 != nil
if _c1 {
return Api.InputChatlist.inputChatlistDialogFilter(filterId: _1!)
}
else {
return nil
}
}
}
}
public extension Api { public extension Api {
enum InputCheckPasswordSRP: TypeConstructorDescription { enum InputCheckPasswordSRP: TypeConstructorDescription {
case inputCheckPasswordEmpty case inputCheckPasswordEmpty
@ -532,42 +568,6 @@ public extension Api {
} }
} }
public extension Api {
enum InputCommunity: TypeConstructorDescription {
case inputCommunityDialogFilter(filterId: Int32)
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
switch self {
case .inputCommunityDialogFilter(let filterId):
if boxed {
buffer.appendInt32(450955169)
}
serializeInt32(filterId, buffer: buffer, boxed: false)
break
}
}
public func descriptionFields() -> (String, [(String, Any)]) {
switch self {
case .inputCommunityDialogFilter(let filterId):
return ("inputCommunityDialogFilter", [("filterId", filterId as Any)])
}
}
public static func parse_inputCommunityDialogFilter(_ reader: BufferReader) -> InputCommunity? {
var _1: Int32?
_1 = reader.readInt32()
let _c1 = _1 != nil
if _c1 {
return Api.InputCommunity.inputCommunityDialogFilter(filterId: _1!)
}
else {
return nil
}
}
}
}
public extension Api { public extension Api {
enum InputContact: TypeConstructorDescription { enum InputContact: TypeConstructorDescription {
case inputPhoneContact(clientId: Int64, phone: String, firstName: String, lastName: String) case inputPhoneContact(clientId: Int64, phone: String, firstName: String, lastName: String)

View File

@ -205,7 +205,7 @@ func apiMessagePeerIds(_ message: Api.Message) -> [PeerId] {
} }
switch action { switch action {
case .messageActionChannelCreate, .messageActionChatDeletePhoto, .messageActionChatEditPhoto, .messageActionChatEditTitle, .messageActionEmpty, .messageActionPinMessage, .messageActionHistoryClear, .messageActionGameScore, .messageActionPaymentSent, .messageActionPaymentSentMe, .messageActionPhoneCall, .messageActionScreenshotTaken, .messageActionCustomAction, .messageActionBotAllowed, .messageActionSecureValuesSent, .messageActionSecureValuesSentMe, .messageActionContactSignUp, .messageActionGroupCall, .messageActionSetMessagesTTL, .messageActionGroupCallScheduled, .messageActionSetChatTheme, .messageActionChatJoinedByRequest, .messageActionWebViewDataSent, .messageActionWebViewDataSentMe, .messageActionGiftPremium, .messageActionTopicCreate, .messageActionTopicEdit, .messageActionSuggestProfilePhoto, .messageActionSetChatWallPaper: case .messageActionChannelCreate, .messageActionChatDeletePhoto, .messageActionChatEditPhoto, .messageActionChatEditTitle, .messageActionEmpty, .messageActionPinMessage, .messageActionHistoryClear, .messageActionGameScore, .messageActionPaymentSent, .messageActionPaymentSentMe, .messageActionPhoneCall, .messageActionScreenshotTaken, .messageActionCustomAction, .messageActionBotAllowed, .messageActionSecureValuesSent, .messageActionSecureValuesSentMe, .messageActionContactSignUp, .messageActionGroupCall, .messageActionSetMessagesTTL, .messageActionGroupCallScheduled, .messageActionSetChatTheme, .messageActionChatJoinedByRequest, .messageActionWebViewDataSent, .messageActionWebViewDataSentMe, .messageActionGiftPremium, .messageActionTopicCreate, .messageActionTopicEdit, .messageActionSuggestProfilePhoto, .messageActionSetChatWallPaper, .messageActionSetSameChatWallPaper:
break break
case let .messageActionChannelMigrateFrom(_, chatId): case let .messageActionChannelMigrateFrom(_, chatId):
result.append(PeerId(namespace: Namespaces.Peer.CloudGroup, id: PeerId.Id._internalFromInt64Value(chatId))) result.append(PeerId(namespace: Namespaces.Peer.CloudGroup, id: PeerId.Id._internalFromInt64Value(chatId)))

View File

@ -110,6 +110,8 @@ func telegramMediaActionFromApiAction(_ action: Api.MessageAction) -> TelegramMe
return TelegramMediaAction(action: .requestedPeer(buttonId: buttonId, peerId: peer.peerId)) return TelegramMediaAction(action: .requestedPeer(buttonId: buttonId, peerId: peer.peerId))
case let .messageActionSetChatWallPaper(wallpaper): case let .messageActionSetChatWallPaper(wallpaper):
return TelegramMediaAction(action: .setChatWallpaper(wallpaper: TelegramWallpaper(apiWallpaper: wallpaper))) return TelegramMediaAction(action: .setChatWallpaper(wallpaper: TelegramWallpaper(apiWallpaper: wallpaper)))
case .messageActionSetSameChatWallPaper:
return nil
} }
} }

View File

@ -350,7 +350,7 @@ extension ChatListFilter {
} }
) )
) )
case let .dialogFilterCommunity(flags, id, title, emoticon, pinnedPeers, includePeers): case let .dialogFilterChatlist(flags, id, title, emoticon, pinnedPeers, includePeers):
self = .filter( self = .filter(
id: id, id: id,
title: title, title: title,
@ -401,7 +401,7 @@ extension ChatListFilter {
if emoticon != nil { if emoticon != nil {
flags |= 1 << 25 flags |= 1 << 25
} }
return .dialogFilterCommunity(flags: flags, id: id, title: title, emoticon: emoticon, pinnedPeers: data.includePeers.pinnedPeers.compactMap { peerId -> Api.InputPeer? in return .dialogFilterChatlist(flags: flags, id: id, title: title, emoticon: emoticon, pinnedPeers: data.includePeers.pinnedPeers.compactMap { peerId -> Api.InputPeer? in
return transaction.getPeer(peerId).flatMap(apiInputPeer) return transaction.getPeer(peerId).flatMap(apiInputPeer)
}, includePeers: data.includePeers.peers.compactMap { peerId -> Api.InputPeer? in }, includePeers: data.includePeers.peers.compactMap { peerId -> Api.InputPeer? in
if data.includePeers.pinnedPeers.contains(peerId) { if data.includePeers.pinnedPeers.contains(peerId) {
@ -539,7 +539,7 @@ private func requestChatListFilters(accountPeerId: PeerId, postbox: Postbox, net
} }
} }
} }
case let .dialogFilterCommunity(_, _, _, _, pinnedPeers, includePeers): case let .dialogFilterChatlist(_, _, _, _, pinnedPeers, includePeers):
for peer in pinnedPeers + includePeers { for peer in pinnedPeers + includePeers {
var peerId: PeerId? var peerId: PeerId?
switch peer { switch peer {

View File

@ -10,11 +10,17 @@ public func canShareLinkToPeer(peer: EnginePeer) -> Bool {
if channel.flags.contains(.isCreator) || (channel.adminRights?.rights.contains(.canInviteUsers) == true) { if channel.flags.contains(.isCreator) || (channel.adminRights?.rights.contains(.canInviteUsers) == true) {
isEnabled = true isEnabled = true
} else if channel.username != nil { } else if channel.username != nil {
if !channel.flags.contains(.requestToJoin) {
isEnabled = true isEnabled = true
} }
}
case let .legacyGroup(group): case let .legacyGroup(group):
if !group.hasBannedPermission(.banAddMembers) { if case .creator = group.role {
isEnabled = true isEnabled = true
} else if case let .admin(rights, _) = group.role {
if rights.rights.contains(.canInviteUsers) {
isEnabled = true
}
} }
default: default:
break break
@ -63,18 +69,18 @@ func _internal_exportChatFolder(account: Account, filterId: Int32, title: String
} }
|> castError(ExportChatFolderError.self) |> castError(ExportChatFolderError.self)
|> mapToSignal { inputPeers -> Signal<ExportedChatFolderLink, ExportChatFolderError> in |> mapToSignal { inputPeers -> Signal<ExportedChatFolderLink, ExportChatFolderError> in
return account.network.request(Api.functions.communities.exportCommunityInvite(community: .inputCommunityDialogFilter(filterId: filterId), title: title, peers: inputPeers)) return account.network.request(Api.functions.chatlists.exportChatlistInvite(chatlist: .inputChatlistDialogFilter(filterId: filterId), title: title, peers: inputPeers))
|> `catch` { error -> Signal<Api.communities.ExportedCommunityInvite, ExportChatFolderError> in |> `catch` { error -> Signal<Api.chatlists.ExportedChatlistInvite, ExportChatFolderError> in
if error.errorDescription == "INVITES_TOO_MUCH" || error.errorDescription == "COMMUNITIES_TOO_MUCH" { if error.errorDescription == "INVITES_TOO_MUCH" || error.errorDescription == "CHATLISTS_TOO_MUCH" {
return account.postbox.transaction { transaction -> (AppConfiguration, Bool) in return account.postbox.transaction { transaction -> (AppConfiguration, Bool) in
return (currentAppConfiguration(transaction: transaction), transaction.getPeer(account.peerId)?.isPremium ?? false) return (currentAppConfiguration(transaction: transaction), transaction.getPeer(account.peerId)?.isPremium ?? false)
} }
|> castError(ExportChatFolderError.self) |> castError(ExportChatFolderError.self)
|> mapToSignal { appConfiguration, isPremium -> Signal<Api.communities.ExportedCommunityInvite, ExportChatFolderError> in |> mapToSignal { appConfiguration, isPremium -> Signal<Api.chatlists.ExportedChatlistInvite, ExportChatFolderError> in
let userDefaultLimits = UserLimitsConfiguration(appConfiguration: appConfiguration, isPremium: false) let userDefaultLimits = UserLimitsConfiguration(appConfiguration: appConfiguration, isPremium: false)
let userPremiumLimits = UserLimitsConfiguration(appConfiguration: appConfiguration, isPremium: true) let userPremiumLimits = UserLimitsConfiguration(appConfiguration: appConfiguration, isPremium: true)
if error.errorDescription == "COMMUNITIES_TOO_MUCH" { if error.errorDescription == "CHATLISTS_TOO_MUCH" {
if isPremium { if isPremium {
return .fail(.sharedFolderLimitExceeded(limit: userPremiumLimits.maxSharedFolderJoin, premiumLimit: userPremiumLimits.maxSharedFolderJoin)) return .fail(.sharedFolderLimitExceeded(limit: userPremiumLimits.maxSharedFolderJoin, premiumLimit: userPremiumLimits.maxSharedFolderJoin))
} else { } else {
@ -95,7 +101,7 @@ func _internal_exportChatFolder(account: Account, filterId: Int32, title: String
|> mapToSignal { result -> Signal<ExportedChatFolderLink, ExportChatFolderError> in |> mapToSignal { result -> Signal<ExportedChatFolderLink, ExportChatFolderError> in
return account.postbox.transaction { transaction -> Signal<ExportedChatFolderLink, ExportChatFolderError> in return account.postbox.transaction { transaction -> Signal<ExportedChatFolderLink, ExportChatFolderError> in
switch result { switch result {
case let .exportedCommunityInvite(filter, invite): case let .exportedChatlistInvite(filter, invite):
let parsedFilter = ChatListFilter(apiFilter: filter) let parsedFilter = ChatListFilter(apiFilter: filter)
let _ = updateChatListFiltersState(transaction: transaction, { state in let _ = updateChatListFiltersState(transaction: transaction, { state in
@ -110,7 +116,7 @@ func _internal_exportChatFolder(account: Account, filterId: Int32, title: String
}) })
switch invite { switch invite {
case let .exportedCommunityInvite(flags, title, url, peers): case let .exportedChatlistInvite(flags, title, url, peers):
return .single(ExportedChatFolderLink( return .single(ExportedChatFolderLink(
title: title, title: title,
link: url, link: url,
@ -127,9 +133,9 @@ func _internal_exportChatFolder(account: Account, filterId: Int32, title: String
} }
func _internal_getExportedChatFolderLinks(account: Account, id: Int32) -> Signal<[ExportedChatFolderLink]?, NoError> { func _internal_getExportedChatFolderLinks(account: Account, id: Int32) -> Signal<[ExportedChatFolderLink]?, NoError> {
return account.network.request(Api.functions.communities.getExportedInvites(community: .inputCommunityDialogFilter(filterId: id))) return account.network.request(Api.functions.chatlists.getExportedInvites(chatlist: .inputChatlistDialogFilter(filterId: id)))
|> map(Optional.init) |> map(Optional.init)
|> `catch` { _ -> Signal<Api.communities.ExportedInvites?, NoError> in |> `catch` { _ -> Signal<Api.chatlists.ExportedInvites?, NoError> in
return .single(nil) return .single(nil)
} }
|> mapToSignal { result -> Signal<[ExportedChatFolderLink]?, NoError> in |> mapToSignal { result -> Signal<[ExportedChatFolderLink]?, NoError> in
@ -161,7 +167,7 @@ func _internal_getExportedChatFolderLinks(account: Account, id: Int32) -> Signal
var result: [ExportedChatFolderLink] = [] var result: [ExportedChatFolderLink] = []
for invite in invites { for invite in invites {
switch invite { switch invite {
case let .exportedCommunityInvite(flags, title, url, peers): case let .exportedChatlistInvite(flags, title, url, peers):
result.append(ExportedChatFolderLink( result.append(ExportedChatFolderLink(
title: title, title: title,
link: url, link: url,
@ -195,13 +201,13 @@ func _internal_editChatFolderLink(account: Account, filterId: Int32, link: Expor
flags |= 1 << 2 flags |= 1 << 2
peers = peerIds.compactMap(transaction.getPeer).compactMap(apiInputPeer) peers = peerIds.compactMap(transaction.getPeer).compactMap(apiInputPeer)
} }
return account.network.request(Api.functions.communities.editExportedInvite(flags: flags, community: .inputCommunityDialogFilter(filterId: filterId), slug: link.slug, title: title, peers: peers)) return account.network.request(Api.functions.chatlists.editExportedInvite(flags: flags, chatlist: .inputChatlistDialogFilter(filterId: filterId), slug: link.slug, title: title, peers: peers))
|> mapError { _ -> EditChatFolderLinkError in |> mapError { _ -> EditChatFolderLinkError in
return .generic return .generic
} }
|> map { result in |> map { result in
switch result { switch result {
case let .exportedCommunityInvite(flags, title, url, peers): case let .exportedChatlistInvite(flags, title, url, peers):
return ExportedChatFolderLink( return ExportedChatFolderLink(
title: title, title: title,
link: url, link: url,
@ -213,7 +219,6 @@ func _internal_editChatFolderLink(account: Account, filterId: Int32, link: Expor
} }
|> castError(EditChatFolderLinkError.self) |> castError(EditChatFolderLinkError.self)
|> switchToLatest |> switchToLatest
} }
public enum RevokeChatFolderLinkError { public enum RevokeChatFolderLinkError {
@ -221,7 +226,7 @@ public enum RevokeChatFolderLinkError {
} }
func _internal_deleteChatFolderLink(account: Account, filterId: Int32, link: ExportedChatFolderLink) -> Signal<Never, RevokeChatFolderLinkError> { func _internal_deleteChatFolderLink(account: Account, filterId: Int32, link: ExportedChatFolderLink) -> Signal<Never, RevokeChatFolderLinkError> {
return account.network.request(Api.functions.communities.deleteExportedInvite(community: .inputCommunityDialogFilter(filterId: filterId), slug: link.slug)) return account.network.request(Api.functions.chatlists.deleteExportedInvite(chatlist: .inputChatlistDialogFilter(filterId: filterId), slug: link.slug))
|> mapError { error -> RevokeChatFolderLinkError in |> mapError { error -> RevokeChatFolderLinkError in
return .generic return .generic
} }
@ -255,14 +260,14 @@ public final class ChatFolderLinkContents {
} }
func _internal_checkChatFolderLink(account: Account, slug: String) -> Signal<ChatFolderLinkContents, CheckChatFolderLinkError> { func _internal_checkChatFolderLink(account: Account, slug: String) -> Signal<ChatFolderLinkContents, CheckChatFolderLinkError> {
return account.network.request(Api.functions.communities.checkCommunityInvite(slug: slug)) return account.network.request(Api.functions.chatlists.checkChatlistInvite(slug: slug))
|> mapError { _ -> CheckChatFolderLinkError in |> mapError { _ -> CheckChatFolderLinkError in
return .generic return .generic
} }
|> mapToSignal { result -> Signal<ChatFolderLinkContents, CheckChatFolderLinkError> in |> mapToSignal { result -> Signal<ChatFolderLinkContents, CheckChatFolderLinkError> in
return account.postbox.transaction { transaction -> ChatFolderLinkContents in return account.postbox.transaction { transaction -> ChatFolderLinkContents in
switch result { switch result {
case let .communityInvite(_, title, emoticon, peers, chats, users): case let .chatlistInvite(_, title, emoticon, peers, chats, users):
let _ = emoticon let _ = emoticon
var allPeers: [Peer] = [] var allPeers: [Peer] = []
@ -304,7 +309,7 @@ func _internal_checkChatFolderLink(account: Account, slug: String) -> Signal<Cha
alreadyMemberPeerIds.removeAll() alreadyMemberPeerIds.removeAll()
return ChatFolderLinkContents(localFilterId: nil, title: title, peers: resultPeers, alreadyMemberPeerIds: alreadyMemberPeerIds, memberCounts: memberCounts) return ChatFolderLinkContents(localFilterId: nil, title: title, peers: resultPeers, alreadyMemberPeerIds: alreadyMemberPeerIds, memberCounts: memberCounts)
case let .communityInviteAlready(filterId, missingPeers, alreadyPeers, chats, users): case let .chatlistInviteAlready(filterId, missingPeers, alreadyPeers, chats, users):
let _ = alreadyPeers let _ = alreadyPeers
var allPeers: [Peer] = [] var allPeers: [Peer] = []
@ -375,6 +380,12 @@ func _internal_checkChatFolderLink(account: Account, slug: String) -> Signal<Cha
} }
} }
|> castError(CheckChatFolderLinkError.self) |> castError(CheckChatFolderLinkError.self)
|> mapToSignal { result -> Signal<ChatFolderLinkContents, CheckChatFolderLinkError> in
if result.localFilterId == nil && result.peers.isEmpty {
return .fail(.generic)
}
return .single(result)
}
} }
} }
@ -410,7 +421,7 @@ func _internal_joinChatFolderLink(account: Account, slug: String, peerIds: [Engi
} }
|> castError(JoinChatFolderLinkError.self) |> castError(JoinChatFolderLinkError.self)
|> mapToSignal { inputPeers, newChatCount -> Signal<JoinChatFolderResult, JoinChatFolderLinkError> in |> mapToSignal { inputPeers, newChatCount -> Signal<JoinChatFolderResult, JoinChatFolderLinkError> in
return account.network.request(Api.functions.communities.joinCommunityInvite(slug: slug, peers: inputPeers)) return account.network.request(Api.functions.chatlists.joinChatlistInvite(slug: slug, peers: inputPeers))
|> `catch` { error -> Signal<Api.Updates, JoinChatFolderLinkError> in |> `catch` { error -> Signal<Api.Updates, JoinChatFolderLinkError> in
if error.errorDescription == "USER_CHANNELS_TOO_MUCH" { if error.errorDescription == "USER_CHANNELS_TOO_MUCH" {
return account.postbox.transaction { transaction -> (AppConfiguration, Bool) in return account.postbox.transaction { transaction -> (AppConfiguration, Bool) in
@ -442,7 +453,7 @@ func _internal_joinChatFolderLink(account: Account, slug: String, peerIds: [Engi
return .fail(.dialogFilterLimitExceeded(limit: userDefaultLimits.maxFoldersCount, premiumLimit: userPremiumLimits.maxFoldersCount)) return .fail(.dialogFilterLimitExceeded(limit: userDefaultLimits.maxFoldersCount, premiumLimit: userPremiumLimits.maxFoldersCount))
} }
} }
} else if error.errorDescription == "COMMUNITIES_TOO_MUCH" { } else if error.errorDescription == "CHATLISTS_TOO_MUCH" {
return account.postbox.transaction { transaction -> (AppConfiguration, Bool) in return account.postbox.transaction { transaction -> (AppConfiguration, Bool) in
return (currentAppConfiguration(transaction: transaction), transaction.getPeer(account.peerId)?.isPremium ?? false) return (currentAppConfiguration(transaction: transaction), transaction.getPeer(account.peerId)?.isPremium ?? false)
} }
@ -551,7 +562,7 @@ func _internal_pollChatFolderUpdatesOnce(account: Account, folderId: Int32) -> S
var updateInterval: Int32 = 3600 var updateInterval: Int32 = 3600
if let data = appConfig.data { if let data = appConfig.data {
if let value = data["community_update_period"] as? Double { if let value = data["chatlist_update_period"] as? Double {
updateInterval = Int32(value) updateInterval = Int32(value)
} }
} }
@ -569,9 +580,9 @@ func _internal_pollChatFolderUpdatesOnce(account: Account, folderId: Int32) -> S
firstTimeFolderUpdates.insert(key) firstTimeFolderUpdates.insert(key)
} }
return account.network.request(Api.functions.communities.getCommunityUpdates(community: .inputCommunityDialogFilter(filterId: folderId))) return account.network.request(Api.functions.chatlists.getChatlistUpdates(chatlist: .inputChatlistDialogFilter(filterId: folderId)))
|> map(Optional.init) |> map(Optional.init)
|> `catch` { _ -> Signal<Api.communities.CommunityUpdates?, NoError> in |> `catch` { _ -> Signal<Api.chatlists.ChatlistUpdates?, NoError> in
return .single(nil) return .single(nil)
} }
|> mapToSignal { result -> Signal<Never, NoError> in |> mapToSignal { result -> Signal<Never, NoError> in
@ -589,7 +600,7 @@ func _internal_pollChatFolderUpdatesOnce(account: Account, folderId: Int32) -> S
|> ignoreValues |> ignoreValues
} }
switch result { switch result {
case let .communityUpdates(missingPeers, chats, users): case let .chatlistUpdates(missingPeers, chats, users):
return account.postbox.transaction { transaction -> Void in return account.postbox.transaction { transaction -> Void in
var peers: [Peer] = [] var peers: [Peer] = []
var peerPresences: [PeerId: Api.User] = [:] var peerPresences: [PeerId: Api.User] = [:]
@ -682,7 +693,7 @@ func _internal_joinAvailableChatsInFolder(account: Account, updates: ChatFolderU
} }
|> castError(JoinChatFolderLinkError.self) |> castError(JoinChatFolderLinkError.self)
|> mapToSignal { inputPeers -> Signal<Never, JoinChatFolderLinkError> in |> mapToSignal { inputPeers -> Signal<Never, JoinChatFolderLinkError> in
return account.network.request(Api.functions.communities.joinCommunityUpdates(community: .inputCommunityDialogFilter(filterId: updates.folderId), peers: inputPeers)) return account.network.request(Api.functions.chatlists.joinChatlistUpdates(chatlist: .inputChatlistDialogFilter(filterId: updates.folderId), peers: inputPeers))
|> `catch` { error -> Signal<Api.Updates, JoinChatFolderLinkError> in |> `catch` { error -> Signal<Api.Updates, JoinChatFolderLinkError> in
if error.errorDescription == "DIALOG_FILTERS_TOO_MUCH" { if error.errorDescription == "DIALOG_FILTERS_TOO_MUCH" {
return account.postbox.transaction { transaction -> (AppConfiguration, Bool) in return account.postbox.transaction { transaction -> (AppConfiguration, Bool) in
@ -737,7 +748,7 @@ func _internal_hideChatFolderUpdates(account: Account, folderId: Int32) -> Signa
}) })
} }
|> mapToSignal { _ -> Signal<Never, NoError> in |> mapToSignal { _ -> Signal<Never, NoError> in
return account.network.request(Api.functions.communities.hideCommunityUpdates(community: .inputCommunityDialogFilter(filterId: folderId))) return account.network.request(Api.functions.chatlists.hideChatlistUpdates(chatlist: .inputChatlistDialogFilter(filterId: folderId)))
|> `catch` { _ -> Signal<Api.Bool, NoError> in |> `catch` { _ -> Signal<Api.Bool, NoError> in
return .single(.boolFalse) return .single(.boolFalse)
} }
@ -750,7 +761,7 @@ func _internal_leaveChatFolder(account: Account, folderId: Int32, removePeerIds:
return removePeerIds.compactMap(transaction.getPeer).compactMap(apiInputPeer) return removePeerIds.compactMap(transaction.getPeer).compactMap(apiInputPeer)
} }
|> mapToSignal { inputPeers -> Signal<Never, NoError> in |> mapToSignal { inputPeers -> Signal<Never, NoError> in
return account.network.request(Api.functions.communities.leaveCommunity(community: .inputCommunityDialogFilter(filterId: folderId), peers: inputPeers)) return account.network.request(Api.functions.chatlists.leaveChatlist(chatlist: .inputChatlistDialogFilter(filterId: folderId), peers: inputPeers))
|> map(Optional.init) |> map(Optional.init)
|> `catch` { _ -> Signal<Api.Updates?, NoError> in |> `catch` { _ -> Signal<Api.Updates?, NoError> in
return .single(nil) return .single(nil)
@ -767,7 +778,7 @@ func _internal_leaveChatFolder(account: Account, folderId: Int32, removePeerIds:
} }
func _internal_requestLeaveChatFolderSuggestions(account: Account, folderId: Int32) -> Signal<[EnginePeer.Id], NoError> { func _internal_requestLeaveChatFolderSuggestions(account: Account, folderId: Int32) -> Signal<[EnginePeer.Id], NoError> {
return account.network.request(Api.functions.communities.getLeaveCommunitySuggestions(community: .inputCommunityDialogFilter(filterId: folderId))) return account.network.request(Api.functions.chatlists.getLeaveChatlistSuggestions(chatlist: .inputChatlistDialogFilter(filterId: folderId)))
|> map { result -> [EnginePeer.Id] in |> map { result -> [EnginePeer.Id] in
return result.map(\.peerId) return result.map(\.peerId)
} }

View File

@ -141,7 +141,7 @@ func _internal_setChatWallpaper(account: Account, peerId: PeerId, wallpaper: Tel
inputSettings = inputWallpaperAndInputSettings.1 inputSettings = inputWallpaperAndInputSettings.1
} }
return account.network.request(Api.functions.messages.setChatWallPaper(peer: inputPeer, wallpaper: inputWallpaper ?? .inputWallPaperNoFile(id: 0), settings: inputSettings ?? apiWallpaperSettings(WallpaperSettings()))) return account.network.request(Api.functions.messages.setChatWallPaper(flags: 0, peer: inputPeer, wallpaper: inputWallpaper ?? .inputWallPaperNoFile(id: 0), settings: inputSettings ?? apiWallpaperSettings(WallpaperSettings()), id: nil))
|> `catch` { error in |> `catch` { error in
return .complete() return .complete()
} }

View File

@ -130,7 +130,7 @@ public func uploadWallpaper(account: Account, resource: MediaResource, mimeType:
case let .progress(progress): case let .progress(progress):
return .single((.progress(progress), result.resource)) return .single((.progress(progress), result.resource))
case let .inputFile(file): case let .inputFile(file):
return account.network.request(Api.functions.account.uploadWallPaper(file: file, mimeType: mimeType, settings: apiWallpaperSettings(settings))) return account.network.request(Api.functions.account.uploadWallPaper(flags: 0, file: file, mimeType: mimeType, settings: apiWallpaperSettings(settings)))
|> mapError { _ in return UploadWallpaperError.generic } |> mapError { _ in return UploadWallpaperError.generic }
|> map { wallpaper -> (UploadWallpaperStatus, MediaResource?) in |> map { wallpaper -> (UploadWallpaperStatus, MediaResource?) in
return (.complete(TelegramWallpaper(apiWallpaper: wallpaper)), result.resource) return (.complete(TelegramWallpaper(apiWallpaper: wallpaper)), result.resource)

View File

@ -832,9 +832,23 @@ private final class ChatFolderLinkPreviewScreenComponent: Component {
//TODO:localize //TODO:localize
let presentationData = context.sharedContext.currentPresentationData.with({ $0 }) let presentationData = context.sharedContext.currentPresentationData.with({ $0 })
if case .updates = component.subject { if case .updates = component.subject {
chatListController.present(UndoOverlayController(presentationData: presentationData, content: .info(title: "Folder \(result.title) Updated", text: "You have joined \(result.newChatCount) new chats", timeout: nil), elevatedLayout: false, action: { _ in true }), in: .current) let chatCountString: String
if result.newChatCount == 1 {
chatCountString = "1 new chat"
} else {
chatCountString = "\(result.newChatCount) new chats"
}
chatListController.present(UndoOverlayController(presentationData: presentationData, content: .info(title: "Folder \(result.title) Updated", text: "You have joined \(chatCountString)", timeout: nil), elevatedLayout: false, action: { _ in true }), in: .current)
} else if result.newChatCount != 0 { } else if result.newChatCount != 0 {
chatListController.present(UndoOverlayController(presentationData: presentationData, content: .info(title: "Folder \(result.title) Added", text: "You also joined \(result.newChatCount) chats", timeout: nil), elevatedLayout: false, action: { _ in true }), in: .current) let chatCountString: String
if result.newChatCount == 1 {
chatCountString = "1 chat"
} else {
chatCountString = "\(result.newChatCount) chats"
}
chatListController.present(UndoOverlayController(presentationData: presentationData, content: .info(title: "Folder \(result.title) Added", text: "You also joined \(chatCountString)", timeout: nil), elevatedLayout: false, action: { _ in true }), in: .current)
} else { } else {
chatListController.present(UndoOverlayController(presentationData: presentationData, content: .info(title: nil, text: "Folder \(result.title) Added", timeout: nil), elevatedLayout: false, action: { _ in true }), in: .current) chatListController.present(UndoOverlayController(presentationData: presentationData, content: .info(title: nil, text: "Folder \(result.title) Added", timeout: nil), elevatedLayout: false, action: { _ in true }), in: .current)
} }