diff --git a/irc/client.go b/irc/client.go index 16837dec..d90789ea 100644 --- a/irc/client.go +++ b/irc/client.go @@ -828,7 +828,7 @@ func (client *Client) applyPreregMetadata(session *Session) { target := client.Nick() for k, v := range updates { - broadcastMetadataUpdate(client.server, maps.Keys(friends), session, target, k, v) + broadcastMetadataUpdate(client.server, maps.Keys(friends), session, target, k, v, true) } } diff --git a/irc/handlers.go b/irc/handlers.go index 878d5eb5..0440bf27 100644 --- a/irc/handlers.go +++ b/irc/handlers.go @@ -3195,11 +3195,11 @@ func metadataRegisteredHandler(client *Client, config *Config, subcommand string // echo the value to the client whether or not there was a real update rb.Add(nil, server.name, RPL_KEYVALUE, client.Nick(), target, key, "*", value) if updated { - notifySubscribers(server, rb.session, targetObj, target, key, value) + notifySubscribers(server, rb.session, targetObj, target, key, value, true) } } else { if updated := targetObj.DeleteMetadata(key); updated { - notifySubscribers(server, rb.session, targetObj, target, key, "") + notifySubscribers(server, rb.session, targetObj, target, key, "", false) } // acknowledge to the client whether or not there was a real update rb.Add(nil, server.name, RPL_KEYNOTSET, client.Nick(), target, key, client.t("Key deleted")) diff --git a/irc/metadata.go b/irc/metadata.go index 762d6a99..b5e9a5a2 100644 --- a/irc/metadata.go +++ b/irc/metadata.go @@ -30,7 +30,7 @@ type MetadataHaver = interface { CountMetadata() int } -func notifySubscribers(server *Server, session *Session, targetObj MetadataHaver, targetName, key, value string) { +func notifySubscribers(server *Server, session *Session, targetObj MetadataHaver, targetName, key, value string, set bool) { var recipientSessions iter.Seq[*Session] switch target := targetObj.(type) { @@ -48,17 +48,17 @@ func notifySubscribers(server *Server, session *Session, targetObj MetadataHaver return // impossible } - broadcastMetadataUpdate(server, recipientSessions, session, targetName, key, value) + broadcastMetadataUpdate(server, recipientSessions, session, targetName, key, value, set) } -func broadcastMetadataUpdate(server *Server, sessions iter.Seq[*Session], originator *Session, target, key, value string) { +func broadcastMetadataUpdate(server *Server, sessions iter.Seq[*Session], originator *Session, target, key, value string, set bool) { for s := range sessions { // don't notify the session that made the change if s == originator || !s.isSubscribedTo(key) { continue } - if value != "" { + if set { s.Send(nil, server.name, "METADATA", target, key, "*", value) } else { s.Send(nil, server.name, "METADATA", target, key, "*")