Handle messages sent by us in the public chat.

pull/43/head
Mikunj 6 years ago
parent 2392fed21a
commit 64c2e36c8a

@ -9,6 +9,9 @@ public final class LokiGroupChatPoller : NSObject {
private let pollForNewMessagesInterval: TimeInterval = 4 private let pollForNewMessagesInterval: TimeInterval = 4
private let pollForDeletedMessagesInterval: TimeInterval = 32 * 60 private let pollForDeletedMessagesInterval: TimeInterval = 32 * 60
private let storage = OWSPrimaryStorage.shared()
private let ourHexEncodedPubKey = OWSIdentityManager.shared().identityKeyPair()!.hexEncodedPublicKey
@objc(initForGroup:) @objc(initForGroup:)
public init(for group: LokiGroupChat) { public init(for group: LokiGroupChat) {
self.group = group self.group = group
@ -31,37 +34,77 @@ public final class LokiGroupChatPoller : NSObject {
private func pollForNewMessages() { private func pollForNewMessages() {
let group = self.group let group = self.group
let _ = LokiGroupChatAPI.getMessages(for: group.serverID, on: group.server).done { messages in let _ = LokiGroupChatAPI.getMessages(for: group.serverID, on: group.server).done { [weak self] messages in
guard let self = self else { return }
messages.reversed().forEach { message in messages.reversed().forEach { message in
let senderHexEncodedPublicKey = message.hexEncodedPublicKey let senderHexEncodedPublicKey = message.hexEncodedPublicKey
let endIndex = senderHexEncodedPublicKey.endIndex if (senderHexEncodedPublicKey != self.ourHexEncodedPubKey) {
let cutoffIndex = senderHexEncodedPublicKey.index(endIndex, offsetBy: -8) self.handleIncomingMessage(message, group: group);
let senderDisplayName = "\(message.displayName) (...\(senderHexEncodedPublicKey[cutoffIndex..<endIndex]))" } else {
let id = group.id.data(using: String.Encoding.utf8)! self.handleOutgoingMessage(message, group: group)
let x1 = SSKProtoGroupContext.builder(id: id, type: .deliver)
x1.setName(group.displayName)
let x2 = SSKProtoDataMessage.builder()
x2.setTimestamp(message.timestamp)
x2.setGroup(try! x1.build())
x2.setBody(message.body)
// Pass down the message server id
if let messageServerID = message.serverID {
let publicChatInfo = SSKProtoPublicChatInfo.builder()
publicChatInfo.setServerID(messageServerID)
x2.setPublicChatInfo(try! publicChatInfo.build())
} }
}
}
}
let x3 = SSKProtoContent.builder() private func handleOutgoingMessage(_ message: LokiGroupMessage, group: LokiGroupChat) {
x3.setDataMessage(try! x2.build()) // Any Outgoing message should have a message server id mapped to it
let x4 = SSKProtoEnvelope.builder(type: .ciphertext, timestamp: message.timestamp) guard let messageServerID = message.serverID else { return }
x4.setSource(senderDisplayName)
x4.setSourceDevice(OWSDevicePrimaryDeviceId) var hasMessage = false
x4.setContent(try! x3.build().serializedData()) storage.newDatabaseConnection().read { transaction in
OWSPrimaryStorage.shared().dbReadWriteConnection.readWrite { transaction in let id = self.storage.getIDForMessage(withServerID: UInt(messageServerID), in: transaction);
SSKEnvironment.shared.messageManager.throws_processEnvelope(try! x4.build(), plaintextData: try! x3.build().serializedData(), wasReceivedByUD: false, transaction: transaction) hasMessage = id != nil
} }
// Check if we already have a message for this server message
guard !hasMessage, let groupID = group.id.data(using: .utf8) else { return }
// Get the thread
let groupThread = TSGroupThread.getOrCreateThread(withGroupId: groupID)
// Save the message
let message = TSOutgoingMessage(outgoingMessageWithTimestamp: message.timestamp, in: groupThread, messageBody: message.body, attachmentIds: [], expiresInSeconds: 0, expireStartedAt: 0, isVoiceMessage: false, groupMetaMessage: .deliver, quotedMessage: nil, contactShare: nil, linkPreview: nil)
storage.newDatabaseConnection().readWrite { transaction in
message.update(withSentRecipient: group.server, wasSentByUD: false, transaction: transaction)
message.savePublicChatMessageID(messageServerID, with: transaction)
guard let messageID = message.uniqueId else {
owsFailDebug("[Loki] Outgoing public chat message should have a unique id set")
return
} }
self.storage.setIDForMessageWithServerID(UInt(messageServerID), to: messageID, in: transaction)
}
}
private func handleIncomingMessage(_ message: LokiGroupMessage, group: LokiGroupChat) {
let senderHexEncodedPublicKey = message.hexEncodedPublicKey
let endIndex = senderHexEncodedPublicKey.endIndex
let cutoffIndex = senderHexEncodedPublicKey.index(endIndex, offsetBy: -8)
let senderDisplayName = "\(message.displayName) (...\(senderHexEncodedPublicKey[cutoffIndex..<endIndex]))"
let id = group.id.data(using: String.Encoding.utf8)!
let x1 = SSKProtoGroupContext.builder(id: id, type: .deliver)
x1.setName(group.displayName)
let x2 = SSKProtoDataMessage.builder()
x2.setTimestamp(message.timestamp)
x2.setGroup(try! x1.build())
x2.setBody(message.body)
// Pass down the message server id
if let messageServerID = message.serverID {
let publicChatInfo = SSKProtoPublicChatInfo.builder()
publicChatInfo.setServerID(messageServerID)
x2.setPublicChatInfo(try! publicChatInfo.build())
}
let x3 = SSKProtoContent.builder()
x3.setDataMessage(try! x2.build())
let x4 = SSKProtoEnvelope.builder(type: .ciphertext, timestamp: message.timestamp)
x4.setSource(senderDisplayName)
x4.setSourceDevice(OWSDevicePrimaryDeviceId)
x4.setContent(try! x3.build().serializedData())
OWSPrimaryStorage.shared().dbReadWriteConnection.readWrite { transaction in
SSKEnvironment.shared.messageManager.throws_processEnvelope(try! x4.build(), plaintextData: try! x3.build().serializedData(), wasReceivedByUD: false, transaction: transaction)
} }
} }

@ -145,7 +145,6 @@ public final class LokiGroupChatAPI : NSObject {
print("[Loki] Couldn't parse message for group chat with ID: \(group) on server: \(server) from: \(message).") print("[Loki] Couldn't parse message for group chat with ID: \(group) on server: \(server) from: \(message).")
return nil return nil
} }
guard hexEncodedPublicKey != userHexEncodedPublicKey else { return nil }
let lastMessageServerID = getLastMessageServerID(for: group, on: server) let lastMessageServerID = getLastMessageServerID(for: group, on: server)
let firstMessageServerID = getFirstMessageServerID(for: group, on: server) let firstMessageServerID = getFirstMessageServerID(for: group, on: server)
if serverID > (lastMessageServerID ?? 0) { setLastMessageServerID(for: group, on: server, to: serverID) } if serverID > (lastMessageServerID ?? 0) { setLastMessageServerID(for: group, on: server, to: serverID) }

@ -96,7 +96,7 @@ NS_ASSUME_NONNULL_BEGIN
- (void)setLastMessageHashForServiceNode:(NSString *)serviceNode hash:(NSString *)hash expiresAt:(u_int64_t)expiresAt transaction:(YapDatabaseReadWriteTransaction *)transaction NS_SWIFT_NAME(setLastMessageHash(forServiceNode:hash:expiresAt:transaction:)); - (void)setLastMessageHashForServiceNode:(NSString *)serviceNode hash:(NSString *)hash expiresAt:(u_int64_t)expiresAt transaction:(YapDatabaseReadWriteTransaction *)transaction NS_SWIFT_NAME(setLastMessageHash(forServiceNode:hash:expiresAt:transaction:));
- (void)setIDForMessageWithServerID:(NSUInteger)serverID to:(NSString *)messageID in:(YapDatabaseReadWriteTransaction *)transaction; - (void)setIDForMessageWithServerID:(NSUInteger)serverID to:(NSString *)messageID in:(YapDatabaseReadWriteTransaction *)transaction;
- (NSString *)getIDForMessageWithServerID:(NSUInteger)serverID in:(YapDatabaseReadTransaction *)transaction; - (NSString *_Nullable)getIDForMessageWithServerID:(NSUInteger)serverID in:(YapDatabaseReadTransaction *)transaction;
@end @end

@ -168,7 +168,7 @@
[transaction setObject:messageID forKey:key inCollection:LKMessageIDCollection]; [transaction setObject:messageID forKey:key inCollection:LKMessageIDCollection];
} }
- (NSString *)getIDForMessageWithServerID:(NSUInteger)serverID in:(YapDatabaseReadTransaction *)transaction { - (NSString *_Nullable)getIDForMessageWithServerID:(NSUInteger)serverID in:(YapDatabaseReadTransaction *)transaction {
NSString *key = [NSString stringWithFormat:@"%@", @(serverID)]; NSString *key = [NSString stringWithFormat:@"%@", @(serverID)];
return [transaction objectForKey:key inCollection:LKMessageIDCollection]; return [transaction objectForKey:key inCollection:LKMessageIDCollection];
} }

Loading…
Cancel
Save