Fix dependence on self

pull/43/head
Niels Andriesse 6 years ago
parent 1e7949a029
commit 4b8011ad7e

@ -6,14 +6,14 @@ public final class LokiGroupChatPoller : NSObject {
private var pollForDeletedMessagesTimer: Timer? = nil
private var pollForModerationPermissionTimer: Timer? = nil
private var hasStarted = false
private let userHexEncodedPublicKey = OWSIdentityManager.shared().identityKeyPair()!.hexEncodedPublicKey
// MARK: Settings
private let pollForNewMessagesInterval: TimeInterval = 4
private let pollForDeletedMessagesInterval: TimeInterval = 20
private let pollForModerationPermissionInterval: TimeInterval = 10 * 60
private let storage = OWSPrimaryStorage.shared()
private let ourHexEncodedPubKey = OWSIdentityManager.shared().identityKeyPair()!.hexEncodedPublicKey
// MARK: Lifecycle
@objc(initForGroup:)
public init(for group: LokiGroupChat) {
self.group = group
@ -36,82 +36,74 @@ public final class LokiGroupChatPoller : NSObject {
hasStarted = false
}
// MARK: Polling
private func pollForNewMessages() {
// Prepare
let group = self.group
let _ = LokiGroupChatAPI.getMessages(for: group.serverID, on: group.server).done { [weak self] messages in
guard let self = self else { return }
let userHexEncodedPublicKey = self.userHexEncodedPublicKey
// Processing logic for incoming messages
func processIncomingMessage(_ message: LokiGroupMessage) {
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)
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())
let storage = OWSPrimaryStorage.shared()
storage.dbReadWriteConnection.readWrite { transaction in
SSKEnvironment.shared.messageManager.throws_processEnvelope(try! x4.build(), plaintextData: try! x3.build().serializedData(), wasReceivedByUD: false, transaction: transaction)
}
}
// Processing logic for outgoing messages
func processOutgoingMessage(_ message: LokiGroupMessage) {
guard let messageServerID = message.serverID else { return }
let storage = OWSPrimaryStorage.shared()
var isDuplicate = false
storage.dbReadConnection.read { transaction in
let id = storage.getIDForMessage(withServerID: UInt(messageServerID), in: transaction)
isDuplicate = id != nil
}
guard !isDuplicate else { return }
guard let groupID = group.id.data(using: .utf8) else { return }
let thread = TSGroupThread.getOrCreateThread(withGroupId: groupID)
let message = TSOutgoingMessage(outgoingMessageWithTimestamp: message.timestamp, in: thread, messageBody: message.body, attachmentIds: [], expiresInSeconds: 0,
expireStartedAt: 0, isVoiceMessage: false, groupMetaMessage: .deliver, quotedMessage: nil, contactShare: nil, linkPreview: nil)
storage.dbReadWriteConnection.readWrite { transaction in
message.update(withSentRecipient: group.server, wasSentByUD: false, transaction: transaction)
message.saveGroupChatMessageID(messageServerID, in: transaction)
guard let messageID = message.uniqueId else { return print("[Loki] Failed to save group message.") }
storage.setIDForMessageWithServerID(UInt(messageServerID), to: messageID, in: transaction)
}
}
// Poll
let _ = LokiGroupChatAPI.getMessages(for: group.serverID, on: group.server).done { messages in
messages.reversed().forEach { message in
let senderHexEncodedPublicKey = message.hexEncodedPublicKey
if (senderHexEncodedPublicKey != self.ourHexEncodedPubKey) {
self.handleIncomingMessage(message, group: group);
if (senderHexEncodedPublicKey != userHexEncodedPublicKey) {
processIncomingMessage(message)
} else {
self.handleOutgoingMessage(message, group: group)
processOutgoingMessage(message)
}
}
}
}
private func handleOutgoingMessage(_ message: LokiGroupMessage, group: LokiGroupChat) {
// Any Outgoing message should have a message server id mapped to it
guard let messageServerID = message.serverID else { return }
var hasMessage = false
storage.newDatabaseConnection().read { transaction in
let id = self.storage.getIDForMessage(withServerID: UInt(messageServerID), in: 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.saveGroupChatMessageID(messageServerID, in: 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)
}
}
private func pollForDeletedMessages() {
let group = self.group
let _ = LokiGroupChatAPI.getDeletedMessageServerIDs(for: group.serverID, on: group.server).done { deletedMessageServerIDs in
@ -127,7 +119,8 @@ public final class LokiGroupChatPoller : NSObject {
private func pollForModerationPermission() {
let group = self.group
let _ = LokiGroupChatAPI.userHasModerationPermission(for: group.serverID, on: group.server).done { [storage] isModerator in
let _ = LokiGroupChatAPI.userHasModerationPermission(for: group.serverID, on: group.server).done { isModerator in
let storage = OWSPrimaryStorage.shared()
storage.dbReadWriteConnection.readWrite { transaction in
storage.setIsModerator(isModerator, for: UInt(group.serverID), on: group.server, in: transaction)
}

@ -93,7 +93,7 @@ typedef NS_ENUM(NSInteger, LKMessageFriendRequestStatus) {
- (void)saveFriendRequestStatus:(LKMessageFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction;
- (void)saveFriendRequestExpiresAt:(u_int64_t)expiresAt withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction;
#pragma mark - Group chat
#pragma mark - Group Chat
- (void)saveGroupChatMessageID:(uint64_t)serverMessageID in:(YapDatabaseReadWriteTransaction *_Nullable)transaction;

@ -491,7 +491,7 @@ static const NSUInteger OWSMessageSchemaVersion = 4;
return self.isFriendRequest && self.friendRequestStatus != LKMessageFriendRequestStatusSendingOrFailed;
}
#pragma mark - Group chat
#pragma mark - Group Chat
- (BOOL) isGroupChatMessage {
return self.groupChatMessageID > 0;

Loading…
Cancel
Save