Implement replying to stories
This commit is contained in:
		
							parent
							
								
									fea19c9e20
								
							
						
					
					
						commit
						5ed9db4f08
					
				| @ -162,6 +162,12 @@ pub enum CliCommands { | ||||
| 
 | ||||
|         #[arg(long)] | ||||
|         sticker: Option<String>, | ||||
| 
 | ||||
|         #[arg(long)] | ||||
|         story_timestamp: Option<u64>, | ||||
| 
 | ||||
|         #[arg(long)] | ||||
|         story_author: Option<String>, | ||||
|     }, | ||||
|     SendContacts, | ||||
|     SendPaymentNotification { | ||||
|  | ||||
| @ -130,6 +130,8 @@ pub trait Rpc { | ||||
|         #[allow(non_snake_case)] quoteMessage: Option<String>, | ||||
|         #[allow(non_snake_case)] quoteMention: Vec<String>, | ||||
|         sticker: Option<String>, | ||||
|         #[allow(non_snake_case)] storyTimestamp: Option<u64>, | ||||
|         #[allow(non_snake_case)] storyAuthor: Option<String>, | ||||
|     ) -> Result<Value>; | ||||
| 
 | ||||
|     #[rpc(name = "sendContacts", params = "named")] | ||||
|  | ||||
| @ -127,6 +127,8 @@ async fn main() -> Result<(), anyhow::Error> { | ||||
|             quote_message, | ||||
|             quote_mention, | ||||
|             sticker, | ||||
|             story_timestamp, | ||||
|             story_author, | ||||
|         } => { | ||||
|             client | ||||
|                 .send( | ||||
| @ -143,6 +145,8 @@ async fn main() -> Result<(), anyhow::Error> { | ||||
|                     quote_message, | ||||
|                     quote_mention, | ||||
|                     sticker, | ||||
|                     story_timestamp, | ||||
|                     story_author, | ||||
|                 ) | ||||
|                 .await | ||||
|         } | ||||
|  | ||||
| @ -624,6 +624,14 @@ class ManagerImpl implements Manager { | ||||
|             } | ||||
|             messageBuilder.withPreviews(previews); | ||||
|         } | ||||
|         if (message.storyReply().isPresent()) { | ||||
|             final var storyReply = message.storyReply().get(); | ||||
|             final var authorServiceId = context.getRecipientHelper() | ||||
|                     .resolveSignalServiceAddress(context.getRecipientHelper().resolveRecipient(storyReply.author())) | ||||
|                     .getServiceId(); | ||||
|             messageBuilder.withStoryContext(new SignalServiceDataMessage.StoryContext(authorServiceId, | ||||
|                     storyReply.timestamp())); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private ArrayList<SignalServiceDataMessage.Mention> resolveMentions(final List<Message.Mention> mentionList) throws UnregisteredRecipientException { | ||||
|  | ||||
| @ -9,7 +9,8 @@ public record Message( | ||||
|         List<Mention> mentions, | ||||
|         Optional<Quote> quote, | ||||
|         Optional<Sticker> sticker, | ||||
|         List<Preview> previews | ||||
|         List<Preview> previews, | ||||
|         Optional<StoryReply> storyReply | ||||
| ) { | ||||
| 
 | ||||
|     public record Mention(RecipientIdentifier.Single recipient, int start, int length) {} | ||||
| @ -19,4 +20,6 @@ public record Message( | ||||
|     public record Sticker(byte[] packId, int stickerId) {} | ||||
| 
 | ||||
|     public record Preview(String url, String title, String description, Optional<String> image) {} | ||||
| 
 | ||||
|     public record StoryReply(long timestamp, RecipientIdentifier.Single author) {} | ||||
| } | ||||
|  | ||||
| @ -275,6 +275,12 @@ Specify the description for the link preview (optional). | ||||
| *--preview-image*:: | ||||
| Specify the image file for the link preview (optional). | ||||
| 
 | ||||
| *--story-timestamp*:: | ||||
| Specify the timestamp of a story to reply to. | ||||
| 
 | ||||
| *--story-author*:: | ||||
| Specify the number of the author of the story. | ||||
| 
 | ||||
| *-e*, *--end-session*:: | ||||
| Clear session state and send end session message. | ||||
| 
 | ||||
|  | ||||
| @ -80,6 +80,10 @@ public class SendCommand implements JsonRpcLocalCommand { | ||||
|         subparser.addArgument("--preview-title").help("Specify the title for the link preview (mandatory)."); | ||||
|         subparser.addArgument("--preview-description").help("Specify the description for the link preview (optional)."); | ||||
|         subparser.addArgument("--preview-image").help("Specify the image file for the link preview (optional)."); | ||||
|         subparser.addArgument("--story-timestamp") | ||||
|                 .type(long.class) | ||||
|                 .help("Specify the timestamp of a story to reply to."); | ||||
|         subparser.addArgument("--story-author").help("Specify the number of the author of the story."); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
| @ -170,18 +174,30 @@ public class SendCommand implements JsonRpcLocalCommand { | ||||
|             previews = List.of(); | ||||
|         } | ||||
| 
 | ||||
|         final Message.StoryReply storyReply; | ||||
|         final var storyReplyTimestamp = ns.getLong("story-timestamp"); | ||||
|         if (storyReplyTimestamp != null) { | ||||
|             final var storyAuthor = ns.getString("story-author"); | ||||
|             storyReply = new Message.StoryReply(storyReplyTimestamp, | ||||
|                     CommandUtil.getSingleRecipientIdentifier(storyAuthor, m.getSelfNumber())); | ||||
|         } else { | ||||
|             storyReply = null; | ||||
|         } | ||||
| 
 | ||||
|         if (messageText.isEmpty() && attachments.isEmpty() && sticker == null && quote == null) { | ||||
|             throw new UserErrorException( | ||||
|                     "Sending empty message is not allowed, either a message, attachment or sticker must be given."); | ||||
|         } | ||||
| 
 | ||||
|         try { | ||||
|             var results = m.sendMessage(new Message(messageText, | ||||
|             final var message = new Message(messageText, | ||||
|                     attachments, | ||||
|                     mentions, | ||||
|                     Optional.ofNullable(quote), | ||||
|                     Optional.ofNullable(sticker), | ||||
|                     previews), recipientIdentifiers); | ||||
|                     previews, | ||||
|                     Optional.ofNullable((storyReply))); | ||||
|             var results = m.sendMessage(message, recipientIdentifiers); | ||||
|             outputResult(outputWriter, results); | ||||
|         } catch (AttachmentInvalidException | IOException e) { | ||||
|             throw new UnexpectedErrorException("Failed to send message: " + e.getMessage() + " (" + e.getClass() | ||||
|  | ||||
| @ -218,7 +218,8 @@ public class DbusSignalImpl implements Signal { | ||||
|                             List.of(), | ||||
|                             Optional.empty(), | ||||
|                             Optional.empty(), | ||||
|                             List.of()), | ||||
|                             List.of(), | ||||
|                             Optional.empty()), | ||||
|                     getSingleRecipientIdentifiers(recipients, m.getSelfNumber()).stream() | ||||
|                             .map(RecipientIdentifier.class::cast) | ||||
|                             .collect(Collectors.toSet())); | ||||
| @ -386,7 +387,8 @@ public class DbusSignalImpl implements Signal { | ||||
|                     List.of(), | ||||
|                     Optional.empty(), | ||||
|                     Optional.empty(), | ||||
|                     List.of()), Set.of(RecipientIdentifier.NoteToSelf.INSTANCE)); | ||||
|                     List.of(), | ||||
|                     Optional.empty()), Set.of(RecipientIdentifier.NoteToSelf.INSTANCE)); | ||||
|             checkSendMessageResults(results); | ||||
|             return results.timestamp(); | ||||
|         } catch (AttachmentInvalidException e) { | ||||
| @ -428,7 +430,8 @@ public class DbusSignalImpl implements Signal { | ||||
|                     List.of(), | ||||
|                     Optional.empty(), | ||||
|                     Optional.empty(), | ||||
|                     List.of()), Set.of(getGroupRecipientIdentifier(groupId))); | ||||
|                     List.of(), | ||||
|                     Optional.empty()), Set.of(getGroupRecipientIdentifier(groupId))); | ||||
|             checkSendMessageResults(results); | ||||
|             return results.timestamp(); | ||||
|         } catch (IOException | InvalidStickerException e) { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 AsamK
						AsamK