@ -1,7 +1,7 @@
@objc ( LKPublicChatPoller )
@objc ( LKPublicChatPoller )
public final class Group ChatPoller : NSObject {
public final class LokiPublic ChatPoller : NSObject {
private let group : LokiPublicChat
private let publicChat : LokiPublicChat
private var pollForNewMessagesTimer : Timer ? = nil
private var pollForNewMessagesTimer : Timer ? = nil
private var pollForDeletedMessagesTimer : Timer ? = nil
private var pollForDeletedMessagesTimer : Timer ? = nil
private var pollForModeratorsTimer : Timer ? = nil
private var pollForModeratorsTimer : Timer ? = nil
@ -14,9 +14,9 @@ public final class GroupChatPoller : NSObject {
private let pollForModeratorsInterval : TimeInterval = 10 * 60
private let pollForModeratorsInterval : TimeInterval = 10 * 60
// MARK: L i f e c y c l e
// MARK: L i f e c y c l e
@objc ( initFor Group : )
@objc ( initFor PublicChat : )
public init ( for group : LokiPublicChat ) {
public init ( for publicChat : LokiPublicChat ) {
self . group = group
self . publicChat = publicChat
super . init ( )
super . init ( )
}
}
@ -42,7 +42,7 @@ public final class GroupChatPoller : NSObject {
// MARK: P o l l i n g
// MARK: P o l l i n g
private func pollForNewMessages ( ) {
private func pollForNewMessages ( ) {
// P r e p a r e
// P r e p a r e
let group = self . group
let publicChat = self . publicChat
let userHexEncodedPublicKey = self . userHexEncodedPublicKey
let userHexEncodedPublicKey = self . userHexEncodedPublicKey
// P r o c e s s i n g l o g i c f o r i n c o m i n g m e s s a g e s
// P r o c e s s i n g l o g i c f o r i n c o m i n g m e s s a g e s
func processIncomingMessage ( _ message : LokiPublicChatMessage ) {
func processIncomingMessage ( _ message : LokiPublicChatMessage ) {
@ -50,9 +50,9 @@ public final class GroupChatPoller : NSObject {
let endIndex = senderHexEncodedPublicKey . endIndex
let endIndex = senderHexEncodedPublicKey . endIndex
let cutoffIndex = senderHexEncodedPublicKey . index ( endIndex , offsetBy : - 8 )
let cutoffIndex = senderHexEncodedPublicKey . index ( endIndex , offsetBy : - 8 )
let senderDisplayName = " \( message . displayName ) (... \( senderHexEncodedPublicKey [ cutoffIndex . . < endIndex ] ) ) "
let senderDisplayName = " \( message . displayName ) (... \( senderHexEncodedPublicKey [ cutoffIndex . . < endIndex ] ) ) "
let id = group . idAsData
let id = publicChat . idAsData
let groupContext = SSKProtoGroupContext . builder ( id : id , type : . deliver )
let groupContext = SSKProtoGroupContext . builder ( id : id , type : . deliver )
groupContext . setName ( group . displayName )
groupContext . setName ( publicChat . displayName )
let dataMessage = SSKProtoDataMessage . builder ( )
let dataMessage = SSKProtoDataMessage . builder ( )
dataMessage . setTimestamp ( message . timestamp )
dataMessage . setTimestamp ( message . timestamp )
dataMessage . setGroup ( try ! groupContext . build ( ) )
dataMessage . setGroup ( try ! groupContext . build ( ) )
@ -75,7 +75,7 @@ public final class GroupChatPoller : NSObject {
envelope . setContent ( try ! content . build ( ) . serializedData ( ) )
envelope . setContent ( try ! content . build ( ) . serializedData ( ) )
let storage = OWSPrimaryStorage . shared ( )
let storage = OWSPrimaryStorage . shared ( )
storage . dbReadWriteConnection . readWrite { transaction in
storage . dbReadWriteConnection . readWrite { transaction in
transaction . setObject ( senderDisplayName , forKey : senderHexEncodedPublicKey , inCollection : group . id )
transaction . setObject ( senderDisplayName , forKey : senderHexEncodedPublicKey , inCollection : publicChat . id )
SSKEnvironment . shared . messageManager . throws_processEnvelope ( try ! envelope . build ( ) , plaintextData : try ! content . build ( ) . serializedData ( ) , wasReceivedByUD : false , transaction : transaction )
SSKEnvironment . shared . messageManager . throws_processEnvelope ( try ! envelope . build ( ) , plaintextData : try ! content . build ( ) . serializedData ( ) , wasReceivedByUD : false , transaction : transaction )
}
}
}
}
@ -89,7 +89,7 @@ public final class GroupChatPoller : NSObject {
isDuplicate = id != nil
isDuplicate = id != nil
}
}
guard ! isDuplicate else { return }
guard ! isDuplicate else { return }
let groupID = group . idAsData
let groupID = publicChat . idAsData
let thread = TSGroupThread . getOrCreateThread ( withGroupId : groupID )
let thread = TSGroupThread . getOrCreateThread ( withGroupId : groupID )
let signalQuote : TSQuotedMessage ?
let signalQuote : TSQuotedMessage ?
if let quote = message . quote {
if let quote = message . quote {
@ -100,7 +100,7 @@ public final class GroupChatPoller : NSObject {
let message = TSOutgoingMessage ( outgoingMessageWithTimestamp : message . timestamp , in : thread , messageBody : message . body , attachmentIds : [ ] , expiresInSeconds : 0 ,
let message = TSOutgoingMessage ( outgoingMessageWithTimestamp : message . timestamp , in : thread , messageBody : message . body , attachmentIds : [ ] , expiresInSeconds : 0 ,
expireStartedAt : 0 , isVoiceMessage : false , groupMetaMessage : . deliver , quotedMessage : signalQuote , contactShare : nil , linkPreview : nil )
expireStartedAt : 0 , isVoiceMessage : false , groupMetaMessage : . deliver , quotedMessage : signalQuote , contactShare : nil , linkPreview : nil )
storage . dbReadWriteConnection . readWrite { transaction in
storage . dbReadWriteConnection . readWrite { transaction in
message . update ( withSentRecipient : group . server , wasSentByUD : false , transaction : transaction )
message . update ( withSentRecipient : publicChat . server , wasSentByUD : false , transaction : transaction )
message . saveGroupChatServerID ( messageServerID , in : transaction )
message . saveGroupChatServerID ( messageServerID , in : transaction )
guard let messageID = message . uniqueId else { return print ( " [Loki] Failed to save public chat message. " ) }
guard let messageID = message . uniqueId else { return print ( " [Loki] Failed to save public chat message. " ) }
storage . setIDForMessageWithServerID ( UInt ( messageServerID ) , to : messageID , in : transaction )
storage . setIDForMessageWithServerID ( UInt ( messageServerID ) , to : messageID , in : transaction )
@ -110,7 +110,7 @@ public final class GroupChatPoller : NSObject {
}
}
}
}
// P o l l
// P o l l
let _ = LokiPublicChatAPI . getMessages ( for : group. channel , on : group . server ) . done ( on : . main ) { messages in
let _ = LokiPublicChatAPI . getMessages ( for : publicChat. channel , on : publicChat . server ) . done ( on : . main ) { messages in
messages . forEach { message in
messages . forEach { message in
if message . hexEncodedPublicKey != userHexEncodedPublicKey {
if message . hexEncodedPublicKey != userHexEncodedPublicKey {
processIncomingMessage ( message )
processIncomingMessage ( message )
@ -122,8 +122,8 @@ public final class GroupChatPoller : NSObject {
}
}
private func pollForDeletedMessages ( ) {
private func pollForDeletedMessages ( ) {
let group = self . group
let publicChat = self . publicChat
let _ = LokiPublicChatAPI . getDeletedMessageServerIDs ( for : group. channel , on : group . server ) . done { deletedMessageServerIDs in
let _ = LokiPublicChatAPI . getDeletedMessageServerIDs ( for : publicChat. channel , on : publicChat . server ) . done { deletedMessageServerIDs in
let storage = OWSPrimaryStorage . shared ( )
let storage = OWSPrimaryStorage . shared ( )
storage . dbReadWriteConnection . readWrite { transaction in
storage . dbReadWriteConnection . readWrite { transaction in
let deletedMessageIDs = deletedMessageServerIDs . compactMap { storage . getIDForMessage ( withServerID : UInt ( $0 ) , in : transaction ) }
let deletedMessageIDs = deletedMessageServerIDs . compactMap { storage . getIDForMessage ( withServerID : UInt ( $0 ) , in : transaction ) }
@ -135,6 +135,6 @@ public final class GroupChatPoller : NSObject {
}
}
private func pollForModerators ( ) {
private func pollForModerators ( ) {
let _ = LokiPublicChatAPI . getModerators ( for : group. channel , on : group . server )
let _ = LokiPublicChatAPI . getModerators ( for : publicChat. channel , on : publicChat . server )
}
}
}
}