mirror of
https://github.com/AsamK/signal-cli.git
synced 2026-04-19 08:31:30 +00:00
Implement two new CLI flags to disable downloading avatars and sticker packs during message reception, following the existing pattern of --ignore-attachments and --ignore-stories flags. Changes: - Add --ignore-avatars and --ignore-stickers flags to ReceiveCommand, DaemonCommand, and JsonRpcDispatcherCommand - Extend ReceiveConfig record with ignoreAvatars and ignoreStickers fields - Pass ignoreAvatars as explicit boolean parameter to ProfileHelper, SyncHelper, and GroupHelper methods (per maintainer feedback) - Gate avatar downloads in ProfileHelper (profile avatars), SyncHelper (contact avatars), and GroupHelper (group avatars for V1 and V2) - Gate sticker pack downloads in IncomingMessageHandler for both direct sticker messages and sync sticker pack operations - Update handleSignalServiceDataMessage and handleSyncMessage to pass full ReceiveConfig instead of individual boolean flags - Update man page (signal-cli.1.adoc) with flag documentation - Add entries to CHANGELOG.md When these flags are set, the respective content is not downloaded during message reception. Metadata (avatar paths, sticker pack IDs) is still stored, and existing FileNotFoundException handling will surface if content is later requested but wasn't downloaded. Fixes #1903 Closes #1904
118 lines
4.7 KiB
Java
118 lines
4.7 KiB
Java
package org.asamk.signal.commands;
|
||
|
||
import net.sourceforge.argparse4j.impl.Arguments;
|
||
import net.sourceforge.argparse4j.inf.Namespace;
|
||
import net.sourceforge.argparse4j.inf.Subparser;
|
||
|
||
import org.asamk.signal.OutputType;
|
||
import org.asamk.signal.Shutdown;
|
||
import org.asamk.signal.commands.exceptions.CommandException;
|
||
import org.asamk.signal.jsonrpc.SignalJsonRpcDispatcherHandler;
|
||
import org.asamk.signal.manager.Manager;
|
||
import org.asamk.signal.manager.MultiAccountManager;
|
||
import org.asamk.signal.output.JsonWriter;
|
||
import org.asamk.signal.output.OutputWriter;
|
||
import org.asamk.signal.util.IOUtils;
|
||
import org.slf4j.Logger;
|
||
import org.slf4j.LoggerFactory;
|
||
|
||
import java.io.FileDescriptor;
|
||
import java.io.FileInputStream;
|
||
import java.io.InputStreamReader;
|
||
import java.nio.channels.Channels;
|
||
import java.util.List;
|
||
import java.util.SequencedCollection;
|
||
import java.util.function.Supplier;
|
||
|
||
import static org.asamk.signal.util.CommandUtil.getReceiveConfig;
|
||
|
||
public class JsonRpcDispatcherCommand implements LocalCommand, MultiLocalCommand {
|
||
|
||
private static final Logger logger = LoggerFactory.getLogger(JsonRpcDispatcherCommand.class);
|
||
|
||
@Override
|
||
public String getName() {
|
||
return "jsonRpc";
|
||
}
|
||
|
||
@Override
|
||
public void attachToSubparser(final Subparser subparser) {
|
||
subparser.help("Take commands from standard input as line-delimited JSON RPC while receiving messages.");
|
||
subparser.addArgument("--ignore-attachments")
|
||
.help("Don’t download attachments of received messages.")
|
||
.action(Arguments.storeTrue());
|
||
subparser.addArgument("--ignore-stories")
|
||
.help("Don’t receive story messages from the server.")
|
||
.action(Arguments.storeTrue());
|
||
subparser.addArgument("--ignore-avatars")
|
||
.help("Don't download avatars of received messages.")
|
||
.action(Arguments.storeTrue());
|
||
subparser.addArgument("--ignore-stickers")
|
||
.help("Don't download sticker packs of received messages.")
|
||
.action(Arguments.storeTrue());
|
||
subparser.addArgument("--send-read-receipts")
|
||
.help("Send read receipts for all incoming data messages (in addition to the default delivery receipts)")
|
||
.action(Arguments.storeTrue());
|
||
subparser.addArgument("--receive-mode")
|
||
.help("Specify when to start receiving messages.")
|
||
.type(Arguments.enumStringType(ReceiveMode.class))
|
||
.setDefault(ReceiveMode.ON_START);
|
||
}
|
||
|
||
@Override
|
||
public SequencedCollection<OutputType> getSupportedOutputTypes() {
|
||
return List.of(OutputType.JSON);
|
||
}
|
||
|
||
@Override
|
||
public void handleCommand(
|
||
final Namespace ns,
|
||
final Manager m,
|
||
final OutputWriter outputWriter
|
||
) throws CommandException {
|
||
Shutdown.installHandler();
|
||
final var receiveMode = ns.<ReceiveMode>get("receive-mode");
|
||
final var receiveConfig = getReceiveConfig(ns);
|
||
m.setReceiveConfig(receiveConfig);
|
||
|
||
final var jsonOutputWriter = (JsonWriter) outputWriter;
|
||
final var lineSupplier = getLineSupplier();
|
||
|
||
final var handler = new SignalJsonRpcDispatcherHandler(jsonOutputWriter,
|
||
lineSupplier,
|
||
receiveMode == ReceiveMode.MANUAL);
|
||
final var thread = Thread.currentThread();
|
||
Shutdown.registerShutdownListener(thread::interrupt);
|
||
handler.handleConnection(m);
|
||
}
|
||
|
||
@Override
|
||
public void handleCommand(
|
||
final Namespace ns,
|
||
final MultiAccountManager c,
|
||
final OutputWriter outputWriter
|
||
) throws CommandException {
|
||
Shutdown.installHandler();
|
||
final var receiveMode = ns.<ReceiveMode>get("receive-mode");
|
||
final var receiveConfig = getReceiveConfig(ns);
|
||
c.getManagers().forEach(m -> m.setReceiveConfig(receiveConfig));
|
||
c.addOnManagerAddedHandler(m -> m.setReceiveConfig(receiveConfig));
|
||
|
||
final var jsonOutputWriter = (JsonWriter) outputWriter;
|
||
final var lineSupplier = getLineSupplier();
|
||
|
||
final var handler = new SignalJsonRpcDispatcherHandler(jsonOutputWriter,
|
||
lineSupplier,
|
||
receiveMode == ReceiveMode.MANUAL);
|
||
final var thread = Thread.currentThread();
|
||
Shutdown.registerShutdownListener(thread::interrupt);
|
||
handler.handleConnection(c);
|
||
}
|
||
|
||
private static Supplier<String> getLineSupplier() {
|
||
// Use FileChannel for stdin, because System.in is uninterruptible
|
||
final var stdInCh = Channels.newInputStream((new FileInputStream(FileDescriptor.in)).getChannel());
|
||
return IOUtils.getLineSupplier(new InputStreamReader(stdInCh, IOUtils.getConsoleCharset()));
|
||
}
|
||
}
|