~emersion/soju-dev

Forward RPL_TOPICWHOTIME to downstreams v2 SUPERSEDED

Hubert Hirtz: 1
 Forward RPL_TOPICWHOTIME to downstreams

 2 files changed, 38 insertions(+), 5 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/soju-dev/patches/12033/mbox | git am -3
Learn more about email & git
View this thread in the archives

[PATCH v2] Forward RPL_TOPICWHOTIME to downstreams Export this patch

---
 bridge.go   | 16 +++++++++++++---
 upstream.go | 27 +++++++++++++++++++++++++--
 2 files changed, 38 insertions(+), 5 deletions(-)

diff --git a/bridge.go b/bridge.go
index e434c49..c4df602 100644
--- a/bridge.go
@@ -1,8 +1,10 @@
package soju

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

	"gopkg.in/irc.v3"
)

func forwardChannel(dc *downstreamConn, ch *upstreamChannel) {
@@ -11,8 +13,6 @@ func forwardChannel(dc *downstreamConn, ch *upstreamChannel) {
	}

	sendTopic(dc, ch)

	// TODO: rpl_topicwhotime
	sendNames(dc, ch)
}

@@ -25,6 +25,16 @@ func sendTopic(dc *downstreamConn, ch *upstreamChannel) {
			Command: irc.RPL_TOPIC,
			Params:  []string{dc.nick, downstreamName, ch.Topic},
		})
		if ch.TopicWho != nil {
			topicWho := ch.TopicWho.Copy()
			topicWho.Name = dc.marshalEntity(ch.conn.network, topicWho.Name)
			topicTime := strconv.FormatInt(ch.TopicTime.Unix(), 10)
			dc.SendMessage(&irc.Message{
				Prefix:  dc.srv.prefix(),
				Command: rpl_topicwhotime,
				Params:  []string{dc.nick, downstreamName, topicWho.String(), topicTime},
			})
		}
	} else {
		dc.SendMessage(&irc.Message{
			Prefix:  dc.srv.prefix(),
diff --git a/upstream.go b/upstream.go
index 07d6266..f95e011 100644
--- a/upstream.go
+++ b/upstream.go
@@ -36,7 +36,7 @@ type upstreamChannel struct {
	Name         string
	conn         *upstreamConn
	Topic        string
	TopicWho     string
	TopicWho     *irc.Prefix
	TopicTime    time.Time
	Status       channelStatus
	modes        channelModes
@@ -830,6 +830,10 @@ func (uc *upstreamConn) handleMessage(msg *irc.Message) error {
			ch.Topic = ""
		}
	case "TOPIC":
		if msg.Prefix == nil {
			return fmt.Errorf("expected a prefix")
		}

		var name string
		if err := parseMessageParams(msg, &name); err != nil {
			return err
@@ -840,6 +844,8 @@ func (uc *upstreamConn) handleMessage(msg *irc.Message) error {
		}
		if len(msg.Params) > 1 {
			ch.Topic = msg.Params[1]
			ch.TopicWho = msg.Prefix.Copy()
			ch.TopicTime = time.Now() // TODO use msg.Tags["time"]
		} else {
			ch.Topic = ""
		}
@@ -971,12 +977,29 @@ func (uc *upstreamConn) handleMessage(msg *irc.Message) error {
		if err != nil {
			return err
		}
		ch.TopicWho = who
		firstTopicWhoTime := ch.TopicWho == nil
		ch.TopicWho = irc.ParsePrefix(who)
		sec, err := strconv.ParseInt(timeStr, 10, 64)
		if err != nil {
			return fmt.Errorf("failed to parse topic time: %v", err)
		}
		ch.TopicTime = time.Unix(sec, 0)
		if firstTopicWhoTime {
			uc.forEachDownstream(func(dc *downstreamConn) {
				topicWho := ch.TopicWho.Copy()
				topicWho.Name = dc.marshalEntity(uc.network, topicWho.Name)
				dc.SendMessage(&irc.Message{
					Prefix:  dc.srv.prefix(),
					Command: rpl_topicwhotime,
					Params: []string{
						dc.nick,
						dc.marshalEntity(uc.network, ch.Name),
						topicWho.String(),
						timeStr,
					},
				})
			})
		}
	case irc.RPL_LIST:
		var channel, clients, topic string
		if err := parseMessageParams(msg, nil, &channel, &clients, &topic); err != nil {
-- 
2.28.0
Two minor comments, LGTM otherwise!