@ -1,16 +1,23 @@
@objc ( LKGroupChatPoller )
public final class LokiGroupChatPoller : NSObject {
private let group s : [ LokiGroupChat ]
private let group : LokiGroupChat
private var pollForNewMessagesTimer : Timer ? = nil
private var pollForDeletedMessagesTimer : Timer ? = nil
private var hasStarted = false
private let pollForNewMessagesInterval : TimeInterval = 4
private lazy var pollForNewMessagesInterval : TimeInterval = {
switch group . kind {
case . publicChat ( _ ) : return 4
case . rss ( _ ) : return 8 * 60
}
} ( )
private let pollForDeletedMessagesInterval : TimeInterval = 32 * 60
@objc public init ( groups : [ LokiGroupChat ] ) {
self . groups = groups
@objc ( initForGroup : )
public init ( for group : LokiGroupChat ) {
self . group = group
super . init ( )
}
@ -28,40 +35,34 @@ public final class LokiGroupChatPoller : NSObject {
}
private func pollForNewMessages ( ) {
for group in groups {
guard case let LokiGroupChat . Kind . publicChat ( channelID ) = group . kind else {
Logger . info ( " [Loki] Trying to poll RSS group chat: \( group ) " )
return
}
LokiGroupChatAPI . getMessages ( for : channelID , on : group . server ) . map { [ weak self ] messages in
self ? . handleMessages ( messages : messages , group : group )
}
}
}
private func handleMessages ( messages : [ LokiGroupMessage ] , group : LokiGroupChat ) -> Void {
messages . reversed ( ) . forEach { message in
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 )
let x3 = SSKProtoContent . builder ( )
x3 . setDataMessage ( try ! x2 . build ( ) )
let x4 = SSKProtoEnvelope . builder ( type : . ciphertext , timestamp : message . timestamp )
let senderHexEncodedPublicKey = message . hexEncodedPublicKey
let endIndex = senderHexEncodedPublicKey . endIndex
let cutoffIndex = senderHexEncodedPublicKey . index ( endIndex , offsetBy : - 8 )
let senderDisplayName = " \( message . displayName ) (... \( senderHexEncodedPublicKey [ cutoffIndex . . < endIndex ] ) ) "
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 )
let group = self . group
switch group . kind {
case . publicChat ( let id ) :
let _ = LokiGroupChatAPI . getMessages ( for : id , on : group . server ) . done { messages in
messages . reversed ( ) . forEach { message in
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 )
let x3 = SSKProtoContent . builder ( )
x3 . setDataMessage ( try ! x2 . build ( ) )
let x4 = SSKProtoEnvelope . builder ( type : . ciphertext , timestamp : message . timestamp )
let senderHexEncodedPublicKey = message . hexEncodedPublicKey
let endIndex = senderHexEncodedPublicKey . endIndex
let cutoffIndex = senderHexEncodedPublicKey . index ( endIndex , offsetBy : - 8 )
let senderDisplayName = " \( message . displayName ) (... \( senderHexEncodedPublicKey [ cutoffIndex . . < endIndex ] ) ) "
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 )
}
}
}
case . rss ( let customID ) : break // TODO: I m p l e m e n t
}
}