~emersion/public-inbox

soju: Send compact channel name lists v2 APPLIED

Hubert Hirtz: 1
 Send compact channel name lists

 2 files changed, 29 insertions(+), 3 deletions(-)
Export patchset (mbox)
How do I use this?

Copy & paste the following snippet into your terminal to import this patchset into git:

curl -s https://lists.sr.ht/~emersion/public-inbox/patches/11399/mbox | git am -3
Learn more about email & git
View this thread in the archives

[PATCH soju v2] Send compact channel name lists Export this patch

This commit resolves `sendNames`' TODO.
---
 bridge.go | 30 +++++++++++++++++++++++++++---
 irc.go    |  2 ++
 2 files changed, 29 insertions(+), 3 deletions(-)

diff --git a/bridge.go b/bridge.go
index c6080af..f1a7526 100644
--- a/bridge.go
@@ -2,6 +2,7 @@ package soju

import (
	"gopkg.in/irc.v3"
	"strings"
)

func forwardChannel(dc *downstreamConn, ch *upstreamChannel) {
@@ -34,17 +35,40 @@ func sendTopic(dc *downstreamConn, ch *upstreamChannel) {
}

func sendNames(dc *downstreamConn, ch *upstreamChannel) {
	// TODO: send multiple members in each message

	downstreamName := dc.marshalEntity(ch.conn.network, ch.Name)

	emptyNameReply := &irc.Message{
		Prefix:  dc.srv.prefix(),
		Command: irc.RPL_NAMREPLY,
		Params:  []string{dc.nick, string(ch.Status), downstreamName, ""},
	}
	maxLength := maxMessageLength - len(emptyNameReply.String())
	var buf strings.Builder

	for nick, memberships := range ch.Members {
		s := memberships.Format(dc) + dc.marshalEntity(ch.conn.network, nick)

		if buf.Len() != 0 && maxLength < buf.Len()+1+len(s) {
			// There's not enough place for the next space + nick.
			dc.SendMessage(&irc.Message{
				Prefix:  dc.srv.prefix(),
				Command: irc.RPL_NAMREPLY,
				Params:  []string{dc.nick, string(ch.Status), downstreamName, buf.String()},
			})
			buf.Reset()
		}

		if buf.Len() != 0 {
			buf.WriteByte(' ')
		}
		buf.WriteString(s)
	}

	if buf.Len() != 0 {
		dc.SendMessage(&irc.Message{
			Prefix:  dc.srv.prefix(),
			Command: irc.RPL_NAMREPLY,
			Params:  []string{dc.nick, string(ch.Status), downstreamName, s},
			Params:  []string{dc.nick, string(ch.Status), downstreamName, buf.String()},
		})
	}

diff --git a/irc.go b/irc.go
index 8fae660..179a089 100644
--- a/irc.go
+++ b/irc.go
@@ -16,6 +16,8 @@ const (
	err_invalidcapcmd = "410"
)

const maxMessageLength = 512

type userModes string

func (ms userModes) Has(c byte) bool {
--
2.27.0
LGTM, thanks! Pushed as 2eb1ed3dd221.