From 3d93dcefa5be09113e662582a894c5c2586d41e2 Mon Sep 17 00:00:00 2001 From: Robert Gerus Date: Sun, 16 Jan 2022 02:23:22 +0100 Subject: [PATCH] Tell us who is still there --- at.go | 9 +++++++-- jitsi.go | 43 ++++++++++++++++++++++++++++++++----------- 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/at.go b/at.go index 275e3c4..c18ea7d 100644 --- a/at.go +++ b/at.go @@ -67,16 +67,21 @@ func (a *atMonitor) Run(c *irc.Client, done chan bool) { arrived := listSubtract(current, a.previousUserList) left := listSubtract(a.previousUserList, current) + alsoThere := listSubtract(a.previousUserList, left) if len(arrived) > 0 { - diffText = fmt.Sprint(" +", arrived) + diffText = fmt.Sprint(" arrived: ", arrived) } if len(left) > 0 { - diffText = fmt.Sprint(" -", left) + diffText += fmt.Sprint(" left: ", left) } if len(diffText) > 0 { + if len(alsoThere) > 0 { + diffText += fmt.Sprint(" also there: ", alsoThere) + } + msg := fmt.Sprintf("NOTICE %s :%s\n", a.channel, diffText) log.Println(diffText) c.Write(msg) diff --git a/jitsi.go b/jitsi.go index ae8323d..590b707 100644 --- a/jitsi.go +++ b/jitsi.go @@ -77,6 +77,14 @@ type JitsiClient struct { users map[string]string // map[jid]nick } +func (j *JitsiClient) UserListZWS() (ret []string) { + for _, user := range j.users { + u := user[:1] + "\u200B" + user[1:] + ret = append(ret, u) + } + return ret +} + func (j *JitsiClient) KeepAlive(ws *websocket.Conn) { ticker := time.NewTicker(5 * time.Second) @@ -109,7 +117,7 @@ func (j *JitsiClient) Run(c *irc.Client, done chan bool) { "ffmuc-de1truetrue" + "" + j.nick + "", } - + j.users = make(map[string]string) for { @@ -136,6 +144,7 @@ func (j *JitsiClient) Run(c *irc.Client, done chan bool) { log.Println("JitsiClient", j.server, j.room, "Shutting down") return default: + var alsoThere string _, err := ws.Read(msg) v := JitsiPresence{} @@ -150,19 +159,27 @@ func (j *JitsiClient) Run(c *irc.Client, done chan bool) { continue } + if v.Nick.Text == j.nick { + continue + } + if v.Nick.Text != "" { // if presence event has Nick present, it *shouldn't* mean that user has left the chat if v.X.Item.Jid != "" { if knownNick, ok := j.users[v.X.Item.Jid]; ok { if knownNick != v.Nick.Text { // user changed nickname, we don't care about that enough - log.Println("JitsiClient", j.server, j.room, "User changed nickname:", knownNick, v.Nick.Text) + log.Println("JitsiClient", j.server, j.room, "User changed nickname:", knownNick, v.Nick.Text) j.users[v.X.Item.Jid] = v.Nick.Text continue } } else { // new user + previousList := j.UserListZWS() + if len(previousList) > 0 { + alsoThere = fmt.Sprint(", also there:", previousList) + } j.users[v.X.Item.Jid] = v.Nick.Text nickZws := v.Nick.Text[:1] + "\u200B" + v.Nick.Text[1:] - ircMsg := fmt.Sprintf("NOTICE %s :jitsi: +%s\n", j.ircChannel, nickZws) - log.Println("JitsiClient", j.server, j.room, "User joined:", j.users[v.X.Item.Jid]) + ircMsg := fmt.Sprintf("NOTICE %s :jitsi: +%s%s\n", j.ircChannel, nickZws, alsoThere) + log.Println("JitsiClient", j.server, j.room, "User joined:", j.users[v.X.Item.Jid]) c.Write(ircMsg) continue } @@ -172,9 +189,13 @@ func (j *JitsiClient) Run(c *irc.Client, done chan bool) { if v.X.Item.Jid != "" { if knownNick, ok := j.users[v.X.Item.Jid]; ok { delete(j.users, v.X.Item.Jid) + userList := j.UserListZWS() + if len(userList) > 0 { + alsoThere = fmt.Sprint(", still there:", userList) + } nickZws := knownNick[:1] + "\u200B" + knownNick[1:] - ircMsg := fmt.Sprintf("NOTICE %s :jitsi: -%s\n", j.ircChannel, nickZws) - log.Println("JitsiClient", j.server, j.room, "User left:", knownNick) + ircMsg := fmt.Sprintf("NOTICE %s :jitsi: -%s%s\n", j.ircChannel, nickZws, alsoThere) + log.Println("JitsiClient", j.server, j.room, "User left:", knownNick) c.Write(ircMsg) continue } @@ -198,11 +219,11 @@ func JitsiRunWrapper(c *irc.Client, done chan bool) { } j := JitsiClient{ - nick: nickname, - ircChannel: args[0], - server: args[1], - room: args[2], - } + nick: nickname, + ircChannel: args[0], + server: args[1], + room: args[2], + } go j.Run(c, jitsiDone[i]) }