From 9a5a02b654a26249e14993d95ae5ea71690172a6 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sat, 5 Apr 2025 18:05:58 +0200 Subject: [PATCH] MultiServer Extend datastore "update" operation to work on lists as well, acting as a pseudo "set union". #4666 --- MultiServer.py | 12 ++++++++---- docs/network protocol.md | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/MultiServer.py b/MultiServer.py index f9ed34e2f7..f465b73928 100644 --- a/MultiServer.py +++ b/MultiServer.py @@ -66,9 +66,13 @@ def pop_from_container(container, value): return container -def update_dict(dictionary, entries): - dictionary.update(entries) - return dictionary +def update_container_unique(container, entries): + if isinstance(container, list): + existing_container_as_set = set(container) + container.extend([entry for entry in entries if entry not in existing_container_as_set]) + else: + container.update(entries) + return container def queue_gc(): @@ -109,7 +113,7 @@ modify_functions = { # lists/dicts: "remove": remove_from_list, "pop": pop_from_container, - "update": update_dict, + "update": update_container_unique, } diff --git a/docs/network protocol.md b/docs/network protocol.md index 70c66543b5..6688c101ab 100644 --- a/docs/network protocol.md +++ b/docs/network protocol.md @@ -470,7 +470,7 @@ The following operations can be applied to a datastorage key | right_shift | Applies a bitwise right-shift to the current value of the key by `value`. | | remove | List only: removes the first instance of `value` found in the list. | | pop | List or Dict: for lists it will remove the index of the `value` given. for dicts it removes the element with the specified key of `value`. | -| update | Dict only: Updates the dictionary with the specified elements given in `value` creating new keys, or updating old ones if they previously existed. | +| update | List or Dict: Adds the elements of `value` to the container if they weren't already present. In the case of a Dict, already present keys will have their corresponding values updated. | ### SetNotify Used to register your current session for receiving all [SetReply](#SetReply) packages of certain keys to allow your client to keep track of changes.