Added support for multiple block/follow lists.

Any list with the following prefix will be used in block/follow logic:

blockedNames
blockedAddresses
followedNames

For instance, any names in a list named "blockedNames_CustomBlockList" would also be blocked, along with those in the standard "blockedNames" list.

This will ultimately allow apps to offer custom block/follow lists to users (once list functionality is added to the Q-Apps API).
This commit is contained in:
CalDescent
2023-04-02 14:42:49 +01:00
parent 2086a2c476
commit 35def54ecc
4 changed files with 217 additions and 5 deletions

View File

@@ -52,6 +52,15 @@ public class ResourceList {
String jsonString = ResourceList.listToJSONString(this.list);
Path filePath = this.getFilePath();
// Don't create list if it's empty
if (this.list != null && this.list.isEmpty()) {
if (filePath != null && Files.exists(filePath)) {
// Delete empty list
Files.delete(filePath);
}
return;
}
// Create parent directory if needed
try {
Files.createDirectories(filePath.getParent());
@@ -109,6 +118,13 @@ public class ResourceList {
this.list.remove(resource);
}
public void clear() {
if (this.list == null) {
return;
}
this.list.clear();
}
public boolean contains(String resource, boolean caseSensitive) {
if (resource == null || this.list == null) {
return false;

View File

@@ -2,8 +2,11 @@ package org.qortal.list;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.qortal.settings.Settings;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -18,6 +21,7 @@ public class ResourceListManager {
public ResourceListManager() {
this.lists = this.fetchLists();
}
public static synchronized ResourceListManager getInstance() {
@@ -27,6 +31,38 @@ public class ResourceListManager {
return instance;
}
public static synchronized void reset() {
if (instance != null) {
instance = null;
}
}
private List<ResourceList> fetchLists() {
List<ResourceList> lists = new ArrayList<>();
Path listsPath = Paths.get(Settings.getInstance().getListsPath());
if (listsPath.toFile().isDirectory()) {
String[] files = listsPath.toFile().list();
for (String fileName : files) {
try {
// Remove .json extension
if (fileName.endsWith(".json")) {
fileName = fileName.substring(0, fileName.length() - 5);
}
ResourceList list = new ResourceList(fileName);
if (list != null) {
lists.add(list);
}
} catch (IOException e) {
// Ignore this list
}
}
}
return lists;
}
private ResourceList getList(String listName) {
for (ResourceList list : this.lists) {
if (Objects.equals(list.getName(), listName)) {
@@ -48,6 +84,18 @@ public class ResourceListManager {
}
private List<ResourceList> getListsByPrefix(String listNamePrefix) {
List<ResourceList> lists = new ArrayList<>();
for (ResourceList list : this.lists) {
if (list != null && list.getName() != null && list.getName().startsWith(listNamePrefix)) {
lists.add(list);
}
}
return lists;
}
public boolean addToList(String listName, String item, boolean save) {
ResourceList list = this.getList(listName);
if (list == null) {
@@ -95,6 +143,16 @@ public class ResourceListManager {
return list.contains(item, caseSensitive);
}
public boolean listWithPrefixContains(String listNamePrefix, String item, boolean caseSensitive) {
List<ResourceList> lists = getListsByPrefix(listNamePrefix);
for (ResourceList list : lists) {
if (list.contains(item, caseSensitive)) {
return true;
}
}
return false;
}
public void saveList(String listName) {
ResourceList list = this.getList(listName);
if (list == null) {
@@ -133,6 +191,15 @@ public class ResourceListManager {
return list.getList();
}
public List<String> getStringsInListsWithPrefix(String listNamePrefix) {
List<String> items = new ArrayList<>();
List<ResourceList> lists = getListsByPrefix(listNamePrefix);
for (ResourceList list : lists) {
items.addAll(list.getList());
}
return items;
}
public int getItemCountForList(String listName) {
ResourceList list = this.getList(listName);
if (list == null) {

View File

@@ -9,26 +9,26 @@ public class ListUtils {
/* Blocking */
public static List<String> blockedNames() {
return ResourceListManager.getInstance().getStringsInList("blockedNames");
return ResourceListManager.getInstance().getStringsInListsWithPrefix("blockedNames");
}
public static boolean isNameBlocked(String name) {
return ResourceListManager.getInstance().listContains("blockedNames", name, false);
return ResourceListManager.getInstance().listWithPrefixContains("blockedNames", name, false);
}
public static boolean isAddressBlocked(String address) {
return ResourceListManager.getInstance().listContains("blockedAddresses", address, true);
return ResourceListManager.getInstance().listWithPrefixContains("blockedAddresses", address, true);
}
/* Following */
public static List<String> followedNames() {
return ResourceListManager.getInstance().getStringsInList("followedNames");
return ResourceListManager.getInstance().getStringsInListsWithPrefix("followedNames");
}
public static boolean isFollowingName(String name) {
return ResourceListManager.getInstance().listContains("followedNames", name, false);
return ResourceListManager.getInstance().listWithPrefixContains("followedNames", name, false);
}
public static int followedNamesCount() {