diff --git a/TelegramCore/Api.swift b/TelegramCore/Api.swift index dd360435c9..36e4a76c89 100644 --- a/TelegramCore/Api.swift +++ b/TelegramCore/Api.swift @@ -202,8 +202,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-471670279] = { return Api.ChannelParticipant.parse_channelParticipantCreator($0) } dict[-1557620115] = { return Api.ChannelParticipant.parse_channelParticipantSelf($0) } dict[-1473271656] = { return Api.ChannelParticipant.parse_channelParticipantAdmin($0) } - dict[871546323] = { return Api.ChannelParticipant.parse_channelParticipantBanned($0) } - dict[-1933187430] = { return Api.ChannelParticipant.parse_channelParticipantKicked($0) } + dict[573315206] = { return Api.ChannelParticipant.parse_channelParticipantBanned($0) } dict[471043349] = { return Api.contacts.Blocked.parse_blocked($0) } dict[-1878523231] = { return Api.contacts.Blocked.parse_blockedSlice($0) } dict[-994444869] = { return Api.Error.parse_error($0) } @@ -7055,8 +7054,7 @@ public struct Api { case channelParticipantCreator(userId: Int32) case channelParticipantSelf(userId: Int32, inviterId: Int32, date: Int32) case channelParticipantAdmin(flags: Int32, userId: Int32, inviterId: Int32, promotedBy: Int32, date: Int32, adminRights: Api.ChannelAdminRights) - case channelParticipantBanned(userId: Int32, kickedBy: Int32, date: Int32, bannedRights: Api.ChannelBannedRights) - case channelParticipantKicked(userId: Int32, kickedBy: Int32, date: Int32) + case channelParticipantBanned(flags: Int32, userId: Int32, kickedBy: Int32, date: Int32, bannedRights: Api.ChannelBannedRights) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) -> Swift.Bool { switch self { @@ -7092,23 +7090,16 @@ public struct Api { serializeInt32(date, buffer: buffer, boxed: false) adminRights.serialize(buffer, true) break - case .channelParticipantBanned(let userId, let kickedBy, let date, let bannedRights): + case .channelParticipantBanned(let flags, let userId, let kickedBy, let date, let bannedRights): if boxed { - buffer.appendInt32(871546323) + buffer.appendInt32(573315206) } + serializeInt32(flags, buffer: buffer, boxed: false) serializeInt32(userId, buffer: buffer, boxed: false) serializeInt32(kickedBy, buffer: buffer, boxed: false) serializeInt32(date, buffer: buffer, boxed: false) bannedRights.serialize(buffer, true) break - case .channelParticipantKicked(let userId, let kickedBy, let date): - if boxed { - buffer.appendInt32(-1933187430) - } - serializeInt32(userId, buffer: buffer, boxed: false) - serializeInt32(kickedBy, buffer: buffer, boxed: false) - serializeInt32(date, buffer: buffer, boxed: false) - break } return true } @@ -7190,33 +7181,19 @@ public struct Api { _2 = reader.readInt32() var _3: Int32? _3 = reader.readInt32() - var _4: Api.ChannelBannedRights? + var _4: Int32? + _4 = reader.readInt32() + var _5: Api.ChannelBannedRights? if let signature = reader.readInt32() { - _4 = Api.parse(reader, signature: signature) as? Api.ChannelBannedRights + _5 = Api.parse(reader, signature: signature) as? Api.ChannelBannedRights } let _c1 = _1 != nil let _c2 = _2 != nil let _c3 = _3 != nil let _c4 = _4 != nil - if _c1 && _c2 && _c3 && _c4 { - return Api.ChannelParticipant.channelParticipantBanned(userId: _1!, kickedBy: _2!, date: _3!, bannedRights: _4!) - } - else { - return nil - } - } - fileprivate static func parse_channelParticipantKicked(_ reader: BufferReader) -> ChannelParticipant? { - var _1: Int32? - _1 = reader.readInt32() - var _2: Int32? - _2 = reader.readInt32() - var _3: Int32? - _3 = reader.readInt32() - let _c1 = _1 != nil - let _c2 = _2 != nil - let _c3 = _3 != nil - if _c1 && _c2 && _c3 { - return Api.ChannelParticipant.channelParticipantKicked(userId: _1!, kickedBy: _2!, date: _3!) + let _c5 = _5 != nil + if _c1 && _c2 && _c3 && _c4 && _c5 { + return Api.ChannelParticipant.channelParticipantBanned(flags: _1!, userId: _2!, kickedBy: _3!, date: _4!, bannedRights: _5!) } else { return nil @@ -7234,10 +7211,8 @@ public struct Api { return "(channelParticipantSelf userId: \(userId), inviterId: \(inviterId), date: \(date))" case .channelParticipantAdmin(let flags, let userId, let inviterId, let promotedBy, let date, let adminRights): return "(channelParticipantAdmin flags: \(flags), userId: \(userId), inviterId: \(inviterId), promotedBy: \(promotedBy), date: \(date), adminRights: \(adminRights))" - case .channelParticipantBanned(let userId, let kickedBy, let date, let bannedRights): - return "(channelParticipantBanned userId: \(userId), kickedBy: \(kickedBy), date: \(date), bannedRights: \(bannedRights))" - case .channelParticipantKicked(let userId, let kickedBy, let date): - return "(channelParticipantKicked userId: \(userId), kickedBy: \(kickedBy), date: \(date))" + case .channelParticipantBanned(let flags, let userId, let kickedBy, let date, let bannedRights): + return "(channelParticipantBanned flags: \(flags), userId: \(userId), kickedBy: \(kickedBy), date: \(date), bannedRights: \(bannedRights))" } } } diff --git a/TelegramCore/CachedChannelParticipants.swift b/TelegramCore/CachedChannelParticipants.swift index b4ea35f2a3..39f2afbdf5 100644 --- a/TelegramCore/CachedChannelParticipants.swift +++ b/TelegramCore/CachedChannelParticipants.swift @@ -43,24 +43,28 @@ public struct ChannelParticipantAdminInfo: Coding, Equatable { public struct ChannelParticipantBannedInfo: Coding, Equatable { public let rights: TelegramChannelBannedRights public let restrictedBy: PeerId + public let isMember: Bool - public init(rights: TelegramChannelBannedRights, restrictedBy: PeerId) { + public init(rights: TelegramChannelBannedRights, restrictedBy: PeerId, isMember: Bool) { self.rights = rights self.restrictedBy = restrictedBy + self.isMember = isMember } public init(decoder: Decoder) { self.rights = decoder.decodeObjectForKey("r", decoder: { TelegramChannelBannedRights(decoder: $0) }) as! TelegramChannelBannedRights self.restrictedBy = PeerId(decoder.decodeInt64ForKey("p", orElse: 0)) + self.isMember = decoder.decodeInt32ForKey("m", orElse: 0) != 0 } public func encode(_ encoder: Encoder) { encoder.encodeObject(self.rights, forKey: "r") encoder.encodeInt64(self.restrictedBy.toInt64(), forKey: "p") + encoder.encodeInt32(self.isMember ? 1 : 0, forKey: "m") } public static func ==(lhs: ChannelParticipantBannedInfo, rhs: ChannelParticipantBannedInfo) -> Bool { - return lhs.rights == rhs.rights && lhs.restrictedBy == rhs.restrictedBy + return lhs.rights == rhs.rights && lhs.restrictedBy == rhs.restrictedBy && lhs.isMember == rhs.isMember } } @@ -168,11 +172,9 @@ extension ChannelParticipant { self = .member(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: userId), invitedAt: date, adminInfo: nil, banInfo: nil) case let .channelParticipantCreator(userId): self = .creator(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: userId)) - case let .channelParticipantKicked(userId, restrictedBy, date): - let banInfo = ChannelParticipantBannedInfo(rights: TelegramChannelBannedRights(flags: [.banReadMessages], untilDate: Int32.max), restrictedBy: PeerId(namespace: Namespaces.Peer.CloudUser, id: restrictedBy)) - self = .member(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: userId), invitedAt: date, adminInfo: nil, banInfo: banInfo) - case let .channelParticipantBanned(userId, restrictedBy, date, bannedRights): - let banInfo = ChannelParticipantBannedInfo(rights: TelegramChannelBannedRights(apiBannedRights: bannedRights), restrictedBy: PeerId(namespace: Namespaces.Peer.CloudUser, id: restrictedBy)) + case let .channelParticipantBanned(flags, userId, restrictedBy, date, bannedRights): + let hasLeft = (flags & (1 << 0)) != 0 + let banInfo = ChannelParticipantBannedInfo(rights: TelegramChannelBannedRights(apiBannedRights: bannedRights), restrictedBy: PeerId(namespace: Namespaces.Peer.CloudUser, id: restrictedBy), isMember: !hasLeft) self = .member(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: userId), invitedAt: date, adminInfo: nil, banInfo: banInfo) case let .channelParticipantAdmin(flags, userId, _, promotedBy, date, adminRights): self = .member(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: userId), invitedAt: date, adminInfo: ChannelParticipantAdminInfo(rights: TelegramChannelAdminRights(apiAdminRights: adminRights), promotedBy: PeerId(namespace: Namespaces.Peer.CloudUser, id: promotedBy), canBeEditedByAccountPeer: (flags & (1 << 0)) != 0), banInfo: nil)