From 3c5e603192b9c6d2c37621d506b7a1a3a59e9c1b Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Mon, 30 May 2022 09:51:36 +0200 Subject: [PATCH] Remove bridge.go All of its functions belong to downstream.go. --- bridge.go | 88 --------------------------------------------------- downstream.go | 77 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 88 deletions(-) delete mode 100644 bridge.go diff --git a/bridge.go b/bridge.go deleted file mode 100644 index ee23ae3..0000000 --- a/bridge.go +++ /dev/null @@ -1,88 +0,0 @@ -package soju - -import ( - "context" - "fmt" - "strconv" - - "gopkg.in/irc.v3" - - "git.sr.ht/~emersion/soju/xirc" -) - -func forwardChannel(ctx context.Context, dc *downstreamConn, ch *upstreamChannel) { - if !ch.complete { - panic("Tried to forward a partial channel") - } - - // RPL_NOTOPIC shouldn't be sent on JOIN - if ch.Topic != "" { - sendTopic(dc, ch) - } - - if dc.caps.IsEnabled("soju.im/read") { - channelCM := ch.conn.network.casemap(ch.Name) - r, err := dc.srv.db.GetReadReceipt(ctx, ch.conn.network.ID, channelCM) - if err != nil { - dc.logger.Printf("failed to get the read receipt for %q: %v", ch.Name, err) - } else { - timestampStr := "*" - if r != nil { - timestampStr = fmt.Sprintf("timestamp=%s", xirc.FormatServerTime(r.Timestamp)) - } - dc.SendMessage(&irc.Message{ - Prefix: dc.prefix(), - Command: "READ", - Params: []string{dc.marshalEntity(ch.conn.network, ch.Name), timestampStr}, - }) - } - } - - if !dc.caps.IsEnabled("soju.im/no-implicit-names") { - sendNames(dc, ch) - } -} - -func sendTopic(dc *downstreamConn, ch *upstreamChannel) { - downstreamName := dc.marshalEntity(ch.conn.network, ch.Name) - - if ch.Topic != "" { - dc.SendMessage(&irc.Message{ - Prefix: dc.srv.prefix(), - Command: irc.RPL_TOPIC, - Params: []string{dc.nick, downstreamName, ch.Topic}, - }) - if ch.TopicWho != nil { - topicWho := dc.marshalUserPrefix(ch.conn.network, ch.TopicWho) - topicTime := strconv.FormatInt(ch.TopicTime.Unix(), 10) - dc.SendMessage(&irc.Message{ - Prefix: dc.srv.prefix(), - Command: xirc.RPL_TOPICWHOTIME, - Params: []string{dc.nick, downstreamName, topicWho.String(), topicTime}, - }) - } - } else { - dc.SendMessage(&irc.Message{ - Prefix: dc.srv.prefix(), - Command: irc.RPL_NOTOPIC, - Params: []string{dc.nick, downstreamName, "No topic is set"}, - }) - } -} - -func sendNames(dc *downstreamConn, ch *upstreamChannel) { - downstreamName := dc.marshalEntity(ch.conn.network, ch.Name) - - var members []string - for _, entry := range ch.Members.innerMap { - nick := entry.originalKey - memberships := entry.value.(*xirc.MembershipSet) - s := formatMemberPrefix(*memberships, dc) + dc.marshalEntity(ch.conn.network, nick) - members = append(members, s) - } - - msgs := xirc.GenerateNamesReply(dc.srv.prefix(), dc.nick, downstreamName, ch.Status, members) - for _, msg := range msgs { - dc.SendMessage(msg) - } -} diff --git a/downstream.go b/downstream.go index 58a3f2f..b7416f3 100644 --- a/downstream.go +++ b/downstream.go @@ -3257,3 +3257,80 @@ func parseNickServCredentials(text, nick string) (username, password string, ok } return username, password, true } + +func forwardChannel(ctx context.Context, dc *downstreamConn, ch *upstreamChannel) { + if !ch.complete { + panic("Tried to forward a partial channel") + } + + // RPL_NOTOPIC shouldn't be sent on JOIN + if ch.Topic != "" { + sendTopic(dc, ch) + } + + if dc.caps.IsEnabled("soju.im/read") { + channelCM := ch.conn.network.casemap(ch.Name) + r, err := dc.srv.db.GetReadReceipt(ctx, ch.conn.network.ID, channelCM) + if err != nil { + dc.logger.Printf("failed to get the read receipt for %q: %v", ch.Name, err) + } else { + timestampStr := "*" + if r != nil { + timestampStr = fmt.Sprintf("timestamp=%s", xirc.FormatServerTime(r.Timestamp)) + } + dc.SendMessage(&irc.Message{ + Prefix: dc.prefix(), + Command: "READ", + Params: []string{dc.marshalEntity(ch.conn.network, ch.Name), timestampStr}, + }) + } + } + + if !dc.caps.IsEnabled("soju.im/no-implicit-names") { + sendNames(dc, ch) + } +} + +func sendTopic(dc *downstreamConn, ch *upstreamChannel) { + downstreamName := dc.marshalEntity(ch.conn.network, ch.Name) + + if ch.Topic != "" { + dc.SendMessage(&irc.Message{ + Prefix: dc.srv.prefix(), + Command: irc.RPL_TOPIC, + Params: []string{dc.nick, downstreamName, ch.Topic}, + }) + if ch.TopicWho != nil { + topicWho := dc.marshalUserPrefix(ch.conn.network, ch.TopicWho) + topicTime := strconv.FormatInt(ch.TopicTime.Unix(), 10) + dc.SendMessage(&irc.Message{ + Prefix: dc.srv.prefix(), + Command: xirc.RPL_TOPICWHOTIME, + Params: []string{dc.nick, downstreamName, topicWho.String(), topicTime}, + }) + } + } else { + dc.SendMessage(&irc.Message{ + Prefix: dc.srv.prefix(), + Command: irc.RPL_NOTOPIC, + Params: []string{dc.nick, downstreamName, "No topic is set"}, + }) + } +} + +func sendNames(dc *downstreamConn, ch *upstreamChannel) { + downstreamName := dc.marshalEntity(ch.conn.network, ch.Name) + + var members []string + for _, entry := range ch.Members.innerMap { + nick := entry.originalKey + memberships := entry.value.(*xirc.MembershipSet) + s := formatMemberPrefix(*memberships, dc) + dc.marshalEntity(ch.conn.network, nick) + members = append(members, s) + } + + msgs := xirc.GenerateNamesReply(dc.srv.prefix(), dc.nick, downstreamName, ch.Status, members) + for _, msg := range msgs { + dc.SendMessage(msg) + } +}