@ -155,11 +155,13 @@ public final class LokiPublicChatAPI : LokiDotNetAPI {
}
public static func sendMessage ( _ message : LokiPublicChatMessage , to channel : UInt64 , on server : String ) -> Promise < LokiPublicChatMessage > {
return Promise < LokiPublicChatMessage > { [ privateKey = userKeyPair . privateKey ] seal in
DispatchQueue . global ( ) . async {
guard let signedMessage = message . sign ( with : privateKey ) else { return seal . reject ( LokiDotNetAPIError . signingFailed ) }
print ( " [Loki] Sending message to public chat channel with ID: \( channel ) on server: \( server ) . " )
let ( promise , seal ) = Promise < LokiPublicChatMessage > . pending ( )
let queue = DispatchQueue . global ( )
queue . async { [ privateKey = userKeyPair . privateKey ] in
guard let signedMessage = message . sign ( with : privateKey ) else { return seal . reject ( LokiDotNetAPIError . signingFailed ) }
attempt ( maxRetryCount : maxRetryCount , recoveringOn : queue ) {
getAuthToken ( for : server ) . then { token -> Promise < LokiPublicChatMessage > in
print ( " [Loki] Sending message to public chat channel with ID: \( channel ) on server: \( server ) . " )
let url = URL ( string : " \( server ) /channels/ \( channel ) /messages " ) !
let parameters = signedMessage . toJSON ( )
let request = TSRequest ( url : url , method : " POST " , parameters : parameters )
@ -183,13 +185,14 @@ public final class LokiPublicChatAPI : LokiDotNetAPI {
storage . dbReadWriteConnection . removeObject ( forKey : server , inCollection : authTokenCollection )
}
throw error
} . retryingIfNeeded ( maxRetryCount : maxRetryCount ) . done { message in
seal . fulfill ( message )
} . catch { error in
seal . reject ( error )
}
} . done { message in
seal . fulfill ( message )
} . catch { error in
seal . reject ( error )
}
}
return promise
}
public static func getDeletedMessageServerIDs ( for channel : UInt64 , on server : String ) -> Promise < [ UInt64 ] > {
@ -220,16 +223,18 @@ public final class LokiPublicChatAPI : LokiDotNetAPI {
}
public static func deleteMessage ( with messageID : UInt , for channel : UInt64 , on server : String , isSentByUser : Bool ) -> Promise < Void > {
return getAuthToken ( for : server ) . then { token -> Promise < Void > in
let isModerationRequest = ! isSentByUser
print ( " [Loki] Deleting message with ID: \( messageID ) for public chat channel with ID: \( channel ) on server: \( server ) (isModerationRequest = \( isModerationRequest ) ). " )
let urlAsString = isSentByUser ? " \( server ) /channels/ \( channel ) /messages/ \( messageID ) " : " \( server ) /loki/v1/moderation/message/ \( messageID ) "
let url = URL ( string : urlAsString ) !
let request = TSRequest ( url : url , method : " DELETE " , parameters : [ : ] )
request . allHTTPHeaderFields = [ " Content-Type " : " application/json " , " Authorization " : " Bearer \( token ) " ]
return LokiFileServerProxy ( for : server ) . perform ( request ) . done { result -> Void in
print ( " [Loki] Deleted message with ID: \( messageID ) on server: \( server ) . " )
} . retryingIfNeeded ( maxRetryCount : maxRetryCount )
return attempt ( maxRetryCount : maxRetryCount , recoveringOn : DispatchQueue . global ( ) ) {
getAuthToken ( for : server ) . then { token -> Promise < Void > in
let isModerationRequest = ! isSentByUser
print ( " [Loki] Deleting message with ID: \( messageID ) for public chat channel with ID: \( channel ) on server: \( server ) (isModerationRequest = \( isModerationRequest ) ). " )
let urlAsString = isSentByUser ? " \( server ) /channels/ \( channel ) /messages/ \( messageID ) " : " \( server ) /loki/v1/moderation/message/ \( messageID ) "
let url = URL ( string : urlAsString ) !
let request = TSRequest ( url : url , method : " DELETE " , parameters : [ : ] )
request . allHTTPHeaderFields = [ " Content-Type " : " application/json " , " Authorization " : " Bearer \( token ) " ]
return LokiFileServerProxy ( for : server ) . perform ( request ) . done { result -> Void in
print ( " [Loki] Deleted message with ID: \( messageID ) on server: \( server ) . " )
}
}
}
}
@ -252,24 +257,28 @@ public final class LokiPublicChatAPI : LokiDotNetAPI {
}
public static func join ( _ channel : UInt64 , on server : String ) -> Promise < Void > {
return getAuthToken ( for : server ) . then { token -> Promise < Void > in
let url = URL ( string : " \( server ) /channels/ \( channel ) /subscribe " ) !
let request = TSRequest ( url : url , method : " POST " , parameters : [ : ] )
request . allHTTPHeaderFields = [ " Content-Type " : " application/json " , " Authorization " : " Bearer \( token ) " ]
return LokiFileServerProxy ( for : server ) . perform ( request ) . done { result -> Void in
print ( " [Loki] Joined channel with ID: \( channel ) on server: \( server ) . " )
} . retryingIfNeeded ( maxRetryCount : maxRetryCount )
return attempt ( maxRetryCount : maxRetryCount , recoveringOn : DispatchQueue . global ( ) ) {
getAuthToken ( for : server ) . then { token -> Promise < Void > in
let url = URL ( string : " \( server ) /channels/ \( channel ) /subscribe " ) !
let request = TSRequest ( url : url , method : " POST " , parameters : [ : ] )
request . allHTTPHeaderFields = [ " Content-Type " : " application/json " , " Authorization " : " Bearer \( token ) " ]
return LokiFileServerProxy ( for : server ) . perform ( request ) . done { result -> Void in
print ( " [Loki] Joined channel with ID: \( channel ) on server: \( server ) . " )
}
}
}
}
public static func leave ( _ channel : UInt64 , on server : String ) -> Promise < Void > {
return getAuthToken ( for : server ) . then { token -> Promise < Void > in
let url = URL ( string : " \( server ) /channels/ \( channel ) /subscribe " ) !
let request = TSRequest ( url : url , method : " DELETE " , parameters : [ : ] )
request . allHTTPHeaderFields = [ " Content-Type " : " application/json " , " Authorization " : " Bearer \( token ) " ]
return LokiFileServerProxy ( for : server ) . perform ( request ) . done { result -> Void in
print ( " [Loki] Left channel with ID: \( channel ) on server: \( server ) . " )
} . retryingIfNeeded ( maxRetryCount : maxRetryCount )
return attempt ( maxRetryCount : maxRetryCount , recoveringOn : DispatchQueue . global ( ) ) {
getAuthToken ( for : server ) . then { token -> Promise < Void > in
let url = URL ( string : " \( server ) /channels/ \( channel ) /subscribe " ) !
let request = TSRequest ( url : url , method : " DELETE " , parameters : [ : ] )
request . allHTTPHeaderFields = [ " Content-Type " : " application/json " , " Authorization " : " Bearer \( token ) " ]
return LokiFileServerProxy ( for : server ) . perform ( request ) . done { result -> Void in
print ( " [Loki] Left channel with ID: \( channel ) on server: \( server ) . " )
}
}
}
}
@ -328,34 +337,38 @@ public final class LokiPublicChatAPI : LokiDotNetAPI {
public static func setDisplayName ( to newDisplayName : String ? , on server : String ) -> Promise < Void > {
print ( " [Loki] Updating display name on server: \( server ) . " )
return getAuthToken ( for : server ) . then { token -> Promise < Void > in
let parameters : JSON = [ " name " : ( newDisplayName ? ? " " ) ]
let url = URL ( string : " \( server ) /users/me " ) !
let request = TSRequest ( url : url , method : " PATCH " , parameters : parameters )
request . allHTTPHeaderFields = [ " Content-Type " : " application/json " , " Authorization " : " Bearer \( token ) " ]
return LokiFileServerProxy ( for : server ) . perform ( request ) . map { _ in } . recover { error in
print ( " Couldn't update display name due to error: \( error ) . " )
throw error
return attempt ( maxRetryCount : maxRetryCount , recoveringOn : DispatchQueue . global ( ) ) {
getAuthToken ( for : server ) . then { token -> Promise < Void > in
let parameters : JSON = [ " name " : ( newDisplayName ? ? " " ) ]
let url = URL ( string : " \( server ) /users/me " ) !
let request = TSRequest ( url : url , method : " PATCH " , parameters : parameters )
request . allHTTPHeaderFields = [ " Content-Type " : " application/json " , " Authorization " : " Bearer \( token ) " ]
return LokiFileServerProxy ( for : server ) . perform ( request ) . map { _ in } . recover { error in
print ( " Couldn't update display name due to error: \( error ) . " )
throw error
}
}
} . retryingIfNeeded ( maxRetryCount : maxRetryCount )
}
}
public static func setProfilePictureURL ( to url : String ? , using profileKey : Data , on server : String ) -> Promise < Void > {
print ( " [Loki] Updating profile picture on server: \( server ) . " )
return getAuthToken ( for : server ) . then { token -> Promise < Void > in
var annotation : JSON = [ " type " : profilePictureType ]
if let url = url {
annotation [ " value " ] = [ " profileKey " : profileKey . base64EncodedString ( ) , " url " : url ]
}
let parameters : JSON = [ " annotations " : [ annotation ] ]
let url = URL ( string : " \( server ) /users/me " ) !
let request = TSRequest ( url : url , method : " PATCH " , parameters : parameters )
request . allHTTPHeaderFields = [ " Content-Type " : " application/json " , " Authorization " : " Bearer \( token ) " ]
return LokiFileServerProxy ( for : server ) . perform ( request ) . map { _ in } . recover { error in
print ( " [Loki] Couldn't update profile picture due to error: \( error ) . " )
throw error
return attempt ( maxRetryCount : maxRetryCount , recoveringOn : DispatchQueue . global ( ) ) {
getAuthToken ( for : server ) . then { token -> Promise < Void > in
var annotation : JSON = [ " type " : profilePictureType ]
if let url = url {
annotation [ " value " ] = [ " profileKey " : profileKey . base64EncodedString ( ) , " url " : url ]
}
let parameters : JSON = [ " annotations " : [ annotation ] ]
let url = URL ( string : " \( server ) /users/me " ) !
let request = TSRequest ( url : url , method : " PATCH " , parameters : parameters )
request . allHTTPHeaderFields = [ " Content-Type " : " application/json " , " Authorization " : " Bearer \( token ) " ]
return LokiFileServerProxy ( for : server ) . perform ( request ) . map { _ in } . recover { error in
print ( " [Loki] Couldn't update profile picture due to error: \( error ) . " )
throw error
}
}
} . retryingIfNeeded ( maxRetryCount : maxRetryCount )
}
}
public static func getInfo ( for channel : UInt64 , on server : String ) -> Promise < LokiPublicChatInfo > {