diff --git a/TelegramCore.xcodeproj/project.pbxproj b/TelegramCore.xcodeproj/project.pbxproj index 63080d5951..8103df37cc 100644 --- a/TelegramCore.xcodeproj/project.pbxproj +++ b/TelegramCore.xcodeproj/project.pbxproj @@ -19,6 +19,8 @@ C239BE981E62F0D200C2C453 /* LoadMessagesIfNecessary.swift in Sources */ = {isa = PBXBuildFile; fileRef = C239BE961E62EE1E00C2C453 /* LoadMessagesIfNecessary.swift */; }; C239BE9C1E630CA700C2C453 /* UpdatePinnedMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C239BE9B1E630CA700C2C453 /* UpdatePinnedMessage.swift */; }; C239BE9D1E630CB300C2C453 /* UpdatePinnedMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C239BE9B1E630CA700C2C453 /* UpdatePinnedMessage.swift */; }; + C23BC3871E9BE3CA00D79F92 /* ImportContact.swift in Sources */ = {isa = PBXBuildFile; fileRef = C23BC3861E9BE3CA00D79F92 /* ImportContact.swift */; }; + C23BC3881E9BE3CB00D79F92 /* ImportContact.swift in Sources */ = {isa = PBXBuildFile; fileRef = C23BC3861E9BE3CA00D79F92 /* ImportContact.swift */; }; C251D7431E65E50500283EDE /* StickerSetInstallation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C251D7421E65E50500283EDE /* StickerSetInstallation.swift */; }; C251D7441E65E50500283EDE /* StickerSetInstallation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C251D7421E65E50500283EDE /* StickerSetInstallation.swift */; }; C25638021E79E7FC00311607 /* TwoStepVerification.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0FA0ABC1E76C908005BB9B7 /* TwoStepVerification.swift */; }; @@ -509,6 +511,7 @@ C2366C881E4F40480097CCFF /* SupportPeerId.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SupportPeerId.swift; sourceTree = ""; }; C239BE961E62EE1E00C2C453 /* LoadMessagesIfNecessary.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoadMessagesIfNecessary.swift; sourceTree = ""; }; C239BE9B1E630CA700C2C453 /* UpdatePinnedMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UpdatePinnedMessage.swift; sourceTree = ""; }; + C23BC3861E9BE3CA00D79F92 /* ImportContact.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImportContact.swift; sourceTree = ""; }; C251D7421E65E50500283EDE /* StickerSetInstallation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StickerSetInstallation.swift; sourceTree = ""; }; C27982501E72C97800262BFD /* MacosLegacy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MacosLegacy.swift; sourceTree = ""; }; C27982521E73077800262BFD /* SecretChatStateBridge.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SecretChatStateBridge.swift; sourceTree = ""; }; @@ -1291,6 +1294,7 @@ C2FD33EA1E696C78008D13D4 /* GroupsInCommon.swift */, D0C48F3B1E8142EF0075317D /* LoadedPeerFromMessage.swift */, D0F3A8A71E82CD7D00B4C64C /* UpdatePeerChatInterfaceState.swift */, + C23BC3861E9BE3CA00D79F92 /* ImportContact.swift */, ); name = Peers; sourceTree = ""; @@ -1579,6 +1583,7 @@ D049EAD51E43D98500A2CD3A /* RecentMediaItem.swift in Sources */, D0C50E341E93A86600F62E39 /* CallSessionManager.swift in Sources */, D00D34421E6EDD2E0057B307 /* ManagedSynchronizeConsumeMessageContentsOperations.swift in Sources */, + C23BC3871E9BE3CA00D79F92 /* ImportContact.swift in Sources */, D03B0D0A1D62255C00955575 /* Holes.swift in Sources */, D0B843CB1DA7FF30005F29E1 /* NBPhoneNumberUtil.m in Sources */, D03B0D5E1D631A6900955575 /* Network.swift in Sources */, @@ -1802,6 +1807,7 @@ D03C536A1DAD5CA9004C17B3 /* TelegramUser.swift in Sources */, D001F3EA1E128A1C007A8C60 /* TelegramPeerNotificationSettings.swift in Sources */, D0FA8BA81E1FA6DF001E855B /* TelegramSecretChat.swift in Sources */, + C23BC3881E9BE3CB00D79F92 /* ImportContact.swift in Sources */, D001F3EB1E128A1C007A8C60 /* EnqueueMessage.swift in Sources */, D00C7CEC1E37A8540080C3D5 /* SetSecretChatMessageAutoremoveTimeoutInteractively.swift in Sources */, D0B844481DAB91FD005F29E1 /* ManagedMessageHistoryHoles.swift in Sources */, diff --git a/TelegramCore/DeleteMessagesInteractively.swift b/TelegramCore/DeleteMessagesInteractively.swift index eeb8c87b1d..a77166cbdd 100644 --- a/TelegramCore/DeleteMessagesInteractively.swift +++ b/TelegramCore/DeleteMessagesInteractively.swift @@ -86,3 +86,47 @@ public func clearHistoryInteractively(postbox: Postbox, peerId: PeerId) -> Signa } } } + +public func clearAuthorHistory(account: Account, peerId: PeerId, memberId:PeerId) -> Signal { + return account.postbox.modify { modifier -> Signal in + + if let peer = modifier.getPeer(peerId), let memberPeer = modifier.getPeer(memberId), let inputChannel = apiInputChannel(peer), let inputUser = apiInputUser(memberPeer) { + + let signal = account.network.request(Api.functions.channels.deleteUserHistory(channel: inputChannel, userId: inputUser)) + |> map { result -> Api.messages.AffectedHistory? in + return result + } + |> `catch` { _ -> Signal in + return .fail(false) + } + |> mapToSignal { result -> Signal in + if let result = result { + switch result { + case let .affectedHistory(pts, ptsCount, offset): + account.stateManager.addUpdateGroups([.updatePts(pts: pts, ptsCount: ptsCount)]) + if offset == 0 { + return .fail(true) + } else { + return .complete() + } + } + } else { + return .fail(true) + } + } + return (signal |> restart) + |> `catch` { success -> Signal in + if success { + return account.postbox.modify { modifier -> Void in + modifier.removeAllMessagesWithAuthor(peerId, authorId: memberId) + } + } else { + return .complete() + } + } + } else { + return .complete() + } + } |> switchToLatest +} + diff --git a/TelegramCore/ImportContact.swift b/TelegramCore/ImportContact.swift new file mode 100644 index 0000000000..77ae965e6f --- /dev/null +++ b/TelegramCore/ImportContact.swift @@ -0,0 +1,43 @@ +#if os(macOS) + import PostboxMac + import SwiftSignalKitMac +#else + import Postbox + import SwiftSignalKit +#endif + +public func importContact(account:Account, firstName:String, lastName:String, phoneNumber:String) -> Signal { + + let input = Api.InputContact.inputPhoneContact(clientId: 1, phone: phoneNumber, firstName: firstName, lastName: lastName) + + return account.network.request(Api.functions.contacts.importContacts(contacts: [input], replace: .boolFalse)) + |> map { Optional($0) } + |> `catch` { _ -> Signal in + return .single(nil) + } + |> mapToSignal { result -> Signal in + return account.postbox.modify { modifier -> PeerId? in + if let result = result { + switch result { + case let .importedContacts(_, _, users): + if let first = users.first { + let user = TelegramUser(user: first) + let peerId = user.id + updatePeers(modifier: modifier, peers: [user], update: { _, updated in + return updated + }) + var peerIds = modifier.getContactPeerIds() + if !peerIds.contains(peerId) { + peerIds.insert(peerId) + modifier.replaceContactPeerIds(peerIds) + } + return peerId + } + + } + } + return nil + } + } + +} diff --git a/TelegramCore/PeerAdmins.swift b/TelegramCore/PeerAdmins.swift index ca34c577dd..c48995f4f8 100644 --- a/TelegramCore/PeerAdmins.swift +++ b/TelegramCore/PeerAdmins.swift @@ -120,7 +120,7 @@ public func addPeerAdmin(account: Account, peerId: PeerId, adminId: PeerId) -> S return account.postbox.modify { modifier -> Signal in if let peer = modifier.getPeer(peerId), let adminPeer = modifier.getPeer(adminId), let inputUser = apiInputUser(adminPeer) { if let channel = peer as? TelegramChannel, let inputChannel = apiInputChannel(channel) { - return account.network.request(Api.functions.channels.editAdmin(channel: inputChannel, userId: inputUser, role: .channelRoleModerator)) + return account.network.request(Api.functions.channels.editAdmin(channel: inputChannel, userId: inputUser, role: .channelRoleEditor)) |> map { [$0] } |> `catch` { error -> Signal<[Api.Updates], AddPeerAdminError> in if error.errorDescription == "USER_NOT_PARTICIPANT" { diff --git a/TelegramCore/ReportPeer.swift b/TelegramCore/ReportPeer.swift index eb6fe642ea..c08e6cf2eb 100644 --- a/TelegramCore/ReportPeer.swift +++ b/TelegramCore/ReportPeer.swift @@ -107,6 +107,16 @@ public func reportPeer(account: Account, peerId:PeerId, reason:ReportPeerReason) } |> switchToLatest } +public func reportSupergroupPeer(account: Account, peerId:PeerId, memberId:PeerId, messageIds:[MessageId]) -> Signal { + return account.postbox.modify { modifier -> Signal in + if let peer = modifier.getPeer(peerId), let inputPeer = apiInputChannel(peer), let memberPeer = modifier.getPeer(memberId), let inputMember = apiInputUser(memberPeer) { + return account.network.request(Api.functions.channels.reportSpam(channel: inputPeer, userId: inputMember, id: messageIds.map({$0.id}))) |> mapError {_ in} |> map {_ in} + } else { + return .complete() + } + } |> switchToLatest +} + public func dismissReportPeer(account: Account, peerId: PeerId) -> Signal { return account.postbox.modify { modifier -> Signal in modifier.updatePeerCachedData(peerIds: Set([peerId]), update: { _, current in diff --git a/TelegramCore/StoreMessage_Telegram.swift b/TelegramCore/StoreMessage_Telegram.swift index 0f4c86bfba..751f539f8b 100644 --- a/TelegramCore/StoreMessage_Telegram.swift +++ b/TelegramCore/StoreMessage_Telegram.swift @@ -442,6 +442,10 @@ extension StoreMessage { let _ = storeFlags.insert(.Incoming) } + if (flags & (1 << 4)) != 0 { + let _ = storeFlags.insert(.Personal) + } + var media: [Media] = [] if let action = telegramMediaActionFromApiAction(action) { media.append(action)