]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - src/client.c
Add new constants for presence key/value lengths
[irc/rqf/shadowircd.git] / src / client.c
index 5cee85867cb2f6074de948a072bbcb8324ececdf..a395ec81c075d65d24c843bc6eb249337cb03f13 100644 (file)
@@ -1747,14 +1747,21 @@ set_metadata(struct Client *client_p, const char *key, const char *value)
 {
        struct MetadataEntry *md;
 
-       delete_metadata(client_p, key);
        if(client_p->user != NULL)
        {
-               md = rb_bh_alloc(metadata_heap);
-               rb_strlcpy(md->key, key, NICKLEN);
-               rb_strlcpy(md->value, value, TOPICLEN);
+               md = irc_dictionary_retrieve(client_p->user->metadata, key);
+               if (md == NULL)
+               {
+                       md = rb_bh_alloc(metadata_heap);
+                       rb_strlcpy(md->key, key, sizeof md->key);
+                       irc_dictionary_add(client_p->user->metadata, md->key, md);
+               }
+               else if (!strcmp(md->key, key) && !strcmp(md->value, value))
+                       return;
+               else
+                       rb_strlcpy(md->key, key, sizeof md->key);
 
-               irc_dictionary_add(client_p->user->metadata, md->key, md);
+               rb_strlcpy(md->value, value, sizeof md->value);
        }
 
        sendto_common_channels_local_with_capability(client_p, CLICAP_PRESENCE, form_str(RPL_METADATACHG), me.name, client_p->name, key, value);