mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-08-08 08:31:13 +00:00
Merge branch 'features/comments'
This commit is contained in:
commit
714dbad948
@ -3,7 +3,7 @@
|
|||||||
@implementation Serialization
|
@implementation Serialization
|
||||||
|
|
||||||
- (NSUInteger)currentLayer {
|
- (NSUInteger)currentLayer {
|
||||||
return 120;
|
return 119;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (id _Nullable)parseMessage:(NSData * _Nullable)data {
|
- (id _Nullable)parseMessage:(NSData * _Nullable)data {
|
||||||
|
@ -2607,6 +2607,7 @@ Unused sets are archived when you add more.";
|
|||||||
"Channel.AdminLog.CanInviteUsers" = "Add Users";
|
"Channel.AdminLog.CanInviteUsers" = "Add Users";
|
||||||
"Channel.AdminLog.CanPinMessages" = "Pin Messages";
|
"Channel.AdminLog.CanPinMessages" = "Pin Messages";
|
||||||
"Channel.AdminLog.CanAddAdmins" = "Add New Admins";
|
"Channel.AdminLog.CanAddAdmins" = "Add New Admins";
|
||||||
|
"Channel.AdminLog.CanBeAnonymous" = "Remain Anonymous";
|
||||||
"Channel.AdminLog.CanEditMessages" = "Edit Messages";
|
"Channel.AdminLog.CanEditMessages" = "Edit Messages";
|
||||||
|
|
||||||
"Channel.AdminLog.MessageToggleInvitesOn" = "%@ enabled group invites";
|
"Channel.AdminLog.MessageToggleInvitesOn" = "%@ enabled group invites";
|
||||||
@ -5786,3 +5787,5 @@ Any member of this group will be able to see messages in the channel.";
|
|||||||
"ChatList.Search.Music_3_10" = "%@ audio files";
|
"ChatList.Search.Music_3_10" = "%@ audio files";
|
||||||
"ChatList.Search.Music_many" = "%@ audio files";
|
"ChatList.Search.Music_many" = "%@ audio files";
|
||||||
"ChatList.Search.Music_any" = "%@ audio files";
|
"ChatList.Search.Music_any" = "%@ audio files";
|
||||||
|
|
||||||
|
"Conversation.InputTextAnonymousPlaceholder" = "Send anonymously";
|
||||||
|
5793
Telegram/Telegram-iOS/en.lproj/Localizable.strings.orig
Normal file
5793
Telegram/Telegram-iOS/en.lproj/Localizable.strings.orig
Normal file
File diff suppressed because it is too large
Load Diff
@ -15,8 +15,8 @@ public enum ChatHistoryLocation: Equatable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public struct ChatHistoryLocationInput: Equatable {
|
public struct ChatHistoryLocationInput: Equatable {
|
||||||
public let content: ChatHistoryLocation
|
public var content: ChatHistoryLocation
|
||||||
public let id: Int32
|
public var id: Int32
|
||||||
|
|
||||||
public init(content: ChatHistoryLocation, id: Int32) {
|
public init(content: ChatHistoryLocation, id: Int32) {
|
||||||
self.content = content
|
self.content = content
|
||||||
|
@ -487,6 +487,8 @@ private func stringForRight(strings: PresentationStrings, right: TelegramChatAdm
|
|||||||
return strings.Channel_EditAdmin_PermissionPinMessages
|
return strings.Channel_EditAdmin_PermissionPinMessages
|
||||||
} else if right.contains(.canAddAdmins) {
|
} else if right.contains(.canAddAdmins) {
|
||||||
return strings.Channel_EditAdmin_PermissionAddAdmins
|
return strings.Channel_EditAdmin_PermissionAddAdmins
|
||||||
|
} else if right.contains(.canBeAnonymous) {
|
||||||
|
return strings.Channel_AdminLog_CanBeAnonymous
|
||||||
} else {
|
} else {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
@ -509,6 +511,8 @@ private func rightDependencies(_ right: TelegramChatAdminRightsFlags) -> [Telegr
|
|||||||
return []
|
return []
|
||||||
} else if right.contains(.canAddAdmins) {
|
} else if right.contains(.canAddAdmins) {
|
||||||
return []
|
return []
|
||||||
|
} else if right.contains(.canBeAnonymous) {
|
||||||
|
return []
|
||||||
} else {
|
} else {
|
||||||
return []
|
return []
|
||||||
}
|
}
|
||||||
@ -607,11 +611,43 @@ private func channelAdminControllerEntries(presentationData: PresentationData, s
|
|||||||
.canBanUsers,
|
.canBanUsers,
|
||||||
.canInviteUsers,
|
.canInviteUsers,
|
||||||
.canPinMessages,
|
.canPinMessages,
|
||||||
|
.canBeAnonymous,
|
||||||
.canAddAdmins
|
.canAddAdmins
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
if isCreator {
|
if isCreator {
|
||||||
|
if isGroup {
|
||||||
|
entries.append(.rightsTitle(presentationData.theme, presentationData.strings.Channel_EditAdmin_PermissionsHeader))
|
||||||
|
|
||||||
|
let accountUserRightsFlags: TelegramChatAdminRightsFlags
|
||||||
|
if channel.flags.contains(.isCreator) {
|
||||||
|
accountUserRightsFlags = maskRightsFlags
|
||||||
|
} else if let adminRights = channel.adminRights {
|
||||||
|
accountUserRightsFlags = maskRightsFlags.intersection(adminRights.flags)
|
||||||
|
} else {
|
||||||
|
accountUserRightsFlags = []
|
||||||
|
}
|
||||||
|
|
||||||
|
let currentRightsFlags: TelegramChatAdminRightsFlags
|
||||||
|
if let updatedFlags = state.updatedFlags {
|
||||||
|
currentRightsFlags = updatedFlags
|
||||||
|
} else if let initialParticipant = initialParticipant, case let .member(_, _, maybeAdminRights, _, _) = initialParticipant, let adminRights = maybeAdminRights {
|
||||||
|
currentRightsFlags = adminRights.rights.flags
|
||||||
|
} else if let initialParticipant = initialParticipant, case let .creator(_, maybeAdminRights, _) = initialParticipant, let adminRights = maybeAdminRights {
|
||||||
|
currentRightsFlags = adminRights.rights.flags
|
||||||
|
} else {
|
||||||
|
currentRightsFlags = accountUserRightsFlags.subtracting(.canAddAdmins)
|
||||||
|
}
|
||||||
|
|
||||||
|
var index = 0
|
||||||
|
for right in rightsOrder {
|
||||||
|
if accountUserRightsFlags.contains(right) {
|
||||||
|
entries.append(.rightItem(presentationData.theme, index, stringForRight(strings: presentationData.strings, right: right, isGroup: isGroup, defaultBannedRights: channel.defaultBannedRights), right, currentRightsFlags, currentRightsFlags.contains(right), right == .canBeAnonymous))
|
||||||
|
index += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
entries.append(.rightsTitle(presentationData.theme, presentationData.strings.Channel_EditAdmin_PermissionsHeader))
|
entries.append(.rightsTitle(presentationData.theme, presentationData.strings.Channel_EditAdmin_PermissionsHeader))
|
||||||
|
|
||||||
@ -731,6 +767,7 @@ private func channelAdminControllerEntries(presentationData: PresentationData, s
|
|||||||
.canBanUsers,
|
.canBanUsers,
|
||||||
.canInviteUsers,
|
.canInviteUsers,
|
||||||
.canPinMessages,
|
.canPinMessages,
|
||||||
|
.canBeAnonymous,
|
||||||
.canAddAdmins
|
.canAddAdmins
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@ public struct TelegramChatAdminRightsFlags: OptionSet {
|
|||||||
public static let canInviteUsers = TelegramChatAdminRightsFlags(rawValue: 1 << 5)
|
public static let canInviteUsers = TelegramChatAdminRightsFlags(rawValue: 1 << 5)
|
||||||
public static let canPinMessages = TelegramChatAdminRightsFlags(rawValue: 1 << 7)
|
public static let canPinMessages = TelegramChatAdminRightsFlags(rawValue: 1 << 7)
|
||||||
public static let canAddAdmins = TelegramChatAdminRightsFlags(rawValue: 1 << 9)
|
public static let canAddAdmins = TelegramChatAdminRightsFlags(rawValue: 1 << 9)
|
||||||
|
public static let canBeAnonymous = TelegramChatAdminRightsFlags(rawValue: 1 << 10)
|
||||||
|
|
||||||
public static var groupSpecific: TelegramChatAdminRightsFlags = [
|
public static var groupSpecific: TelegramChatAdminRightsFlags = [
|
||||||
.canChangeInfo,
|
.canChangeInfo,
|
||||||
@ -26,6 +27,7 @@ public struct TelegramChatAdminRightsFlags: OptionSet {
|
|||||||
.canBanUsers,
|
.canBanUsers,
|
||||||
.canInviteUsers,
|
.canInviteUsers,
|
||||||
.canPinMessages,
|
.canPinMessages,
|
||||||
|
.canBeAnonymous,
|
||||||
.canAddAdmins
|
.canAddAdmins
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -550,12 +550,12 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
|
|||||||
dict[-1387279939] = { return Api.MessageInteractionCounters.parse_messageInteractionCounters($0) }
|
dict[-1387279939] = { return Api.MessageInteractionCounters.parse_messageInteractionCounters($0) }
|
||||||
dict[-1107852396] = { return Api.stats.BroadcastStats.parse_broadcastStats($0) }
|
dict[-1107852396] = { return Api.stats.BroadcastStats.parse_broadcastStats($0) }
|
||||||
dict[-484987010] = { return Api.Updates.parse_updatesTooLong($0) }
|
dict[-484987010] = { return Api.Updates.parse_updatesTooLong($0) }
|
||||||
dict[-1857044719] = { return Api.Updates.parse_updateShortMessage($0) }
|
|
||||||
dict[377562760] = { return Api.Updates.parse_updateShortChatMessage($0) }
|
|
||||||
dict[2027216577] = { return Api.Updates.parse_updateShort($0) }
|
dict[2027216577] = { return Api.Updates.parse_updateShort($0) }
|
||||||
dict[1918567619] = { return Api.Updates.parse_updatesCombined($0) }
|
dict[1918567619] = { return Api.Updates.parse_updatesCombined($0) }
|
||||||
dict[1957577280] = { return Api.Updates.parse_updates($0) }
|
dict[1957577280] = { return Api.Updates.parse_updates($0) }
|
||||||
dict[301019932] = { return Api.Updates.parse_updateShortSentMessage($0) }
|
dict[301019932] = { return Api.Updates.parse_updateShortSentMessage($0) }
|
||||||
|
dict[580309704] = { return Api.Updates.parse_updateShortMessage($0) }
|
||||||
|
dict[1076714939] = { return Api.Updates.parse_updateShortChatMessage($0) }
|
||||||
dict[-276825834] = { return Api.stats.MegagroupStats.parse_megagroupStats($0) }
|
dict[-276825834] = { return Api.stats.MegagroupStats.parse_megagroupStats($0) }
|
||||||
dict[-884757282] = { return Api.StatsAbsValueAndPrev.parse_statsAbsValueAndPrev($0) }
|
dict[-884757282] = { return Api.StatsAbsValueAndPrev.parse_statsAbsValueAndPrev($0) }
|
||||||
dict[1038967584] = { return Api.MessageMedia.parse_messageMediaEmpty($0) }
|
dict[1038967584] = { return Api.MessageMedia.parse_messageMediaEmpty($0) }
|
||||||
@ -607,7 +607,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
|
|||||||
dict[-1820043071] = { return Api.User.parse_user($0) }
|
dict[-1820043071] = { return Api.User.parse_user($0) }
|
||||||
dict[-2082087340] = { return Api.Message.parse_messageEmpty($0) }
|
dict[-2082087340] = { return Api.Message.parse_messageEmpty($0) }
|
||||||
dict[998150060] = { return Api.Message.parse_message($0) }
|
dict[998150060] = { return Api.Message.parse_message($0) }
|
||||||
dict[797820163] = { return Api.Message.parse_messageService($0) }
|
dict[-1245570157] = { return Api.Message.parse_messageService($0) }
|
||||||
dict[831924812] = { return Api.StatsGroupTopInviter.parse_statsGroupTopInviter($0) }
|
dict[831924812] = { return Api.StatsGroupTopInviter.parse_statsGroupTopInviter($0) }
|
||||||
dict[186120336] = { return Api.messages.RecentStickers.parse_recentStickersNotModified($0) }
|
dict[186120336] = { return Api.messages.RecentStickers.parse_recentStickersNotModified($0) }
|
||||||
dict[586395571] = { return Api.messages.RecentStickers.parse_recentStickers($0) }
|
dict[586395571] = { return Api.messages.RecentStickers.parse_recentStickers($0) }
|
||||||
|
@ -15841,12 +15841,12 @@ public extension Api {
|
|||||||
}
|
}
|
||||||
public enum Updates: TypeConstructorDescription {
|
public enum Updates: TypeConstructorDescription {
|
||||||
case updatesTooLong
|
case updatesTooLong
|
||||||
case updateShortMessage(flags: Int32, id: Int32, userId: Int32, message: String, pts: Int32, ptsCount: Int32, date: Int32, fwdFrom: Api.MessageFwdHeader?, viaBotId: Int32?, replyToMsgId: Int32?, entities: [Api.MessageEntity]?)
|
|
||||||
case updateShortChatMessage(flags: Int32, id: Int32, fromId: Int32, chatId: Int32, message: String, pts: Int32, ptsCount: Int32, date: Int32, fwdFrom: Api.MessageFwdHeader?, viaBotId: Int32?, replyToMsgId: Int32?, entities: [Api.MessageEntity]?)
|
|
||||||
case updateShort(update: Api.Update, date: Int32)
|
case updateShort(update: Api.Update, date: Int32)
|
||||||
case updatesCombined(updates: [Api.Update], users: [Api.User], chats: [Api.Chat], date: Int32, seqStart: Int32, seq: Int32)
|
case updatesCombined(updates: [Api.Update], users: [Api.User], chats: [Api.Chat], date: Int32, seqStart: Int32, seq: Int32)
|
||||||
case updates(updates: [Api.Update], users: [Api.User], chats: [Api.Chat], date: Int32, seq: Int32)
|
case updates(updates: [Api.Update], users: [Api.User], chats: [Api.Chat], date: Int32, seq: Int32)
|
||||||
case updateShortSentMessage(flags: Int32, id: Int32, pts: Int32, ptsCount: Int32, date: Int32, media: Api.MessageMedia?, entities: [Api.MessageEntity]?)
|
case updateShortSentMessage(flags: Int32, id: Int32, pts: Int32, ptsCount: Int32, date: Int32, media: Api.MessageMedia?, entities: [Api.MessageEntity]?)
|
||||||
|
case updateShortMessage(flags: Int32, id: Int32, userId: Int32, message: String, pts: Int32, ptsCount: Int32, date: Int32, fwdFrom: Api.MessageFwdHeader?, viaBotId: Int32?, replyTo: Api.MessageReplyHeader?, entities: [Api.MessageEntity]?)
|
||||||
|
case updateShortChatMessage(flags: Int32, id: Int32, fromId: Int32, chatId: Int32, message: String, pts: Int32, ptsCount: Int32, date: Int32, fwdFrom: Api.MessageFwdHeader?, viaBotId: Int32?, replyTo: Api.MessageReplyHeader?, entities: [Api.MessageEntity]?)
|
||||||
|
|
||||||
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
|
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
|
||||||
switch self {
|
switch self {
|
||||||
@ -15855,47 +15855,6 @@ public extension Api {
|
|||||||
buffer.appendInt32(-484987010)
|
buffer.appendInt32(-484987010)
|
||||||
}
|
}
|
||||||
|
|
||||||
break
|
|
||||||
case .updateShortMessage(let flags, let id, let userId, let message, let pts, let ptsCount, let date, let fwdFrom, let viaBotId, let replyToMsgId, let entities):
|
|
||||||
if boxed {
|
|
||||||
buffer.appendInt32(-1857044719)
|
|
||||||
}
|
|
||||||
serializeInt32(flags, buffer: buffer, boxed: false)
|
|
||||||
serializeInt32(id, buffer: buffer, boxed: false)
|
|
||||||
serializeInt32(userId, buffer: buffer, boxed: false)
|
|
||||||
serializeString(message, buffer: buffer, boxed: false)
|
|
||||||
serializeInt32(pts, buffer: buffer, boxed: false)
|
|
||||||
serializeInt32(ptsCount, buffer: buffer, boxed: false)
|
|
||||||
serializeInt32(date, buffer: buffer, boxed: false)
|
|
||||||
if Int(flags) & Int(1 << 2) != 0 {fwdFrom!.serialize(buffer, true)}
|
|
||||||
if Int(flags) & Int(1 << 11) != 0 {serializeInt32(viaBotId!, buffer: buffer, boxed: false)}
|
|
||||||
if Int(flags) & Int(1 << 3) != 0 {serializeInt32(replyToMsgId!, buffer: buffer, boxed: false)}
|
|
||||||
if Int(flags) & Int(1 << 7) != 0 {buffer.appendInt32(481674261)
|
|
||||||
buffer.appendInt32(Int32(entities!.count))
|
|
||||||
for item in entities! {
|
|
||||||
item.serialize(buffer, true)
|
|
||||||
}}
|
|
||||||
break
|
|
||||||
case .updateShortChatMessage(let flags, let id, let fromId, let chatId, let message, let pts, let ptsCount, let date, let fwdFrom, let viaBotId, let replyToMsgId, let entities):
|
|
||||||
if boxed {
|
|
||||||
buffer.appendInt32(377562760)
|
|
||||||
}
|
|
||||||
serializeInt32(flags, buffer: buffer, boxed: false)
|
|
||||||
serializeInt32(id, buffer: buffer, boxed: false)
|
|
||||||
serializeInt32(fromId, buffer: buffer, boxed: false)
|
|
||||||
serializeInt32(chatId, buffer: buffer, boxed: false)
|
|
||||||
serializeString(message, buffer: buffer, boxed: false)
|
|
||||||
serializeInt32(pts, buffer: buffer, boxed: false)
|
|
||||||
serializeInt32(ptsCount, buffer: buffer, boxed: false)
|
|
||||||
serializeInt32(date, buffer: buffer, boxed: false)
|
|
||||||
if Int(flags) & Int(1 << 2) != 0 {fwdFrom!.serialize(buffer, true)}
|
|
||||||
if Int(flags) & Int(1 << 11) != 0 {serializeInt32(viaBotId!, buffer: buffer, boxed: false)}
|
|
||||||
if Int(flags) & Int(1 << 3) != 0 {serializeInt32(replyToMsgId!, buffer: buffer, boxed: false)}
|
|
||||||
if Int(flags) & Int(1 << 7) != 0 {buffer.appendInt32(481674261)
|
|
||||||
buffer.appendInt32(Int32(entities!.count))
|
|
||||||
for item in entities! {
|
|
||||||
item.serialize(buffer, true)
|
|
||||||
}}
|
|
||||||
break
|
break
|
||||||
case .updateShort(let update, let date):
|
case .updateShort(let update, let date):
|
||||||
if boxed {
|
if boxed {
|
||||||
@ -15965,6 +15924,47 @@ public extension Api {
|
|||||||
item.serialize(buffer, true)
|
item.serialize(buffer, true)
|
||||||
}}
|
}}
|
||||||
break
|
break
|
||||||
|
case .updateShortMessage(let flags, let id, let userId, let message, let pts, let ptsCount, let date, let fwdFrom, let viaBotId, let replyTo, let entities):
|
||||||
|
if boxed {
|
||||||
|
buffer.appendInt32(580309704)
|
||||||
|
}
|
||||||
|
serializeInt32(flags, buffer: buffer, boxed: false)
|
||||||
|
serializeInt32(id, buffer: buffer, boxed: false)
|
||||||
|
serializeInt32(userId, buffer: buffer, boxed: false)
|
||||||
|
serializeString(message, buffer: buffer, boxed: false)
|
||||||
|
serializeInt32(pts, buffer: buffer, boxed: false)
|
||||||
|
serializeInt32(ptsCount, buffer: buffer, boxed: false)
|
||||||
|
serializeInt32(date, buffer: buffer, boxed: false)
|
||||||
|
if Int(flags) & Int(1 << 2) != 0 {fwdFrom!.serialize(buffer, true)}
|
||||||
|
if Int(flags) & Int(1 << 11) != 0 {serializeInt32(viaBotId!, buffer: buffer, boxed: false)}
|
||||||
|
if Int(flags) & Int(1 << 3) != 0 {replyTo!.serialize(buffer, true)}
|
||||||
|
if Int(flags) & Int(1 << 7) != 0 {buffer.appendInt32(481674261)
|
||||||
|
buffer.appendInt32(Int32(entities!.count))
|
||||||
|
for item in entities! {
|
||||||
|
item.serialize(buffer, true)
|
||||||
|
}}
|
||||||
|
break
|
||||||
|
case .updateShortChatMessage(let flags, let id, let fromId, let chatId, let message, let pts, let ptsCount, let date, let fwdFrom, let viaBotId, let replyTo, let entities):
|
||||||
|
if boxed {
|
||||||
|
buffer.appendInt32(1076714939)
|
||||||
|
}
|
||||||
|
serializeInt32(flags, buffer: buffer, boxed: false)
|
||||||
|
serializeInt32(id, buffer: buffer, boxed: false)
|
||||||
|
serializeInt32(fromId, buffer: buffer, boxed: false)
|
||||||
|
serializeInt32(chatId, buffer: buffer, boxed: false)
|
||||||
|
serializeString(message, buffer: buffer, boxed: false)
|
||||||
|
serializeInt32(pts, buffer: buffer, boxed: false)
|
||||||
|
serializeInt32(ptsCount, buffer: buffer, boxed: false)
|
||||||
|
serializeInt32(date, buffer: buffer, boxed: false)
|
||||||
|
if Int(flags) & Int(1 << 2) != 0 {fwdFrom!.serialize(buffer, true)}
|
||||||
|
if Int(flags) & Int(1 << 11) != 0 {serializeInt32(viaBotId!, buffer: buffer, boxed: false)}
|
||||||
|
if Int(flags) & Int(1 << 3) != 0 {replyTo!.serialize(buffer, true)}
|
||||||
|
if Int(flags) & Int(1 << 7) != 0 {buffer.appendInt32(481674261)
|
||||||
|
buffer.appendInt32(Int32(entities!.count))
|
||||||
|
for item in entities! {
|
||||||
|
item.serialize(buffer, true)
|
||||||
|
}}
|
||||||
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -15972,10 +15972,6 @@ public extension Api {
|
|||||||
switch self {
|
switch self {
|
||||||
case .updatesTooLong:
|
case .updatesTooLong:
|
||||||
return ("updatesTooLong", [])
|
return ("updatesTooLong", [])
|
||||||
case .updateShortMessage(let flags, let id, let userId, let message, let pts, let ptsCount, let date, let fwdFrom, let viaBotId, let replyToMsgId, let entities):
|
|
||||||
return ("updateShortMessage", [("flags", flags), ("id", id), ("userId", userId), ("message", message), ("pts", pts), ("ptsCount", ptsCount), ("date", date), ("fwdFrom", fwdFrom), ("viaBotId", viaBotId), ("replyToMsgId", replyToMsgId), ("entities", entities)])
|
|
||||||
case .updateShortChatMessage(let flags, let id, let fromId, let chatId, let message, let pts, let ptsCount, let date, let fwdFrom, let viaBotId, let replyToMsgId, let entities):
|
|
||||||
return ("updateShortChatMessage", [("flags", flags), ("id", id), ("fromId", fromId), ("chatId", chatId), ("message", message), ("pts", pts), ("ptsCount", ptsCount), ("date", date), ("fwdFrom", fwdFrom), ("viaBotId", viaBotId), ("replyToMsgId", replyToMsgId), ("entities", entities)])
|
|
||||||
case .updateShort(let update, let date):
|
case .updateShort(let update, let date):
|
||||||
return ("updateShort", [("update", update), ("date", date)])
|
return ("updateShort", [("update", update), ("date", date)])
|
||||||
case .updatesCombined(let updates, let users, let chats, let date, let seqStart, let seq):
|
case .updatesCombined(let updates, let users, let chats, let date, let seqStart, let seq):
|
||||||
@ -15984,105 +15980,16 @@ public extension Api {
|
|||||||
return ("updates", [("updates", updates), ("users", users), ("chats", chats), ("date", date), ("seq", seq)])
|
return ("updates", [("updates", updates), ("users", users), ("chats", chats), ("date", date), ("seq", seq)])
|
||||||
case .updateShortSentMessage(let flags, let id, let pts, let ptsCount, let date, let media, let entities):
|
case .updateShortSentMessage(let flags, let id, let pts, let ptsCount, let date, let media, let entities):
|
||||||
return ("updateShortSentMessage", [("flags", flags), ("id", id), ("pts", pts), ("ptsCount", ptsCount), ("date", date), ("media", media), ("entities", entities)])
|
return ("updateShortSentMessage", [("flags", flags), ("id", id), ("pts", pts), ("ptsCount", ptsCount), ("date", date), ("media", media), ("entities", entities)])
|
||||||
|
case .updateShortMessage(let flags, let id, let userId, let message, let pts, let ptsCount, let date, let fwdFrom, let viaBotId, let replyTo, let entities):
|
||||||
|
return ("updateShortMessage", [("flags", flags), ("id", id), ("userId", userId), ("message", message), ("pts", pts), ("ptsCount", ptsCount), ("date", date), ("fwdFrom", fwdFrom), ("viaBotId", viaBotId), ("replyTo", replyTo), ("entities", entities)])
|
||||||
|
case .updateShortChatMessage(let flags, let id, let fromId, let chatId, let message, let pts, let ptsCount, let date, let fwdFrom, let viaBotId, let replyTo, let entities):
|
||||||
|
return ("updateShortChatMessage", [("flags", flags), ("id", id), ("fromId", fromId), ("chatId", chatId), ("message", message), ("pts", pts), ("ptsCount", ptsCount), ("date", date), ("fwdFrom", fwdFrom), ("viaBotId", viaBotId), ("replyTo", replyTo), ("entities", entities)])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static func parse_updatesTooLong(_ reader: BufferReader) -> Updates? {
|
public static func parse_updatesTooLong(_ reader: BufferReader) -> Updates? {
|
||||||
return Api.Updates.updatesTooLong
|
return Api.Updates.updatesTooLong
|
||||||
}
|
}
|
||||||
public static func parse_updateShortMessage(_ reader: BufferReader) -> Updates? {
|
|
||||||
var _1: Int32?
|
|
||||||
_1 = reader.readInt32()
|
|
||||||
var _2: Int32?
|
|
||||||
_2 = reader.readInt32()
|
|
||||||
var _3: Int32?
|
|
||||||
_3 = reader.readInt32()
|
|
||||||
var _4: String?
|
|
||||||
_4 = parseString(reader)
|
|
||||||
var _5: Int32?
|
|
||||||
_5 = reader.readInt32()
|
|
||||||
var _6: Int32?
|
|
||||||
_6 = reader.readInt32()
|
|
||||||
var _7: Int32?
|
|
||||||
_7 = reader.readInt32()
|
|
||||||
var _8: Api.MessageFwdHeader?
|
|
||||||
if Int(_1!) & Int(1 << 2) != 0 {if let signature = reader.readInt32() {
|
|
||||||
_8 = Api.parse(reader, signature: signature) as? Api.MessageFwdHeader
|
|
||||||
} }
|
|
||||||
var _9: Int32?
|
|
||||||
if Int(_1!) & Int(1 << 11) != 0 {_9 = reader.readInt32() }
|
|
||||||
var _10: Int32?
|
|
||||||
if Int(_1!) & Int(1 << 3) != 0 {_10 = reader.readInt32() }
|
|
||||||
var _11: [Api.MessageEntity]?
|
|
||||||
if Int(_1!) & Int(1 << 7) != 0 {if let _ = reader.readInt32() {
|
|
||||||
_11 = Api.parseVector(reader, elementSignature: 0, elementType: Api.MessageEntity.self)
|
|
||||||
} }
|
|
||||||
let _c1 = _1 != nil
|
|
||||||
let _c2 = _2 != nil
|
|
||||||
let _c3 = _3 != nil
|
|
||||||
let _c4 = _4 != nil
|
|
||||||
let _c5 = _5 != nil
|
|
||||||
let _c6 = _6 != nil
|
|
||||||
let _c7 = _7 != nil
|
|
||||||
let _c8 = (Int(_1!) & Int(1 << 2) == 0) || _8 != nil
|
|
||||||
let _c9 = (Int(_1!) & Int(1 << 11) == 0) || _9 != nil
|
|
||||||
let _c10 = (Int(_1!) & Int(1 << 3) == 0) || _10 != nil
|
|
||||||
let _c11 = (Int(_1!) & Int(1 << 7) == 0) || _11 != nil
|
|
||||||
if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 {
|
|
||||||
return Api.Updates.updateShortMessage(flags: _1!, id: _2!, userId: _3!, message: _4!, pts: _5!, ptsCount: _6!, date: _7!, fwdFrom: _8, viaBotId: _9, replyToMsgId: _10, entities: _11)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public static func parse_updateShortChatMessage(_ reader: BufferReader) -> Updates? {
|
|
||||||
var _1: Int32?
|
|
||||||
_1 = reader.readInt32()
|
|
||||||
var _2: Int32?
|
|
||||||
_2 = reader.readInt32()
|
|
||||||
var _3: Int32?
|
|
||||||
_3 = reader.readInt32()
|
|
||||||
var _4: Int32?
|
|
||||||
_4 = reader.readInt32()
|
|
||||||
var _5: String?
|
|
||||||
_5 = parseString(reader)
|
|
||||||
var _6: Int32?
|
|
||||||
_6 = reader.readInt32()
|
|
||||||
var _7: Int32?
|
|
||||||
_7 = reader.readInt32()
|
|
||||||
var _8: Int32?
|
|
||||||
_8 = reader.readInt32()
|
|
||||||
var _9: Api.MessageFwdHeader?
|
|
||||||
if Int(_1!) & Int(1 << 2) != 0 {if let signature = reader.readInt32() {
|
|
||||||
_9 = Api.parse(reader, signature: signature) as? Api.MessageFwdHeader
|
|
||||||
} }
|
|
||||||
var _10: Int32?
|
|
||||||
if Int(_1!) & Int(1 << 11) != 0 {_10 = reader.readInt32() }
|
|
||||||
var _11: Int32?
|
|
||||||
if Int(_1!) & Int(1 << 3) != 0 {_11 = reader.readInt32() }
|
|
||||||
var _12: [Api.MessageEntity]?
|
|
||||||
if Int(_1!) & Int(1 << 7) != 0 {if let _ = reader.readInt32() {
|
|
||||||
_12 = Api.parseVector(reader, elementSignature: 0, elementType: Api.MessageEntity.self)
|
|
||||||
} }
|
|
||||||
let _c1 = _1 != nil
|
|
||||||
let _c2 = _2 != nil
|
|
||||||
let _c3 = _3 != nil
|
|
||||||
let _c4 = _4 != nil
|
|
||||||
let _c5 = _5 != nil
|
|
||||||
let _c6 = _6 != nil
|
|
||||||
let _c7 = _7 != nil
|
|
||||||
let _c8 = _8 != nil
|
|
||||||
let _c9 = (Int(_1!) & Int(1 << 2) == 0) || _9 != nil
|
|
||||||
let _c10 = (Int(_1!) & Int(1 << 11) == 0) || _10 != nil
|
|
||||||
let _c11 = (Int(_1!) & Int(1 << 3) == 0) || _11 != nil
|
|
||||||
let _c12 = (Int(_1!) & Int(1 << 7) == 0) || _12 != nil
|
|
||||||
if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 && _c12 {
|
|
||||||
return Api.Updates.updateShortChatMessage(flags: _1!, id: _2!, fromId: _3!, chatId: _4!, message: _5!, pts: _6!, ptsCount: _7!, date: _8!, fwdFrom: _9, viaBotId: _10, replyToMsgId: _11, entities: _12)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public static func parse_updateShort(_ reader: BufferReader) -> Updates? {
|
public static func parse_updateShort(_ reader: BufferReader) -> Updates? {
|
||||||
var _1: Api.Update?
|
var _1: Api.Update?
|
||||||
if let signature = reader.readInt32() {
|
if let signature = reader.readInt32() {
|
||||||
@ -16193,6 +16100,103 @@ public extension Api {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public static func parse_updateShortMessage(_ reader: BufferReader) -> Updates? {
|
||||||
|
var _1: Int32?
|
||||||
|
_1 = reader.readInt32()
|
||||||
|
var _2: Int32?
|
||||||
|
_2 = reader.readInt32()
|
||||||
|
var _3: Int32?
|
||||||
|
_3 = reader.readInt32()
|
||||||
|
var _4: String?
|
||||||
|
_4 = parseString(reader)
|
||||||
|
var _5: Int32?
|
||||||
|
_5 = reader.readInt32()
|
||||||
|
var _6: Int32?
|
||||||
|
_6 = reader.readInt32()
|
||||||
|
var _7: Int32?
|
||||||
|
_7 = reader.readInt32()
|
||||||
|
var _8: Api.MessageFwdHeader?
|
||||||
|
if Int(_1!) & Int(1 << 2) != 0 {if let signature = reader.readInt32() {
|
||||||
|
_8 = Api.parse(reader, signature: signature) as? Api.MessageFwdHeader
|
||||||
|
} }
|
||||||
|
var _9: Int32?
|
||||||
|
if Int(_1!) & Int(1 << 11) != 0 {_9 = reader.readInt32() }
|
||||||
|
var _10: Api.MessageReplyHeader?
|
||||||
|
if Int(_1!) & Int(1 << 3) != 0 {if let signature = reader.readInt32() {
|
||||||
|
_10 = Api.parse(reader, signature: signature) as? Api.MessageReplyHeader
|
||||||
|
} }
|
||||||
|
var _11: [Api.MessageEntity]?
|
||||||
|
if Int(_1!) & Int(1 << 7) != 0 {if let _ = reader.readInt32() {
|
||||||
|
_11 = Api.parseVector(reader, elementSignature: 0, elementType: Api.MessageEntity.self)
|
||||||
|
} }
|
||||||
|
let _c1 = _1 != nil
|
||||||
|
let _c2 = _2 != nil
|
||||||
|
let _c3 = _3 != nil
|
||||||
|
let _c4 = _4 != nil
|
||||||
|
let _c5 = _5 != nil
|
||||||
|
let _c6 = _6 != nil
|
||||||
|
let _c7 = _7 != nil
|
||||||
|
let _c8 = (Int(_1!) & Int(1 << 2) == 0) || _8 != nil
|
||||||
|
let _c9 = (Int(_1!) & Int(1 << 11) == 0) || _9 != nil
|
||||||
|
let _c10 = (Int(_1!) & Int(1 << 3) == 0) || _10 != nil
|
||||||
|
let _c11 = (Int(_1!) & Int(1 << 7) == 0) || _11 != nil
|
||||||
|
if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 {
|
||||||
|
return Api.Updates.updateShortMessage(flags: _1!, id: _2!, userId: _3!, message: _4!, pts: _5!, ptsCount: _6!, date: _7!, fwdFrom: _8, viaBotId: _9, replyTo: _10, entities: _11)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public static func parse_updateShortChatMessage(_ reader: BufferReader) -> Updates? {
|
||||||
|
var _1: Int32?
|
||||||
|
_1 = reader.readInt32()
|
||||||
|
var _2: Int32?
|
||||||
|
_2 = reader.readInt32()
|
||||||
|
var _3: Int32?
|
||||||
|
_3 = reader.readInt32()
|
||||||
|
var _4: Int32?
|
||||||
|
_4 = reader.readInt32()
|
||||||
|
var _5: String?
|
||||||
|
_5 = parseString(reader)
|
||||||
|
var _6: Int32?
|
||||||
|
_6 = reader.readInt32()
|
||||||
|
var _7: Int32?
|
||||||
|
_7 = reader.readInt32()
|
||||||
|
var _8: Int32?
|
||||||
|
_8 = reader.readInt32()
|
||||||
|
var _9: Api.MessageFwdHeader?
|
||||||
|
if Int(_1!) & Int(1 << 2) != 0 {if let signature = reader.readInt32() {
|
||||||
|
_9 = Api.parse(reader, signature: signature) as? Api.MessageFwdHeader
|
||||||
|
} }
|
||||||
|
var _10: Int32?
|
||||||
|
if Int(_1!) & Int(1 << 11) != 0 {_10 = reader.readInt32() }
|
||||||
|
var _11: Api.MessageReplyHeader?
|
||||||
|
if Int(_1!) & Int(1 << 3) != 0 {if let signature = reader.readInt32() {
|
||||||
|
_11 = Api.parse(reader, signature: signature) as? Api.MessageReplyHeader
|
||||||
|
} }
|
||||||
|
var _12: [Api.MessageEntity]?
|
||||||
|
if Int(_1!) & Int(1 << 7) != 0 {if let _ = reader.readInt32() {
|
||||||
|
_12 = Api.parseVector(reader, elementSignature: 0, elementType: Api.MessageEntity.self)
|
||||||
|
} }
|
||||||
|
let _c1 = _1 != nil
|
||||||
|
let _c2 = _2 != nil
|
||||||
|
let _c3 = _3 != nil
|
||||||
|
let _c4 = _4 != nil
|
||||||
|
let _c5 = _5 != nil
|
||||||
|
let _c6 = _6 != nil
|
||||||
|
let _c7 = _7 != nil
|
||||||
|
let _c8 = _8 != nil
|
||||||
|
let _c9 = (Int(_1!) & Int(1 << 2) == 0) || _9 != nil
|
||||||
|
let _c10 = (Int(_1!) & Int(1 << 11) == 0) || _10 != nil
|
||||||
|
let _c11 = (Int(_1!) & Int(1 << 3) == 0) || _11 != nil
|
||||||
|
let _c12 = (Int(_1!) & Int(1 << 7) == 0) || _12 != nil
|
||||||
|
if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 && _c12 {
|
||||||
|
return Api.Updates.updateShortChatMessage(flags: _1!, id: _2!, fromId: _3!, chatId: _4!, message: _5!, pts: _6!, ptsCount: _7!, date: _8!, fwdFrom: _9, viaBotId: _10, replyTo: _11, entities: _12)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
public enum StatsAbsValueAndPrev: TypeConstructorDescription {
|
public enum StatsAbsValueAndPrev: TypeConstructorDescription {
|
||||||
@ -17422,7 +17426,7 @@ public extension Api {
|
|||||||
public enum Message: TypeConstructorDescription {
|
public enum Message: TypeConstructorDescription {
|
||||||
case messageEmpty(id: Int32)
|
case messageEmpty(id: Int32)
|
||||||
case message(flags: Int32, id: Int32, fromId: Api.Peer, peerId: Api.Peer, fwdFrom: Api.MessageFwdHeader?, viaBotId: Int32?, replyTo: Api.MessageReplyHeader?, date: Int32, message: String, media: Api.MessageMedia?, replyMarkup: Api.ReplyMarkup?, entities: [Api.MessageEntity]?, views: Int32?, forwards: Int32?, replies: Api.MessageReplies?, editDate: Int32?, postAuthor: String?, groupedId: Int64?, restrictionReason: [Api.RestrictionReason]?)
|
case message(flags: Int32, id: Int32, fromId: Api.Peer, peerId: Api.Peer, fwdFrom: Api.MessageFwdHeader?, viaBotId: Int32?, replyTo: Api.MessageReplyHeader?, date: Int32, message: String, media: Api.MessageMedia?, replyMarkup: Api.ReplyMarkup?, entities: [Api.MessageEntity]?, views: Int32?, forwards: Int32?, replies: Api.MessageReplies?, editDate: Int32?, postAuthor: String?, groupedId: Int64?, restrictionReason: [Api.RestrictionReason]?)
|
||||||
case messageService(flags: Int32, id: Int32, fromId: Api.Peer, peerId: Api.Peer, replyToMsgId: Int32?, date: Int32, action: Api.MessageAction)
|
case messageService(flags: Int32, id: Int32, fromId: Api.Peer, peerId: Api.Peer, replyTo: Api.MessageReplyHeader?, date: Int32, action: Api.MessageAction)
|
||||||
|
|
||||||
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
|
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
|
||||||
switch self {
|
switch self {
|
||||||
@ -17464,15 +17468,15 @@ public extension Api {
|
|||||||
item.serialize(buffer, true)
|
item.serialize(buffer, true)
|
||||||
}}
|
}}
|
||||||
break
|
break
|
||||||
case .messageService(let flags, let id, let fromId, let peerId, let replyToMsgId, let date, let action):
|
case .messageService(let flags, let id, let fromId, let peerId, let replyTo, let date, let action):
|
||||||
if boxed {
|
if boxed {
|
||||||
buffer.appendInt32(797820163)
|
buffer.appendInt32(-1245570157)
|
||||||
}
|
}
|
||||||
serializeInt32(flags, buffer: buffer, boxed: false)
|
serializeInt32(flags, buffer: buffer, boxed: false)
|
||||||
serializeInt32(id, buffer: buffer, boxed: false)
|
serializeInt32(id, buffer: buffer, boxed: false)
|
||||||
fromId.serialize(buffer, true)
|
fromId.serialize(buffer, true)
|
||||||
peerId.serialize(buffer, true)
|
peerId.serialize(buffer, true)
|
||||||
if Int(flags) & Int(1 << 3) != 0 {serializeInt32(replyToMsgId!, buffer: buffer, boxed: false)}
|
if Int(flags) & Int(1 << 3) != 0 {replyTo!.serialize(buffer, true)}
|
||||||
serializeInt32(date, buffer: buffer, boxed: false)
|
serializeInt32(date, buffer: buffer, boxed: false)
|
||||||
action.serialize(buffer, true)
|
action.serialize(buffer, true)
|
||||||
break
|
break
|
||||||
@ -17485,8 +17489,8 @@ public extension Api {
|
|||||||
return ("messageEmpty", [("id", id)])
|
return ("messageEmpty", [("id", id)])
|
||||||
case .message(let flags, let id, let fromId, let peerId, let fwdFrom, let viaBotId, let replyTo, let date, let message, let media, let replyMarkup, let entities, let views, let forwards, let replies, let editDate, let postAuthor, let groupedId, let restrictionReason):
|
case .message(let flags, let id, let fromId, let peerId, let fwdFrom, let viaBotId, let replyTo, let date, let message, let media, let replyMarkup, let entities, let views, let forwards, let replies, let editDate, let postAuthor, let groupedId, let restrictionReason):
|
||||||
return ("message", [("flags", flags), ("id", id), ("fromId", fromId), ("peerId", peerId), ("fwdFrom", fwdFrom), ("viaBotId", viaBotId), ("replyTo", replyTo), ("date", date), ("message", message), ("media", media), ("replyMarkup", replyMarkup), ("entities", entities), ("views", views), ("forwards", forwards), ("replies", replies), ("editDate", editDate), ("postAuthor", postAuthor), ("groupedId", groupedId), ("restrictionReason", restrictionReason)])
|
return ("message", [("flags", flags), ("id", id), ("fromId", fromId), ("peerId", peerId), ("fwdFrom", fwdFrom), ("viaBotId", viaBotId), ("replyTo", replyTo), ("date", date), ("message", message), ("media", media), ("replyMarkup", replyMarkup), ("entities", entities), ("views", views), ("forwards", forwards), ("replies", replies), ("editDate", editDate), ("postAuthor", postAuthor), ("groupedId", groupedId), ("restrictionReason", restrictionReason)])
|
||||||
case .messageService(let flags, let id, let fromId, let peerId, let replyToMsgId, let date, let action):
|
case .messageService(let flags, let id, let fromId, let peerId, let replyTo, let date, let action):
|
||||||
return ("messageService", [("flags", flags), ("id", id), ("fromId", fromId), ("peerId", peerId), ("replyToMsgId", replyToMsgId), ("date", date), ("action", action)])
|
return ("messageService", [("flags", flags), ("id", id), ("fromId", fromId), ("peerId", peerId), ("replyTo", replyTo), ("date", date), ("action", action)])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -17597,8 +17601,10 @@ public extension Api {
|
|||||||
if let signature = reader.readInt32() {
|
if let signature = reader.readInt32() {
|
||||||
_4 = Api.parse(reader, signature: signature) as? Api.Peer
|
_4 = Api.parse(reader, signature: signature) as? Api.Peer
|
||||||
}
|
}
|
||||||
var _5: Int32?
|
var _5: Api.MessageReplyHeader?
|
||||||
if Int(_1!) & Int(1 << 3) != 0 {_5 = reader.readInt32() }
|
if Int(_1!) & Int(1 << 3) != 0 {if let signature = reader.readInt32() {
|
||||||
|
_5 = Api.parse(reader, signature: signature) as? Api.MessageReplyHeader
|
||||||
|
} }
|
||||||
var _6: Int32?
|
var _6: Int32?
|
||||||
_6 = reader.readInt32()
|
_6 = reader.readInt32()
|
||||||
var _7: Api.MessageAction?
|
var _7: Api.MessageAction?
|
||||||
@ -17613,7 +17619,7 @@ public extension Api {
|
|||||||
let _c6 = _6 != nil
|
let _c6 = _6 != nil
|
||||||
let _c7 = _7 != nil
|
let _c7 = _7 != nil
|
||||||
if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 {
|
if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 {
|
||||||
return Api.Message.messageService(flags: _1!, id: _2!, fromId: _3!, peerId: _4!, replyToMsgId: _5, date: _6!, action: _7!)
|
return Api.Message.messageService(flags: _1!, id: _2!, fromId: _3!, peerId: _4!, replyTo: _5, date: _6!, action: _7!)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return nil
|
return nil
|
||||||
|
@ -366,8 +366,14 @@ func enqueueMessages(transaction: Transaction, account: Account, peerId: PeerId,
|
|||||||
}
|
}
|
||||||
|
|
||||||
let authorId: PeerId?
|
let authorId: PeerId?
|
||||||
if let peer = peer as? TelegramChannel, case .broadcast = peer.info {
|
if let peer = peer as? TelegramChannel {
|
||||||
authorId = peer.id
|
if case .broadcast = peer.info {
|
||||||
|
authorId = peer.id
|
||||||
|
} else if case .group = peer.info, peer.hasPermission(.canBeAnonymous) {
|
||||||
|
authorId = peer.id
|
||||||
|
} else {
|
||||||
|
authorId = account.peerId
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
authorId = account.peerId
|
authorId = account.peerId
|
||||||
}
|
}
|
||||||
@ -529,8 +535,14 @@ func enqueueMessages(transaction: Transaction, account: Account, peerId: PeerId,
|
|||||||
}
|
}
|
||||||
|
|
||||||
let authorId: PeerId?
|
let authorId: PeerId?
|
||||||
if let peer = peer as? TelegramChannel, case .broadcast = peer.info {
|
if let peer = peer as? TelegramChannel {
|
||||||
authorId = peer.id
|
if case .broadcast = peer.info {
|
||||||
|
authorId = peer.id
|
||||||
|
} else if case .group = peer.info, peer.hasPermission(.canBeAnonymous) {
|
||||||
|
authorId = peer.id
|
||||||
|
} else {
|
||||||
|
authorId = account.peerId
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
authorId = account.peerId
|
authorId = account.peerId
|
||||||
}
|
}
|
||||||
|
@ -210,7 +210,7 @@ public class BoxedMessage: NSObject {
|
|||||||
|
|
||||||
public class Serialization: NSObject, MTSerialization {
|
public class Serialization: NSObject, MTSerialization {
|
||||||
public func currentLayer() -> UInt {
|
public func currentLayer() -> UInt {
|
||||||
return 120
|
return 119
|
||||||
}
|
}
|
||||||
|
|
||||||
public func parseMessage(_ data: Data!) -> Any! {
|
public func parseMessage(_ data: Data!) -> Any! {
|
||||||
|
@ -217,11 +217,12 @@ func apiMessageAssociatedMessageIds(_ message: Api.Message) -> [MessageId]? {
|
|||||||
}
|
}
|
||||||
case .messageEmpty:
|
case .messageEmpty:
|
||||||
break
|
break
|
||||||
case let .messageService(flags, _, fromId, chatPeerId, replyToMsgId, _, _):
|
case let .messageService(flags, _, fromId, chatPeerId, replyHeader, _, _):
|
||||||
if let replyToMsgId = replyToMsgId {
|
if let replyHeader = replyHeader {
|
||||||
let peerId: PeerId = chatPeerId.peerId
|
switch replyHeader {
|
||||||
|
case let .messageReplyHeader(_, replyToMsgId, replyToPeerId, _):
|
||||||
return [MessageId(peerId: peerId, namespace: Namespaces.Message.Cloud, id: replyToMsgId)]
|
return [MessageId(peerId: replyToPeerId?.peerId ?? chatPeerId.peerId, namespace: Namespaces.Message.Cloud, id: replyToMsgId)]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
@ -581,20 +582,35 @@ extension StoreMessage {
|
|||||||
self.init(id: MessageId(peerId: peerId, namespace: namespace, id: id), globallyUniqueId: nil, groupingKey: groupingId, threadId: threadId, timestamp: date, flags: storeFlags, tags: tags, globalTags: globalTags, localTags: [], forwardInfo: forwardInfo, authorId: authorId, text: messageText, attributes: attributes, media: medias)
|
self.init(id: MessageId(peerId: peerId, namespace: namespace, id: id), globallyUniqueId: nil, groupingKey: groupingId, threadId: threadId, timestamp: date, flags: storeFlags, tags: tags, globalTags: globalTags, localTags: [], forwardInfo: forwardInfo, authorId: authorId, text: messageText, attributes: attributes, media: medias)
|
||||||
case .messageEmpty:
|
case .messageEmpty:
|
||||||
return nil
|
return nil
|
||||||
case let .messageService(flags, id, fromId, chatPeerId, replyToMsgId, date, action):
|
case let .messageService(flags, id, fromId, chatPeerId, replyTo, date, action):
|
||||||
let peerId: PeerId = chatPeerId.peerId
|
let peerId: PeerId = chatPeerId.peerId
|
||||||
var authorId: PeerId? = fromId.peerId
|
var authorId: PeerId? = fromId.peerId
|
||||||
|
|
||||||
var attributes: [MessageAttribute] = []
|
var attributes: [MessageAttribute] = []
|
||||||
if let replyToMsgId = replyToMsgId {
|
|
||||||
attributes.append(ReplyMessageAttribute(messageId: MessageId(peerId: peerId, namespace: Namespaces.Message.Cloud, id: replyToMsgId), threadMessageId: nil))
|
var threadId: Int64?
|
||||||
|
if let replyTo = replyTo {
|
||||||
|
var threadMessageId: MessageId?
|
||||||
|
switch replyTo {
|
||||||
|
case let .messageReplyHeader(_, replyToMsgId, replyToPeerId, replyToTopId):
|
||||||
|
let replyPeerId = replyToPeerId?.peerId ?? peerId
|
||||||
|
if let replyToTopId = replyToTopId {
|
||||||
|
let threadIdValue = MessageId(peerId: replyPeerId, namespace: Namespaces.Message.Cloud, id: replyToTopId)
|
||||||
|
threadMessageId = threadIdValue
|
||||||
|
threadId = makeMessageThreadId(threadIdValue)
|
||||||
|
} else if peerId.namespace == Namespaces.Peer.CloudChannel {
|
||||||
|
let threadIdValue = MessageId(peerId: replyPeerId, namespace: Namespaces.Message.Cloud, id: replyToMsgId)
|
||||||
|
threadMessageId = threadIdValue
|
||||||
|
threadId = makeMessageThreadId(threadIdValue)
|
||||||
|
}
|
||||||
|
attributes.append(ReplyMessageAttribute(messageId: MessageId(peerId: replyPeerId, namespace: Namespaces.Message.Cloud, id: replyToMsgId), threadMessageId: threadMessageId))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags & (1 << 17)) != 0 {
|
if (flags & (1 << 17)) != 0 {
|
||||||
attributes.append(ContentRequiresValidationMessageAttribute())
|
attributes.append(ContentRequiresValidationMessageAttribute())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
var storeFlags = StoreMessageFlags()
|
var storeFlags = StoreMessageFlags()
|
||||||
if (flags & 2) == 0 {
|
if (flags & 2) == 0 {
|
||||||
let _ = storeFlags.insert(.Incoming)
|
let _ = storeFlags.insert(.Incoming)
|
||||||
@ -624,7 +640,7 @@ extension StoreMessage {
|
|||||||
storeFlags.insert(.WasScheduled)
|
storeFlags.insert(.WasScheduled)
|
||||||
}
|
}
|
||||||
|
|
||||||
self.init(id: MessageId(peerId: peerId, namespace: namespace, id: id), globallyUniqueId: nil, groupingKey: nil, threadId: nil, timestamp: date, flags: storeFlags, tags: tags, globalTags: globalTags, localTags: [], forwardInfo: nil, authorId: authorId, text: "", attributes: attributes, media: media)
|
self.init(id: MessageId(peerId: peerId, namespace: namespace, id: id), globallyUniqueId: nil, groupingKey: nil, threadId: threadId, timestamp: date, flags: storeFlags, tags: tags, globalTags: globalTags, localTags: [], forwardInfo: nil, authorId: authorId, text: "", attributes: attributes, media: media)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,11 +12,19 @@ public enum TelegramChannelPermission {
|
|||||||
case banMembers
|
case banMembers
|
||||||
case addAdmins
|
case addAdmins
|
||||||
case changeInfo
|
case changeInfo
|
||||||
|
case canBeAnonymous
|
||||||
}
|
}
|
||||||
|
|
||||||
public extension TelegramChannel {
|
public extension TelegramChannel {
|
||||||
func hasPermission(_ permission: TelegramChannelPermission) -> Bool {
|
func hasPermission(_ permission: TelegramChannelPermission) -> Bool {
|
||||||
if self.flags.contains(.isCreator) {
|
if self.flags.contains(.isCreator) {
|
||||||
|
if case .canBeAnonymous = permission {
|
||||||
|
if let adminRights = self.adminRights {
|
||||||
|
return adminRights.flags.contains(.canBeAnonymous)
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
switch permission {
|
switch permission {
|
||||||
@ -116,6 +124,11 @@ public extension TelegramChannel {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
|
case .canBeAnonymous:
|
||||||
|
if let adminRights = self.adminRights, adminRights.flags.contains(.canBeAnonymous) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,17 +57,14 @@ class UpdateMessageService: NSObject, MTMessageService {
|
|||||||
if groups.count != 0 {
|
if groups.count != 0 {
|
||||||
self.putNext(groups)
|
self.putNext(groups)
|
||||||
}
|
}
|
||||||
case let .updateShortChatMessage(flags, id, fromId, chatId, message, pts, ptsCount, date, fwdFrom, viaBotId, replyToMsgId, entities):
|
case let .updateShortChatMessage(flags, id, fromId, chatId, message, pts, ptsCount, date, fwdFrom, viaBotId, replyHeader, entities):
|
||||||
let replyHeader = replyToMsgId.flatMap { replyToMsgId -> Api.MessageReplyHeader in
|
|
||||||
return Api.MessageReplyHeader.messageReplyHeader(flags: 0, replyToMsgId: replyToMsgId, replyToPeerId: nil, replyToTopId: nil)
|
|
||||||
}
|
|
||||||
let generatedMessage = Api.Message.message(flags: flags, id: id, fromId: .peerChat(chatId: fromId), peerId: Api.Peer.peerChat(chatId: chatId), fwdFrom: fwdFrom, viaBotId: viaBotId, replyTo: replyHeader, date: date, message: message, media: Api.MessageMedia.messageMediaEmpty, replyMarkup: nil, entities: entities, views: nil, forwards: nil, replies: nil, editDate: nil, postAuthor: nil, groupedId: nil, restrictionReason: nil)
|
let generatedMessage = Api.Message.message(flags: flags, id: id, fromId: .peerChat(chatId: fromId), peerId: Api.Peer.peerChat(chatId: chatId), fwdFrom: fwdFrom, viaBotId: viaBotId, replyTo: replyHeader, date: date, message: message, media: Api.MessageMedia.messageMediaEmpty, replyMarkup: nil, entities: entities, views: nil, forwards: nil, replies: nil, editDate: nil, postAuthor: nil, groupedId: nil, restrictionReason: nil)
|
||||||
let update = Api.Update.updateNewMessage(message: generatedMessage, pts: pts, ptsCount: ptsCount)
|
let update = Api.Update.updateNewMessage(message: generatedMessage, pts: pts, ptsCount: ptsCount)
|
||||||
let groups = groupUpdates([update], users: [], chats: [], date: date, seqRange: nil)
|
let groups = groupUpdates([update], users: [], chats: [], date: date, seqRange: nil)
|
||||||
if groups.count != 0 {
|
if groups.count != 0 {
|
||||||
self.putNext(groups)
|
self.putNext(groups)
|
||||||
}
|
}
|
||||||
case let .updateShortMessage(flags, id, userId, message, pts, ptsCount, date, fwdFrom, viaBotId, replyToMsgId, entities):
|
case let .updateShortMessage(flags, id, userId, message, pts, ptsCount, date, fwdFrom, viaBotId, replyHeader, entities):
|
||||||
let generatedFromId: Api.Peer
|
let generatedFromId: Api.Peer
|
||||||
if (Int(flags) & 1 << 1) != 0 {
|
if (Int(flags) & 1 << 1) != 0 {
|
||||||
generatedFromId = Api.Peer.peerUser(userId: self.peerId.id)
|
generatedFromId = Api.Peer.peerUser(userId: self.peerId.id)
|
||||||
@ -77,10 +74,6 @@ class UpdateMessageService: NSObject, MTMessageService {
|
|||||||
|
|
||||||
let generatedPeerId = Api.Peer.peerUser(userId: userId)
|
let generatedPeerId = Api.Peer.peerUser(userId: userId)
|
||||||
|
|
||||||
let replyHeader = replyToMsgId.flatMap { replyToMsgId -> Api.MessageReplyHeader in
|
|
||||||
return Api.MessageReplyHeader.messageReplyHeader(flags: 0, replyToMsgId: replyToMsgId, replyToPeerId: nil, replyToTopId: nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
let generatedMessage = Api.Message.message(flags: flags, id: id, fromId: generatedFromId, peerId: generatedPeerId, fwdFrom: fwdFrom, viaBotId: viaBotId, replyTo: replyHeader, date: date, message: message, media: Api.MessageMedia.messageMediaEmpty, replyMarkup: nil, entities: entities, views: nil, forwards: nil, replies: nil, editDate: nil, postAuthor: nil, groupedId: nil, restrictionReason: nil)
|
let generatedMessage = Api.Message.message(flags: flags, id: id, fromId: generatedFromId, peerId: generatedPeerId, fwdFrom: fwdFrom, viaBotId: viaBotId, replyTo: replyHeader, date: date, message: message, media: Api.MessageMedia.messageMediaEmpty, replyMarkup: nil, entities: entities, views: nil, forwards: nil, replies: nil, editDate: nil, postAuthor: nil, groupedId: nil, restrictionReason: nil)
|
||||||
let update = Api.Update.updateNewMessage(message: generatedMessage, pts: pts, ptsCount: ptsCount)
|
let update = Api.Update.updateNewMessage(message: generatedMessage, pts: pts, ptsCount: ptsCount)
|
||||||
let groups = groupUpdates([update], users: [], chats: [], date: date, seqRange: nil)
|
let groups = groupUpdates([update], users: [], chats: [], date: date, seqRange: nil)
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -229,6 +229,9 @@ public enum PresentationResourceKey: Int32 {
|
|||||||
case groupInfoMembersIcon
|
case groupInfoMembersIcon
|
||||||
|
|
||||||
case emptyChatListCheckIcon
|
case emptyChatListCheckIcon
|
||||||
|
|
||||||
|
case chatFreeCommentButtonBackground
|
||||||
|
case chatFreeCommentButtonIcon
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum PresentationResourceParameterKey: Hashable {
|
public enum PresentationResourceParameterKey: Hashable {
|
||||||
|
@ -1106,4 +1106,17 @@ public struct PresentationResourcesChat {
|
|||||||
return generateTintedImage(image: UIImage(bundleImageName: "Item List/DisclosureArrow"), color: messageTheme.accentTextColor)
|
return generateTintedImage(image: UIImage(bundleImageName: "Item List/DisclosureArrow"), color: messageTheme.accentTextColor)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static func chatFreeCommentButtonBackground(_ theme: PresentationTheme, wallpaper: TelegramWallpaper) -> UIImage? {
|
||||||
|
return theme.image(PresentationResourceKey.chatFreeCommentButtonBackground.rawValue, { _ in
|
||||||
|
let strokeColor = bubbleVariableColor(variableColor: theme.chat.message.shareButtonStrokeColor, wallpaper: wallpaper)
|
||||||
|
return generateStretchableFilledCircleImage(diameter: 30.0, color: bubbleVariableColor(variableColor: theme.chat.message.shareButtonFillColor, wallpaper: wallpaper), strokeColor: strokeColor, strokeWidth: strokeColor.alpha.isZero ? nil : 1.0)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
public static func chatFreeCommentButtonIcon(_ theme: PresentationTheme, wallpaper: TelegramWallpaper) -> UIImage? {
|
||||||
|
return theme.image(PresentationResourceKey.chatFreeCommentButtonIcon.rawValue, { _ in
|
||||||
|
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Message/FreeRepliesIcon"), color: bubbleVariableColor(variableColor: theme.chat.message.shareButtonForegroundColor, wallpaper: wallpaper))
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Binary file not shown.
@ -3742,6 +3742,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
strongSelf.chatDisplayNode.historyNode.scrollToEndOfHistory()
|
strongSelf.chatDisplayNode.historyNode.scrollToEndOfHistory()
|
||||||
} else if case let .peer(peerId) = strongSelf.chatLocation {
|
} else if case let .peer(peerId) = strongSelf.chatLocation {
|
||||||
strongSelf.navigateToMessage(messageLocation: .upperBound(peerId), animated: true)
|
strongSelf.navigateToMessage(messageLocation: .upperBound(peerId), animated: true)
|
||||||
|
} else if case .replyThread = strongSelf.chatLocation {
|
||||||
|
strongSelf.scrollToEndOfHistory()
|
||||||
} else {
|
} else {
|
||||||
strongSelf.chatDisplayNode.historyNode.scrollToEndOfHistory()
|
strongSelf.chatDisplayNode.historyNode.scrollToEndOfHistory()
|
||||||
}
|
}
|
||||||
@ -8067,7 +8069,67 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
}
|
}
|
||||||
|
|
||||||
func scrollToEndOfHistory() {
|
func scrollToEndOfHistory() {
|
||||||
self.chatDisplayNode.historyNode.scrollToEndOfHistory()
|
let locationInput = ChatHistoryLocationInput(content: .Scroll(index: .upperBound, anchorIndex: .upperBound, sourceIndex: .lowerBound, scrollPosition: .top(0.0), animated: true), id: 0)
|
||||||
|
|
||||||
|
let historyView = preloadedChatHistoryViewForLocation(locationInput, context: self.context, chatLocation: self.chatLocation, chatLocationContextHolder: self.chatLocationContextHolder, fixedCombinedReadStates: nil, tagMask: nil, additionalData: [])
|
||||||
|
let signal = historyView
|
||||||
|
|> mapToSignal { historyView -> Signal<(MessageIndex?, Bool), NoError> in
|
||||||
|
switch historyView {
|
||||||
|
case .Loading:
|
||||||
|
return .single((nil, true))
|
||||||
|
case .HistoryView:
|
||||||
|
return .single((nil, false))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|> take(until: { index in
|
||||||
|
return SignalTakeAction(passthrough: true, complete: !index.1)
|
||||||
|
})
|
||||||
|
|
||||||
|
var cancelImpl: (() -> Void)?
|
||||||
|
let presentationData = self.presentationData
|
||||||
|
let displayTime = CACurrentMediaTime()
|
||||||
|
let progressSignal = Signal<Never, NoError> { [weak self] subscriber in
|
||||||
|
let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: {
|
||||||
|
if CACurrentMediaTime() - displayTime > 1.5 {
|
||||||
|
cancelImpl?()
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
self?.present(controller, in: .window(.root))
|
||||||
|
return ActionDisposable { [weak controller] in
|
||||||
|
Queue.mainQueue().async() {
|
||||||
|
controller?.dismiss()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|> runOn(Queue.mainQueue())
|
||||||
|
|> delay(0.05, queue: Queue.mainQueue())
|
||||||
|
let progressDisposable = MetaDisposable()
|
||||||
|
var progressStarted = false
|
||||||
|
self.messageIndexDisposable.set((signal
|
||||||
|
|> afterDisposed {
|
||||||
|
Queue.mainQueue().async {
|
||||||
|
progressDisposable.dispose()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|> deliverOnMainQueue).start(next: { [weak self] index in
|
||||||
|
if index.1 {
|
||||||
|
if !progressStarted {
|
||||||
|
progressStarted = true
|
||||||
|
progressDisposable.set(progressSignal.start())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, completed: { [weak self] in
|
||||||
|
if let strongSelf = self {
|
||||||
|
strongSelf.loadingMessage.set(false)
|
||||||
|
strongSelf.chatDisplayNode.historyNode.scrollToEndOfHistory()
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
cancelImpl = { [weak self] in
|
||||||
|
if let strongSelf = self {
|
||||||
|
strongSelf.loadingMessage.set(false)
|
||||||
|
strongSelf.messageIndexDisposable.set(nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateDownButtonVisibility() {
|
func updateDownButtonVisibility() {
|
||||||
|
@ -419,6 +419,7 @@ private struct ChatHistoryAnimatedEmojiConfiguration {
|
|||||||
public final class ChatHistoryListNode: ListView, ChatHistoryNode {
|
public final class ChatHistoryListNode: ListView, ChatHistoryNode {
|
||||||
private let context: AccountContext
|
private let context: AccountContext
|
||||||
private let chatLocation: ChatLocation
|
private let chatLocation: ChatLocation
|
||||||
|
private let chatLocationContextHolder: Atomic<ChatLocationContextHolder?>
|
||||||
private let subject: ChatControllerSubject?
|
private let subject: ChatControllerSubject?
|
||||||
private let tagMask: MessageTags?
|
private let tagMask: MessageTags?
|
||||||
private let controllerInteraction: ChatControllerInteraction
|
private let controllerInteraction: ChatControllerInteraction
|
||||||
@ -532,6 +533,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
|
|||||||
public init(context: AccountContext, chatLocation: ChatLocation, chatLocationContextHolder: Atomic<ChatLocationContextHolder?>, tagMask: MessageTags?, subject: ChatControllerSubject?, controllerInteraction: ChatControllerInteraction, selectedMessages: Signal<Set<MessageId>?, NoError>, mode: ChatHistoryListMode = .bubbles) {
|
public init(context: AccountContext, chatLocation: ChatLocation, chatLocationContextHolder: Atomic<ChatLocationContextHolder?>, tagMask: MessageTags?, subject: ChatControllerSubject?, controllerInteraction: ChatControllerInteraction, selectedMessages: Signal<Set<MessageId>?, NoError>, mode: ChatHistoryListMode = .bubbles) {
|
||||||
self.context = context
|
self.context = context
|
||||||
self.chatLocation = chatLocation
|
self.chatLocation = chatLocation
|
||||||
|
self.chatLocationContextHolder = chatLocationContextHolder
|
||||||
self.subject = subject
|
self.subject = subject
|
||||||
self.tagMask = tagMask
|
self.tagMask = tagMask
|
||||||
self.controllerInteraction = controllerInteraction
|
self.controllerInteraction = controllerInteraction
|
||||||
@ -706,6 +708,9 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
|
|||||||
} else {
|
} else {
|
||||||
if let subject = subject, case let .message(messageId) = subject {
|
if let subject = subject, case let .message(messageId) = subject {
|
||||||
strongSelf.chatHistoryLocationValue = ChatHistoryLocationInput(content: .InitialSearch(location: .id(messageId), count: 60), id: (strongSelf.chatHistoryLocationValue?.id).flatMap({ $0 + 1 }) ?? 0)
|
strongSelf.chatHistoryLocationValue = ChatHistoryLocationInput(content: .InitialSearch(location: .id(messageId), count: 60), id: (strongSelf.chatHistoryLocationValue?.id).flatMap({ $0 + 1 }) ?? 0)
|
||||||
|
} else if var chatHistoryLocation = strongSelf.chatHistoryLocationValue {
|
||||||
|
chatHistoryLocation.id += 1
|
||||||
|
strongSelf.chatHistoryLocationValue = chatHistoryLocation
|
||||||
} else {
|
} else {
|
||||||
strongSelf.chatHistoryLocationValue = ChatHistoryLocationInput(content: .Initial(count: 60), id: (strongSelf.chatHistoryLocationValue?.id).flatMap({ $0 + 1 }) ?? 0)
|
strongSelf.chatHistoryLocationValue = ChatHistoryLocationInput(content: .Initial(count: 60), id: (strongSelf.chatHistoryLocationValue?.id).flatMap({ $0 + 1 }) ?? 0)
|
||||||
}
|
}
|
||||||
@ -1286,7 +1291,8 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
|
|||||||
case .known(0.0):
|
case .known(0.0):
|
||||||
break
|
break
|
||||||
default:
|
default:
|
||||||
self.chatHistoryLocationValue = ChatHistoryLocationInput(content: .Scroll(index: .upperBound, anchorIndex: .upperBound, sourceIndex: .lowerBound, scrollPosition: .top(0.0), animated: true), id: self.takeNextHistoryLocationId())
|
let locationInput = ChatHistoryLocationInput(content: .Scroll(index: .upperBound, anchorIndex: .upperBound, sourceIndex: .lowerBound, scrollPosition: .top(0.0), animated: true), id: self.takeNextHistoryLocationId())
|
||||||
|
self.chatHistoryLocationValue = locationInput
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1522,12 +1528,14 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
|
|||||||
if transition.animateIn || animateIn {
|
if transition.animateIn || animateIn {
|
||||||
let heightNorm = strongSelf.bounds.height - strongSelf.insets.top
|
let heightNorm = strongSelf.bounds.height - strongSelf.insets.top
|
||||||
strongSelf.forEachVisibleItemNode { itemNode in
|
strongSelf.forEachVisibleItemNode { itemNode in
|
||||||
|
let delayFactor = itemNode.frame.minY / heightNorm
|
||||||
|
let delay = Double(delayFactor * 0.1)
|
||||||
|
|
||||||
if let itemNode = itemNode as? ChatMessageItemView {
|
if let itemNode = itemNode as? ChatMessageItemView {
|
||||||
let delayFactor = itemNode.frame.minY / heightNorm
|
|
||||||
let delay = Double(delayFactor * 0.1)
|
|
||||||
|
|
||||||
itemNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.15, delay: delay)
|
itemNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.15, delay: delay)
|
||||||
itemNode.layer.animateScale(from: 0.9, to: 1.0, duration: 0.4, delay: delay, timingFunction: kCAMediaTimingFunctionSpring)
|
itemNode.layer.animateScale(from: 0.94, to: 1.0, duration: 0.4, delay: delay, timingFunction: kCAMediaTimingFunctionSpring)
|
||||||
|
} else if let itemNode = itemNode as? ChatUnreadItemNode {
|
||||||
|
itemNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.15, delay: delay)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
strongSelf.forEachItemHeaderNode { itemNode in
|
strongSelf.forEachItemHeaderNode { itemNode in
|
||||||
@ -1535,7 +1543,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
|
|||||||
let delay = Double(delayFactor * 0.2)
|
let delay = Double(delayFactor * 0.2)
|
||||||
|
|
||||||
itemNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.15, delay: delay)
|
itemNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.15, delay: delay)
|
||||||
itemNode.layer.animateScale(from: 0.9, to: 1.0, duration: 0.4, delay: delay, timingFunction: kCAMediaTimingFunctionSpring)
|
itemNode.layer.animateScale(from: 0.94, to: 1.0, duration: 0.4, delay: delay, timingFunction: kCAMediaTimingFunctionSpring)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -211,6 +211,12 @@ func chatHistoryViewForLocation(_ location: ChatHistoryLocationInput, context: A
|
|||||||
|> map { view, updateType, initialData -> ChatHistoryViewUpdate in
|
|> map { view, updateType, initialData -> ChatHistoryViewUpdate in
|
||||||
let (cachedData, cachedDataMessages, readStateData) = extractAdditionalData(view: view, chatLocation: chatLocation)
|
let (cachedData, cachedDataMessages, readStateData) = extractAdditionalData(view: view, chatLocation: chatLocation)
|
||||||
|
|
||||||
|
let combinedInitialData = ChatHistoryCombinedInitialData(initialData: initialData, buttonKeyboardMessage: view.topTaggedMessages.first, cachedData: cachedData, cachedDataMessages: cachedDataMessages, readStateData: readStateData)
|
||||||
|
|
||||||
|
if view.isLoading {
|
||||||
|
return ChatHistoryViewUpdate.Loading(initialData: combinedInitialData, type: .Generic(type: updateType))
|
||||||
|
}
|
||||||
|
|
||||||
let genericType: ViewUpdateType
|
let genericType: ViewUpdateType
|
||||||
let scrollPosition: ChatHistoryViewScrollPosition? = first ? chatScrollPosition : nil
|
let scrollPosition: ChatHistoryViewScrollPosition? = first ? chatScrollPosition : nil
|
||||||
if first {
|
if first {
|
||||||
@ -219,7 +225,7 @@ func chatHistoryViewForLocation(_ location: ChatHistoryLocationInput, context: A
|
|||||||
} else {
|
} else {
|
||||||
genericType = updateType
|
genericType = updateType
|
||||||
}
|
}
|
||||||
return .HistoryView(view: view, type: .Generic(type: genericType), scrollPosition: scrollPosition, flashIndicators: animated, originalScrollPosition: chatScrollPosition, initialData: ChatHistoryCombinedInitialData(initialData: initialData, buttonKeyboardMessage: view.topTaggedMessages.first, cachedData: cachedData, cachedDataMessages: cachedDataMessages, readStateData: readStateData), id: location.id)
|
return .HistoryView(view: view, type: .Generic(type: genericType), scrollPosition: scrollPosition, flashIndicators: animated, originalScrollPosition: chatScrollPosition, initialData: combinedInitialData, id: location.id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,7 +32,7 @@ extension AnimatedStickerNode: GenericAnimatedStickerNode {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class ChatMessageShareButton: HighlightTrackingButtonNode {
|
class ChatMessageShareButton: HighlightableButtonNode {
|
||||||
private let backgroundNode: ASImageNode
|
private let backgroundNode: ASImageNode
|
||||||
private let iconNode: ASImageNode
|
private let iconNode: ASImageNode
|
||||||
|
|
||||||
@ -74,17 +74,23 @@ class ChatMessageShareButton: HighlightTrackingButtonNode {
|
|||||||
|
|
||||||
let graphics = PresentationResourcesChat.additionalGraphics(presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper, bubbleCorners: presentationData.chatBubbleCorners)
|
let graphics = PresentationResourcesChat.additionalGraphics(presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper, bubbleCorners: presentationData.chatBubbleCorners)
|
||||||
var updatedShareButtonBackground: UIImage?
|
var updatedShareButtonBackground: UIImage?
|
||||||
|
var updatedIconImage: UIImage?
|
||||||
if isReplies {
|
if isReplies {
|
||||||
updatedShareButtonBackground = chatBubbleActionButtonImage(fillColor: bubbleVariableColor(variableColor: presentationData.theme.theme.chat.message.shareButtonFillColor, wallpaper: presentationData.theme.wallpaper), strokeColor: bubbleVariableColor(variableColor: presentationData.theme.theme.chat.message.shareButtonStrokeColor, wallpaper: presentationData.theme.wallpaper), foregroundColor: bubbleVariableColor(variableColor: presentationData.theme.theme.chat.message.shareButtonForegroundColor, wallpaper: presentationData.theme.wallpaper), image: UIImage(bundleImageName: "Chat/Message/FreeRepliesIcon"), iconOffset: CGPoint(x: 0.5, y: 1.0))?.stretchableImage(withLeftCapWidth: 29 / 2, topCapHeight: 29 / 2)
|
updatedShareButtonBackground = PresentationResourcesChat.chatFreeCommentButtonBackground(presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper)
|
||||||
|
updatedIconImage = PresentationResourcesChat.chatFreeCommentButtonIcon(presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper)
|
||||||
} else if message.id.peerId == account.peerId {
|
} else if message.id.peerId == account.peerId {
|
||||||
updatedShareButtonBackground = graphics.chatBubbleNavigateButtonImage
|
updatedShareButtonBackground = graphics.chatBubbleNavigateButtonImage
|
||||||
} else {
|
} else {
|
||||||
updatedShareButtonBackground = graphics.chatBubbleShareButtonImage
|
updatedShareButtonBackground = graphics.chatBubbleShareButtonImage
|
||||||
}
|
}
|
||||||
self.backgroundNode.image = updatedShareButtonBackground
|
self.backgroundNode.image = updatedShareButtonBackground
|
||||||
|
self.iconNode.image = updatedIconImage
|
||||||
}
|
}
|
||||||
var size = CGSize(width: 29.0, height: 29.0)
|
var size = CGSize(width: 30.0, height: 30.0)
|
||||||
|
var offsetIcon = false
|
||||||
if isReplies, replyCount > 0 {
|
if isReplies, replyCount > 0 {
|
||||||
|
offsetIcon = true
|
||||||
|
|
||||||
let textNode: ImmediateTextNode
|
let textNode: ImmediateTextNode
|
||||||
if let current = self.textNode {
|
if let current = self.textNode {
|
||||||
textNode = current
|
textNode = current
|
||||||
@ -94,11 +100,29 @@ class ChatMessageShareButton: HighlightTrackingButtonNode {
|
|||||||
self.addSubnode(textNode)
|
self.addSubnode(textNode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let textColor = bubbleVariableColor(variableColor: presentationData.theme.theme.chat.message.shareButtonForegroundColor, wallpaper: presentationData.theme.wallpaper)
|
||||||
|
|
||||||
|
let countString: String
|
||||||
|
if replyCount >= 1000 * 1000 {
|
||||||
|
countString = "\(replyCount / 1000_000)M"
|
||||||
|
} else if replyCount >= 1000 {
|
||||||
|
countString = "\(replyCount / 1000)K"
|
||||||
|
} else {
|
||||||
|
countString = "\(replyCount)"
|
||||||
|
}
|
||||||
|
|
||||||
|
textNode.attributedText = NSAttributedString(string: countString, font: Font.regular(11.0), textColor: textColor)
|
||||||
|
let textSize = textNode.updateLayout(CGSize(width: 100.0, height: 100.0))
|
||||||
|
size.height += textSize.height - 1.0
|
||||||
|
textNode.frame = CGRect(origin: CGPoint(x: floor((size.width - textSize.width) / 2.0), y: size.height - textSize.height - 4.0), size: textSize)
|
||||||
} else if let textNode = self.textNode {
|
} else if let textNode = self.textNode {
|
||||||
self.textNode = nil
|
self.textNode = nil
|
||||||
textNode.removeFromSupernode()
|
textNode.removeFromSupernode()
|
||||||
}
|
}
|
||||||
self.backgroundNode.frame = CGRect(origin: CGPoint(), size: size)
|
self.backgroundNode.frame = CGRect(origin: CGPoint(), size: size)
|
||||||
|
if let image = self.iconNode.image {
|
||||||
|
self.iconNode.frame = CGRect(origin: CGPoint(x: floor((size.width - image.size.width) / 2.0), y: floor((size.width - image.size.width) / 2.0) - (offsetIcon ? 1.0 : 0.0)), size: image.size)
|
||||||
|
}
|
||||||
return size
|
return size
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -898,7 +922,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
|
|||||||
updatedShareButtonNode.addTarget(strongSelf, action: #selector(strongSelf.shareButtonPressed), forControlEvents: .touchUpInside)
|
updatedShareButtonNode.addTarget(strongSelf, action: #selector(strongSelf.shareButtonPressed), forControlEvents: .touchUpInside)
|
||||||
}
|
}
|
||||||
let buttonSize = updatedShareButtonNode.update(presentationData: item.presentationData, message: item.message, account: item.context.account)
|
let buttonSize = updatedShareButtonNode.update(presentationData: item.presentationData, message: item.message, account: item.context.account)
|
||||||
updatedShareButtonNode.frame = CGRect(origin: CGPoint(x: updatedImageFrame.maxX + 8.0, y: updatedImageFrame.maxY - 30.0), size: buttonSize)
|
updatedShareButtonNode.frame = CGRect(origin: CGPoint(x: updatedImageFrame.maxX + 8.0, y: updatedImageFrame.maxY - buttonSize.height), size: buttonSize)
|
||||||
} else if let shareButtonNode = strongSelf.shareButtonNode {
|
} else if let shareButtonNode = strongSelf.shareButtonNode {
|
||||||
shareButtonNode.removeFromSupernode()
|
shareButtonNode.removeFromSupernode()
|
||||||
strongSelf.shareButtonNode = nil
|
strongSelf.shareButtonNode = nil
|
||||||
|
@ -831,7 +831,14 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode
|
|||||||
displayAuthorInfo = !mergedTop.merged && incoming && effectiveAuthor != nil
|
displayAuthorInfo = !mergedTop.merged && incoming && effectiveAuthor != nil
|
||||||
} else {
|
} else {
|
||||||
effectiveAuthor = firstMessage.author
|
effectiveAuthor = firstMessage.author
|
||||||
displayAuthorInfo = !mergedTop.merged && incoming && peerId.isGroupOrChannel && effectiveAuthor != nil
|
|
||||||
|
var allowAuthor = incoming
|
||||||
|
|
||||||
|
if let author = firstMessage.author, author is TelegramChannel, author.id == firstMessage.id.peerId, !incoming {
|
||||||
|
allowAuthor = true
|
||||||
|
}
|
||||||
|
|
||||||
|
displayAuthorInfo = !mergedTop.merged && allowAuthor && peerId.isGroupOrChannel && effectiveAuthor != nil
|
||||||
if let forwardInfo = firstMessage.forwardInfo, forwardInfo.psaType != nil {
|
if let forwardInfo = firstMessage.forwardInfo, forwardInfo.psaType != nil {
|
||||||
displayAuthorInfo = false
|
displayAuthorInfo = false
|
||||||
}
|
}
|
||||||
@ -1152,7 +1159,12 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode
|
|||||||
authorNameColor = chatMessagePeerIdColors[Int(peer.id.id % 7)]
|
authorNameColor = chatMessagePeerIdColors[Int(peer.id.id % 7)]
|
||||||
} else if let effectiveAuthor = effectiveAuthor {
|
} else if let effectiveAuthor = effectiveAuthor {
|
||||||
authorNameString = effectiveAuthor.displayTitle(strings: item.presentationData.strings, displayOrder: item.presentationData.nameDisplayOrder)
|
authorNameString = effectiveAuthor.displayTitle(strings: item.presentationData.strings, displayOrder: item.presentationData.nameDisplayOrder)
|
||||||
authorNameColor = chatMessagePeerIdColors[Int(effectiveAuthor.id.id % 7)]
|
|
||||||
|
if incoming {
|
||||||
|
authorNameColor = chatMessagePeerIdColors[Int(effectiveAuthor.id.id % 7)]
|
||||||
|
} else {
|
||||||
|
authorNameColor = item.presentationData.theme.theme.chat.message.outgoing.accentTextColor
|
||||||
|
}
|
||||||
|
|
||||||
var isScam = effectiveAuthor.isScam
|
var isScam = effectiveAuthor.isScam
|
||||||
if case let .peer(peerId) = item.chatLocation, let authorPeerId = item.message.author?.id, authorPeerId == peerId {
|
if case let .peer(peerId) = item.chatLocation, let authorPeerId = item.message.author?.id, authorPeerId == peerId {
|
||||||
|
@ -26,7 +26,7 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView {
|
|||||||
|
|
||||||
private var selectionNode: ChatMessageSelectionNode?
|
private var selectionNode: ChatMessageSelectionNode?
|
||||||
private var deliveryFailedNode: ChatMessageDeliveryFailedNode?
|
private var deliveryFailedNode: ChatMessageDeliveryFailedNode?
|
||||||
private var shareButtonNode: HighlightableButtonNode?
|
private var shareButtonNode: ChatMessageShareButton?
|
||||||
|
|
||||||
private var swipeToReplyNode: ChatMessageSwipeToReplyNode?
|
private var swipeToReplyNode: ChatMessageSwipeToReplyNode?
|
||||||
private var swipeToReplyFeedback: HapticFeedback?
|
private var swipeToReplyFeedback: HapticFeedback?
|
||||||
@ -360,28 +360,12 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView {
|
|||||||
|
|
||||||
var updatedShareButtonBackground: UIImage?
|
var updatedShareButtonBackground: UIImage?
|
||||||
|
|
||||||
var updatedShareButtonNode: HighlightableButtonNode?
|
var updatedShareButtonNode: ChatMessageShareButton?
|
||||||
if needShareButton {
|
if needShareButton {
|
||||||
if currentShareButtonNode != nil {
|
if currentShareButtonNode != nil {
|
||||||
updatedShareButtonNode = currentShareButtonNode
|
updatedShareButtonNode = currentShareButtonNode
|
||||||
if item.presentationData.theme !== currentItem?.presentationData.theme {
|
|
||||||
let graphics = PresentationResourcesChat.additionalGraphics(item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper, bubbleCorners: item.presentationData.chatBubbleCorners)
|
|
||||||
if item.message.id.peerId == item.context.account.peerId {
|
|
||||||
updatedShareButtonBackground = graphics.chatBubbleNavigateButtonImage
|
|
||||||
} else {
|
|
||||||
updatedShareButtonBackground = graphics.chatBubbleShareButtonImage
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
let buttonNode = HighlightableButtonNode()
|
let buttonNode = ChatMessageShareButton()
|
||||||
let buttonIcon: UIImage?
|
|
||||||
let graphics = PresentationResourcesChat.additionalGraphics(item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper, bubbleCorners: item.presentationData.chatBubbleCorners)
|
|
||||||
if item.message.id.peerId == item.context.account.peerId {
|
|
||||||
buttonIcon = graphics.chatBubbleNavigateButtonImage
|
|
||||||
} else {
|
|
||||||
buttonIcon = graphics.chatBubbleShareButtonImage
|
|
||||||
}
|
|
||||||
buttonNode.setBackgroundImage(buttonIcon, for: [.normal])
|
|
||||||
updatedShareButtonNode = buttonNode
|
updatedShareButtonNode = buttonNode
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -483,18 +467,13 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView {
|
|||||||
strongSelf.addSubnode(updatedShareButtonNode)
|
strongSelf.addSubnode(updatedShareButtonNode)
|
||||||
updatedShareButtonNode.addTarget(strongSelf, action: #selector(strongSelf.shareButtonPressed), forControlEvents: .touchUpInside)
|
updatedShareButtonNode.addTarget(strongSelf, action: #selector(strongSelf.shareButtonPressed), forControlEvents: .touchUpInside)
|
||||||
}
|
}
|
||||||
if let updatedShareButtonBackground = updatedShareButtonBackground {
|
let buttonSize = updatedShareButtonNode.update(presentationData: item.presentationData, message: item.message, account: item.context.account)
|
||||||
strongSelf.shareButtonNode?.setBackgroundImage(updatedShareButtonBackground, for: [.normal])
|
updatedShareButtonNode.frame = CGRect(origin: CGPoint(x: videoFrame.maxX - 7.0, y: videoFrame.maxY - 24.0 - buttonSize.height), size: buttonSize)
|
||||||
}
|
|
||||||
} else if let shareButtonNode = strongSelf.shareButtonNode {
|
} else if let shareButtonNode = strongSelf.shareButtonNode {
|
||||||
shareButtonNode.removeFromSupernode()
|
shareButtonNode.removeFromSupernode()
|
||||||
strongSelf.shareButtonNode = nil
|
strongSelf.shareButtonNode = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if let shareButtonNode = strongSelf.shareButtonNode {
|
|
||||||
shareButtonNode.frame = CGRect(origin: CGPoint(x: videoFrame.maxX - 7.0, y: videoFrame.maxY - 54.0), size: CGSize(width: 29.0, height: 29.0))
|
|
||||||
}
|
|
||||||
|
|
||||||
if let updatedReplyBackgroundNode = updatedReplyBackgroundNode {
|
if let updatedReplyBackgroundNode = updatedReplyBackgroundNode {
|
||||||
if strongSelf.replyBackgroundNode == nil {
|
if strongSelf.replyBackgroundNode == nil {
|
||||||
strongSelf.replyBackgroundNode = updatedReplyBackgroundNode
|
strongSelf.replyBackgroundNode = updatedReplyBackgroundNode
|
||||||
@ -760,6 +739,15 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView {
|
|||||||
|
|
||||||
@objc func shareButtonPressed() {
|
@objc func shareButtonPressed() {
|
||||||
if let item = self.item {
|
if let item = self.item {
|
||||||
|
if let channel = item.message.peers[item.message.id.peerId] as? TelegramChannel, case .broadcast = channel.info {
|
||||||
|
for attribute in item.message.attributes {
|
||||||
|
if let _ = attribute as? ReplyThreadMessageAttribute {
|
||||||
|
item.controllerInteraction.openMessageReplies(item.message.id)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if item.content.firstMessage.id.peerId == item.context.account.peerId {
|
if item.content.firstMessage.id.peerId == item.context.account.peerId {
|
||||||
for attribute in item.content.firstMessage.attributes {
|
for attribute in item.content.firstMessage.attributes {
|
||||||
if let attribute = attribute as? SourceReferenceMessageAttribute {
|
if let attribute = attribute as? SourceReferenceMessageAttribute {
|
||||||
|
@ -136,6 +136,10 @@ private func messagesShouldBeMerged(accountPeerId: PeerId, _ lhs: Message, _ rhs
|
|||||||
}
|
}
|
||||||
|
|
||||||
if abs(lhs.timestamp - rhs.timestamp) < Int32(10 * 60) && sameAuthor {
|
if abs(lhs.timestamp - rhs.timestamp) < Int32(10 * 60) && sameAuthor {
|
||||||
|
if let channel = lhs.peers[lhs.id.peerId] as? TelegramChannel, case .group = channel.info, lhsEffectiveAuthor?.id == channel.id, !lhs.effectivelyIncoming(accountPeerId) {
|
||||||
|
return .none
|
||||||
|
}
|
||||||
|
|
||||||
var upperStyle: Int32 = ChatMessageMerge.fullyMerged.rawValue
|
var upperStyle: Int32 = ChatMessageMerge.fullyMerged.rawValue
|
||||||
var lowerStyle: Int32 = ChatMessageMerge.fullyMerged.rawValue
|
var lowerStyle: Int32 = ChatMessageMerge.fullyMerged.rawValue
|
||||||
for media in lhs.media {
|
for media in lhs.media {
|
||||||
|
@ -28,7 +28,7 @@ class ChatMessageStickerItemNode: ChatMessageItemView {
|
|||||||
|
|
||||||
private var selectionNode: ChatMessageSelectionNode?
|
private var selectionNode: ChatMessageSelectionNode?
|
||||||
private var deliveryFailedNode: ChatMessageDeliveryFailedNode?
|
private var deliveryFailedNode: ChatMessageDeliveryFailedNode?
|
||||||
private var shareButtonNode: HighlightableButtonNode?
|
private var shareButtonNode: ChatMessageShareButton?
|
||||||
|
|
||||||
var telegramFile: TelegramMediaFile?
|
var telegramFile: TelegramMediaFile?
|
||||||
private let fetchDisposable = MetaDisposable()
|
private let fetchDisposable = MetaDisposable()
|
||||||
@ -444,30 +444,12 @@ class ChatMessageStickerItemNode: ChatMessageItemView {
|
|||||||
replyBackgroundImage = graphics.chatFreeformContentAdditionalInfoBackgroundImage
|
replyBackgroundImage = graphics.chatFreeformContentAdditionalInfoBackgroundImage
|
||||||
}
|
}
|
||||||
|
|
||||||
var updatedShareButtonBackground: UIImage?
|
var updatedShareButtonNode: ChatMessageShareButton?
|
||||||
|
|
||||||
var updatedShareButtonNode: HighlightableButtonNode?
|
|
||||||
if needShareButton {
|
if needShareButton {
|
||||||
if currentShareButtonNode != nil {
|
if currentShareButtonNode != nil {
|
||||||
updatedShareButtonNode = currentShareButtonNode
|
updatedShareButtonNode = currentShareButtonNode
|
||||||
if item.presentationData.theme !== currentItem?.presentationData.theme {
|
|
||||||
let graphics = PresentationResourcesChat.additionalGraphics(item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper, bubbleCorners: item.presentationData.chatBubbleCorners)
|
|
||||||
if item.message.id.peerId == item.context.account.peerId {
|
|
||||||
updatedShareButtonBackground = graphics.chatBubbleNavigateButtonImage
|
|
||||||
} else {
|
|
||||||
updatedShareButtonBackground = graphics.chatBubbleShareButtonImage
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
let buttonNode = HighlightableButtonNode()
|
let buttonNode = ChatMessageShareButton()
|
||||||
let buttonIcon: UIImage?
|
|
||||||
let graphics = PresentationResourcesChat.additionalGraphics(item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper, bubbleCorners: item.presentationData.chatBubbleCorners)
|
|
||||||
if item.message.id.peerId == item.context.account.peerId {
|
|
||||||
buttonIcon = graphics.chatBubbleNavigateButtonImage
|
|
||||||
} else {
|
|
||||||
buttonIcon = graphics.chatBubbleShareButtonImage
|
|
||||||
}
|
|
||||||
buttonNode.setBackgroundImage(buttonIcon, for: [.normal])
|
|
||||||
updatedShareButtonNode = buttonNode
|
updatedShareButtonNode = buttonNode
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -533,20 +515,15 @@ class ChatMessageStickerItemNode: ChatMessageItemView {
|
|||||||
strongSelf.addSubnode(updatedShareButtonNode)
|
strongSelf.addSubnode(updatedShareButtonNode)
|
||||||
updatedShareButtonNode.addTarget(strongSelf, action: #selector(strongSelf.shareButtonPressed), forControlEvents: .touchUpInside)
|
updatedShareButtonNode.addTarget(strongSelf, action: #selector(strongSelf.shareButtonPressed), forControlEvents: .touchUpInside)
|
||||||
}
|
}
|
||||||
if let updatedShareButtonBackground = updatedShareButtonBackground {
|
let buttonSize = updatedShareButtonNode.update(presentationData: item.presentationData, message: item.message, account: item.context.account)
|
||||||
strongSelf.shareButtonNode?.setBackgroundImage(updatedShareButtonBackground, for: [.normal])
|
var shareButtonFrame = CGRect(origin: CGPoint(x: updatedImageFrame.maxX + 8.0, y: updatedImageFrame.maxY - 10.0 - buttonSize.height), size: buttonSize)
|
||||||
}
|
|
||||||
} else if let shareButtonNode = strongSelf.shareButtonNode {
|
|
||||||
shareButtonNode.removeFromSupernode()
|
|
||||||
strongSelf.shareButtonNode = nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if let shareButtonNode = strongSelf.shareButtonNode {
|
|
||||||
var shareButtonFrame = CGRect(origin: CGPoint(x: updatedImageFrame.maxX + 8.0, y: updatedImageFrame.maxY - 30.0 - 10.0), size: CGSize(width: 29.0, height: 29.0))
|
|
||||||
if isEmoji && incoming {
|
if isEmoji && incoming {
|
||||||
shareButtonFrame.origin.x = dateAndStatusFrame.maxX + 8.0
|
shareButtonFrame.origin.x = dateAndStatusFrame.maxX + 8.0
|
||||||
}
|
}
|
||||||
transition.updateFrame(node: shareButtonNode, frame: shareButtonFrame)
|
transition.updateFrame(node: updatedShareButtonNode, frame: shareButtonFrame)
|
||||||
|
} else if let shareButtonNode = strongSelf.shareButtonNode {
|
||||||
|
shareButtonNode.removeFromSupernode()
|
||||||
|
strongSelf.shareButtonNode = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if let updatedReplyBackgroundNode = updatedReplyBackgroundNode {
|
if let updatedReplyBackgroundNode = updatedReplyBackgroundNode {
|
||||||
@ -795,6 +772,15 @@ class ChatMessageStickerItemNode: ChatMessageItemView {
|
|||||||
|
|
||||||
@objc func shareButtonPressed() {
|
@objc func shareButtonPressed() {
|
||||||
if let item = self.item {
|
if let item = self.item {
|
||||||
|
if let channel = item.message.peers[item.message.id.peerId] as? TelegramChannel, case .broadcast = channel.info {
|
||||||
|
for attribute in item.message.attributes {
|
||||||
|
if let _ = attribute as? ReplyThreadMessageAttribute {
|
||||||
|
item.controllerInteraction.openMessageReplies(item.message.id)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if item.content.firstMessage.id.peerId == item.context.account.peerId {
|
if item.content.firstMessage.id.peerId == item.context.account.peerId {
|
||||||
for attribute in item.content.firstMessage.attributes {
|
for attribute in item.content.firstMessage.attributes {
|
||||||
if let attribute = attribute as? SourceReferenceMessageAttribute {
|
if let attribute = attribute as? SourceReferenceMessageAttribute {
|
||||||
|
@ -790,6 +790,8 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate {
|
|||||||
} else {
|
} else {
|
||||||
placeholder = interfaceState.strings.Conversation_InputTextBroadcastPlaceholder
|
placeholder = interfaceState.strings.Conversation_InputTextBroadcastPlaceholder
|
||||||
}
|
}
|
||||||
|
} else if let channel = peer as? TelegramChannel, case .group = channel.info, channel.hasPermission(.canBeAnonymous) {
|
||||||
|
placeholder = interfaceState.strings.Conversation_InputTextAnonymousPlaceholder
|
||||||
} else if case .replyThread = interfaceState.chatLocation {
|
} else if case .replyThread = interfaceState.chatLocation {
|
||||||
//TODO:localize
|
//TODO:localize
|
||||||
placeholder = "Reply"
|
placeholder = "Reply"
|
||||||
|
Binary file not shown.
@ -187,274 +187,274 @@ public final class WalletStrings: Equatable {
|
|||||||
private let _s: [Int: String]
|
private let _s: [Int: String]
|
||||||
private let _r: [Int: [(Int, NSRange)]]
|
private let _r: [Int: [(Int, NSRange)]]
|
||||||
private let _ps: [Int: String]
|
private let _ps: [Int: String]
|
||||||
public var Wallet_Updated_JustNow: String { return self._s[0]! }
|
|
||||||
public var Wallet_WordCheck_IncorrectText: String { return self._s[1]! }
|
|
||||||
public var Wallet_Month_ShortNovember: String { return self._s[2]! }
|
|
||||||
public var Wallet_Configuration_BlockchainIdPlaceholder: String { return self._s[3]! }
|
|
||||||
public var Wallet_Info_Send: String { return self._s[4]! }
|
|
||||||
public var Wallet_TransactionInfo_SendGrams: String { return self._s[5]! }
|
|
||||||
public func Wallet_Info_TransactionBlockchainFee(_ _0: String) -> (String, [(Int, NSRange)]) {
|
|
||||||
return formatWithArgumentRanges(self._s[6]!, self._r[6]!, [_0])
|
|
||||||
}
|
|
||||||
public var Wallet_Sent_Title: String { return self._s[7]! }
|
|
||||||
public var Wallet_Receive_ShareUrlInfo: String { return self._s[8]! }
|
|
||||||
public var Wallet_RestoreFailed_Title: String { return self._s[9]! }
|
|
||||||
public var Wallet_TransactionInfo_CopyAddress: String { return self._s[11]! }
|
|
||||||
public var Wallet_Settings_BackupWallet: String { return self._s[12]! }
|
|
||||||
public var Wallet_Send_NetworkErrorTitle: String { return self._s[13]! }
|
|
||||||
public var Wallet_Month_ShortJune: String { return self._s[14]! }
|
|
||||||
public var Wallet_TransactionInfo_StorageFeeInfo: String { return self._s[15]! }
|
|
||||||
public var Wallet_Created_Title: String { return self._s[16]! }
|
|
||||||
public func Wallet_Configuration_ApplyErrorTextURLUnreachable(_ _0: String) -> (String, [(Int, NSRange)]) {
|
|
||||||
return formatWithArgumentRanges(self._s[17]!, self._r[17]!, [_0])
|
|
||||||
}
|
|
||||||
public var Wallet_Send_SyncInProgress: String { return self._s[18]! }
|
|
||||||
public var Wallet_Info_YourBalance: String { return self._s[19]! }
|
|
||||||
public var Wallet_Configuration_ApplyErrorTextURLInvalidData: String { return self._s[20]! }
|
|
||||||
public var Wallet_TransactionInfo_CommentHeader: String { return self._s[21]! }
|
|
||||||
public var Wallet_TransactionInfo_OtherFeeHeader: String { return self._s[22]! }
|
|
||||||
public func Wallet_Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
|
|
||||||
return formatWithArgumentRanges(self._s[23]!, self._r[23]!, [_1, _2, _3])
|
|
||||||
}
|
|
||||||
public var Wallet_Settings_ConfigurationInfo: String { return self._s[24]! }
|
|
||||||
public var Wallet_WordImport_IncorrectText: String { return self._s[25]! }
|
|
||||||
public var Wallet_Month_GenJanuary: String { return self._s[26]! }
|
|
||||||
public var Wallet_Send_OwnAddressAlertTitle: String { return self._s[27]! }
|
|
||||||
public var Wallet_Receive_ShareAddress: String { return self._s[28]! }
|
|
||||||
public var Wallet_WordImport_Title: String { return self._s[29]! }
|
|
||||||
public var Wallet_TransactionInfo_Title: String { return self._s[30]! }
|
|
||||||
public var Wallet_Words_NotDoneText: String { return self._s[32]! }
|
|
||||||
public var Wallet_RestoreFailed_EnterWords: String { return self._s[33]! }
|
|
||||||
public var Wallet_WordImport_Text: String { return self._s[34]! }
|
|
||||||
public var Wallet_RestoreFailed_Text: String { return self._s[36]! }
|
|
||||||
public var Wallet_TransactionInfo_NoAddress: String { return self._s[37]! }
|
|
||||||
public var Wallet_Navigation_Back: String { return self._s[38]! }
|
|
||||||
public var Wallet_Intro_Terms: String { return self._s[39]! }
|
|
||||||
public func Wallet_Send_Balance(_ _0: String) -> (String, [(Int, NSRange)]) {
|
|
||||||
return formatWithArgumentRanges(self._s[40]!, self._r[40]!, [_0])
|
|
||||||
}
|
|
||||||
public func Wallet_Time_PreciseDate_m8(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
|
|
||||||
return formatWithArgumentRanges(self._s[41]!, self._r[41]!, [_1, _2, _3])
|
|
||||||
}
|
|
||||||
public var Wallet_TransactionInfo_AddressCopied: String { return self._s[42]! }
|
|
||||||
public func Wallet_Info_TransactionDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
|
|
||||||
return formatWithArgumentRanges(self._s[43]!, self._r[43]!, [_1, _2, _3])
|
|
||||||
}
|
|
||||||
public var Wallet_Send_NetworkErrorText: String { return self._s[44]! }
|
|
||||||
public var Wallet_VoiceOver_Editing_ClearText: String { return self._s[45]! }
|
|
||||||
public var Wallet_Intro_ImportExisting: String { return self._s[46]! }
|
|
||||||
public var Wallet_Receive_CommentInfo: String { return self._s[47]! }
|
|
||||||
public var Wallet_WordCheck_Continue: String { return self._s[48]! }
|
|
||||||
public var Wallet_Send_EncryptComment: String { return self._s[49]! }
|
|
||||||
public var Wallet_Receive_InvoiceUrlCopied: String { return self._s[50]! }
|
|
||||||
public var Wallet_Completed_Text: String { return self._s[51]! }
|
|
||||||
public var Wallet_WordCheck_IncorrectHeader: String { return self._s[53]! }
|
|
||||||
public var Wallet_Configuration_SourceHeader: String { return self._s[54]! }
|
|
||||||
public var Wallet_TransactionInfo_StorageFeeInfoUrl: String { return self._s[55]! }
|
|
||||||
public var Wallet_Receive_Title: String { return self._s[56]! }
|
|
||||||
public var Wallet_Info_WalletCreated: String { return self._s[57]! }
|
|
||||||
public var Wallet_Navigation_Cancel: String { return self._s[58]! }
|
|
||||||
public var Wallet_CreateInvoice_Title: String { return self._s[59]! }
|
|
||||||
public func Wallet_WordCheck_Text(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
|
|
||||||
return formatWithArgumentRanges(self._s[60]!, self._r[60]!, [_1, _2, _3])
|
|
||||||
}
|
|
||||||
public var Wallet_TransactionInfo_SenderHeader: String { return self._s[61]! }
|
|
||||||
public func Wallet_Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
|
|
||||||
return formatWithArgumentRanges(self._s[62]!, self._r[62]!, [_1, _2, _3])
|
|
||||||
}
|
|
||||||
public var Wallet_Month_GenAugust: String { return self._s[63]! }
|
|
||||||
public var Wallet_Info_UnknownTransaction: String { return self._s[64]! }
|
|
||||||
public var Wallet_Receive_CreateInvoice: String { return self._s[65]! }
|
|
||||||
public var Wallet_Month_GenSeptember: String { return self._s[66]! }
|
|
||||||
public var Wallet_Month_GenJuly: String { return self._s[67]! }
|
|
||||||
public var Wallet_Receive_AddressHeader: String { return self._s[68]! }
|
|
||||||
public var Wallet_Send_AmountText: String { return self._s[69]! }
|
|
||||||
public var Wallet_SecureStorageNotAvailable_Text: String { return self._s[70]! }
|
|
||||||
public func Wallet_Time_PreciseDate_m12(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
|
|
||||||
return formatWithArgumentRanges(self._s[71]!, self._r[71]!, [_1, _2, _3])
|
|
||||||
}
|
|
||||||
public func Wallet_Updated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) {
|
public func Wallet_Updated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) {
|
||||||
return formatWithArgumentRanges(self._s[72]!, self._r[72]!, [_0])
|
return formatWithArgumentRanges(self._s[0]!, self._r[0]!, [_0])
|
||||||
}
|
}
|
||||||
public var Wallet_Configuration_Title: String { return self._s[74]! }
|
public var Wallet_Receive_AddressHeader: String { return self._s[2]! }
|
||||||
public var Wallet_Configuration_BlockchainIdHeader: String { return self._s[75]! }
|
public var Wallet_Navigation_Cancel: String { return self._s[3]! }
|
||||||
public var Wallet_Words_Title: String { return self._s[76]! }
|
public var Wallet_SecureStorageChanged_PasscodeText: String { return self._s[4]! }
|
||||||
public var Wallet_Month_ShortMay: String { return self._s[77]! }
|
public var Wallet_Month_GenNovember: String { return self._s[5]! }
|
||||||
public var Wallet_WordCheck_Title: String { return self._s[78]! }
|
public var Wallet_Month_GenApril: String { return self._s[6]! }
|
||||||
public var Wallet_Words_NotDoneResponse: String { return self._s[79]! }
|
public var Wallet_Weekday_Today: String { return self._s[7]! }
|
||||||
public var Wallet_Configuration_SourceURL: String { return self._s[80]! }
|
public var Wallet_Info_ReceiveGrams: String { return self._s[9]! }
|
||||||
public var Wallet_Send_ErrorNotEnoughFundsText: String { return self._s[81]! }
|
public var Wallet_TransactionInfo_Title: String { return self._s[10]! }
|
||||||
public var Wallet_Receive_CreateInvoiceInfo: String { return self._s[82]! }
|
public var Wallet_Receive_CommentHeader: String { return self._s[11]! }
|
||||||
public func Wallet_Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
|
public func Wallet_Sent_Text(_ _0: String) -> (String, [(Int, NSRange)]) {
|
||||||
|
return formatWithArgumentRanges(self._s[12]!, self._r[12]!, [_0])
|
||||||
|
}
|
||||||
|
public var Wallet_Info_WalletCreated: String { return self._s[14]! }
|
||||||
|
public var Wallet_Month_GenJanuary: String { return self._s[15]! }
|
||||||
|
public var Wallet_Send_NetworkErrorTitle: String { return self._s[16]! }
|
||||||
|
public var Wallet_SecureStorageNotAvailable_Title: String { return self._s[17]! }
|
||||||
|
public var Wallet_WordCheck_Continue: String { return self._s[18]! }
|
||||||
|
public func Wallet_Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
|
||||||
|
return formatWithArgumentRanges(self._s[19]!, self._r[19]!, [_1, _2, _3])
|
||||||
|
}
|
||||||
|
public var Wallet_Created_ExportErrorText: String { return self._s[20]! }
|
||||||
|
public var Wallet_Info_RefreshErrorText: String { return self._s[21]! }
|
||||||
|
public var Wallet_Month_GenSeptember: String { return self._s[22]! }
|
||||||
|
public var Wallet_Month_GenDecember: String { return self._s[23]! }
|
||||||
|
public var Wallet_Sent_Title: String { return self._s[24]! }
|
||||||
|
public func Wallet_SecureStorageChanged_BiometryText(_ _0: String) -> (String, [(Int, NSRange)]) {
|
||||||
|
return formatWithArgumentRanges(self._s[25]!, self._r[25]!, [_0])
|
||||||
|
}
|
||||||
|
public var Wallet_Send_ErrorNotEnoughFundsText: String { return self._s[26]! }
|
||||||
|
public var Wallet_Receive_CopyAddress: String { return self._s[27]! }
|
||||||
|
public var Wallet_TransactionInfo_SenderHeader: String { return self._s[28]! }
|
||||||
|
public var Wallet_Words_NotDoneOk: String { return self._s[29]! }
|
||||||
|
public var Wallet_Receive_AmountHeader: String { return self._s[30]! }
|
||||||
|
public var Wallet_Configuration_SourceJSON: String { return self._s[31]! }
|
||||||
|
public var Wallet_Send_ErrorInvalidAddress: String { return self._s[32]! }
|
||||||
|
public var Wallet_Receive_ShareUrlInfo: String { return self._s[33]! }
|
||||||
|
public var Wallet_Words_Text: String { return self._s[34]! }
|
||||||
|
public var Wallet_Receive_CopyInvoiceUrl: String { return self._s[35]! }
|
||||||
|
public var Wallet_Send_AddressInfo: String { return self._s[36]! }
|
||||||
|
public var Wallet_Month_ShortJuly: String { return self._s[37]! }
|
||||||
|
public var Wallet_AccessDenied_Settings: String { return self._s[38]! }
|
||||||
|
public var Wallet_WordImport_IncorrectTitle: String { return self._s[39]! }
|
||||||
|
public var Wallet_Completed_Text: String { return self._s[40]! }
|
||||||
|
public var Wallet_Info_TransactionFrom: String { return self._s[41]! }
|
||||||
|
public func Wallet_Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
|
||||||
|
return formatWithArgumentRanges(self._s[42]!, self._r[42]!, [_1, _2, _3])
|
||||||
|
}
|
||||||
|
public var Wallet_Configuration_ApplyErrorTextJSONInvalidData: String { return self._s[43]! }
|
||||||
|
public var Wallet_SecureStorageReset_PasscodeText: String { return self._s[44]! }
|
||||||
|
public var Wallet_Month_ShortNovember: String { return self._s[46]! }
|
||||||
|
public var Wallet_Configuration_BlockchainNameChangedText: String { return self._s[47]! }
|
||||||
|
public var Wallet_Configuration_ApplyErrorTextURLInvalid: String { return self._s[48]! }
|
||||||
|
public var Wallet_Send_UninitializedText: String { return self._s[49]! }
|
||||||
|
public var Wallet_WordImport_Title: String { return self._s[50]! }
|
||||||
|
public func Wallet_Info_TransactionDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
|
||||||
|
return formatWithArgumentRanges(self._s[51]!, self._r[51]!, [_1, _2, _3])
|
||||||
|
}
|
||||||
|
public var Wallet_Send_AddressHeader: String { return self._s[52]! }
|
||||||
|
public var Wallet_Send_Title: String { return self._s[53]! }
|
||||||
|
public var Wallet_Send_SendAnyway: String { return self._s[54]! }
|
||||||
|
public func Wallet_Time_PreciseDate_m8(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
|
||||||
|
return formatWithArgumentRanges(self._s[55]!, self._r[55]!, [_1, _2, _3])
|
||||||
|
}
|
||||||
|
public var Wallet_UnknownError: String { return self._s[56]! }
|
||||||
|
public var Wallet_Month_ShortApril: String { return self._s[57]! }
|
||||||
|
public var Wallet_Settings_ConfigurationInfo: String { return self._s[58]! }
|
||||||
|
public var Wallet_Qr_ScanCode: String { return self._s[59]! }
|
||||||
|
public var Wallet_Info_Address: String { return self._s[60]! }
|
||||||
|
public func Wallet_Configuration_ApplyErrorTextURLUnreachable(_ _0: String) -> (String, [(Int, NSRange)]) {
|
||||||
|
return formatWithArgumentRanges(self._s[61]!, self._r[61]!, [_0])
|
||||||
|
}
|
||||||
|
public var Wallet_Month_ShortMay: String { return self._s[62]! }
|
||||||
|
public var Wallet_Send_OwnAddressAlertTitle: String { return self._s[63]! }
|
||||||
|
public var Wallet_TransactionInfo_OtherFeeInfoUrl: String { return self._s[64]! }
|
||||||
|
public var Wallet_WordCheck_IncorrectText: String { return self._s[65]! }
|
||||||
|
public var Wallet_Receive_ShareInvoiceUrl: String { return self._s[66]! }
|
||||||
|
public var Wallet_Receive_CreateInvoiceInfo: String { return self._s[67]! }
|
||||||
|
public var Wallet_TransactionInfo_StorageFeeInfoUrl: String { return self._s[68]! }
|
||||||
|
public var Wallet_Navigation_Back: String { return self._s[69]! }
|
||||||
|
public var Wallet_Send_Confirmation: String { return self._s[70]! }
|
||||||
|
public var Wallet_Configuration_SourceURL: String { return self._s[71]! }
|
||||||
|
public var Wallet_Intro_CreateErrorTitle: String { return self._s[72]! }
|
||||||
|
public var Wallet_Month_GenJuly: String { return self._s[73]! }
|
||||||
|
public var Wallet_Words_NotDoneTitle: String { return self._s[74]! }
|
||||||
|
public var Wallet_TransactionInfo_SendGrams: String { return self._s[75]! }
|
||||||
|
public func Wallet_SecureStorageReset_BiometryText(_ _0: String) -> (String, [(Int, NSRange)]) {
|
||||||
|
return formatWithArgumentRanges(self._s[76]!, self._r[76]!, [_0])
|
||||||
|
}
|
||||||
|
public var Wallet_Send_UninitializedTitle: String { return self._s[77]! }
|
||||||
|
public var Wallet_Created_Title: String { return self._s[78]! }
|
||||||
|
public var Wallet_Settings_Title: String { return self._s[79]! }
|
||||||
|
public var Wallet_Completed_ViewWallet: String { return self._s[80]! }
|
||||||
|
public var Wallet_Send_SyncInProgress: String { return self._s[81]! }
|
||||||
|
public var Wallet_Configuration_SourceHeader: String { return self._s[82]! }
|
||||||
|
public func Wallet_Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
|
||||||
return formatWithArgumentRanges(self._s[83]!, self._r[83]!, [_1, _2, _3])
|
return formatWithArgumentRanges(self._s[83]!, self._r[83]!, [_1, _2, _3])
|
||||||
}
|
}
|
||||||
public var Wallet_Info_Address: String { return self._s[84]! }
|
public var Wallet_Info_Updating: String { return self._s[84]! }
|
||||||
public var Wallet_Intro_CreateWallet: String { return self._s[85]! }
|
public var Wallet_TransactionInfo_StorageFeeHeader: String { return self._s[85]! }
|
||||||
public var Wallet_SecureStorageChanged_PasscodeText: String { return self._s[86]! }
|
public var Wallet_Month_ShortMarch: String { return self._s[86]! }
|
||||||
public func Wallet_SecureStorageReset_BiometryText(_ _0: String) -> (String, [(Int, NSRange)]) {
|
public var Wallet_Send_Send: String { return self._s[87]! }
|
||||||
return formatWithArgumentRanges(self._s[87]!, self._r[87]!, [_0])
|
public var Wallet_Send_TransactionInProgress: String { return self._s[88]! }
|
||||||
|
public var Wallet_Month_ShortJanuary: String { return self._s[89]! }
|
||||||
|
public var Wallet_Navigation_Done: String { return self._s[90]! }
|
||||||
|
public var Wallet_Words_NotDoneText: String { return self._s[91]! }
|
||||||
|
public var Wallet_Month_GenMay: String { return self._s[92]! }
|
||||||
|
public var Wallet_TransactionInfo_AddressCopied: String { return self._s[93]! }
|
||||||
|
public var Wallet_Month_GenMarch: String { return self._s[94]! }
|
||||||
|
public var Wallet_SecureStorageChanged_ImportWallet: String { return self._s[95]! }
|
||||||
|
public var Wallet_RestoreFailed_CreateWallet: String { return self._s[96]! }
|
||||||
|
public var Wallet_Receive_InvoiceUrlCopied: String { return self._s[97]! }
|
||||||
|
public var Wallet_Receive_AmountText: String { return self._s[98]! }
|
||||||
|
public var Wallet_Receive_ShareAddress: String { return self._s[99]! }
|
||||||
|
public var Wallet_Receive_CommentInfo: String { return self._s[100]! }
|
||||||
|
public var Wallet_Intro_Text: String { return self._s[101]! }
|
||||||
|
public var Wallet_WordImport_IncorrectText: String { return self._s[102]! }
|
||||||
|
public var Wallet_Month_GenFebruary: String { return self._s[104]! }
|
||||||
|
public var Wallet_Send_NetworkErrorText: String { return self._s[105]! }
|
||||||
|
public var Wallet_Created_Proceed: String { return self._s[106]! }
|
||||||
|
public var Wallet_Info_UnknownTransaction: String { return self._s[107]! }
|
||||||
|
public func Wallet_Send_Balance(_ _0: String) -> (String, [(Int, NSRange)]) {
|
||||||
|
return formatWithArgumentRanges(self._s[108]!, self._r[108]!, [_0])
|
||||||
}
|
}
|
||||||
public var Wallet_Send_SendAnyway: String { return self._s[88]! }
|
public var Wallet_SecureStorageReset_Title: String { return self._s[110]! }
|
||||||
public var Wallet_UnknownError: String { return self._s[89]! }
|
public var Wallet_Configuration_Title: String { return self._s[111]! }
|
||||||
public var Wallet_Configuration_ApplyErrorTextURLInvalid: String { return self._s[90]! }
|
public var Wallet_Send_ErrorDecryptionFailed: String { return self._s[112]! }
|
||||||
public var Wallet_SecureStorageChanged_ImportWallet: String { return self._s[91]! }
|
public var Wallet_CreateInvoice_Title: String { return self._s[113]! }
|
||||||
public var Wallet_SecureStorageChanged_CreateWallet: String { return self._s[93]! }
|
public var Wallet_Info_Receive: String { return self._s[114]! }
|
||||||
public var Wallet_Configuration_SourceInfo: String { return self._s[94]! }
|
public var Wallet_Sending_Text: String { return self._s[115]! }
|
||||||
public var Wallet_Words_NotDoneOk: String { return self._s[95]! }
|
public var Wallet_Intro_NotNow: String { return self._s[116]! }
|
||||||
public var Wallet_Intro_Title: String { return self._s[96]! }
|
public var Wallet_SecureStorageChanged_CreateWallet: String { return self._s[117]! }
|
||||||
public var Wallet_Info_Receive: String { return self._s[97]! }
|
public var Wallet_TransactionInfo_CommentHeader: String { return self._s[118]! }
|
||||||
public var Wallet_Completed_ViewWallet: String { return self._s[98]! }
|
public var Wallet_Intro_CreateErrorText: String { return self._s[119]! }
|
||||||
public var Wallet_Month_ShortJuly: String { return self._s[99]! }
|
public var Wallet_Weekday_Yesterday: String { return self._s[120]! }
|
||||||
public var Wallet_Month_ShortApril: String { return self._s[100]! }
|
public var Wallet_Configuration_ApplyErrorTitle: String { return self._s[121]! }
|
||||||
public func Wallet_Info_TransactionDateHeader(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
|
public var Wallet_Info_Send: String { return self._s[122]! }
|
||||||
return formatWithArgumentRanges(self._s[101]!, self._r[101]!, [_1, _2])
|
|
||||||
}
|
|
||||||
public var Wallet_Receive_ShareInvoiceUrl: String { return self._s[102]! }
|
|
||||||
public func Wallet_Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
|
|
||||||
return formatWithArgumentRanges(self._s[103]!, self._r[103]!, [_1, _2, _3])
|
|
||||||
}
|
|
||||||
public var Wallet_Send_UninitializedText: String { return self._s[105]! }
|
|
||||||
public func Wallet_Sent_Text(_ _0: String) -> (String, [(Int, NSRange)]) {
|
|
||||||
return formatWithArgumentRanges(self._s[106]!, self._r[106]!, [_0])
|
|
||||||
}
|
|
||||||
public var Wallet_Month_GenNovember: String { return self._s[107]! }
|
|
||||||
public func Wallet_Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
|
public func Wallet_Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
|
||||||
return formatWithArgumentRanges(self._s[108]!, self._r[108]!, [_1, _2, _3])
|
return formatWithArgumentRanges(self._s[123]!, self._r[123]!, [_1, _2, _3])
|
||||||
}
|
}
|
||||||
public var Wallet_Month_GenApril: String { return self._s[109]! }
|
public var Wallet_Intro_CreateWallet: String { return self._s[124]! }
|
||||||
public var Wallet_Month_ShortMarch: String { return self._s[110]! }
|
public var Wallet_Sending_Title: String { return self._s[125]! }
|
||||||
public var Wallet_Month_GenFebruary: String { return self._s[111]! }
|
public var Wallet_Updated_JustNow: String { return self._s[126]! }
|
||||||
public var Wallet_Qr_ScanCode: String { return self._s[112]! }
|
public func Wallet_Info_TransactionBlockchainFee(_ _0: String) -> (String, [(Int, NSRange)]) {
|
||||||
public var Wallet_Receive_AddressCopied: String { return self._s[113]! }
|
return formatWithArgumentRanges(self._s[127]!, self._r[127]!, [_0])
|
||||||
public var Wallet_Send_UninitializedTitle: String { return self._s[114]! }
|
|
||||||
public var Wallet_AccessDenied_Title: String { return self._s[115]! }
|
|
||||||
public var Wallet_AccessDenied_Settings: String { return self._s[116]! }
|
|
||||||
public var Wallet_Send_Send: String { return self._s[117]! }
|
|
||||||
public var Wallet_Info_RefreshErrorTitle: String { return self._s[118]! }
|
|
||||||
public var Wallet_Month_GenJune: String { return self._s[119]! }
|
|
||||||
public var Wallet_Send_AddressHeader: String { return self._s[120]! }
|
|
||||||
public var Wallet_SecureStorageReset_BiometryTouchId: String { return self._s[121]! }
|
|
||||||
public var Wallet_Send_Confirmation: String { return self._s[122]! }
|
|
||||||
public var Wallet_Completed_Title: String { return self._s[123]! }
|
|
||||||
public var Wallet_Alert_OK: String { return self._s[124]! }
|
|
||||||
public var Wallet_Settings_DeleteWallet: String { return self._s[125]! }
|
|
||||||
public var Wallet_SecureStorageReset_PasscodeText: String { return self._s[126]! }
|
|
||||||
public var Wallet_Month_ShortSeptember: String { return self._s[127]! }
|
|
||||||
public var Wallet_Info_TransactionTo: String { return self._s[128]! }
|
|
||||||
public var Wallet_Send_ConfirmationConfirm: String { return self._s[129]! }
|
|
||||||
public var Wallet_TransactionInfo_OtherFeeInfo: String { return self._s[130]! }
|
|
||||||
public var Wallet_Receive_AmountText: String { return self._s[131]! }
|
|
||||||
public var Wallet_Receive_CopyAddress: String { return self._s[132]! }
|
|
||||||
public var Wallet_Intro_Text: String { return self._s[134]! }
|
|
||||||
public var Wallet_Configuration_Apply: String { return self._s[135]! }
|
|
||||||
public func Wallet_SecureStorageChanged_BiometryText(_ _0: String) -> (String, [(Int, NSRange)]) {
|
|
||||||
return formatWithArgumentRanges(self._s[136]!, self._r[136]!, [_0])
|
|
||||||
}
|
}
|
||||||
public func Wallet_Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
|
public var Wallet_Month_ShortDecember: String { return self._s[128]! }
|
||||||
|
public var Wallet_Info_YourBalance: String { return self._s[129]! }
|
||||||
|
public var Wallet_Configuration_BlockchainNameChangedTitle: String { return self._s[130]! }
|
||||||
|
public var Wallet_AccessDenied_Title: String { return self._s[131]! }
|
||||||
|
public var Wallet_Words_Title: String { return self._s[132]! }
|
||||||
|
public var Wallet_Configuration_BlockchainNameChangedProceed: String { return self._s[133]! }
|
||||||
|
public func Wallet_Info_TransactionDateHeader(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
|
||||||
|
return formatWithArgumentRanges(self._s[134]!, self._r[134]!, [_1, _2])
|
||||||
|
}
|
||||||
|
public var Wallet_Words_NotDoneResponse: String { return self._s[135]! }
|
||||||
|
public var Wallet_Send_ErrorNotEnoughFundsTitle: String { return self._s[136]! }
|
||||||
|
public func Wallet_WordCheck_Text(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
|
||||||
return formatWithArgumentRanges(self._s[137]!, self._r[137]!, [_1, _2, _3])
|
return formatWithArgumentRanges(self._s[137]!, self._r[137]!, [_1, _2, _3])
|
||||||
}
|
}
|
||||||
public var Wallet_RestoreFailed_CreateWallet: String { return self._s[138]! }
|
public var Wallet_SecureStorageReset_BiometryTouchId: String { return self._s[138]! }
|
||||||
public var Wallet_Weekday_Yesterday: String { return self._s[139]! }
|
public var Wallet_RestoreFailed_Title: String { return self._s[140]! }
|
||||||
public var Wallet_Receive_AmountHeader: String { return self._s[140]! }
|
public var Wallet_Alert_OK: String { return self._s[141]! }
|
||||||
public var Wallet_TransactionInfo_OtherFeeInfoUrl: String { return self._s[141]! }
|
public var Wallet_Navigation_Close: String { return self._s[142]! }
|
||||||
public var Wallet_Month_ShortFebruary: String { return self._s[142]! }
|
public var Wallet_Configuration_BlockchainIdHeader: String { return self._s[143]! }
|
||||||
public var Wallet_Configuration_SourceJSON: String { return self._s[143]! }
|
public var Wallet_Send_AddressText: String { return self._s[144]! }
|
||||||
public var Wallet_Alert_Cancel: String { return self._s[144]! }
|
public var Wallet_Configuration_BlockchainIdInfo: String { return self._s[145]! }
|
||||||
public var Wallet_TransactionInfo_RecipientHeader: String { return self._s[145]! }
|
public func Wallet_Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
|
||||||
public var Wallet_Configuration_ApplyErrorTextJSONInvalidData: String { return self._s[146]! }
|
return formatWithArgumentRanges(self._s[146]!, self._r[146]!, [_1, _2, _3])
|
||||||
public var Wallet_Info_TransactionFrom: String { return self._s[147]! }
|
|
||||||
public var Wallet_Send_ErrorDecryptionFailed: String { return self._s[148]! }
|
|
||||||
public var Wallet_Send_OwnAddressAlertText: String { return self._s[149]! }
|
|
||||||
public var Wallet_Words_NotDoneTitle: String { return self._s[150]! }
|
|
||||||
public var Wallet_Month_ShortOctober: String { return self._s[151]! }
|
|
||||||
public var Wallet_Month_GenMay: String { return self._s[152]! }
|
|
||||||
public var Wallet_Intro_CreateErrorTitle: String { return self._s[153]! }
|
|
||||||
public var Wallet_SecureStorageReset_BiometryFaceId: String { return self._s[154]! }
|
|
||||||
public var Wallet_Month_ShortJanuary: String { return self._s[155]! }
|
|
||||||
public var Wallet_Month_GenMarch: String { return self._s[156]! }
|
|
||||||
public var Wallet_AccessDenied_Camera: String { return self._s[157]! }
|
|
||||||
public var Wallet_Sending_Text: String { return self._s[158]! }
|
|
||||||
public var Wallet_Month_GenOctober: String { return self._s[159]! }
|
|
||||||
public var Wallet_Receive_CopyInvoiceUrl: String { return self._s[160]! }
|
|
||||||
public var Wallet_ContextMenuCopy: String { return self._s[161]! }
|
|
||||||
public func Wallet_Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
|
|
||||||
return formatWithArgumentRanges(self._s[162]!, self._r[162]!, [_1, _2, _3])
|
|
||||||
}
|
}
|
||||||
public var Wallet_Info_Updating: String { return self._s[164]! }
|
public func Wallet_Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
|
||||||
public var Wallet_Created_ExportErrorTitle: String { return self._s[165]! }
|
return formatWithArgumentRanges(self._s[147]!, self._r[147]!, [_1, _2, _3])
|
||||||
public var Wallet_SecureStorageNotAvailable_Title: String { return self._s[166]! }
|
|
||||||
public var Wallet_Sending_Title: String { return self._s[167]! }
|
|
||||||
public var Wallet_Navigation_Done: String { return self._s[168]! }
|
|
||||||
public var Wallet_Configuration_BlockchainIdInfo: String { return self._s[169]! }
|
|
||||||
public var Wallet_Configuration_BlockchainNameChangedTitle: String { return self._s[170]! }
|
|
||||||
public var Wallet_Settings_Title: String { return self._s[171]! }
|
|
||||||
public func Wallet_Receive_ShareInvoiceUrlInfo(_ _0: String) -> (String, [(Int, NSRange)]) {
|
|
||||||
return formatWithArgumentRanges(self._s[172]!, self._r[172]!, [_0])
|
|
||||||
}
|
|
||||||
public var Wallet_Info_RefreshErrorNetworkText: String { return self._s[173]! }
|
|
||||||
public var Wallet_Weekday_Today: String { return self._s[175]! }
|
|
||||||
public var Wallet_Month_ShortDecember: String { return self._s[176]! }
|
|
||||||
public var Wallet_Words_Text: String { return self._s[177]! }
|
|
||||||
public var Wallet_Configuration_BlockchainNameChangedProceed: String { return self._s[178]! }
|
|
||||||
public var Wallet_WordCheck_ViewWords: String { return self._s[179]! }
|
|
||||||
public var Wallet_Send_AddressInfo: String { return self._s[180]! }
|
|
||||||
public func Wallet_Updated_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) {
|
|
||||||
return formatWithArgumentRanges(self._s[181]!, self._r[181]!, [_0])
|
|
||||||
}
|
|
||||||
public var Wallet_Intro_NotNow: String { return self._s[182]! }
|
|
||||||
public var Wallet_Send_OwnAddressAlertProceed: String { return self._s[183]! }
|
|
||||||
public var Wallet_Navigation_Close: String { return self._s[184]! }
|
|
||||||
public var Wallet_Month_GenDecember: String { return self._s[186]! }
|
|
||||||
public var Wallet_Send_ErrorNotEnoughFundsTitle: String { return self._s[187]! }
|
|
||||||
public var Wallet_WordImport_IncorrectTitle: String { return self._s[188]! }
|
|
||||||
public var Wallet_Send_AddressText: String { return self._s[189]! }
|
|
||||||
public var Wallet_Receive_AmountInfo: String { return self._s[190]! }
|
|
||||||
public func Wallet_Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
|
|
||||||
return formatWithArgumentRanges(self._s[191]!, self._r[191]!, [_1, _2, _3])
|
|
||||||
}
|
|
||||||
public var Wallet_Month_ShortAugust: String { return self._s[192]! }
|
|
||||||
public var Wallet_Qr_Title: String { return self._s[193]! }
|
|
||||||
public var Wallet_Settings_Configuration: String { return self._s[194]! }
|
|
||||||
public var Wallet_WordCheck_TryAgain: String { return self._s[195]! }
|
|
||||||
public var Wallet_Info_TransactionPendingHeader: String { return self._s[196]! }
|
|
||||||
public var Wallet_Receive_InvoiceUrlHeader: String { return self._s[197]! }
|
|
||||||
public var Wallet_Configuration_ApplyErrorTitle: String { return self._s[198]! }
|
|
||||||
public var Wallet_Send_TransactionInProgress: String { return self._s[199]! }
|
|
||||||
public var Wallet_Created_Text: String { return self._s[200]! }
|
|
||||||
public var Wallet_Created_Proceed: String { return self._s[201]! }
|
|
||||||
public var Wallet_Words_Done: String { return self._s[202]! }
|
|
||||||
public var Wallet_WordImport_Continue: String { return self._s[203]! }
|
|
||||||
public var Wallet_TransactionInfo_StorageFeeHeader: String { return self._s[204]! }
|
|
||||||
public var Wallet_WordImport_CanNotRemember: String { return self._s[205]! }
|
|
||||||
public func Wallet_Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
|
|
||||||
return formatWithArgumentRanges(self._s[206]!, self._r[206]!, [_1, _2, _3])
|
|
||||||
}
|
}
|
||||||
|
public var Wallet_VoiceOver_Editing_ClearText: String { return self._s[148]! }
|
||||||
|
public var Wallet_SecureStorageNotAvailable_Text: String { return self._s[149]! }
|
||||||
|
public var Wallet_TransactionInfo_CopyAddress: String { return self._s[150]! }
|
||||||
|
public var Wallet_Settings_BackupWallet: String { return self._s[151]! }
|
||||||
|
public var Wallet_Configuration_ApplyErrorTextURLInvalidData: String { return self._s[152]! }
|
||||||
|
public var Wallet_RestoreFailed_EnterWords: String { return self._s[153]! }
|
||||||
|
public var Wallet_Created_Text: String { return self._s[154]! }
|
||||||
|
public var Wallet_Month_ShortJune: String { return self._s[155]! }
|
||||||
|
public var Wallet_Send_AmountText: String { return self._s[156]! }
|
||||||
|
public var Wallet_Intro_Title: String { return self._s[157]! }
|
||||||
|
public var Wallet_Month_GenAugust: String { return self._s[158]! }
|
||||||
|
public var Wallet_Qr_Title: String { return self._s[159]! }
|
||||||
|
public var Wallet_Month_GenJune: String { return self._s[160]! }
|
||||||
|
public var Wallet_Configuration_Apply: String { return self._s[162]! }
|
||||||
public func Wallet_Send_ConfirmationText(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
|
public func Wallet_Send_ConfirmationText(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
|
||||||
return formatWithArgumentRanges(self._s[207]!, self._r[207]!, [_1, _2, _3])
|
return formatWithArgumentRanges(self._s[163]!, self._r[163]!, [_1, _2, _3])
|
||||||
}
|
}
|
||||||
public var Wallet_Created_ExportErrorText: String { return self._s[209]! }
|
public var Wallet_ContextMenuCopy: String { return self._s[164]! }
|
||||||
|
public var Wallet_SecureStorageReset_BiometryFaceId: String { return self._s[165]! }
|
||||||
|
public var Wallet_WordCheck_TryAgain: String { return self._s[166]! }
|
||||||
|
public var Wallet_Settings_DeleteWalletInfo: String { return self._s[167]! }
|
||||||
|
public var Wallet_Month_ShortOctober: String { return self._s[168]! }
|
||||||
|
public var Wallet_Configuration_SourceInfo: String { return self._s[169]! }
|
||||||
|
public var Wallet_TransactionInfo_NoAddress: String { return self._s[170]! }
|
||||||
|
public var Wallet_WordCheck_IncorrectHeader: String { return self._s[171]! }
|
||||||
|
public var Wallet_Completed_Title: String { return self._s[172]! }
|
||||||
|
public func Wallet_Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
|
||||||
|
return formatWithArgumentRanges(self._s[173]!, self._r[173]!, [_1, _2, _3])
|
||||||
|
}
|
||||||
|
public var Wallet_WordImport_Text: String { return self._s[174]! }
|
||||||
|
public var Wallet_Info_RefreshErrorNetworkText: String { return self._s[175]! }
|
||||||
public func Wallet_Updated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) {
|
public func Wallet_Updated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) {
|
||||||
|
return formatWithArgumentRanges(self._s[177]!, self._r[177]!, [_0])
|
||||||
|
}
|
||||||
|
public var Wallet_Send_OwnAddressAlertProceed: String { return self._s[178]! }
|
||||||
|
public var Wallet_RestoreFailed_Text: String { return self._s[179]! }
|
||||||
|
public var Wallet_Settings_DeleteWallet: String { return self._s[180]! }
|
||||||
|
public var Wallet_TransactionInfo_OtherFeeHeader: String { return self._s[181]! }
|
||||||
|
public var Wallet_Settings_Configuration: String { return self._s[182]! }
|
||||||
|
public var Wallet_Sent_ViewWallet: String { return self._s[183]! }
|
||||||
|
public var Wallet_WordImport_Continue: String { return self._s[184]! }
|
||||||
|
public var Wallet_WordCheck_ViewWords: String { return self._s[185]! }
|
||||||
|
public var Wallet_Words_Done: String { return self._s[186]! }
|
||||||
|
public func Wallet_Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
|
||||||
|
return formatWithArgumentRanges(self._s[187]!, self._r[187]!, [_1, _2, _3])
|
||||||
|
}
|
||||||
|
public var Wallet_TransactionInfo_StorageFeeInfo: String { return self._s[188]! }
|
||||||
|
public func Wallet_Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
|
||||||
|
return formatWithArgumentRanges(self._s[190]!, self._r[190]!, [_1, _2, _3])
|
||||||
|
}
|
||||||
|
public var Wallet_Info_TransactionTo: String { return self._s[191]! }
|
||||||
|
public var Wallet_AccessDenied_Camera: String { return self._s[192]! }
|
||||||
|
public var Wallet_Info_RefreshErrorTitle: String { return self._s[193]! }
|
||||||
|
public var Wallet_Month_ShortAugust: String { return self._s[194]! }
|
||||||
|
public var Wallet_TransactionInfo_OtherFeeInfo: String { return self._s[195]! }
|
||||||
|
public var Wallet_Receive_AmountInfo: String { return self._s[196]! }
|
||||||
|
public var Wallet_Receive_InvoiceUrlHeader: String { return self._s[197]! }
|
||||||
|
public var Wallet_Receive_CreateInvoice: String { return self._s[198]! }
|
||||||
|
public var Wallet_Receive_Title: String { return self._s[200]! }
|
||||||
|
public var Wallet_Configuration_BlockchainIdPlaceholder: String { return self._s[201]! }
|
||||||
|
public var Wallet_Month_ShortFebruary: String { return self._s[202]! }
|
||||||
|
public func Wallet_Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
|
||||||
|
return formatWithArgumentRanges(self._s[203]!, self._r[203]!, [_1, _2, _3])
|
||||||
|
}
|
||||||
|
public var Wallet_Receive_AddressCopied: String { return self._s[204]! }
|
||||||
|
public var Wallet_Month_GenOctober: String { return self._s[205]! }
|
||||||
|
public var Wallet_TransactionInfo_RecipientHeader: String { return self._s[206]! }
|
||||||
|
public var Wallet_Send_EncryptComment: String { return self._s[207]! }
|
||||||
|
public var Wallet_WordCheck_Title: String { return self._s[208]! }
|
||||||
|
public var Wallet_Alert_Cancel: String { return self._s[209]! }
|
||||||
|
public func Wallet_Updated_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) {
|
||||||
return formatWithArgumentRanges(self._s[210]!, self._r[210]!, [_0])
|
return formatWithArgumentRanges(self._s[210]!, self._r[210]!, [_0])
|
||||||
}
|
}
|
||||||
public var Wallet_Settings_DeleteWalletInfo: String { return self._s[211]! }
|
public var Wallet_Intro_Terms: String { return self._s[211]! }
|
||||||
public var Wallet_Intro_CreateErrorText: String { return self._s[212]! }
|
public func Wallet_Time_PreciseDate_m12(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
|
||||||
public var Wallet_Sent_ViewWallet: String { return self._s[213]! }
|
return formatWithArgumentRanges(self._s[212]!, self._r[212]!, [_1, _2, _3])
|
||||||
public var Wallet_Send_ErrorInvalidAddress: String { return self._s[214]! }
|
|
||||||
public var Wallet_Configuration_BlockchainNameChangedText: String { return self._s[215]! }
|
|
||||||
public func Wallet_Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
|
|
||||||
return formatWithArgumentRanges(self._s[216]!, self._r[216]!, [_1, _2, _3])
|
|
||||||
}
|
}
|
||||||
public var Wallet_Send_Title: String { return self._s[217]! }
|
public var Wallet_Intro_ImportExisting: String { return self._s[213]! }
|
||||||
public var Wallet_Info_RefreshErrorText: String { return self._s[218]! }
|
public var Wallet_WordImport_CanNotRemember: String { return self._s[214]! }
|
||||||
public var Wallet_SecureStorageReset_Title: String { return self._s[219]! }
|
public var Wallet_Month_ShortSeptember: String { return self._s[215]! }
|
||||||
public var Wallet_Receive_CommentHeader: String { return self._s[220]! }
|
public var Wallet_Send_OwnAddressAlertText: String { return self._s[216]! }
|
||||||
public var Wallet_Info_ReceiveGrams: String { return self._s[221]! }
|
public func Wallet_Receive_ShareInvoiceUrlInfo(_ _0: String) -> (String, [(Int, NSRange)]) {
|
||||||
public func Wallet_Updated_HoursAgo(_ value: Int32) -> String {
|
return formatWithArgumentRanges(self._s[217]!, self._r[217]!, [_0])
|
||||||
|
}
|
||||||
|
public var Wallet_Send_ConfirmationConfirm: String { return self._s[218]! }
|
||||||
|
public var Wallet_Created_ExportErrorTitle: String { return self._s[219]! }
|
||||||
|
public var Wallet_Info_TransactionPendingHeader: String { return self._s[220]! }
|
||||||
|
public func Wallet_Updated_MinutesAgo(_ value: Int32) -> String {
|
||||||
let form = getPluralizationForm(self.lc, value)
|
let form = getPluralizationForm(self.lc, value)
|
||||||
let stringValue = walletStringsFormattedNumber(value, self.groupingSeparator)
|
let stringValue = walletStringsFormattedNumber(value, self.groupingSeparator)
|
||||||
return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue)
|
return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue)
|
||||||
}
|
}
|
||||||
public func Wallet_Updated_MinutesAgo(_ value: Int32) -> String {
|
public func Wallet_Updated_HoursAgo(_ value: Int32) -> String {
|
||||||
let form = getPluralizationForm(self.lc, value)
|
let form = getPluralizationForm(self.lc, value)
|
||||||
let stringValue = walletStringsFormattedNumber(value, self.groupingSeparator)
|
let stringValue = walletStringsFormattedNumber(value, self.groupingSeparator)
|
||||||
return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue)
|
return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user