From 754d731ec3a205833993f532dfa9e9364fe9a4dc Mon Sep 17 00:00:00 2001 From: Shivaram Lingamneni Date: Sun, 15 Jun 2025 17:48:51 -0400 Subject: [PATCH] replay existing metadata to reattaching always-on clients --- irc/handlers.go | 21 +++++++++++---------- irc/server.go | 3 +++ 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/irc/handlers.go b/irc/handlers.go index f45d0e7e..e1a59ad5 100644 --- a/irc/handlers.go +++ b/irc/handlers.go @@ -3226,16 +3226,7 @@ func metadataHandler(server *Server, client *Client, msg ircmsg.Message, rb *Res } case "list": - values := targetObj.ListMetadata() - - batchId := rb.StartNestedBatch("metadata") - defer rb.EndNestedBatch(batchId) - - for key, val := range values { - visibility := "*" - - rb.Add(nil, server.name, RPL_KEYVALUE, client.Nick(), originalTarget, key, visibility, val) - } + playMetadataList(rb, client.Nick(), target, targetObj.ListMetadata()) case "clear": if !metadataCanIEditThisTarget(client, targetObj) { @@ -3306,6 +3297,16 @@ func metadataHandler(server *Server, client *Client, msg ircmsg.Message, rb *Res return } +func playMetadataList(rb *ResponseBuffer, nick, target string, values map[string]string) { + batchId := rb.StartNestedBatch("metadata") + defer rb.EndNestedBatch(batchId) + + for key, val := range values { + visibility := "*" + rb.Add(nil, rb.session.client.server.name, RPL_KEYVALUE, nick, target, key, visibility, val) + } +} + // REHASH func rehashHandler(server *Server, client *Client, msg ircmsg.Message, rb *ResponseBuffer) bool { nick := client.Nick() diff --git a/irc/server.go b/irc/server.go index 5974f633..4b23fe8a 100644 --- a/irc/server.go +++ b/irc/server.go @@ -496,6 +496,9 @@ func (server *Server) playRegistrationBurst(session *Session) { if !(rb.session.capabilities.Has(caps.ExtendedISupport) && rb.session.isupportSentPrereg) { server.RplISupport(c, rb) } + if session.capabilities.Has(caps.Metadata) && c.AlwaysOn() { + playMetadataList(rb, d.nick, d.nick, c.ListMetadata()) + } if d.account != "" && session.capabilities.Has(caps.Persistence) { reportPersistenceStatus(c, rb, false) }