1 package org
.asamk
.signal
.commands
;
3 import net
.sourceforge
.argparse4j
.inf
.Namespace
;
4 import net
.sourceforge
.argparse4j
.inf
.Subparser
;
6 import org
.asamk
.signal
.commands
.exceptions
.CommandException
;
7 import org
.asamk
.signal
.commands
.exceptions
.UnexpectedErrorException
;
8 import org
.asamk
.signal
.commands
.exceptions
.UserErrorException
;
9 import org
.asamk
.signal
.json
.JsonAttachmentData
;
10 import org
.asamk
.signal
.manager
.Manager
;
11 import org
.asamk
.signal
.manager
.api
.UnregisteredRecipientException
;
12 import org
.asamk
.signal
.output
.JsonWriter
;
13 import org
.asamk
.signal
.output
.OutputWriter
;
14 import org
.asamk
.signal
.output
.PlainTextWriter
;
15 import org
.asamk
.signal
.util
.CommandUtil
;
17 import java
.io
.FileNotFoundException
;
18 import java
.io
.IOException
;
19 import java
.io
.InputStream
;
20 import java
.util
.Base64
;
22 public class GetAvatarCommand
implements JsonRpcLocalCommand
{
25 public String
getName() {
30 public void attachToSubparser(final Subparser subparser
) {
31 subparser
.help("Retrieve the avatar of a contact, contact's profile or group base64 encoded.");
32 var mut
= subparser
.addMutuallyExclusiveGroup().required(true);
33 mut
.addArgument("-c", "--contact").help("Get a contact avatar");
34 mut
.addArgument("-p", "--profile").help("Get a profile avatar");
35 mut
.addArgument("-g", "--group-id").help("Get a group avatar");
39 public void handleCommand(
40 final Namespace ns
, final Manager m
, final OutputWriter outputWriter
41 ) throws CommandException
{
42 final var contactRecipient
= ns
.getString("contact");
43 final var profileRecipient
= ns
.getString("profile");
44 final var groupId
= ns
.getString("groupId");
46 final InputStream data
;
48 if (contactRecipient
!= null) {
49 data
= m
.retrieveContactAvatar(CommandUtil
.getSingleRecipientIdentifier(contactRecipient
,
51 } else if (profileRecipient
!= null) {
52 data
= m
.retrieveProfileAvatar(CommandUtil
.getSingleRecipientIdentifier(profileRecipient
,
55 data
= m
.retrieveGroupAvatar(CommandUtil
.getGroupId(groupId
));
57 } catch (FileNotFoundException ex
) {
58 throw new UserErrorException("Could not find avatar", ex
);
59 } catch (IOException ex
) {
60 throw new UnexpectedErrorException("An error occurred reading avatar", ex
);
61 } catch (UnregisteredRecipientException e
) {
62 throw new UserErrorException("The user " + e
.getSender().getIdentifier() + " is not registered.");
66 final var bytes
= data
.readAllBytes();
67 final var base64
= Base64
.getEncoder().encodeToString(bytes
);
68 switch (outputWriter
) {
69 case PlainTextWriter writer
-> writer
.println(base64
);
70 case JsonWriter writer
-> writer
.write(new JsonAttachmentData(base64
));
72 } catch (IOException ex
) {
73 throw new UnexpectedErrorException("An error occurred reading avatar", ex
);