diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index f26eeb33..9f37145b 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -16,7 +16,6 @@
-
diff --git a/src/main/java/org/asamk/Signal.java b/src/main/java/org/asamk/Signal.java
index 6fb59303..6c819eef 100644
--- a/src/main/java/org/asamk/Signal.java
+++ b/src/main/java/org/asamk/Signal.java
@@ -24,6 +24,10 @@ public interface Signal extends DBusInterface {
void setContactName(String number, String name);
+ void blockContact(String number);
+
+ void unblockContact(String number);
+
List getGroupIds();
String getGroupName(byte[] groupId);
diff --git a/src/main/java/org/asamk/signal/commands/BlockContactCommand.java b/src/main/java/org/asamk/signal/commands/BlockContactCommand.java
new file mode 100644
index 00000000..92de4750
--- /dev/null
+++ b/src/main/java/org/asamk/signal/commands/BlockContactCommand.java
@@ -0,0 +1,29 @@
+package org.asamk.signal.commands;
+
+import net.sourceforge.argparse4j.inf.Namespace;
+import net.sourceforge.argparse4j.inf.Subparser;
+import org.asamk.signal.manager.Manager;
+
+public class BlockContactCommand implements LocalCommand {
+
+ @Override
+ public void attachToSubparser(final Subparser subparser) {
+ subparser.addArgument("number")
+ .help("Contact number");
+ subparser.help("Block the given contact (no messages will be received)");
+ }
+
+ @Override
+ public int handleCommand(final Namespace ns, final Manager m) {
+ if (!m.isRegistered()) {
+ System.err.println("User is not registered.");
+ return 1;
+ }
+
+ String number = ns.getString("number");
+
+ m.blockContact(number);
+
+ return 0;
+ }
+}
diff --git a/src/main/java/org/asamk/signal/commands/Commands.java b/src/main/java/org/asamk/signal/commands/Commands.java
index aa53d339..563b5263 100644
--- a/src/main/java/org/asamk/signal/commands/Commands.java
+++ b/src/main/java/org/asamk/signal/commands/Commands.java
@@ -9,6 +9,7 @@ public class Commands {
static {
addCommand("addDevice", new AddDeviceCommand());
+ addCommand("blockContact", new BlockContactCommand());
addCommand("daemon", new DaemonCommand());
addCommand("link", new LinkCommand());
addCommand("listContacts", new ListContactsCommand());
@@ -25,6 +26,7 @@ public class Commands {
addCommand("updateContact", new UpdateContactCommand());
addCommand("setPin", new SetPinCommand());
addCommand("trust", new TrustCommand());
+ addCommand("unblockContact", new UnblockContactCommand());
addCommand("unregister", new UnregisterCommand());
addCommand("updateAccount", new UpdateAccountCommand());
addCommand("updateGroup", new UpdateGroupCommand());
diff --git a/src/main/java/org/asamk/signal/commands/UnblockContactCommand.java b/src/main/java/org/asamk/signal/commands/UnblockContactCommand.java
new file mode 100644
index 00000000..af44e638
--- /dev/null
+++ b/src/main/java/org/asamk/signal/commands/UnblockContactCommand.java
@@ -0,0 +1,29 @@
+package org.asamk.signal.commands;
+
+import net.sourceforge.argparse4j.inf.Namespace;
+import net.sourceforge.argparse4j.inf.Subparser;
+import org.asamk.signal.manager.Manager;
+
+public class UnblockContactCommand implements LocalCommand {
+
+ @Override
+ public void attachToSubparser(final Subparser subparser) {
+ subparser.addArgument("number")
+ .help("Contact number");
+ subparser.help("Unblock the given contact (messages will be received again)");
+ }
+
+ @Override
+ public int handleCommand(final Namespace ns, final Manager m) {
+ if (!m.isRegistered()) {
+ System.err.println("User is not registered.");
+ return 1;
+ }
+
+ String number = ns.getString("number");
+
+ m.unblockContact(number);
+
+ return 0;
+ }
+}
diff --git a/src/main/java/org/asamk/signal/manager/Manager.java b/src/main/java/org/asamk/signal/manager/Manager.java
index 54d3f922..2fffcc16 100644
--- a/src/main/java/org/asamk/signal/manager/Manager.java
+++ b/src/main/java/org/asamk/signal/manager/Manager.java
@@ -686,6 +686,36 @@ public class Manager implements Signal {
account.save();
}
+ @Override
+ public void blockContact(String number) {
+ ContactInfo contact = account.getContactStore().getContact(number);
+ if (contact == null) {
+ contact = new ContactInfo();
+ contact.number = number;
+ System.err.println("Adding and blocking contact " + number);
+ } else {
+ System.err.println("Blocking contact " + number);
+ }
+ contact.blocked = true;
+ account.getContactStore().updateContact(contact);
+ account.save();
+ }
+
+ @Override
+ public void unblockContact(String number) {
+ ContactInfo contact = account.getContactStore().getContact(number);
+ if (contact == null) {
+ contact = new ContactInfo();
+ contact.number = number;
+ System.err.println("Adding and unblocking contact " + number);
+ } else {
+ System.err.println("Unblocking contact " + number);
+ }
+ contact.blocked = false;
+ account.getContactStore().updateContact(contact);
+ account.save();
+ }
+
@Override
public List getGroupIds() {
List groups = getGroups();
diff --git a/src/main/java/org/asamk/signal/storage/contacts/ContactInfo.java b/src/main/java/org/asamk/signal/storage/contacts/ContactInfo.java
index 291303b2..be69b40c 100644
--- a/src/main/java/org/asamk/signal/storage/contacts/ContactInfo.java
+++ b/src/main/java/org/asamk/signal/storage/contacts/ContactInfo.java
@@ -19,6 +19,9 @@ public class ContactInfo {
@JsonProperty
public String profileKey;
+ @JsonProperty(defaultValue = "false")
+ public boolean blocked;
+
@JsonIgnore
public SignalServiceAddress getAddress() {
return new SignalServiceAddress(null, number);