commit 36c3030231ed806c29c182e38cb0957993c835d1
parent c88d7e72f0531114e7e000f79ee6ce9a11f23952
Author: default <nobody@localhost>
Date: Sat, 23 Nov 2024 17:33:49 +0100
In user_persist(), only publish the actor to the world if a relevant field has changed.
This way, changing user preferences does not trigger an automatic send storm.
Diffstat:
M | data.c | | | 26 | ++++++++++++++++++++++++++ |
1 file changed, 26 insertions(+), 0 deletions(-)
diff --git a/data.c b/data.c
@@ -336,6 +336,32 @@ int user_persist(snac *snac, int publish)
xs *bfn = xs_fmt("%s.bak", fn);
FILE *f;
+ if (publish) {
+ /* check if any of the relevant fields have really changed */
+ if ((f = fopen(fn, "r")) != NULL) {
+ xs *old = xs_json_load(f);
+ fclose(f);
+
+ if (old != NULL) {
+ int nw = 0;
+ const char *fields[] = { "header", "avatar", "name", "bio", "metadata", NULL };
+
+ for (int n = 0; fields[n]; n++) {
+ const char *of = xs_dict_get(old, fields[n]);
+ const char *nf = xs_dict_get(snac->config, fields[n]);
+
+ if (xs_type(of) != XSTYPE_STRING || xs_type(nf) != XSTYPE_STRING || strcmp(of, nf)) {
+ nw = 1;
+ break;
+ }
+ }
+
+ if (!nw)
+ publish = 0;
+ }
+ }
+ }
+
rename(fn, bfn);
if ((f = fopen(fn, "w")) != NULL) {