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])
}