mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-10-09 03:20:48 +00:00
Update API
This commit is contained in:
parent
0192d976c8
commit
f0336cd98a
@ -941,7 +941,12 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController
|
||||
|
||||
self.chatListDisplayNode.mainContainerNode.present = { [weak self] c in
|
||||
if let strongSelf = self {
|
||||
strongSelf.present(c, in: .window(.root))
|
||||
if c is UndoOverlayController {
|
||||
strongSelf.dismissAllUndoControllers()
|
||||
strongSelf.present(c, in: .current)
|
||||
} else {
|
||||
strongSelf.present(c, in: .window(.root))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -708,7 +708,7 @@ private func mappedInsertEntries(context: AccountContext, nodeInteraction: ChatL
|
||||
case .premiumUpgrade, .premiumAnnualDiscount, .premiumRestore:
|
||||
nodeInteraction?.openPremiumIntro()
|
||||
case .reviewLogin:
|
||||
nodeInteraction?.openActiveSessions()
|
||||
break
|
||||
}
|
||||
case .hide:
|
||||
switch notice {
|
||||
@ -1028,7 +1028,7 @@ private func mappedUpdateEntries(context: AccountContext, nodeInteraction: ChatL
|
||||
case .premiumUpgrade, .premiumAnnualDiscount, .premiumRestore:
|
||||
nodeInteraction?.openPremiumIntro()
|
||||
case .reviewLogin:
|
||||
nodeInteraction?.openActiveSessions()
|
||||
break
|
||||
}
|
||||
case .hide:
|
||||
switch notice {
|
||||
@ -1623,7 +1623,7 @@ public final class ChatListNode: ListView {
|
||||
animationBackgroundColor = UIColor(rgb: 0x474747)
|
||||
}
|
||||
//TODO:localize
|
||||
self.present?(UndoOverlayController(presentationData: presentationData, content: .universal(animation: "anim_success", scale: 1.0, colors: ["info1.info1.stroke": animationBackgroundColor, "info2.info2.Fill": animationBackgroundColor], title: "New Login Allowed", text: "You can check the list of your active logins in [Settings > Devices]().", customUndoText: nil, timeout: 5), elevatedLayout: true, action: { [weak self] action in
|
||||
self.present?(UndoOverlayController(presentationData: presentationData, content: .universal(animation: "anim_success", scale: 1.0, colors: ["info1.info1.stroke": animationBackgroundColor, "info2.info2.Fill": animationBackgroundColor], title: "New Login Allowed", text: "You can check the list of your active logins in [Settings > Devices]().", customUndoText: nil, timeout: 5), elevatedLayout: false, action: { [weak self] action in
|
||||
switch action {
|
||||
case .info:
|
||||
self?.interaction?.openActiveSessions()
|
||||
|
@ -804,7 +804,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
|
||||
dict[1374088783] = { return Api.StoryItem.parse_storyItemDeleted($0) }
|
||||
dict[-5388013] = { return Api.StoryItem.parse_storyItemSkipped($0) }
|
||||
dict[-1329730875] = { return Api.StoryView.parse_storyView($0) }
|
||||
dict[-968094825] = { return Api.StoryViews.parse_storyViews($0) }
|
||||
dict[-1923523370] = { return Api.StoryViews.parse_storyViews($0) }
|
||||
dict[1964978502] = { return Api.TextWithEntities.parse_textWithEntities($0) }
|
||||
dict[-1609668650] = { return Api.Theme.parse_theme($0) }
|
||||
dict[-94849324] = { return Api.ThemeSettings.parse_themeSettings($0) }
|
||||
|
@ -610,17 +610,23 @@ public extension Api {
|
||||
}
|
||||
public extension Api {
|
||||
enum StoryViews: TypeConstructorDescription {
|
||||
case storyViews(flags: Int32, viewsCount: Int32, reactionsCount: Int32, recentViewers: [Int64]?)
|
||||
case storyViews(flags: Int32, viewsCount: Int32, forwardsCount: Int32?, reactions: [Api.ReactionCount]?, reactionsCount: Int32?, recentViewers: [Int64]?)
|
||||
|
||||
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
|
||||
switch self {
|
||||
case .storyViews(let flags, let viewsCount, let reactionsCount, let recentViewers):
|
||||
case .storyViews(let flags, let viewsCount, let forwardsCount, let reactions, let reactionsCount, let recentViewers):
|
||||
if boxed {
|
||||
buffer.appendInt32(-968094825)
|
||||
buffer.appendInt32(-1923523370)
|
||||
}
|
||||
serializeInt32(flags, buffer: buffer, boxed: false)
|
||||
serializeInt32(viewsCount, buffer: buffer, boxed: false)
|
||||
serializeInt32(reactionsCount, buffer: buffer, boxed: false)
|
||||
if Int(flags) & Int(1 << 2) != 0 {serializeInt32(forwardsCount!, buffer: buffer, boxed: false)}
|
||||
if Int(flags) & Int(1 << 3) != 0 {buffer.appendInt32(481674261)
|
||||
buffer.appendInt32(Int32(reactions!.count))
|
||||
for item in reactions! {
|
||||
item.serialize(buffer, true)
|
||||
}}
|
||||
if Int(flags) & Int(1 << 4) != 0 {serializeInt32(reactionsCount!, buffer: buffer, boxed: false)}
|
||||
if Int(flags) & Int(1 << 0) != 0 {buffer.appendInt32(481674261)
|
||||
buffer.appendInt32(Int32(recentViewers!.count))
|
||||
for item in recentViewers! {
|
||||
@ -632,8 +638,8 @@ public extension Api {
|
||||
|
||||
public func descriptionFields() -> (String, [(String, Any)]) {
|
||||
switch self {
|
||||
case .storyViews(let flags, let viewsCount, let reactionsCount, let recentViewers):
|
||||
return ("storyViews", [("flags", flags as Any), ("viewsCount", viewsCount as Any), ("reactionsCount", reactionsCount as Any), ("recentViewers", recentViewers as Any)])
|
||||
case .storyViews(let flags, let viewsCount, let forwardsCount, let reactions, let reactionsCount, let recentViewers):
|
||||
return ("storyViews", [("flags", flags as Any), ("viewsCount", viewsCount as Any), ("forwardsCount", forwardsCount as Any), ("reactions", reactions as Any), ("reactionsCount", reactionsCount as Any), ("recentViewers", recentViewers as Any)])
|
||||
}
|
||||
}
|
||||
|
||||
@ -643,17 +649,25 @@ public extension Api {
|
||||
var _2: Int32?
|
||||
_2 = reader.readInt32()
|
||||
var _3: Int32?
|
||||
_3 = reader.readInt32()
|
||||
var _4: [Int64]?
|
||||
if Int(_1!) & Int(1 << 2) != 0 {_3 = reader.readInt32() }
|
||||
var _4: [Api.ReactionCount]?
|
||||
if Int(_1!) & Int(1 << 3) != 0 {if let _ = reader.readInt32() {
|
||||
_4 = Api.parseVector(reader, elementSignature: 0, elementType: Api.ReactionCount.self)
|
||||
} }
|
||||
var _5: Int32?
|
||||
if Int(_1!) & Int(1 << 4) != 0 {_5 = reader.readInt32() }
|
||||
var _6: [Int64]?
|
||||
if Int(_1!) & Int(1 << 0) != 0 {if let _ = reader.readInt32() {
|
||||
_4 = Api.parseVector(reader, elementSignature: 570911930, elementType: Int64.self)
|
||||
_6 = Api.parseVector(reader, elementSignature: 570911930, elementType: Int64.self)
|
||||
} }
|
||||
let _c1 = _1 != nil
|
||||
let _c2 = _2 != nil
|
||||
let _c3 = _3 != nil
|
||||
let _c4 = (Int(_1!) & Int(1 << 0) == 0) || _4 != nil
|
||||
if _c1 && _c2 && _c3 && _c4 {
|
||||
return Api.StoryViews.storyViews(flags: _1!, viewsCount: _2!, reactionsCount: _3!, recentViewers: _4)
|
||||
let _c3 = (Int(_1!) & Int(1 << 2) == 0) || _3 != nil
|
||||
let _c4 = (Int(_1!) & Int(1 << 3) == 0) || _4 != nil
|
||||
let _c5 = (Int(_1!) & Int(1 << 4) == 0) || _5 != nil
|
||||
let _c6 = (Int(_1!) & Int(1 << 0) == 0) || _6 != nil
|
||||
if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 {
|
||||
return Api.StoryViews.storyViews(flags: _1!, viewsCount: _2!, forwardsCount: _3, reactions: _4, reactionsCount: _5, recentViewers: _6)
|
||||
}
|
||||
else {
|
||||
return nil
|
||||
|
@ -1,7 +1,7 @@
|
||||
import Postbox
|
||||
import TelegramApi
|
||||
|
||||
public struct MessageReaction: Equatable, PostboxCoding {
|
||||
public struct MessageReaction: Equatable, PostboxCoding, Codable {
|
||||
public enum Reaction: Hashable, Codable, PostboxCoding {
|
||||
case builtin(String)
|
||||
case custom(Int64)
|
||||
@ -75,6 +75,24 @@ public struct MessageReaction: Equatable, PostboxCoding {
|
||||
}
|
||||
}
|
||||
|
||||
public init(from decoder: Decoder) throws {
|
||||
let container = try decoder.container(keyedBy: StringCodingKey.self)
|
||||
|
||||
if let value = try container.decodeIfPresent(String.self, forKey: "v") {
|
||||
self.value = .builtin(value)
|
||||
} else {
|
||||
self.value = .custom(try container.decode(Int64.self, forKey: "cfid"))
|
||||
}
|
||||
self.count = try container.decode(Int32.self, forKey: "c")
|
||||
if let chosenOrder = try container.decodeIfPresent(Int32.self, forKey: "s") {
|
||||
self.chosenOrder = Int(chosenOrder)
|
||||
} else if let isSelected = try container.decodeIfPresent(Int32.self, forKey: "s"), isSelected != 0 {
|
||||
self.chosenOrder = 0
|
||||
} else {
|
||||
self.chosenOrder = nil
|
||||
}
|
||||
}
|
||||
|
||||
public func encode(_ encoder: PostboxEncoder) {
|
||||
switch self.value {
|
||||
case let .builtin(value):
|
||||
@ -89,6 +107,19 @@ public struct MessageReaction: Equatable, PostboxCoding {
|
||||
encoder.encodeNil(forKey: "cord")
|
||||
}
|
||||
}
|
||||
|
||||
public func encode(to encoder: Encoder) throws {
|
||||
var container = encoder.container(keyedBy: StringCodingKey.self)
|
||||
|
||||
switch self.value {
|
||||
case let .builtin(value):
|
||||
try container.encode(value, forKey: "v")
|
||||
case let .custom(fileId):
|
||||
try container.encode(fileId, forKey: "cfid")
|
||||
}
|
||||
try container.encode(self.count, forKey: "c")
|
||||
try container.encodeIfPresent(self.chosenOrder.flatMap(Int32.init), forKey: "cord")
|
||||
}
|
||||
}
|
||||
|
||||
extension MessageReaction.Reaction {
|
||||
|
@ -358,7 +358,14 @@ public final class EngineStoryViewListContext {
|
||||
mediaAreas: item.mediaAreas,
|
||||
text: item.text,
|
||||
entities: item.entities,
|
||||
views: Stories.Item.Views(seenCount: Int(count), reactedCount: Int(reactionsCount), seenPeerIds: currentViews.seenPeerIds, hasList: currentViews.hasList),
|
||||
views: Stories.Item.Views(
|
||||
seenCount: Int(count),
|
||||
reactedCount: Int(reactionsCount),
|
||||
forwardCount: currentViews.forwardCount,
|
||||
seenPeerIds: currentViews.seenPeerIds,
|
||||
reactions: currentViews.reactions,
|
||||
hasList: currentViews.hasList
|
||||
),
|
||||
privacy: item.privacy,
|
||||
isPinned: item.isPinned,
|
||||
isExpired: item.isExpired,
|
||||
@ -387,7 +394,14 @@ public final class EngineStoryViewListContext {
|
||||
mediaAreas: item.mediaAreas,
|
||||
text: item.text,
|
||||
entities: item.entities,
|
||||
views: Stories.Item.Views(seenCount: Int(count), reactedCount: Int(reactionsCount), seenPeerIds: currentViews.seenPeerIds, hasList: currentViews.hasList),
|
||||
views: Stories.Item.Views(
|
||||
seenCount: Int(count),
|
||||
reactedCount: Int(reactionsCount),
|
||||
forwardCount: currentViews.forwardCount,
|
||||
seenPeerIds: currentViews.seenPeerIds,
|
||||
reactions: currentViews.reactions,
|
||||
hasList: currentViews.hasList
|
||||
),
|
||||
privacy: item.privacy,
|
||||
isPinned: item.isPinned,
|
||||
isExpired: item.isExpired,
|
||||
|
@ -42,19 +42,25 @@ public enum Stories {
|
||||
private enum CodingKeys: String, CodingKey {
|
||||
case seenCount = "seenCount"
|
||||
case reactedCount = "reactedCount"
|
||||
case forwardCount = "forwardCount"
|
||||
case seenPeerIds = "seenPeerIds"
|
||||
case reactions = "reactions"
|
||||
case hasList = "hasList"
|
||||
}
|
||||
|
||||
public var seenCount: Int
|
||||
public var reactedCount: Int
|
||||
public var forwardCount: Int
|
||||
public var seenPeerIds: [PeerId]
|
||||
public var reactions: [MessageReaction]
|
||||
public var hasList: Bool
|
||||
|
||||
public init(seenCount: Int, reactedCount: Int, seenPeerIds: [PeerId], hasList: Bool) {
|
||||
public init(seenCount: Int, reactedCount: Int, forwardCount: Int, seenPeerIds: [PeerId], reactions: [MessageReaction], hasList: Bool) {
|
||||
self.seenCount = seenCount
|
||||
self.reactedCount = reactedCount
|
||||
self.forwardCount = forwardCount
|
||||
self.seenPeerIds = seenPeerIds
|
||||
self.reactions = reactions
|
||||
self.hasList = hasList
|
||||
}
|
||||
|
||||
@ -63,7 +69,9 @@ public enum Stories {
|
||||
|
||||
self.seenCount = Int(try container.decode(Int32.self, forKey: .seenCount))
|
||||
self.reactedCount = Int(try container.decodeIfPresent(Int32.self, forKey: .reactedCount) ?? 0)
|
||||
self.forwardCount = Int(try container.decodeIfPresent(Int32.self, forKey: .forwardCount) ?? 0)
|
||||
self.seenPeerIds = try container.decode([Int64].self, forKey: .seenPeerIds).map(PeerId.init)
|
||||
self.reactions = try container.decodeIfPresent([MessageReaction].self, forKey: .reactions) ?? []
|
||||
self.hasList = try container.decodeIfPresent(Bool.self, forKey: .hasList) ?? true
|
||||
}
|
||||
|
||||
@ -72,7 +80,9 @@ public enum Stories {
|
||||
|
||||
try container.encode(Int32(clamping: self.seenCount), forKey: .seenCount)
|
||||
try container.encode(Int32(clamping: self.reactedCount), forKey: .reactedCount)
|
||||
try container.encode(Int32(clamping: self.forwardCount), forKey: .forwardCount)
|
||||
try container.encode(self.seenPeerIds.map { $0.toInt64() }, forKey: .seenPeerIds)
|
||||
try container.encode(self.reactions, forKey: .reactions)
|
||||
try container.encode(self.hasList, forKey: .hasList)
|
||||
}
|
||||
}
|
||||
@ -1445,13 +1455,32 @@ extension Api.StoryItem {
|
||||
extension Stories.Item.Views {
|
||||
init(apiViews: Api.StoryViews) {
|
||||
switch apiViews {
|
||||
case let .storyViews(flags, viewsCount, reactionsCount, recentViewers):
|
||||
case let .storyViews(flags, viewsCount, forwardsCount, reactions, reactionsCount, recentViewers):
|
||||
//storyViews#8d595cd6 flags:# has_viewers:flags.1?true views_count:int forwards_count:flags.2?int reactions:flags.3?Vector<ReactionCount> reactions_count:flags.4?int recent_viewers:flags.0?Vector<long> = StoryViews;
|
||||
let hasList = (flags & (1 << 1)) != 0
|
||||
var seenPeerIds: [PeerId] = []
|
||||
if let recentViewers = recentViewers {
|
||||
seenPeerIds = recentViewers.map { PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value($0)) }
|
||||
}
|
||||
self.init(seenCount: Int(viewsCount), reactedCount: Int(reactionsCount), seenPeerIds: seenPeerIds, hasList: hasList)
|
||||
var mappedReactions: [MessageReaction] = []
|
||||
if let reactions = reactions {
|
||||
for result in reactions {
|
||||
switch result {
|
||||
case let .reactionCount(_, chosenOrder, reaction, count):
|
||||
if let reaction = MessageReaction.Reaction(apiReaction: reaction) {
|
||||
mappedReactions.append(MessageReaction(value: reaction, count: count, chosenOrder: chosenOrder.flatMap(Int.init)))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
self.init(
|
||||
seenCount: Int(viewsCount),
|
||||
reactedCount: Int(reactionsCount ?? 0),
|
||||
forwardCount: Int(forwardsCount ?? 0),
|
||||
seenPeerIds: seenPeerIds,
|
||||
reactions: mappedReactions,
|
||||
hasList: hasList
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -14,13 +14,17 @@ public final class EngineStoryItem: Equatable {
|
||||
public final class Views: Equatable {
|
||||
public let seenCount: Int
|
||||
public let reactedCount: Int
|
||||
public var forwardCount: Int
|
||||
public let seenPeers: [EnginePeer]
|
||||
public let reactions: [MessageReaction]
|
||||
public let hasList: Bool
|
||||
|
||||
public init(seenCount: Int, reactedCount: Int, seenPeers: [EnginePeer], hasList: Bool) {
|
||||
public init(seenCount: Int, reactedCount: Int, forwardCount: Int, seenPeers: [EnginePeer], reactions: [MessageReaction], hasList: Bool) {
|
||||
self.seenCount = seenCount
|
||||
self.reactedCount = reactedCount
|
||||
self.forwardCount = forwardCount
|
||||
self.seenPeers = seenPeers
|
||||
self.reactions = reactions
|
||||
self.hasList = hasList
|
||||
}
|
||||
|
||||
@ -31,9 +35,15 @@ public final class EngineStoryItem: Equatable {
|
||||
if lhs.reactedCount != rhs.reactedCount {
|
||||
return false
|
||||
}
|
||||
if lhs.forwardCount != rhs.forwardCount {
|
||||
return false
|
||||
}
|
||||
if lhs.seenPeers != rhs.seenPeers {
|
||||
return false
|
||||
}
|
||||
if lhs.reactions != rhs.reactions {
|
||||
return false
|
||||
}
|
||||
if lhs.hasList != rhs.hasList {
|
||||
return false
|
||||
}
|
||||
@ -159,7 +169,9 @@ extension EngineStoryItem {
|
||||
return Stories.Item.Views(
|
||||
seenCount: views.seenCount,
|
||||
reactedCount: views.reactedCount,
|
||||
forwardCount: views.forwardCount,
|
||||
seenPeerIds: views.seenPeers.map(\.id),
|
||||
reactions: views.reactions,
|
||||
hasList: views.hasList
|
||||
)
|
||||
},
|
||||
@ -533,9 +545,11 @@ public final class PeerStoryListContext {
|
||||
return EngineStoryItem.Views(
|
||||
seenCount: views.seenCount,
|
||||
reactedCount: views.reactedCount,
|
||||
forwardCount: views.forwardCount,
|
||||
seenPeers: views.seenPeerIds.compactMap { id -> EnginePeer? in
|
||||
return transaction.getPeer(id).flatMap(EnginePeer.init)
|
||||
},
|
||||
reactions: views.reactions,
|
||||
hasList: views.hasList
|
||||
)
|
||||
},
|
||||
@ -661,9 +675,11 @@ public final class PeerStoryListContext {
|
||||
return EngineStoryItem.Views(
|
||||
seenCount: views.seenCount,
|
||||
reactedCount: views.reactedCount,
|
||||
forwardCount: views.forwardCount,
|
||||
seenPeers: views.seenPeerIds.compactMap { id -> EnginePeer? in
|
||||
return transaction.getPeer(id).flatMap(EnginePeer.init)
|
||||
},
|
||||
reactions: views.reactions,
|
||||
hasList: views.hasList
|
||||
)
|
||||
},
|
||||
@ -813,9 +829,11 @@ public final class PeerStoryListContext {
|
||||
return EngineStoryItem.Views(
|
||||
seenCount: views.seenCount,
|
||||
reactedCount: views.reactedCount,
|
||||
forwardCount: views.forwardCount,
|
||||
seenPeers: views.seenPeerIds.compactMap { id -> EnginePeer? in
|
||||
return peers[id].flatMap(EnginePeer.init)
|
||||
},
|
||||
reactions: views.reactions,
|
||||
hasList: views.hasList
|
||||
)
|
||||
},
|
||||
@ -856,9 +874,11 @@ public final class PeerStoryListContext {
|
||||
return EngineStoryItem.Views(
|
||||
seenCount: views.seenCount,
|
||||
reactedCount: views.reactedCount,
|
||||
forwardCount: views.forwardCount,
|
||||
seenPeers: views.seenPeerIds.compactMap { id -> EnginePeer? in
|
||||
return peers[id].flatMap(EnginePeer.init)
|
||||
},
|
||||
reactions: views.reactions,
|
||||
hasList: views.hasList
|
||||
)
|
||||
},
|
||||
@ -901,9 +921,11 @@ public final class PeerStoryListContext {
|
||||
return EngineStoryItem.Views(
|
||||
seenCount: views.seenCount,
|
||||
reactedCount: views.reactedCount,
|
||||
forwardCount: views.forwardCount,
|
||||
seenPeers: views.seenPeerIds.compactMap { id -> EnginePeer? in
|
||||
return peers[id].flatMap(EnginePeer.init)
|
||||
},
|
||||
reactions: views.reactions,
|
||||
hasList: views.hasList
|
||||
)
|
||||
},
|
||||
@ -942,9 +964,11 @@ public final class PeerStoryListContext {
|
||||
return EngineStoryItem.Views(
|
||||
seenCount: views.seenCount,
|
||||
reactedCount: views.reactedCount,
|
||||
forwardCount: views.forwardCount,
|
||||
seenPeers: views.seenPeerIds.compactMap { id -> EnginePeer? in
|
||||
return peers[id].flatMap(EnginePeer.init)
|
||||
},
|
||||
reactions: views.reactions,
|
||||
hasList: views.hasList
|
||||
)
|
||||
},
|
||||
@ -1107,9 +1131,11 @@ public final class PeerExpiringStoryListContext {
|
||||
return EngineStoryItem.Views(
|
||||
seenCount: views.seenCount,
|
||||
reactedCount: views.reactedCount,
|
||||
forwardCount: views.forwardCount,
|
||||
seenPeers: views.seenPeerIds.compactMap { id -> EnginePeer? in
|
||||
return transaction.getPeer(id).flatMap(EnginePeer.init)
|
||||
},
|
||||
reactions: views.reactions,
|
||||
hasList: views.hasList
|
||||
)
|
||||
},
|
||||
|
@ -169,9 +169,11 @@ public final class StoryContentContextImpl: StoryContentContext {
|
||||
return EngineStoryItem.Views(
|
||||
seenCount: views.seenCount,
|
||||
reactedCount: views.reactedCount,
|
||||
forwardCount: views.forwardCount,
|
||||
seenPeers: views.seenPeerIds.compactMap { id -> EnginePeer? in
|
||||
return peers[id].flatMap(EnginePeer.init)
|
||||
},
|
||||
reactions: views.reactions,
|
||||
hasList: views.hasList
|
||||
)
|
||||
},
|
||||
@ -1076,9 +1078,11 @@ public final class SingleStoryContentContextImpl: StoryContentContext {
|
||||
return EngineStoryItem.Views(
|
||||
seenCount: views.seenCount,
|
||||
reactedCount: views.reactedCount,
|
||||
forwardCount: views.forwardCount,
|
||||
seenPeers: views.seenPeerIds.compactMap { id -> EnginePeer? in
|
||||
return peers[id].flatMap(EnginePeer.init)
|
||||
},
|
||||
reactions: views.reactions,
|
||||
hasList: views.hasList
|
||||
)
|
||||
},
|
||||
|
Loading…
x
Reference in New Issue
Block a user