]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/commands/UpdateAccountCommand.java
Update user agent
[signal-cli] / src / main / java / org / asamk / signal / commands / UpdateAccountCommand.java
1 package org.asamk.signal.commands;
2
3 import com.fasterxml.jackson.annotation.JsonInclude;
4
5 import net.sourceforge.argparse4j.impl.Arguments;
6 import net.sourceforge.argparse4j.inf.Namespace;
7 import net.sourceforge.argparse4j.inf.Subparser;
8
9 import org.asamk.signal.commands.exceptions.CommandException;
10 import org.asamk.signal.commands.exceptions.IOErrorException;
11 import org.asamk.signal.commands.exceptions.UserErrorException;
12 import org.asamk.signal.manager.Manager;
13 import org.asamk.signal.manager.api.InvalidUsernameException;
14 import org.asamk.signal.output.JsonWriter;
15 import org.asamk.signal.output.OutputWriter;
16 import org.asamk.signal.output.PlainTextWriter;
17
18 import java.io.IOException;
19
20 public class UpdateAccountCommand implements JsonRpcLocalCommand {
21
22 @Override
23 public String getName() {
24 return "updateAccount";
25 }
26
27 @Override
28 public void attachToSubparser(final Subparser subparser) {
29 subparser.help("Update the account attributes on the signal server.");
30 subparser.addArgument("-n", "--device-name").help("Specify a name to describe this device.");
31 subparser.addArgument("--unrestricted-unidentified-sender")
32 .type(Boolean.class)
33 .help("Enable if anyone should be able to send you unidentified sender messages.");
34 subparser.addArgument("--discoverable-by-number")
35 .type(Boolean.class)
36 .help("Enable/disable if the account should be discoverable by phone number");
37 subparser.addArgument("--number-sharing")
38 .type(Boolean.class)
39 .help("Indicates if Signal should share its phone number when sending a message.");
40
41 var mut = subparser.addMutuallyExclusiveGroup();
42 mut.addArgument("-u", "--username").help("Specify a username that can then be used to contact this account.");
43 mut.addArgument("--delete-username")
44 .action(Arguments.storeTrue())
45 .help("Delete the username associated with this account.");
46 }
47
48 @Override
49 public void handleCommand(
50 final Namespace ns,
51 final Manager m,
52 final OutputWriter outputWriter
53 ) throws CommandException {
54 final var deviceName = ns.getString("device-name");
55 final var unrestrictedUnidentifiedSender = ns.getBoolean("unrestricted-unidentified-sender");
56 final var discoverableByNumber = ns.getBoolean("discoverable-by-number");
57 final var numberSharing = ns.getBoolean("number-sharing");
58 try {
59 m.updateAccountAttributes(deviceName, unrestrictedUnidentifiedSender, discoverableByNumber, numberSharing);
60 } catch (IOException e) {
61 throw new IOErrorException("UpdateAccount error: " + e.getMessage(), e);
62 }
63
64 final var username = ns.getString("username");
65 if (username != null) {
66 try {
67 m.setUsername(username);
68 final var newUsername = m.getUsername();
69 final var newUsernameLink = m.getUsernameLink();
70 switch (outputWriter) {
71 case PlainTextWriter w -> w.println("Your new username: {} ({})",
72 newUsername,
73 newUsernameLink == null ? "-" : newUsernameLink.getUrl());
74 case JsonWriter w -> w.write(new JsonAccountResponse(newUsername,
75 newUsernameLink == null ? null : newUsernameLink.getUrl()));
76 }
77 } catch (IOException e) {
78 throw new IOErrorException("Failed to set username: " + e.getMessage(), e);
79 } catch (InvalidUsernameException e) {
80 throw new UserErrorException("Invalid username: " + e.getMessage(), e);
81 }
82 }
83
84 final var deleteUsername = Boolean.TRUE.equals(ns.getBoolean("delete-username"));
85 if (deleteUsername) {
86 try {
87 m.deleteUsername();
88 } catch (IOException e) {
89 throw new IOErrorException("Failed to delete username: " + e.getMessage(), e);
90 }
91 }
92 }
93
94 private record JsonAccountResponse(
95 @JsonInclude(JsonInclude.Include.NON_NULL) String username,
96 @JsonInclude(JsonInclude.Include.NON_NULL) String usernameLink
97 ) {}
98 }